|
@@ -350,14 +350,9 @@ struct addrspace * as_create(void)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
- as->as_vbase1 = 0;
|
|
|
- as->as_pbase1 = 0;
|
|
|
- as->as_npages1 = 0;
|
|
|
- as->as_vbase2 = 0;
|
|
|
- as->as_pbase2 = 0;
|
|
|
- as->as_npages2 = 0;
|
|
|
- as->as_stackpbase = 0;
|
|
|
- as->loading = true;
|
|
|
+ as->pt = NULL;
|
|
|
+ as->regions = 0;
|
|
|
+ as->pages = 0;
|
|
|
|
|
|
return as;
|
|
|
}
|
|
@@ -420,22 +415,52 @@ as_define_region(struct addrspace *as, vaddr_t vaddr, size_t sz,
|
|
|
(void)readable;
|
|
|
(void)writeable;
|
|
|
(void)executable;
|
|
|
-
|
|
|
- if (as->as_vbase1 == 0) {
|
|
|
- as->as_vbase1 = vaddr;
|
|
|
- as->as_npages1 = npages;
|
|
|
- return 0;
|
|
|
+
|
|
|
+ if (as->regions > 2) goto skip3;
|
|
|
+
|
|
|
+ // code segment not inited yet
|
|
|
+ if (!(as->regions))
|
|
|
+ {
|
|
|
+ as->pt = kmalloc(npages * sizeof(struct pte));
|
|
|
+ for (int i = 0; i < npages; ++i)
|
|
|
+ {
|
|
|
+ pt[i].section = 0;
|
|
|
+ pt[i].pageStart = NULL;
|
|
|
+ pt[i].frame = -1;
|
|
|
+ }
|
|
|
+ ++as->regions;
|
|
|
+ as->pages += npages;
|
|
|
+ return 0;
|
|
|
}
|
|
|
-
|
|
|
- if (as->as_vbase2 == 0) {
|
|
|
- as->as_vbase2 = vaddr;
|
|
|
- as->as_npages2 = npages;
|
|
|
- return 0;
|
|
|
+
|
|
|
+ // this is the data segment
|
|
|
+ if (as->regions == 1)
|
|
|
+ {
|
|
|
+ // alloc new pt, copy over data
|
|
|
+ struct pte * temp = kmalloc((npages + as->pages) * sizeof(struct pte));
|
|
|
+ for (int i = 0; i < as->pages; ++i)
|
|
|
+ {
|
|
|
+ temp[i] = as->pt[i];
|
|
|
+ }
|
|
|
+
|
|
|
+ // fill in new section's entries
|
|
|
+ for (int i = as->pages; i < (npages + as->pages); ++i)
|
|
|
+ {
|
|
|
+ temp[i].section = 1;
|
|
|
+ temp[i].pageStart = NULL;
|
|
|
+ temp[i].frame = -1;
|
|
|
+ }
|
|
|
+ kfree(as->pt);
|
|
|
+ as->pt = temp;
|
|
|
+ ++as->regions;
|
|
|
+ as->pages += npages;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
* Support for more than two regions is not available.
|
|
|
*/
|
|
|
+ skip3:
|
|
|
kprintf("dumbvm: Warning: too many regions\n");
|
|
|
return EUNIMP;
|
|
|
}
|
|
@@ -450,10 +475,30 @@ as_zero_region(paddr_t paddr, unsigned npages)
|
|
|
int
|
|
|
as_prepare_load(struct addrspace *as)
|
|
|
{
|
|
|
- KASSERT(as->as_pbase1 == 0);
|
|
|
- KASSERT(as->as_pbase2 == 0);
|
|
|
- KASSERT(as->as_stackpbase == 0);
|
|
|
-
|
|
|
+ // alloc new pt, copy over data
|
|
|
+ struct pte * temp = kmalloc((DUMBVM_STACKPAGES + as->pages) * sizeof(struct pte));
|
|
|
+ for (int i = 0; i < as->pages; ++i)
|
|
|
+ {
|
|
|
+ temp[i] = as->pt[i];
|
|
|
+ }
|
|
|
+
|
|
|
+ // fill in stack section's entries
|
|
|
+ for (int i = as->pages; i < (DUMBVM_STACKPAGES + as->pages); ++i)
|
|
|
+ {
|
|
|
+ temp[i].section = 2;
|
|
|
+ temp[i].pageStart = NULL;
|
|
|
+ temp[i].frame = -1;
|
|
|
+ }
|
|
|
+ ++as->regions;
|
|
|
+ as->pages += DUMBVM_STACKPAGES;
|
|
|
+
|
|
|
+
|
|
|
+ for (int i = 0; i < as->pages; +=i)
|
|
|
+ {
|
|
|
+ as->pt[i].pageStart
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
as->as_pbase1 = alloc_kpages(as->as_npages1) - MIPS_KSEG0;
|
|
|
if (as->as_pbase1 == 0) {
|
|
|
return ENOMEM;
|