Skip to content

Commit

Permalink
feat: 添加 Lab4 练习 13-14 代码
Browse files Browse the repository at this point in the history
  • Loading branch information
woai3c committed Feb 25, 2020
1 parent 8f9e7e0 commit c3974ed
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 8 deletions.
2 changes: 1 addition & 1 deletion kern/env.c
Original file line number Diff line number Diff line change
Expand Up @@ -254,7 +254,7 @@ env_alloc(struct Env **newenv_store, envid_t parent_id)

// Enable interrupts while in user mode.
// LAB 4: Your code here.

e->env_tf.tf_eflags |= FL_IF;
// Clear the page fault handler until user installs one.
e->env_pgfault_upcall = 0;

Expand Down
3 changes: 1 addition & 2 deletions kern/sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@ sched_yield(void)
size_t index = (start + i) % NENV;
if (envs[index].env_status == ENV_RUNNABLE) {
env_run(&envs[index]);
break;
}
}

Expand Down Expand Up @@ -88,7 +87,7 @@ sched_halt(void)
"pushl $0\n"
"pushl $0\n"
// Uncomment the following line after completing exercise 13
//"sti\n"
"sti\n"
"1:\n"
"hlt\n"
"jmp 1b\n"
Expand Down
6 changes: 6 additions & 0 deletions kern/syscall.c
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,12 @@ syscall(uint32_t syscallno, uint32_t a1, uint32_t a2, uint32_t a3, uint32_t a4,
return sys_page_unmap(a1, (void *) a2);
case SYS_env_set_pgfault_upcall:
return sys_env_set_pgfault_upcall(a1, (void *) a2);
case SYS_ipc_try_send:
return sys_ipc_try_send(a1, a2, (void *) a3, a4);
break;
case SYS_ipc_recv:
return sys_ipc_recv((void *) a1);
break;
default:
return -E_INVAL;
}
Expand Down
45 changes: 40 additions & 5 deletions kern/trap.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,28 @@ trap_init(void)
void simd_floating_point_error_handler();
void system_call();

void irq_0_handler();
void irq_1_handler();
void irq_2_handler();
void irq_3_handler();
void irq_4_handler();
void irq_5_handler();
void irq_6_handler();
void irq_7_handler();
void irq_8_handler();
void irq_9_handler();
void irq_10_handler();
void irq_11_handler();
void irq_12_handler();
void irq_13_handler();
void irq_14_handler();
void irq_15_handler();

// set up trap gate descriptor
SETGATE(idt[T_DIVIDE], 0, GD_KT, divide_error_handler, 0);
SETGATE(idt[T_DEBUG], 0, GD_KT, debug_exception_handler, 0);
SETGATE(idt[T_NMI], 0, GD_KT, non_maskable_interrupt_handler, 0);
SETGATE(idt[T_BRKPT], 1, GD_KT, breakpoint_handler, 3);
SETGATE(idt[T_BRKPT], 0, GD_KT, breakpoint_handler, 0);
SETGATE(idt[T_OFLOW], 0, GD_KT, overflow_handler, 0);
SETGATE(idt[T_BOUND], 0, GD_KT, bounds_check_handler, 0);
SETGATE(idt[T_ILLOP], 0, GD_KT, invalid_opcode_handler, 0);
Expand All @@ -111,8 +128,24 @@ trap_init(void)
SETGATE(idt[T_ALIGN], 0, GD_KT, alignment_check_handler, 0);
SETGATE(idt[T_MCHK], 0, GD_KT, machine_check_handler, 0);
SETGATE(idt[T_SIMDERR], 0, GD_KT, simd_floating_point_error_handler, 0);
SETGATE(idt[T_SYSCALL], 1, GD_KT, system_call, 3);

SETGATE(idt[T_SYSCALL], 0, GD_KT, system_call, 3);

