comparison src/impl/vm_impl_private.cbc @ 208:a0620ca23f19

be functional loaduvm
author tobaru
date Thu, 23 Jan 2020 17:52:35 +0900
parents 8a55878f6a25
children 66db83ec1ec2
comparison
equal deleted inserted replaced
207:8a55878f6a25 208:a0620ca23f19
6 /* 6 /*
7 vm_impl* createvm_impl2(); 7 vm_impl* createvm_impl2();
8 */ 8 */
9 9
10 __code loaduvm_ptesize_checkvm_impl(struct vm_impl* vm_impl, __code next(...)) { 10 __code loaduvm_ptesize_checkvm_impl(struct vm_impl* vm_impl, __code next(...)) {
11 char* addr = vm_impl->addr;
11 12
12 if ((uint) vm_impl->addr %PTE_SZ != 0) { 13 if ((uint) addr %PTE_SZ != 0) {
13 // goto panic 14 // goto panic
14 } 15 }
15 16
16 goto loaduvm_loopvm_impl(vm_impl, next(...)); 17 goto loaduvm_loopvm_impl(vm_impl, next(...));
17 } 18 }
18 19
19 __code loaduvm_loopvm_impl(struct vm_impl* vm_impl, __code next(...)) { 20 __code loaduvm_loopvm_impl(struct vm_impl* vm_impl, __code next(...)) {
21 uint i = vm_impl->i;
22 uint sz = vm_impl->sz;
20 23
21 if (vm_impl->i < vm_impl->sz) { 24 if (i < sz) {
22 goto loaduvm_check_pgdir(vm_impl, next(...)); 25 goto loaduvm_check_pgdir(vm_impl, next(...));
23 } 26 }
27
24 goto loaduvm_exit(vm_impl, next(...)); 28 goto loaduvm_exit(vm_impl, next(...));
25 } 29 }
30
31
26 static pte_t* walkpgdir (pde_t *pgdir, const void *va, int alloc) 32 static pte_t* walkpgdir (pde_t *pgdir, const void *va, int alloc)
27 { 33 {
28 pde_t *pde; 34 pde_t *pde;
29 pte_t *pgtab; 35 pte_t *pgtab;
30 36
51 return &pgtab[PTE_IDX(va)]; 57 return &pgtab[PTE_IDX(va)];
52 } 58 }
53 59
54 60
55 __code loaduvm_check_pgdir(struct vm_impl* vm_impl, __code next(...)) { 61 __code loaduvm_check_pgdir(struct vm_impl* vm_impl, __code next(...)) {
56 if ((vm_impl->pte = walkpgdir(vm_impl->pgdir, vm_impl->addr + vm_impl->i, 0)) == 0) { 62 pte_t* pte = vm_impl->pte;
63 pde_t* pgdir = vm_impl->pgdir;
64 uint i = vm_impl->i;
65 char* addr = vm_impl->addr;
66 uint pa = vm_impl->pa;
67
68 if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) {
57 // goto panic 69 // goto panic
58 } 70 }
59 vm_impl->pa = PTE_ADDR(*vm_impl->pte); 71 pa = PTE_ADDR(*pte);
60 72
73 vm_impl->pte = pte;
74 vm_impl->pgdir = pgdir;
75 vm_impl->addr = addr;
76 vm_impl->pa = pa;
77
61 goto loaduvm_check_PTE_SZ(vm_impl, next(...)); 78 goto loaduvm_check_PTE_SZ(vm_impl, next(...));
62 } 79 }
63 80
64 __code loaduvm_check_PTE_SZ(struct vm_impl* vm_impl, __code next(...)) { 81 __code loaduvm_check_PTE_SZ(struct vm_impl* vm_impl, __code next(...)) {
65 if (vm_impl->sz - vm_impl->i < PTE_SZ) { 82 uint sz = vm_impl->sz;
66 vm_impl->n = vm_impl->sz - vm_impl->i; 83 uint i = vm_impl->i;
84 uint n = vm_impl->n;
85 struct inode* ip = vm_impl->ip;
86 uint pa = vm_impl->pa;
87 uint offset = vm_impl->offset;
88
89 if (sz - i < PTE_SZ) {
90 n = sz - i;
67 } else { 91 } else {
68 vm_impl->n = PTE_SZ; 92 n = PTE_SZ;
69 } 93 }
70 94
71 if (readi(vm_impl->ip, p2v(vm_impl->pa), vm_impl->offset + vm_impl->i, vm_impl->n) != vm_impl->n) { 95 if (readi(ip, p2v(pa), offset + i, n) != n) {
72 // panic 96 // panic
73 // return -1; 97 // return -1;
74 } 98 }
75 99
100 vm_impl->n = n;
101
76 goto loaduvm_exit(vm_impl, next(...)); 102 goto loaduvm_exit(vm_impl, next(...));
77 } 103 }
78 104
79 __code loaduvm_exit(struct vm_impl* vm_impl, __code next(...)) { 105 __code loaduvm_exit(struct vm_impl* vm_impl, __code next(...)) {
80 106