diff --git a/src/x86/isr.c b/src/x86/isr.c index 5bff31a..f4cc513 100644 --- a/src/x86/isr.c +++ b/src/x86/isr.c @@ -65,7 +65,3 @@ void isr_timer(struct interrupt_frame_t *frame) printf("Timer tick.\n"); apic_eoi(); } - -void isr_syscall(struct interrupt_frame_t *frame) -{ -} \ No newline at end of file diff --git a/src/x86/preempt.S b/src/x86/preempt.S index 47cc4c2..3f2227b 100644 --- a/src/x86/preempt.S +++ b/src/x86/preempt.S @@ -1,5 +1,28 @@ .section .text +.global isr_syscall +.type isr_syscall, @function +isr_syscall: + cli + push %edx + push %ecx + push %ebx + push %eax + push $kernel_state + mov $0x10, %ax + mov %ax, %ds + mov %ax, %es + mov %ax, %fs + mov %ax, %gs + call do_syscall + add $0x14, %esp + mov $0x23, %cx + mov %cx, %ds + mov %cx, %es + mov %cx, %fs + mov %cx, %gs + iret + .global isr_preempt .type isr_preempt, @function isr_preempt: @@ -7,11 +30,11 @@ isr_preempt: push %esp push $0x800 call save_context - sub $8, %esp + add $8, %esp push $0x800 push $kernel_state call next_process - sub $8, %esp + add $8, %esp push %eax call load_context \ No newline at end of file