From c39cbb79cdf58e243db962da45ddc5420c875c55 Mon Sep 17 00:00:00 2001 From: ngiddings Date: Sun, 18 Apr 2021 02:10:03 -0500 Subject: [PATCH] Task contexts now load segment registers correctly Interrupt enable bit set in saved EFLAGS register --- include/context.h | 2 +- src/x86/context.c | 13 +++++++++---- src/x86/isr.c | 24 ++++++++++++++++++++++-- 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/include/context.h b/include/context.h index 792966c..c65932e 100644 --- a/include/context.h +++ b/include/context.h @@ -5,4 +5,4 @@ void *initialize_context(void *task_entry, struct page_stack_t *page_stack); -void load_context(struct process_state_t *context) __attribute__((noreturn)); +void load_context(struct process_state_t *context) __attribute__((naked)); diff --git a/src/x86/context.c b/src/x86/context.c index 9da0bb2..69e1481 100644 --- a/src/x86/context.c +++ b/src/x86/context.c @@ -35,7 +35,7 @@ void *initialize_context(void *task_entry, struct page_stack_t *page_stack) memset(stack, 0, sizeof(*stack)); stack->eip = (uint32_t)task_entry; stack->cs = 27; - stack->flags = flags; + stack->flags = flags | 0x200; stack->esp = 0xFF7FE000; stack->ss = 35; stack->esp_temp = &stack->eax; @@ -44,8 +44,13 @@ void *initialize_context(void *task_entry, struct page_stack_t *page_stack) void load_context(struct process_state_t *context) { - asm("mov %0, %%esp; " + asm("mov $0x10, %%ax; " + "mov %%ax, %%ds; " + "mov %%ax, %%es; " + "mov %%ax, %%fs; " + "mov %%ax, %%gs; " + ::: "ax"); + asm("mov 4(%esp), %esp; " "popal; " - "iret; " - :: "r"(context)); + "iret; "); } \ No newline at end of file diff --git a/src/x86/isr.c b/src/x86/isr.c index 81dbc4e..2e95102 100644 --- a/src/x86/isr.c +++ b/src/x86/isr.c @@ -16,6 +16,12 @@ void isr_division_by_zero(void* frame) void isr_gp_fault(void* frame, unsigned int error) { asm("cli"); + asm("mov $0x10, %%ax; " + "mov %%ax, %%ds; " + "mov %%ax, %%es; " + "mov %%ax, %%fs; " + "mov %%ax, %%gs; " + ::: "ax"); printf("Exception: GP fault, code %08x\n", error); asm("hlt"); } @@ -25,6 +31,12 @@ void isr_page_fault(void* frame, unsigned int error) size_t addr; asm("mov %%cr2, %0" : "=r"(addr)); + asm("mov $0x10, %%ax; " + "mov %%ax, %%ds; " + "mov %%ax, %%es; " + "mov %%ax, %%fs; " + "mov %%ax, %%gs; " + ::: "ax"); printf("Exception: Page fault, code %08x, linear address %08x\n", error, addr); asm("hlt"); } @@ -45,11 +57,19 @@ void isr_timer(void* frame) void isr_preempt(void* frame) { - asm("pushal;" - "mov %esp, %ebp"); + asm("pushal; " + "mov %esp, %ebp; "); + asm("mov $0x10, %%ax; " + "mov %%ax, %%ds; " + "mov %%ax, %%es; " + "mov %%ax, %%fs; " + "mov %%ax, %%gs; " + ::: "ax"); struct process_state_t *process_state; asm("mov %%ebp, %0" : "=r"(process_state)); + printf("Preempted process %08x.\n", kernel_state.active_process); + apic_eoi(); next_process(&kernel_state, process_state); }