summaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/vm.c b/vm.c
index 8a57ca9..a60c915 100644
--- a/vm.c
+++ b/vm.c
@@ -195,7 +195,8 @@ allocuvm(pde_t *pgdir, char *addr, uint sz)
if(pte == 0 || (*pte & PTE_P) == 0){
char *mem = kalloc();
if(mem == 0){
- // XXX clean up?
+ cprintf("allocuvm out of memory\n");
+ deallocuvm(pgdir, addr, sz);
return 0;
}
memset(mem, 0, PGSIZE);
@@ -312,13 +313,17 @@ copyuvm(pde_t *pgdir, uint sz)
if(*pte & PTE_P){
pa = PTE_ADDR(*pte);
if (!(mem = kalloc()))
- return 0;
+ goto bad;
memmove(mem, (char *)pa, PGSIZE);
if (!mappages(d, (void *)i, PGSIZE, PADDR(mem), PTE_W|PTE_U))
- return 0;
+ goto bad;
}
}
return d;
+
+bad:
+ freevm(d);
+ return 0;
}
// Allocate one page table for the machine for the kernel address