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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
;; /*
;; * ========================================================
;; *
;; * NeKernel
;; * Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
;; *
;; * ========================================================
;; */
section .text
extern rt_wait_400ns
global rt_out8
global rt_out16
global rt_out32
global rt_in8
global rt_in16
global rt_in32
rt_out8:
mov al, dl
mov dx, cx
out dx, al
ret
rt_out16:
mov ax, dx
mov dx, cx
out dx, ax
ret
rt_out32:
mov eax, edx
mov edx, ecx
out dx, eax
ret
rt_in8:
mov dx, cx
in al, dx
ret
rt_in16:
mov edx, ecx
in ax, dx
ret
rt_in32:
mov rdx, rcx
in eax, dx
ret
extern hal_system_call_enter
global mp_system_call_handler
mp_system_call_handler:
push rbp
mov rbp, rsp
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
jmp hal_system_call_enter
pop r15
pop r14
pop r13
pop r12
pop r11
pop r10
pop r9
pop r8
pop rbp
o64 iret
section .text
global sched_jump_to_task
sched_jump_to_task:
push rbp
mov rbp, rsp
mov ax, 0x33
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ax, 0x18
ltr ax
push 0x33
mov rdx, [rcx + 0x08]
push rdx
o64 pushf
push 0x2B
mov rdx, [rcx + 0x00]
push rdx
call sched_recover_registers
o64 iret
global sched_idle_task
sched_idle_task:
jmp $
ret
sched_recover_registers:
mov r8, [rcx + 0x10]
mov r9, [rcx + 0x18]
mov r10, [rcx + 0x20]
mov r11, [rcx + 0x28]
mov r12, [rcx + 0x30]
mov r13, [rcx + 0x38]
mov r14, [rcx + 0x40]
mov r15, [rcx + 0x48]
ret
|