Kernel/x86_64 - Separated task switching from timer interrupt
[tpg/acess2.git] / Kernel / arch / x86_64 / proc.asm
1 ;
2 ;
3 ;
4 %include "arch/x86_64/include/common.inc.asm"
5 [BITS 64]
6 [section .text]
7
8 [extern Threads_Exit]
9
10 [global GetRIP]
11 GetRIP:
12         mov rax, [rsp]
13         ret
14
15 [global NewTaskHeader]
16 NewTaskHeader:
17         mov rax, [rsp]
18         mov dr0, rax
19         
20         sti
21         mov al, 0x20
22         mov dx, 0x20
23         out dx, al
24
25         mov rdi, [rsp+0x18]
26         dec QWORD [rsp+0x10]
27         jz .call
28         mov rsi, [rsp+0x20]
29         dec QWORD [rsp+0x10]
30         jz .call
31         mov rdx, [rsp+0x28]
32         dec QWORD [rsp+0x10]
33         jz .call
34         mov rcx, [rsp+0x30]
35         dec QWORD [rsp+0x10]
36         jz .call
37 .call:
38         mov rax, [rsp+0x8]
39 ;       xchg bx, bx
40         call rax
41         
42         ; Quit thread with RAX as the return code
43         xor rdi, rdi
44         mov rsi, rax
45         call Threads_Exit
46
47 .hlt:
48         jmp .hlt
49
50 [extern MM_Clone]
51 [global Proc_CloneInt]
52 Proc_CloneInt:
53         PUSH_GPR
54         ; Save RSP
55         mov [rdi], rsp
56         call MM_Clone
57         ; Save CR3
58         mov rsi, [rsp+0x30]
59         mov [rsi], rax
60         ; Undo the PUSH_GPR
61         add rsp, 0x80
62         mov rax, .newTask
63         ret
64 .newTask:
65         POP_GPR
66         xor eax, eax
67         ret
68
69 [global SaveState]
70 SaveState:
71         ; Save regs to RSI
72         add rsi, 0x80
73         SAVE_GPR rsi
74         ; Save return addr
75         mov rax, [rsp]
76         mov [rsi], rax
77         ; Return RSI as the RSP value
78         sub rsi, 0x80
79         mov [rdi], rsi
80         ; Check for 
81         mov rax, .restore
82         ret
83 .restore:
84         ; RSP = RSI now
85         POP_GPR
86         mov rax, [rsp]
87         mov rsp, [rsp-0x60]     ; Restore RSP from the saved value
88         mov [rsp], rax  ; Restore return address
89         xor eax, eax
90         ret
91
92 [global SwitchTasks]
93 ; rdi = New RSP
94 ; rsi = Old RSP save loc
95 ; rdx = New RIP
96 ; rcx = Old RIP save loc
97 ; r8 = CR3
98 SwitchTasks:
99         PUSH_GPR
100         
101         lea rax, [rel .restore]
102         mov QWORD [rcx], rax
103         mov [rsi], rsp
104
105         test r8, r8
106         jz .setState
107         mov cr3, r8
108         invlpg [rdi]
109         invlpg [rdi+0x1000]
110 .setState:
111         mov rsp, rdi
112         jmp rdx
113
114 .restore:
115         POP_GPR
116         xor eax, eax
117         ret
118

UCC git Repository :: git.ucc.asn.au