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