task4 finished
This commit is contained in:
@@ -126,38 +126,40 @@ sys_uptime(void)
|
||||
|
||||
uint64
|
||||
sys_pgaccess(void)
|
||||
{
|
||||
uint64 va;
|
||||
int n;
|
||||
uint64 user_mask_addr;
|
||||
argaddr(0, &va);
|
||||
argint(1, &n);
|
||||
argaddr(2, &user_mask_addr);
|
||||
if (va < 0 || n < 0 || user_mask_addr < 0)
|
||||
return -1;
|
||||
|
||||
if (n < 0 || n > 32)
|
||||
return -1;
|
||||
|
||||
{
|
||||
// lab pgtbl: your code here.
|
||||
struct proc *p = myproc();
|
||||
uint64 mask = 0;
|
||||
unsigned int abits=0;
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
uint64 v = va + i * PGSIZE;
|
||||
pte_t *pte = walk(p->pagetable, v, 0);
|
||||
uint64 addr;
|
||||
argaddr(0, &addr);
|
||||
|
||||
if (!pte || (*pte & PTE_PS))
|
||||
continue;
|
||||
int num;
|
||||
argint(1,&num);
|
||||
|
||||
if ((*pte & PTE_V) && (*pte & PTE_A)) {
|
||||
mask |= (1 << i); // Set bit i in mask
|
||||
*pte &= ~PTE_A; // Clear the Accessed bit
|
||||
uint64 dest;
|
||||
argaddr(2, &dest);
|
||||
|
||||
|
||||
for(int i=0;i<num;i++){
|
||||
uint64 query_addr = addr + i * PGSIZE ;
|
||||
|
||||
|
||||
pte_t * pte=walk(p->pagetable, query_addr, 0);
|
||||
if(*pte&PTE_A)
|
||||
{
|
||||
abits=abits|(1<<i);
|
||||
*pte=(*pte)&(~PTE_A);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (copyout(p->pagetable, user_mask_addr, (char*)&mask, sizeof(mask)) < 0)
|
||||
|
||||
|
||||
if(copyout(p->pagetable,dest,(char*)&abits, sizeof(abits)) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user