usertests and optional finished
This commit is contained in:
@ -163,3 +163,42 @@ sys_pgaccess(void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef LAB_PGTBL
|
||||
uint64
|
||||
sys_dirtypages(void)
|
||||
{
|
||||
struct proc *p = myproc();
|
||||
unsigned int dbits = 0;
|
||||
|
||||
uint64 addr;
|
||||
argaddr(0, &addr);
|
||||
|
||||
int num;
|
||||
argint(1, &num);
|
||||
|
||||
uint64 dest;
|
||||
argaddr(2, &dest);
|
||||
|
||||
// Check each page in the range
|
||||
for(int i = 0; i < num; i++){
|
||||
uint64 query_addr = addr + i * PGSIZE;
|
||||
|
||||
pte_t *pte = walk(p->pagetable, query_addr, 0);
|
||||
if(pte == 0)
|
||||
continue; // Skip pages that don't exist
|
||||
|
||||
if(*pte & PTE_D) {
|
||||
dbits = dbits | (1 << i);
|
||||
// Clear the dirty bit after reading it
|
||||
*pte = (*pte) & (~PTE_D);
|
||||
}
|
||||
}
|
||||
|
||||
// Copy the result back to user space
|
||||
if(copyout(p->pagetable, dest, (char*)&dbits, sizeof(dbits)) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user