# HG changeset patch # User menikon # Date 1579779219 -32400 # Node ID ab5a80021afe9c6d39544b26c9298351262188f5 # Parent b73c5bd61c37dd90307d65d993c30c7b08e02908# Parent 02bb0f8be908b7aa9445b7c8292168c19dbd9d1e merge diff -r b73c5bd61c37 -r ab5a80021afe src/gearsTools/lib/Gears/Context.pm --- a/src/gearsTools/lib/Gears/Context.pm Thu Jan 23 01:55:03 2020 +0900 +++ b/src/gearsTools/lib/Gears/Context.pm Thu Jan 23 20:33:39 2020 +0900 @@ -240,7 +240,7 @@ my $header_paths = Gears::Util->find_headers_path($search_bash_path); map { - if (/(\w+)\.(?:h|dg)/) { + if (/(\w+)\.(?:h|dg)$/) { my $header_file = $1; if (exists $res{$header_file}) { if ($res{$header_file} =~ /^\d+$/){ diff -r b73c5bd61c37 -r ab5a80021afe src/gearsTools/lib/Gears/Util.pm --- a/src/gearsTools/lib/Gears/Util.pm Thu Jan 23 01:55:03 2020 +0900 +++ b/src/gearsTools/lib/Gears/Util.pm Thu Jan 23 20:33:39 2020 +0900 @@ -40,6 +40,7 @@ sub _parse_base { my ($file,$code_verbose) = @_; my $ir = {}; + $ir->{file_name} = $file; Gears::Util->file_checking($file); open my $fh, '<', $file; @@ -153,10 +154,10 @@ sub h2context_str { my ($class, $h2context) = @_; - my $context = ''; my $space = ' '; - $context = "${space}struct $h2context->{name} {\n"; + my $context = "${space}//$h2context->{file_name}\n"; + $context .= "${space}struct $h2context->{name} {\n"; my $content_space; if (exists $h2context->{content}){ my @chars = split //, $h2context->{content}->[0]; diff -r b73c5bd61c37 -r ab5a80021afe src/impl/vm_impl.cbc --- a/src/impl/vm_impl.cbc Thu Jan 23 01:55:03 2020 +0900 +++ b/src/impl/vm_impl.cbc Thu Jan 23 20:33:39 2020 +0900 @@ -3,12 +3,13 @@ // ---- // typedef struct vm_impl impl vm{ +// union Data* vm_impl; // uint i; -// pte_t *pte; -// unsigned int sz; +// pte_t* pte; +// uint sz; // // __code loaduvm_ptesize_check(Type* vm_impl, __code next(...)); -// __code loaduvm_loop(Type* vm_impl, uint i, pte_t *pte, unsigned int sz, __code next(...)); +// __code loaduvm_loop(Type* vm_impl, uint i, pte_t* pte, uint sz, __code next(...)); // __code next(...); // // @@ -19,8 +20,12 @@ struct vm* vm = new vm(); struct vm_impl* vm_impl = new vm_impl(); vm->vm = (union Data*)vm_impl; + vm_impl->vm_impl = NULL; vm_impl->i = 0; - vm_impl->sz = 0; + vm_impl->pte = NULL; + vm_impl->sz = 0; + vm_impl->loaduvm_ptesize_check = C_loaduvm_ptesize_checkvm_impl; + vm_impl->loaduvm_loop = C_loaduvm_loopvm_impl; vm->init_vmm = C_init_vmmvm_impl; vm->kpt_freerange = C_kpt_freerangevm_impl; vm->kpt_alloc = C_kpt_allocvm_impl; @@ -36,10 +41,15 @@ return vm; } - +extern struct { + struct spinlock lock; + struct run *freelist; +} kpt_mem; __code init_vmmvm_impl(struct vm_impl* vm, __code next(...)) { - + initlock(&kpt_mem.lock, "vm"); + kpt_mem.freelist = NULL; + goto next(...); } @@ -64,9 +74,14 @@ goto next(...); } -__code loaduvmvm_impl(struct vm_impl* vm,pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...)) { - - goto next(...); +__code loaduvmvm_impl(struct vm_impl* vm, pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...)) { + vm->pgdir = pgdir; + vm->addr = addr; + vm->ip = ip; + vm->offset = offset; + vm->sz = sz; + + goto loaduvm_ptesize_checkvm_impl(vm, next); } __code allocuvmvm_impl(struct vm_impl* vm, pde_t* pgdir, uint oldsz, uint newsz, __code next(...)) { @@ -99,4 +114,3 @@ goto next(...); } - diff -r b73c5bd61c37 -r ab5a80021afe src/impl/vm_impl.h --- a/src/impl/vm_impl.h Thu Jan 23 01:55:03 2020 +0900 +++ b/src/impl/vm_impl.h Thu Jan 23 20:33:39 2020 +0900 @@ -1,10 +1,18 @@ typedef struct vm_impl impl vm{ + union Data* vm_impl; uint i; pte_t* pte; - unsigned int sz; - + uint sz; + pde_t* pgdir; + char* addr; + struct inode* ip; + uint offset; + uint pa; + uint n; + + __code init_vmm(Type* vm_impl, __code next(...)); __code loaduvm_ptesize_check(Type* vm_impl, __code next(...)); - __code loaduvm_loop(Type* vm_impl, uint i, pte_t* pte, unsigned int sz, __code next(...)); + __code loaduvm_loop(Type* vm_impl, uint i, pte_t* pte, uint sz, __code next(...)); __code next(...); diff -r b73c5bd61c37 -r ab5a80021afe src/impl/vm_impl_private.cbc --- a/src/impl/vm_impl_private.cbc Thu Jan 23 01:55:03 2020 +0900 +++ b/src/impl/vm_impl_private.cbc Thu Jan 23 20:33:39 2020 +0900 @@ -1,14 +1,108 @@ #include "../../context.h" +#include "mmu.h" +#include "memlayout.h" #interface "vm_impl.h" -#define __ncode + +/* +vm_impl* createvm_impl2(); +*/ + +__code loaduvm_ptesize_checkvm_impl(struct vm_impl* vm_impl, __code next(...)) { + char* addr = vm_impl->addr; -__ncode loaduvm_ptesize_checkvm_impl(struct vm_impl* vm, enum Code next) { + if ((uint) addr %PTE_SZ != 0) { + // goto panic + } + + goto loaduvm_loopvm_impl(vm_impl, next(...)); +} - // goto meta(); +__code loaduvm_loopvm_impl(struct vm_impl* vm_impl, __code next(...)) { + uint i = vm_impl->i; + uint sz = vm_impl->sz; + + if (i < sz) { + goto loaduvm_check_pgdir(vm_impl, next(...)); + } + + goto loaduvm_exit(vm_impl, next(...)); } -__ncode loaduvm_loopvm_impl(struct vm_impl* vm, uint* i, pte_t* pte, uint sz, enum Code next) { + +static pte_t* walkpgdir (pde_t *pgdir, const void *va, int alloc) +{ + pde_t *pde; + pte_t *pgtab; + + // pgdir points to the page directory, get the page direcotry entry (pde) + pde = &pgdir[PDE_IDX(va)]; + + if (*pde & PE_TYPES) { + pgtab = (pte_t*) p2v(PT_ADDR(*pde)); - // goto meta(); + } else { + if (!alloc || (pgtab = (pte_t*) kpt_alloc()) == 0) { + return 0; + } + + // Make sure all those PTE_P bits are zero. + memset(pgtab, 0, PT_SZ); + + // The permissions here are overly generous, but they can + // be further restricted by the permissions in the page table + // entries, if necessary. + *pde = v2p(pgtab) | UPDE_TYPE; + } + + return &pgtab[PTE_IDX(va)]; } + +__code loaduvm_check_pgdir(struct vm_impl* vm_impl, __code next(...)) { + pte_t* pte = vm_impl->pte; + pde_t* pgdir = vm_impl->pgdir; + uint i = vm_impl->i; + char* addr = vm_impl->addr; + uint pa = vm_impl->pa; + + if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) { + // goto panic + } + pa = PTE_ADDR(*pte); + + vm_impl->pte = pte; + vm_impl->pgdir = pgdir; + vm_impl->addr = addr; + vm_impl->pa = pa; + + goto loaduvm_check_PTE_SZ(vm_impl, next(...)); +} + +__code loaduvm_check_PTE_SZ(struct vm_impl* vm_impl, __code next(...)) { + uint sz = vm_impl->sz; + uint i = vm_impl->i; + uint n = vm_impl->n; + struct inode* ip = vm_impl->ip; + uint pa = vm_impl->pa; + uint offset = vm_impl->offset; + + if (sz - i < PTE_SZ) { + n = sz - i; + } else { + n = PTE_SZ; + } + + if (readi(ip, p2v(pa), offset + i, n) != n) { + // panic + // return -1; + } + + vm_impl->n = n; + + goto loaduvm_exit(vm_impl, next(...)); +} + +__code loaduvm_exit(struct vm_impl* vm_impl, __code next(...)) { + + goto next(...); +}