Mercurial > hg > Members > menikon > CbC_xv6
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 |