boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

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