# HG changeset patch # User tobaru # Date 1579857026 -32400 # Node ID 7a4d299a35bea96068ee9a7316b5d8c6110b1e7b # Parent 098942ff5f44f490cf956f77151b19e92dbd5bc4 paging_init diff -r 098942ff5f44 -r 7a4d299a35be src/impl/vm_impl.cbc --- a/src/impl/vm_impl.cbc Fri Jan 24 17:44:25 2020 +0900 +++ b/src/impl/vm_impl.cbc Fri Jan 24 18:10:26 2020 +0900 @@ -31,6 +31,7 @@ vm_impl->copyuvm_check_null = C_copyuvm_check_nullvm_impl; vm_impl->copyuvm_loop = C_copyuvm_loopvm_impl; vm_impl->uva2ka_check_pe_types = C_uva2ka_check_pe_types; + vm_impl->paging_intvm_impl = C_paging_intvmvm_impl; vm->init_vmm = C_init_vmmvm_impl; vm->kpt_freerange = C_kpt_freerangevm_impl; vm->kpt_alloc = C_kpt_allocvm_impl; @@ -42,7 +43,7 @@ vm->copyuvm = C_copyuvmvm_impl; vm->uva2ka = C_uva2kavm_impl; vm->copyout = C_copyoutvm_impl; - vm->pagind_int = C_pagind_intvm_impl; + vm->paging_int = C_paging_intvm_impl; return vm; } @@ -130,12 +131,12 @@ } __code copyoutvm_impl(struct vm_impl* vm, pde_t* pgdir, uint va, void* pp, uint len, __code next(...)) { - + goto next(...); } -__code pagind_intvm_impl(struct vm_impl* vm, uint phy_low, uint phy_hi, __code next(...)) { +__code paging_intvm_impl(struct vm_impl* vm, uint phy_low, uint phy_hi, __code next(...)) { - goto next(...); + goto paging_intvmvm_impl(vm, phy_low, phy_hi, next(...)); } diff -r 098942ff5f44 -r 7a4d299a35be src/impl/vm_impl.h --- a/src/impl/vm_impl.h Fri Jan 24 17:44:25 2020 +0900 +++ b/src/impl/vm_impl.h Fri Jan 24 18:10:26 2020 +0900 @@ -17,6 +17,8 @@ char* uva; pde_t* d; uint ap; + uint phy_low; + uint phy_hi; __code kpt_alloc_check_impl(Type* vm_impl, __code next(...)); __code loaduvm_ptesize_check(Type* vm_impl, __code next(int ret, ...)); @@ -27,6 +29,7 @@ __code copyuvm_loop(Type* vm_impl,pde_t* pgdir, uint sz, pde_t* d, pte_t* pte, uint pa, uint i, uint ap, char* mem, __code next(int ret, ...)); __code clearpteu_check_ptevm_impl(Type* vm_impl, pde_t* pgdir, char* uva, __code next(...)); __code uva2ka_check_pe_types(Type* vm_impl, pde_t* pgdir, char* uva, __code next(...)); + __code paging_intvm_impl(Type* vm_impl, uint phy_low, uint phy_hi, __code next(...)); __code next(...); } vm_impl; diff -r 098942ff5f44 -r 7a4d299a35be src/impl/vm_impl_private.cbc --- a/src/impl/vm_impl_private.cbc Fri Jan 24 17:44:25 2020 +0900 +++ b/src/impl/vm_impl_private.cbc Fri Jan 24 18:10:26 2020 +0900 @@ -1,5 +1,6 @@ #include "../../context.h" #include "mmu.h" +#include "defs.h" #include "memlayout.h" #interface "vm_impl.h" @@ -311,3 +312,21 @@ goto next(ret, ...); } +// flush all TLB +static void flush_tlb (void) +{ + uint val = 0; + asm("MCR p15, 0, %[r], c8, c7, 0" : :[r]"r" (val):); + + // invalid entire data and instruction cache + asm ("MCR p15,0,%[r],c7,c10,0": :[r]"r" (val):); + asm ("MCR p15,0,%[r],c7,c11,0": :[r]"r" (val):); +} + +__code paging_intvmvm_impl(struct vm_impl* vm_impl, uint phy_low, uint phy_hi, __code next(...)) { + mappages (P2V(&_kernel_pgtbl), P2V(phy_low), phy_hi - phy_low, phy_low, AP_KU); + flush_tlb (); + + goto next(...)); +} + diff -r 098942ff5f44 -r 7a4d299a35be src/interface/vm.h --- a/src/interface/vm.h Fri Jan 24 17:44:25 2020 +0900 +++ b/src/interface/vm.h Fri Jan 24 18:10:26 2020 +0900 @@ -28,6 +28,6 @@ __code copyuvm(Impl* vm, pde_t* pgdir, uint sz, __code next(...)); __code uva2ka(Impl* vm, pde_t* pgdir, char* uva, __code next(...)); __code copyout(Impl* vm, pde_t* pgdir, uint va, void* pp, uint len, __code next(...)); - __code pagind_int(Impl* vm, uint phy_low, uint phy_hi, __code next(...)); + __code paging_int(Impl* vm, uint phy_low, uint phy_hi, __code next(...)); __code next(...); } vm;