summaryrefslogtreecommitdiff
path: root/src/kernel/isrs.asm
blob: 1fd6fcb839da38d5e1591668eefd90f6d7052bde (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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
  mov dword [esp], 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:
  mov ax, 0x2b
  mov ds, ax

  push dword 0x2b
  sub esp, 4
  push dword 0x00000200;interrupt flag
  push dword 0x23
  sub esp, 4
  jmp yield_isr.return_to_task