void pt_page_in(vaddr_t vaddr, struct segment *s) { int spl = splhigh(); _vmstats_inc(VMSTAT_TLB_FAULT); //get the page detail int pt_offset_id = (vaddr - s->vbase) / PAGE_SIZE; struct page_detail *pd = &(s->pt->page_details[pt_offset_id]); if (pd->valid && pd->pfn != -1){ pd->use = 1; _vmstats_inc(VMSTAT_TLB_RELOAD); tlb_add_entry(vaddr, pd->pfn*PAGE_SIZE, s->writeable, 1); splx(spl); return; }else if(pd->sfn != -1){ splx(spl); pd->use = 1; pd->pfn = cm_getppage(); swap_read(pd->pfn,pd->sfn); pd->sfn = -1; //add the tlb entry tlb_add_entry(vaddr, pd->pfn*PAGE_SIZE, s->writeable, 1); //finish the load cm_finish_paging(pd->pfn, pd); }else{ splx(spl); pd->use = 1; pd->pfn = cm_getppage(); load_segment_page(curthread->t_vmspace->file, vaddr, s, pd->pfn*PAGE_SIZE); //add the tlb entry tlb_add_entry(vaddr, pd->pfn*PAGE_SIZE, s->writeable, 1); //finish the load cm_finish_paging(pd->pfn, pd); } }
void page_fault_handler(page_virt pv){ // Get a Free block if(pm_isFull()){ printf("PF: Unload a page\n"); unloadAPage(); // fill } page_phys pp = pm_getFreePage(); // Mark page as loaded printf("PF: Load a page (%d)\n",pv); loadAPage(pv); // fill // Read from Swap if(page_table[pv].status == SWAPPED){ swap_read(pv,pp); } // Update page table page_table[pv].pp=pp; page_table[pv].status=ALLOCATED; // Write to MMU mmu_addTranslation(pv,pp); // That's all }
bool swap_load (struct frame *frame) { //printf ("[Debug] swap_load ()!\n"); struct swap_slot *slot = swap_search (frame->suppage); if (slot == NULL) return false; swap_read (slot->sec_no_start, frame->kpage, PGSIZE); swap_remove (slot); //printf ("[Debug] success of swap_load ()!\n"); return true; }