Mercurial > hg > CbC > CbC_xv6
annotate src/impl/vm_impl.cbc @ 253:124c51584208
update vm_impl.h
author | anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 04 Feb 2020 14:33:56 +0900 |
parents | 58da7a1234f7 |
children | 17ccc6e21e35 |
rev | line source |
---|---|
192 | 1 #include "../../context.h" |
190 | 2 #interface "vm.h" |
3 | |
4 // ---- | |
5 // typedef struct vm_impl<Impl, Isa> impl vm{ | |
196 | 6 // union Data* vm_impl; |
193 | 7 // uint i; |
196 | 8 // pte_t* pte; |
9 // uint sz; | |
190 | 10 // |
193 | 11 // __code loaduvm_ptesize_check(Type* vm_impl, __code next(...)); |
196 | 12 // __code loaduvm_loop(Type* vm_impl, uint i, pte_t* pte, uint sz, __code next(...)); |
193 | 13 // __code next(...); |
190 | 14 // |
15 // | |
16 // } vm_impl; | |
17 // ---- | |
18 | |
19 vm* createvm_impl(struct Context* cbc_context) { | |
20 struct vm* vm = new vm(); | |
21 struct vm_impl* vm_impl = new vm_impl(); | |
22 vm->vm = (union Data*)vm_impl; | |
196 | 23 vm_impl->vm_impl = NULL; |
193 | 24 vm_impl->i = 0; |
196 | 25 vm_impl->pte = NULL; |
26 vm_impl->sz = 0; | |
27 vm_impl->loaduvm_ptesize_check = C_loaduvm_ptesize_checkvm_impl; | |
28 vm_impl->loaduvm_loop = C_loaduvm_loopvm_impl; | |
205 | 29 vm_impl->allocuvm_check_newsz = C_allocuvm_check_newszvm_impl; |
30 vm_impl->allocuvm_loop = C_allocuvm_loopvm_impl; | |
208 | 31 vm_impl->copyuvm_check_null = C_copyuvm_check_nullvm_impl; |
32 vm_impl->copyuvm_loop = C_copyuvm_loopvm_impl; | |
211 | 33 vm_impl->uva2ka_check_pe_types = C_uva2ka_check_pe_types; |
213 | 34 vm_impl->paging_intvm_impl = C_paging_intvmvm_impl; |
214 | 35 vm_impl->copyout_loopvm_impl = C_copyout_loopvm_impl; |
217 | 36 vm_impl->switchuvm_check_pgdirvm_impl = C_switchuvm_check_pgdirvm_impl; |
218 | 37 vm_impl->init_inituvm_check_sz = C_init_inituvm_check_sz; |
227 | 38 vm->void_ret = C_vm_void_ret; |
190 | 39 vm->init_vmm = C_init_vmmvm_impl; |
40 vm->kpt_freerange = C_kpt_freerangevm_impl; | |
41 vm->kpt_alloc = C_kpt_allocvm_impl; | |
42 vm->switchuvm = C_switchuvmvm_impl; | |
43 vm->init_inituvm = C_init_inituvmvm_impl; | |
44 vm->loaduvm = C_loaduvmvm_impl; | |
45 vm->allocuvm = C_allocuvmvm_impl; | |
46 vm->clearpteu = C_clearpteuvm_impl; | |
47 vm->copyuvm = C_copyuvmvm_impl; | |
48 vm->uva2ka = C_uva2kavm_impl; | |
49 vm->copyout = C_copyoutvm_impl; | |
213 | 50 vm->paging_int = C_paging_intvm_impl; |
190 | 51 return vm; |
52 } | |
53 | |
201 | 54 extern struct { |
55 struct spinlock lock; | |
56 struct run *freelist; | |
57 } kpt_mem; | |
190 | 58 |
227 | 59 __code init_vmmvm_impl(struct vm_impl* vm,__code next(...)) { |
201 | 60 initlock(&kpt_mem.lock, "vm"); |
61 kpt_mem.freelist = NULL; | |
62 | |
227 | 63 goto next(...); |
190 | 64 } |
65 | |
202 | 66 extern struct run { |
67 struct run *next; | |
68 }; | |
190 | 69 |
202 | 70 static void _kpt_free (char *v) |
71 { | |
72 struct run *r; | |
73 | |
74 r = (struct run*) v; | |
75 r->next = kpt_mem.freelist; | |
76 kpt_mem.freelist = r; | |
190 | 77 } |
78 | |
202 | 79 __code kpt_freerangevm_impl(struct vm_impl* vm, uint low, uint hi, __code next(...)) { |
80 | |
81 if (low < hi) { | |
82 _kpt_free((char*)low); | |
83 goto kpt_freerangevm_impl(vm, low + PT_SZ, hi, next(...)); | |
84 | |
85 } | |
86 goto next(...); | |
87 } | |
88 __code kpt_allocvm_impl(struct vm_impl* vm, __code next(...)) { | |
89 acquire(&kpt_mem.lock); | |
190 | 90 |
203 | 91 goto kpt_alloc_check_impl(vm_impl, next(...)); |
190 | 92 } |
93 | |
193 | 94 typedef struct proc proc; |
205 | 95 __code switchuvmvm_impl(struct vm_impl* vm , struct proc* p, __code next(...)) { //:skip |
190 | 96 |
217 | 97 goto switchuvm_check_pgdirvm_impl(...); |
190 | 98 } |
99 | |
218 | 100 __code init_inituvmvm_impl(struct vm_impl* vm, pde_t* pgdir, char* init, uint sz, __code next(...)) { |
190 | 101 |
228
d1c7018537c0
write static constructor
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
227
diff
changeset
|
102 Gearef(cbc_context, vm_impl)->pgdir = pgdir; |
d1c7018537c0
write static constructor
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
227
diff
changeset
|
103 Gearef(cbc_context, vm_impl)->init = init; |
d1c7018537c0
write static constructor
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
227
diff
changeset
|
104 Gearef(cbc_context, vm_impl)->sz = sz; |
d1c7018537c0
write static constructor
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
227
diff
changeset
|
105 Gearef(cbc_context, vm_impl)->next = next; |
218 | 106 goto init_inituvm_check_sz(vm, pgdir, init, sz, next(...)); |
190 | 107 } |
108 | |
197 | 109 __code loaduvmvm_impl(struct vm_impl* vm, pde_t* pgdir, char* addr, struct inode* ip, uint offset, uint sz, __code next(...)) { |
231
58da7a1234f7
s/vm->impl=/Gearef/
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
228
diff
changeset
|
110 Gearef(cbc_context, vm_impl)->pgdir = pgdir; |
58da7a1234f7
s/vm->impl=/Gearef/
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
228
diff
changeset
|
111 Gearef(cbc_context, vm_impl)->addr = addr; |
58da7a1234f7
s/vm->impl=/Gearef/
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
228
diff
changeset
|
112 Gearef(cbc_context, vm_impl)->ip = ip; |
58da7a1234f7
s/vm->impl=/Gearef/
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
228
diff
changeset
|
113 Gearef(cbc_context, vm_impl)->offset = offset; |
58da7a1234f7
s/vm->impl=/Gearef/
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
228
diff
changeset
|
114 Gearef(cbc_context, vm_impl)->sz = sz; |
58da7a1234f7
s/vm->impl=/Gearef/
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
228
diff
changeset
|
115 Gearef(cbc_context, vm_impl)->next = next; |
58da7a1234f7
s/vm->impl=/Gearef/
anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
parents:
228
diff
changeset
|
116 |
210 | 117 goto loaduvm_ptesize_checkvm_impl(vm, next(...)); |
190 | 118 } |
119 | |
193 | 120 __code allocuvmvm_impl(struct vm_impl* vm, pde_t* pgdir, uint oldsz, uint newsz, __code next(...)) { |
190 | 121 |
205 | 122 goto allocuvm_check_newszvm_impl(vm, pgdir, oldsz, newsz, next(...)); |
190 | 123 } |
124 | |
125 __code clearpteuvm_impl(struct vm_impl* vm, pde_t* pgdir, char* uva, __code next(...)) { | |
126 | |
210 | 127 goto clearpteu_check_ptevm_impl(vm, pgdir, uva, next(...)); |
190 | 128 } |
129 | |
193 | 130 __code copyuvmvm_impl(struct vm_impl* vm, pde_t* pgdir, uint sz, __code next(...)) { |
190 | 131 |
208 | 132 goto copyuvm_check_nullvm_impl(vm, pgdir, sz, __code next(...)); |
190 | 133 } |
134 | |
135 __code uva2kavm_impl(struct vm_impl* vm, pde_t* pgdir, char* uva, __code next(...)) { | |
136 | |
211 | 137 goto uva2ka_check_pe_types(vm, pgdir, uva, next(...)); |
190 | 138 } |
139 | |
193 | 140 __code copyoutvm_impl(struct vm_impl* vm, pde_t* pgdir, uint va, void* pp, uint len, __code next(...)) { |
214 | 141 |
142 vm->buf = (char*) pp; | |
143 | |
215 | 144 goto copyout_loopvm_impl(vm, pgdir, va, pp, len, va0, pa0, next(...)); |
190 | 145 } |
146 | |
213 | 147 __code paging_intvm_impl(struct vm_impl* vm, uint phy_low, uint phy_hi, __code next(...)) { |
190 | 148 |
213 | 149 goto paging_intvmvm_impl(vm, phy_low, phy_hi, next(...)); |
190 | 150 } |
151 | |
227 | 152 __code vm_void_ret(struct vm_impl* vm) { |
153 return; | |
154 } |