package nachos.userprog;
import nachos.machine.*;
import nachos.threads.*;
import nachos.userprog.*;
import java.util.*;
public class PageTableDriver {
public PageTableDriver(UserProcess proc) {
this.proc = proc;
int numPhysPages = Machine.processor().getNumPhysPages();
entries = new TranslationEntry[numPhysPages];
for(int i = 0; i < numPhysPages; i++) {
entries[i] = new TranslationEntry(i, i, false, false, false, false);
}
}
public void map(int vadr, int padr) {
entries[vadr] = new TranslationEntry(vadr, padr, true, false, false, false);
}
public int alloc(boolean readonly) {
UserKernel.memdrv.acquire();
int p = UserKernel.memdrv.alloc(proc);
UserKernel.memdrv.release();
if(p == -1)
return -1;
entries[next_vaddr] = new TranslationEntry(next_vaddr, p, true, readonly, false, false);
next_vaddr++;
return next_vaddr - 1;
}
public void destroy() {
UserKernel.memdrv.acquire();
UserKernel.memdrv.freeAll(proc);
UserKernel.memdrv.release();
}
public int translate(int vadr) {
int vpn = vadr / pageSize, poff = vadr % pageSize;
int ppn = find(vpn);
if(ppn == -1)
return -1;
return ppn * pageSize + poff;
}
public int find(int vpn) {
if(vpn < 0 || vpn > Machine.processor().getNumPhysPages())
return -1;
return entries[vpn].valid ? entries[vpn].ppn : -1;
}
public TranslationEntry[] getPageTable() {
return entries;
}
private TranslationEntry[] entries;
private UserProcess proc;
private int next_vaddr = 0, pageSize = Processor.pageSize;
}