Intermediate commit (trap is close to working).
This commit is contained in:
parent
73dad8b484
commit
8120dfde65
23
kern/env.c
23
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);
|
||||
}
|
||||
|
||||
|
|
40
kern/trap.c
40
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();
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user