Esempio n. 1
0
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");
       }

}
Esempio n. 2
0
int caller(){
	int arg1 = 222;
	int arg2 = 333;
	int sum = swap_add(&arg1, &arg2);
	int diff = arg1 - arg2;
	return sum*diff;
}
Esempio n. 3
0
int caller() {
    int arg1 = 534;
    int arg2 = 1057;
    int sum = swap_add(&arg1, &arg2);
    int diff = arg1 - arg2;

    return sum * diff;
}