43 lines
1.2 KiB
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
|