summaryrefslogtreecommitdiff
path: root/src/kernel/isrs.asm
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/isrs.asm')
-rw-r--r--src/kernel/isrs.asm94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/kernel/isrs.asm b/src/kernel/isrs.asm
new file mode 100644
index 0000000..163ddbe
--- /dev/null
+++ b/src/kernel/isrs.asm
@@ -0,0 +1,94 @@
+bits 32
+
+global syscall_isr
+global quit_isr
+global yield_isr
+global _start_user_mode
+
+extern syscall_table
+extern active_task
+
+extern delete_task
+extern advance_active_task
+
+n_syscalls equ 8
+
+section .text
+syscall_isr:
+ cmp eax, n_syscalls
+ jge .bad
+
+ mov eax, dword [syscall_table + eax * 4]
+
+ push edi
+ push esi
+ push edx
+ push ecx
+ push ebx
+
+ call eax
+
+ add esp, 20
+
+ iret
+
+.bad:
+ mov eax, -1
+ iret
+
+quit_isr:
+ push dword [active_task]
+ call delete_task
+ push yield_isr.return_to_task
+ jmp advance_active_task
+
+yield_isr:
+ mov eax, dword [active_task]
+
+ mov dword [eax + 8], ebx
+ mov dword [eax + 12], ecx
+ mov dword [eax + 16], edx
+ mov dword [eax + 20], esi
+ mov dword [eax + 24], edi
+ mov dword [eax + 28], ebp
+
+ mov edx, dword [esp]
+ mov dword [eax], edx
+
+ mov edx, cr3
+ mov dword [eax + 4], edx
+
+ mov edx, dword [esp + 12]
+ mov dword [eax + 4], edx
+
+ call advance_active_task
+
+.return_to_task:
+ mov eax, dword [active_task]
+
+ mov edx, dword [eax]
+ mov dword [esp], edx
+
+ mov edx, dword [eax + 4]
+ mov cr3, edx
+
+ mov edx, dword [eax + 4]
+ mov dword [esp + 24], edx
+
+ mov ebx, dword [eax + 8]
+ mov ecx, dword [eax + 12]
+ mov edx, dword [eax + 16]
+ mov esi, dword [eax + 20]
+ mov edi, dword [eax + 24]
+ mov ebp, dword [eax + 28]
+
+_before_start_task:
+ iret
+
+_start_user_mode:
+ push dword 0x2b
+ sub esp, 4
+ push dword 0x00000200;interrupt flag
+ push dword 0x23
+ sub esp, 4
+ jmp yield_isr.return_to_task \ No newline at end of file