int MPTIntro_test1() { set_pdir_base(0); if ((unsigned int)PDirPool[0] != rcr3()) { dprintf("test 1 failed.\n"); return 1; } set_pdir_entry_identity(1, 1); set_pdir_entry(1, 2, 100); if (get_pdir_entry(1, 1) != (unsigned int)IDPTbl[1] + 7) { dprintf("test 1 failed.\n"); return 1; } if (get_pdir_entry(1, 2) != 409607) { dprintf("test 1 failed.\n"); return 1; } rmv_pdir_entry(1, 1); rmv_pdir_entry(1, 2); if (get_pdir_entry(1, 1) != 0 || get_pdir_entry(1, 2) != 0) { dprintf("test 1 failed.\n"); return 1; } dprintf("test 1 passed.\n"); return 0; }
int mon_start_user (int argc, char **argv, struct Trapframe *tf) { if (CID != 0) { dprintf( "The process is already running. If you want to run the program again, please restart qemu.\n"); return 0; } uint8_t * exe = _binary___obj_proc_dummy_dummy_start; CID = alloc_mem_quota (0, 1024 * 1024); elf_load (exe, CID); dprintf("Program 0x%08x is loaded.\n", exe); set_pdir_base (CID); entry_t entry = (entry_t) elf_entry (exe); entry(); return 0; }
void proc_start_user(void) { unsigned int cur_pid = get_curid(); static int first = TRUE; kstack_switch(cur_pid); set_pdir_base(cur_pid); trap_return((void *) &uctx_pool[cur_pid]); }
void trap (tf_t *tf) { unsigned int cur_pid; unsigned int in_kernel; cur_pid = get_curid (); set_pdir_base (0); //switch to the kernel's page table. trap_cb_t f; f = TRAP_HANDLER[get_pcpu_idx()][tf->trapno]; if (f){ f(tf); } else { KERN_WARN("No handler for user trap 0x%x, process %d, eip 0x%08x. \n", tf->trapno, cur_pid, tf->eip); } kstack_switch(cur_pid); set_pdir_base(cur_pid); trap_return((void *) tf); }
/** * Initializes the page structures, * move to the page structure # 0 (kernel). * and turn on the paging. */ void paging_init(unsigned int mbi_addr) { pdir_init_kern(mbi_addr); set_pdir_base(0); enable_paging(); }