diff options
| -rw-r--r-- | kernel/vm.c | 15 | 
1 files changed, 11 insertions, 4 deletions
| diff --git a/kernel/vm.c b/kernel/vm.c index 486945e..5c31e87 100644 --- a/kernel/vm.c +++ b/kernel/vm.c @@ -136,8 +136,9 @@ kvmmap(pagetable_t kpgtbl, uint64 va, uint64 pa, uint64 sz, int perm)  }  // Create PTEs for virtual addresses starting at va that refer to -// physical addresses starting at pa. va and size might not -// be page-aligned. Returns 0 on success, -1 if walk() couldn't +// physical addresses starting at pa. +// va and size MUST be page-aligned. +// Returns 0 on success, -1 if walk() couldn't  // allocate a needed page-table page.  int  mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) @@ -145,11 +146,17 @@ mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm)    uint64 a, last;    pte_t *pte; +  if((va % PGSIZE) != 0) +    panic("mappages: va not aligned"); + +  if((size % PGSIZE) != 0) +    panic("mappages: size not aligned"); +    if(size == 0)      panic("mappages: size"); -  a = PGROUNDDOWN(va); -  last = PGROUNDDOWN(va + size - 1); +  a = va; +  last = va + size - PGSIZE;    for(;;){      if((pte = walk(pagetable, a, 1)) == 0)        return -1; | 
