summaryrefslogtreecommitdiff
path: root/kernel/traps.s
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/traps.s')
-rw-r--r--kernel/traps.s14
1 files changed, 11 insertions, 3 deletions
diff --git a/kernel/traps.s b/kernel/traps.s
index 73e7f64..36b3423 100644
--- a/kernel/traps.s
+++ b/kernel/traps.s
@@ -11,8 +11,10 @@ extern ctask
extern idt
extern panic
extern printk
-extern register_isr
+extern register_trap
+extern reschedule
extern sighandler_default
+extern ticked
; here we define offsets into task_struct.
; if task_struct is modified, this must be
@@ -269,6 +271,7 @@ exc_reserved:
syscall_handler:
SAVE
+ mov dword [ticked], 0
; push the arguments onto the stack, then
; calculate the offset for the appropriate
; handler function and call it
@@ -282,8 +285,13 @@ syscall_handler:
add esp, 12
; preserve the syscall's return value
mov [esp+30], eax
- mov eax, esp
+ ; check if the timer fired while we were in kernel mode
+ mov eax, [ticked]
+ jz .skip
+ call reschedule
+.skip:
; check pending signals and handle them (if any)
+ mov eax, esp
push eax
call check_signals
add esp, 4
@@ -379,7 +387,7 @@ syscall_init:
push syscall_handler
push dword 3
push dword 0x80
- call register_isr
+ call register_trap
add esp, 12
pop ebp
ret