arch.h (2860B)
1 /* riscv64 seed-kernel backend constants. 2 * Low-level boot/trap/MMU files are intentionally isolated under this 3 * directory; common kernel.c only depends on the contract below. */ 4 #ifndef SEED_ARCH_H 5 #define SEED_ARCH_H 6 7 #define ARCH_NAME "riscv64" 8 #define ARCH_ELF_MACHINE 0xf3 9 #define ARCH_ELF_MACHINE_NAME "riscv64" 10 11 #define ARCH_DEVICE_ALIAS_BASE 0x200000000UL 12 #define ARCH_UART0_PA 0x10000000UL 13 #define ARCH_KERNEL_HEAP_END 0x8b000000UL 14 15 #define ARCH_USER_POOL_A_PA 0x8c000000UL 16 #define ARCH_USER_POOL_B_PA 0xbc000000UL 17 #define ARCH_USER_POOL_SIZE 0x30000000UL 18 #define ARCH_USER_VA_LO 0x00200000UL 19 #define ARCH_USER_VA_HI 0x30200000UL 20 #define ARCH_USER_POOL_FIRST_SLOT 1 21 #define ARCH_USER_POOL_LAST_SLOT 384 22 23 #define ARCH_SYS_unlinkat 35 24 #define ARCH_SYS_openat 56 25 #define ARCH_SYS_close 57 26 #define ARCH_SYS_lseek 62 27 #define ARCH_SYS_read 63 28 #define ARCH_SYS_write 64 29 #define ARCH_SYS_exit_group 93 30 #define ARCH_SYS_waitid 95 31 #define ARCH_SYS_brk 214 32 #define ARCH_SYS_spawn 1024 33 34 struct trapframe { 35 u64 x[32]; 36 u64 pc; 37 u64 status; 38 }; 39 40 #define ARCH_TRAPFRAME_NREGS 32 41 #define ARCH_SYSCALL_ARG(tf, i) ((tf)->x[10 + (i)]) 42 #define ARCH_SYSCALL_NR(tf) ((tf)->x[17]) 43 #define ARCH_SET_RET(tf, v) ((tf)->x[10] = (u64)(v)) 44 #define ARCH_SET_PC(tf, v) ((tf)->pc = (u64)(v)) 45 #define ARCH_TF_PC(tf) ((tf)->pc) 46 #define ARCH_IS_SYSCALL(cause) ((cause) == 8) 47 48 enum { BAR_WMB, BAR_RMB, BAR_ICACHE, BAR_ICACHE_CTX }; 49 enum { PAUSE_NOP, PAUSE_WFI }; 50 51 extern u64 saved_user_sp; 52 extern void cpu_pause(int kind); 53 extern void riscv_fence(int kind); 54 extern u64 riscv_read_stval(void); 55 extern void riscv_write_satp(u64 v); 56 extern void riscv_set_sum(void); 57 extern void arch_setup_mmu(void); 58 extern void arch_swap_user_pool(int which); 59 extern void arch_system_off(void); 60 extern void eret_to_user(u64 entry, u64 sp); 61 62 #define arch_read_user_sp() (saved_user_sp) 63 #define arch_write_user_sp(v) (saved_user_sp = (v)) 64 #define arch_fault_addr() riscv_read_stval() 65 #define arch_pause() cpu_pause(PAUSE_NOP) 66 #define arch_idle_forever() do { for (;;) cpu_pause(PAUSE_WFI); } while (0) 67 #define arch_mmio_ptr(pa) ((volatile u8 *)(ARCH_DEVICE_ALIAS_BASE + (u64)(pa))) 68 #define arch_wmb() riscv_fence(BAR_WMB) 69 #define arch_rmb() riscv_fence(BAR_RMB) 70 #define arch_icache_sync() riscv_fence(BAR_ICACHE) 71 #define arch_icache_context_sync() riscv_fence(BAR_ICACHE_CTX) 72 73 static inline void arch_clear_to_user_entry(struct trapframe *tf, u64 entry) { 74 for (int i = 0; i < ARCH_TRAPFRAME_NREGS; i++) tf->x[i] = 0; 75 tf->pc = entry; 76 } 77 78 static inline void arch_console_putc(char c) { 79 volatile u8 *uart = (volatile u8 *)(ARCH_DEVICE_ALIAS_BASE + ARCH_UART0_PA); 80 while (!(uart[5] & 0x20)) { } 81 uart[0] = (u8)c; 82 } 83 84 #endif