#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.
lgdt(c->gdt, sizeof(c->gdt));
loadgs(SEG_KCPU << 3);
-
+
// Initialize cpu-local storage.
cpu = c;
proc = 0;
// 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;
}
{
char *a, *last;
pte_t *pte;
-
+
a = (char*)PGROUNDDOWN((uint)va);
last = (char*)PGROUNDDOWN(((uint)va) + size - 1);
for(;;){
// 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
// 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)
//
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;
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);
}
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;
}