SETGATE(idt[IRQ_OFFSET + 0], 0, GD_KT, irq_0_handler, 0);
SETGATE(idt[IRQ_OFFSET + 1], 0, GD_KT, irq_1_handler, 0);
SETGATE(idt[IRQ_OFFSET + 2], 0, GD_KT, irq_2_handler, 0);
SETGATE(idt[IRQ_OFFSET + 3], 0, GD_KT, irq_3_handler, 0);
SETGATE(idt[IRQ_OFFSET + 4], 0, GD_KT, irq_4_handler, 0);
SETGATE(idt[IRQ_OFFSET + 5], 0, GD_KT, irq_5_handler, 0);
SETGATE(idt[IRQ_OFFSET + 6], 0, GD_KT, irq_6_handler, 0);
SETGATE(idt[IRQ_OFFSET + 7], 0, GD_KT, irq_7_handler, 0);
SETGATE(idt[IRQ_OFFSET + 8], 0, GD_KT, irq_8_handler, 0);
SETGATE(idt[IRQ_OFFSET + 9], 0, GD_KT, irq_9_handler, 0);
SETGATE(idt[IRQ_OFFSET + 10], 0, GD_KT, irq_10_handler, 0);
SETGATE(idt[IRQ_OFFSET + 11], 0, GD_KT, irq_11_handler, 0);
SETGATE(idt[IRQ_OFFSET + 12], 0, GD_KT, irq_12_handler, 0);
SETGATE(idt[IRQ_OFFSET + 13], 0, GD_KT, irq_13_handler, 0);
SETGATE(idt[IRQ_OFFSET + 14], 0, GD_KT, irq_14_handler, 0);
SETGATE(idt[IRQ_OFFSET + 15], 0, GD_KT, irq_15_handler, 0);
// Per-CPU setup
trap_init_percpu();
}
Expand Down Expand Up @@ -223,7 +256,6 @@ trap_dispatch(struct Trapframe *tf)

if (tf->tf_trapno == T_BRKPT) {
monitor(tf);
return;
}

if (tf->tf_trapno == T_SYSCALL) {
Expand All @@ -243,7 +275,10 @@ trap_dispatch(struct Trapframe *tf)
// Handle clock interrupts. Don't forget to acknowledge the
// interrupt using lapic_eoi() before calling the scheduler!
// LAB 4: Your code here.

if (tf->tf_trapno == IRQ_OFFSET + IRQ_TIMER) {
lapic_eoi();
sched_yield();
}
// Unexpected trap: The user process or the kernel has a bug.
print_trapframe(tf);
if (tf->tf_cs == GD_KT)
Expand Down
17 changes: 17 additions & 0 deletions kern/trapentry.S
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,23 @@ TRAPHANDLER_NOEC(machine_check_handler, T_MCHK)
TRAPHANDLER_NOEC(simd_floating_point_error_handler, T_SIMDERR)
TRAPHANDLER_NOEC(system_call, T_SYSCALL)

TRAPHANDLER_NOEC(irq_0_handler, IRQ_OFFSET + 0);
TRAPHANDLER_NOEC(irq_1_handler, IRQ_OFFSET + 1);
TRAPHANDLER_NOEC(irq_2_handler, IRQ_OFFSET + 2);
TRAPHANDLER_NOEC(irq_3_handler, IRQ_OFFSET + 3);
TRAPHANDLER_NOEC(irq_4_handler, IRQ_OFFSET + 4);
TRAPHANDLER_NOEC(irq_5_handler, IRQ_OFFSET + 5);
TRAPHANDLER_NOEC(irq_6_handler, IRQ_OFFSET + 6);
TRAPHANDLER_NOEC(irq_7_handler, IRQ_OFFSET + 7);
TRAPHANDLER_NOEC(irq_8_handler, IRQ_OFFSET + 8);
TRAPHANDLER_NOEC(irq_9_handler, IRQ_OFFSET + 9);
TRAPHANDLER_NOEC(irq_10_handler, IRQ_OFFSET + 10);
TRAPHANDLER_NOEC(irq_11_handler, IRQ_OFFSET + 11);
TRAPHANDLER_NOEC(irq_12_handler, IRQ_OFFSET + 12);
TRAPHANDLER_NOEC(irq_13_handler, IRQ_OFFSET + 13);
TRAPHANDLER_NOEC(irq_14_handler, IRQ_OFFSET + 14);
TRAPHANDLER_NOEC(irq_15_handler, IRQ_OFFSET + 15);

/*
* Lab 3: Your code here for _alltraps
*/
Expand Down

0 comments on commit c3974ed

Please sign in to comment.