os-workshop

same materials and sample source for RV32 OS projects
git clone http://frotz.net/git/os-workshop.git
Log | Files | Refs

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>