int deallocuvm(pde_t*, uint, uint);
void freevm(pde_t*);
void inituvm(pde_t*, char*, uint);
-int loaduvm(pde_t*, char*, struct inode *, uint, uint);
-pde_t* copyuvm(pde_t*,uint);
+int loaduvm(pde_t*, char*, struct inode*, uint, uint);
+pde_t* copyuvm(pde_t*, uint);
void switchuvm(struct proc*);
void switchkvm(void);
-int copyout(pde_t *pgdir, uint va, void *buf, uint len);
+int copyout(pde_t*, uint, void*, uint);
// number of elements in fixed-size array
#define NELEM(x) (sizeof(x)/sizeof((x)[0]))
int
allocuvm(pde_t *pgdir, uint oldsz, uint newsz)
{
- char *a, *last, *mem;
+ char *mem;
+ uint a;
if(newsz > USERTOP)
return 0;
if(newsz < oldsz)
return oldsz;
- a = (char*)PGROUNDUP(oldsz);
- last = PGROUNDDOWN(newsz - 1);
- for(; a <= last; a += PGSIZE){
+ a = PGROUNDUP(oldsz);
+ for(; a < newsz; a += PGSIZE){
mem = kalloc();
if(mem == 0){
cprintf("allocuvm out of memory\n");
return 0;
}
memset(mem, 0, PGSIZE);
- mappages(pgdir, a, PGSIZE, PADDR(mem), PTE_W|PTE_U);
+ mappages(pgdir, (char*)a, PGSIZE, PADDR(mem), PTE_W|PTE_U);
}
return newsz;
}
int
deallocuvm(pde_t *pgdir, uint oldsz, uint newsz)
{
- char *a, *last;
pte_t *pte;
- uint pa;
+ uint a, pa;
if(newsz >= oldsz)
return oldsz;
- a = (char*)PGROUNDUP(newsz);
- last = PGROUNDDOWN(oldsz - 1);
- for(; a <= last; a += PGSIZE){
- pte = walkpgdir(pgdir, a, 0);
+ a = PGROUNDUP(newsz);
+ for(; a < oldsz; a += PGSIZE){
+ pte = walkpgdir(pgdir, (char*)a, 0);
if(pte && (*pte & PTE_P) != 0){
pa = PTE_ADDR(*pte);
if(pa == 0)
// copy some data to user address va in page table pgdir.
// most useful when pgdir is not the current page table.
-// returns 1 if everthing OK, 0 on error.
// uva2ka ensures this only works for PTE_U pages.
int
copyout(pde_t *pgdir, uint va, void *xbuf, uint len)