diff --git a/kern/env.c b/kern/env.c index bbde139..51e1f36 100644 --- a/kern/env.c +++ b/kern/env.c @@ -186,7 +186,7 @@ env_setup_vm(struct Env *e) // - The functions in kern/pmap.h are handy. p->pp_ref++; e->env_pgdir = page2kva(p); - memcpy(p + PDX(UTOP), kern_pgdir + PDX(UTOP), NPDENTRIES - PDX(UTOP)); + memcpy(e->env_pgdir + PDX(UTOP), kern_pgdir + PDX(UTOP), NPDENTRIES - PDX(UTOP)); // UVPT maps the env's own page table read-only. // Permissions: kernel R, user R @@ -285,6 +285,7 @@ region_alloc(struct Env *e, void *va, size_t len) panic("Failed to allocate memory"); if(page_insert(e->env_pgdir, p, va, PTE_U | PTE_W)) panic("Failed to allocate memory for page table"); + va += PGSIZE; } } @@ -356,12 +357,11 @@ load_icode(struct Env *e, uint8_t *binary) memset((void*) ph->p_va + ph->p_filesz, 0, ph->p_memsz - ph->p_filesz); lcr3(PADDR(kern_pgdir)); } + e->env_tf.tf_eip = elf->e_entry; // Now map one page for the program's initial stack // at virtual address USTACKTOP - PGSIZE. - region_alloc(e, USTACKTOP - PGSIZE, PGSIZE); - - // LAB 3: Your code here. + region_alloc(e, (void*) USTACKTOP - PGSIZE, PGSIZE); } // @@ -375,6 +375,11 @@ void env_create(uint8_t *binary, enum EnvType type) { // LAB 3: Your code here. + struct Env* new_env; + if(env_alloc(&new_env, 0) < 0) + panic("Failed to allocate environment"); + new_env->env_type = type; + load_icode(new_env, binary); } // @@ -491,7 +496,13 @@ env_run(struct Env *e) // e->env_tf to sensible values. // LAB 3: Your code here. - - panic("env_run not yet implemented"); + if(curenv && curenv->env_status == ENV_RUNNING) { + curenv->env_status = ENV_RUNNABLE; + } + curenv = e; + e->env_status = ENV_RUNNING; + e->env_runs++; + lcr3(PADDR(e->env_pgdir)); + env_pop_tf(&e->env_tf); } diff --git a/kern/trap.c b/kern/trap.c index 7f6075f..fc8252e 100644 --- a/kern/trap.c +++ b/kern/trap.c @@ -61,6 +61,26 @@ static const char *trapname(int trapno) // XYZ: write a function declaration here... // e.g., void t_divide(); +void t_divide(); +void t_debug(); +void t_nmi(); +void t_brkpt(); +void t_oflow(); +void t_bound(); +void t_illop(); +void t_device(); +void t_dblflt(); +void t_tss(); +void t_segnp(); +void t_stack(); +void t_gpflt(); +void t_pgflt(); +void t_fperr(); +void t_align(); +void t_mchk(); +void t_simderr(); +void t_syscall(); +void t_default(); void trap_init(void) @@ -77,6 +97,26 @@ trap_init(void) * */ // LAB 3: Your code here. + SETGATE(idt[T_DIVIDE], 0, GD_KT, t_divide, 0); + SETGATE(idt[T_DEBUG], 0, GD_KT, t_debug, 0); + SETGATE(idt[T_NMI], 0, GD_KT, t_nmi, 0); + SETGATE(idt[T_BRKPT], 0, GD_KT, t_brkpt, 0); + SETGATE(idt[T_OFLOW], 0, GD_KT, t_oflow, 0); + SETGATE(idt[T_BOUND], 0, GD_KT, t_bound, 0); + SETGATE(idt[T_ILLOP], 0, GD_KT, t_illop, 0); + SETGATE(idt[T_DEVICE], 0, GD_KT, t_device, 0); + SETGATE(idt[T_DBLFLT], 0, GD_KT, t_dblflt, 0); + SETGATE(idt[T_TSS], 0, GD_KT, t_tss, 0); + SETGATE(idt[T_SEGNP], 0, GD_KT, t_segnp, 0); + SETGATE(idt[T_STACK], 0, GD_KT, t_stack, 0); + SETGATE(idt[T_GPFLT], 0, GD_KT, t_gpflt, 0); + SETGATE(idt[T_PGFLT], 0, GD_KT, t_pgflt, 0); + SETGATE(idt[T_FPERR], 0, GD_KT, t_fperr, 0); + SETGATE(idt[T_ALIGN], 0, GD_KT, t_align, 0); + SETGATE(idt[T_MCHK], 0, GD_KT, t_mchk, 0); + SETGATE(idt[T_SIMDERR], 0, GD_KT, t_simderr, 0); + SETGATE(idt[T_SYSCALL], 0, GD_KT, t_syscall, 3); + SETGATE(idt[T_DEFAULT], 0, GD_KT, t_default, 0); // Per-CPU setup trap_init_percpu(); diff --git a/kern/trapentry.S b/kern/trapentry.S index 80dfe58..406033b 100644 --- a/kern/trapentry.S +++ b/kern/trapentry.S @@ -46,6 +46,26 @@ /* * Lab 3: Your code here for generating entry points for the different traps. */ +TRAPHANDLER_NOEC(t_divide, T_DIVIDE); +TRAPHANDLER_NOEC(t_debug, T_DEBUG); +TRAPHANDLER_NOEC(t_nmi, T_NMI); +TRAPHANDLER_NOEC(t_brkpt, T_BRKPT); +TRAPHANDLER_NOEC(t_oflow, T_OFLOW); +TRAPHANDLER_NOEC(t_bound, T_OFLOW); +TRAPHANDLER_NOEC(t_illop, T_OFLOW); +TRAPHANDLER_NOEC(t_device, T_OFLOW); +TRAPHANDLER(t_dblflt, T_OFLOW); +TRAPHANDLER(t_tss, T_TSS); +TRAPHANDLER(t_segnp, T_SEGNP); +TRAPHANDLER(t_stack, T_STACK); +TRAPHANDLER(t_gpflt, T_GPFLT); +TRAPHANDLER(t_pgflt, T_PGFLT); +TRAPHANDLER_NOEC(t_fperr, T_FPERR); +TRAPHANDLER(t_align, T_ALIGN); +TRAPHANDLER_NOEC(t_mchk, T_MCHK); +TRAPHANDLER_NOEC(t_simderr, T_SIMDERR); +TRAPHANDLER_NOEC(t_syscall, T_SYSCALL); +TRAPHANDLER(t_default, T_DEFAULT); // HINT 1 : TRAPHANDLER_NOEC(t_divide, T_DIVIDE); // Do something like this if there is no error code for the trap @@ -58,4 +78,15 @@ * Lab 3: Your code here for _alltraps */ - +.globl _alltraps +_alltraps: + sub $0x2, %esp + push %ds + sub $0x2, %esp + push %es + pushal + mov $(GD_KD), %eax + movl %eax, %ds + movl %eax, %es + pushl %esp + call trap