kernel.h (1525B)
1 // Copyright 2022, Brian Swetland <swetland@frotz.net> 2 // Licensed under the Apache License, Version 2.0 3 4 #pragma once 5 6 #include <xos/status.h> 7 #include <xos/types.h> 8 9 #include <hw/riscv.h> 10 #include <hw/context.h> 11 #include <hw/intrinsics.h> 12 13 #define PAGE_SIZE 4096 14 15 #define KVA_BASE 0xC0000000 16 #define KPA_BASE 0x40000000 17 18 void panic(const char* msg); 19 20 // vm.c 21 static inline void* pa_to_kva(paddr_t pa) { 22 return (void*) (pa + (KVA_BASE - KPA_BASE)); 23 } 24 static inline paddr_t kva_to_pa(void *kva) { 25 return ((paddr_t) kva) - (KVA_BASE - KPA_BASE); 26 } 27 28 // allocate a (zero'd) physical page, return ppa 29 paddr_t ppage_alloc_z(void); 30 31 // allocate a (zero'd) physical page, return kva 32 void *kpage_alloc_z(void); 33 34 void vmm_init(paddr_t lo, paddr_t hi); 35 status_t vm_map_4k(uint32_t *pdir, vaddr_t va, paddr_t pa, uint32_t attrs); 36 status_t vm_map_4m(uint32_t *pdir, vaddr_t va, paddr_t pa, uint32_t attrs); 37 38 #define USER_RW (PTE_D|PTE_A|PTE_U|PTE_R|PTE_W|PTE_V) 39 #define USER_RX (PTE_D|PTE_A|PTE_U|PTE_R|PTE_X|PTE_V) 40 #define USER_RWX (PTE_D|PTE_A|PTE_U|PTE_R|PTE_W|PTE_X|PTE_V) 41 42 #define KERNEL_RO (PTE_D|PTE_A|PTE_R|PTE_V) 43 #define KERNEL_RW (PTE_D|PTE_A|PTE_R|PTE_W|PTE_V) 44 #define KERNEL_RX (PTE_D|PTE_A|PTE_R|PTE_X|PTE_V) 45 46 // thread.c 47 typedef struct { 48 uint32_t magic; 49 uint32_t id; 50 uint32_t *pgdir; 51 uint32_t reschedule; 52 53 uint32_t reserved0; 54 uint32_t reserved1; 55 uint32_t reserved2; 56 uint32_t reserved3; 57 } thread_t; 58 59 // syscall entry points 60 #define __SYSCALL(n,rtype,name,args) rtype sys_##name args; 61 #include <xos/syscall-tmpl.h>