From 36c51aac585ae467f3dd946ad44164df62dc8ac8 Mon Sep 17 00:00:00 2001 From: "Peter H. Froehlich" Date: Sat, 10 Oct 2015 23:40:05 -0400 Subject: [PATCH] Check more kalloc()/mappages() failures, nits. --- vm.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/vm.c b/vm.c index 5326d14..fc61781 100644 --- a/vm.c +++ b/vm.c @@ -8,8 +8,7 @@ #include "elf.h" extern char data[]; // defined by kernel.ld -pde_t *kpgdir; // for use in scheduler() -struct segdesc gdt[NSEGS]; +static pde_t *kpgdir; // for use in scheduler() // Set up CPU's kernel segment descriptors. // Run once on entry on each CPU. @@ -33,7 +32,7 @@ seginit(void) lgdt(c->gdt, sizeof(c->gdt)); loadgs(SEG_KCPU << 3); - + // Initialize cpu-local storage. cpu = c; proc = 0; @@ -57,7 +56,7 @@ walkpgdir(pde_t *pgdir, const void *va, int alloc) // Make sure all those PTE_P bits are zero. memset(pgtab, 0, PGSIZE); // The permissions here are overly generous, but they can - // be further restricted by the permissions in the page table + // be further restricted by the permissions in the page table // entries, if necessary. *pde = v2p(pgtab) | PTE_P | PTE_W | PTE_U; } @@ -72,7 +71,7 @@ mappages(pde_t *pgdir, void *va, uint size, uint pa, int perm) { char *a, *last; pte_t *pte; - + a = (char*)PGROUNDDOWN((uint)va); last = (char*)PGROUNDDOWN(((uint)va) + size - 1); for(;;){ @@ -94,7 +93,7 @@ mappages(pde_t *pgdir, void *va, uint size, uint pa, int perm) // current process's page table during system calls and interrupts; // page protection bits prevent user code from using the kernel's // mappings. -// +// // setupkvm() and exec() set up every page table like this: // // 0..KERNBASE: user memory (text+data+stack+heap), mapped to @@ -102,7 +101,7 @@ mappages(pde_t *pgdir, void *va, uint size, uint pa, int perm) // KERNBASE..KERNBASE+EXTMEM: mapped to 0..EXTMEM (for I/O space) // KERNBASE+EXTMEM..data: mapped to EXTMEM..V2P(data) // for the kernel's instructions and r/o data -// data..KERNBASE+PHYSTOP: mapped to V2P(data)..PHYSTOP, +// data..KERNBASE+PHYSTOP: mapped to V2P(data)..PHYSTOP, // rw data + free physical memory // 0xfe000000..0: mapped direct (devices such as ioapic) // @@ -137,7 +136,7 @@ setupkvm(void) if (p2v(PHYSTOP) > (void*)DEVSPACE) panic("PHYSTOP too high"); for(k = kmap; k < &kmap[NELEM(kmap)]; k++) - if(mappages(pgdir, k->virt, k->phys_end - k->phys_start, + if(mappages(pgdir, k->virt, k->phys_end - k->phys_start, (uint)k->phys_start, k->perm) < 0) return 0; return pgdir; @@ -182,12 +181,14 @@ void inituvm(pde_t *pgdir, char *init, uint sz) { char *mem; - + if(sz >= PGSIZE) panic("inituvm: more than a page"); - mem = kalloc(); + if ((mem = kalloc()) == 0) + panic("inituvm: cannot allocate memory"); memset(mem, 0, PGSIZE); - mappages(pgdir, 0, PGSIZE, v2p(mem), PTE_W|PTE_U); + if (mappages(pgdir, 0, PGSIZE, v2p(mem), PTE_W|PTE_U) < 0) + panic("inituvm: cannot create pagetable"); memmove(mem, init, sz); } @@ -237,7 +238,8 @@ allocuvm(pde_t *pgdir, uint oldsz, uint newsz) return 0; } memset(mem, 0, PGSIZE); - mappages(pgdir, (char*)a, PGSIZE, v2p(mem), PTE_W|PTE_U); + if (mappages(pgdir, (char*)a, PGSIZE, v2p(mem), PTE_W|PTE_U) < 0) + panic("allocuvm: cannot create pagetable"); } return newsz; } -- 2.50.1