Kernel/x86_64 - Commenting and cleanup
[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         ; Save state RIP and RSP
102         lea rax, [rel .restore]
103         mov [rcx], rax
104         mov [rsi], rsp
105
106         ; Change CR3 if requested
107         test r8, r8
108         jz .setState
109         mov cr3, r8
110         
111         ; Make sure the stack is valid before jumping
112         invlpg [rdi]
113         invlpg [rdi+0x1000]
114         
115         ; Go to new state
116 .setState:
117         mov rsp, rdi
118         jmp rdx
119
120         ; Restore point for saved state
121 .restore:
122         POP_GPR
123         xor eax, eax    ; Return zero
124         ret
125

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