rumpk/libs/membrane/sys_arch.c

43 lines
1.2 KiB
C

#include "lwip/opt.h"
#include "lwip/arch.h"
#include "lwip/sys.h"
// External references to console
extern void console_write(const void* p, unsigned long len);
// Simple counter for monotonic time
static volatile u32_t lwip_ticks_ms = 0;
// 1. Initialization (Membrane version - minimal)
void sys_init(void) {
// Silent init for Membrane
}
// 2. The Time Source
u32_t sys_now(void) {
#if defined(__riscv)
uint64_t ticks;
__asm__ volatile ("rdtime %0" : "=r"(ticks));
// RISC-V QEMU virt is 10MHz -> 1ms = 10,000 ticks
return (u32_t)(ticks / 10000);
#elif defined(__aarch64__)
uint64_t ticks;
__asm__ volatile ("mrs %0, cntvct_el0" : "=r"(ticks));
// ARM64 QEMU virt is usually 62.5MHz or similar, but often 24MHz
// Let's assume 1 tick = 1 microsecond (1MHz) for simplicity if we don't know freq
// Actually, cntfrq_el0 holds the frequency.
return (u32_t)(ticks / 1000);
#else
static volatile u32_t lwip_ticks_ms = 0;
return ++lwip_ticks_ms;
#endif
}
// 3. Panic handler is in clib.c (nexus_lwip_panic)
// 4. Critical Sections (Stubbed)
#if SYS_LIGHTWEIGHT_PROT
sys_prot_t sys_arch_protect(void) { return 0; }
void sys_arch_unprotect(sys_prot_t pval) { (void)pval; }
#endif