summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/HALKit/AMD64/HalCommonAPI.asm
blob: f571aba763a67911ddf084aa39a601fefc0d2508 (plain)
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