void * frame_evict() { ASSERT(lock_held_by_current_thread(&vm_lock)); uint32_t e_ptr = frametable.evict_ptr; while(1) { if (frametable.frametable[frametable.evict_ptr].pin == false && frametable.frametable[frametable.evict_ptr].pte != (void*) 0xFFFFFFFF) { struct pagetable_entry* old_pte = frametable.frametable[frametable.evict_ptr].pte; struct thread *t = thread_from_tid(frametable.frametable[frametable.evict_ptr].tid); if (old_pte->accessed) { pagedir_set_accessed(t->pagedir, pg_no_to_addr(frametable.frametable[frametable.evict_ptr].virt_address), false); continue; } // First we MUST mark the page as not present so that no // further accesses and modifications of the page content // are possible pagedir_set_not_present(t->pagedir, pg_no_to_addr(frametable.frametable[frametable.evict_ptr].virt_address)); if (old_pte->writable) { struct spage_table_entry ecmp, *e; struct hash_elem *elem; ecmp.vaddr = pg_no_to_addr(frametable.frametable[frametable.evict_ptr].virt_address); elem = hash_find(&t->sup_pagetable, &ecmp.elem); if (elem == NULL) { //swap struct swaptable_entry * st_e = create_swaptable_entry(pagenum_to_page(frametable.evict_ptr)); swap_add(st_e); spage_map_swap(pg_no_to_addr( frametable.frametable[frametable.evict_ptr].virt_address), st_e, t); } else { e = hash_entry(elem, struct spage_table_entry, elem); if (e->flags & SPTE_MMAP && old_pte->dirty) { //flush spage_flush_mmap(e, pagenum_to_page(frametable.evict_ptr)); //reset dirty bit pagedir_set_dirty(t->pagedir, e->vaddr, false); } else if (!(e->flags & SPTE_MMAP)) { //file backed writable entry PANIC("SWAP of page with spage entry!"); } } } frametable.frametable[frametable.evict_ptr].pte = (void*) 0xFFFFFFFF; void* tmp = pagenum_to_page(frametable.evict_ptr); log_debug("### Evict page at 0x%08x ###\n", (uint32_t) tmp); frametable.evict_ptr = (frametable.evict_ptr + 1) % frametable.size; return tmp; } // jump to next position frametable.evict_ptr = (frametable.evict_ptr + 1) % frametable.size; if (e_ptr == frametable.evict_ptr) PANIC("Nothing to evict and nothing swappable"); } }
int caller(){ int arg1 = 222; int arg2 = 333; int sum = swap_add(&arg1, &arg2); int diff = arg1 - arg2; return sum*diff; }
int caller() { int arg1 = 534; int arg2 = 1057; int sum = swap_add(&arg1, &arg2); int diff = arg1 - arg2; return sum * diff; }