Kernel/ARMv7 - Fixed not using ASIDs
[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 [extern MM_DumpTables]
52 [global Proc_CloneInt]
53 Proc_CloneInt:
54         PUSH_GPR
55         ; Save RSP
56         mov [rdi], rsp
57         call MM_Clone
58         ; Save CR3
59         mov rsi, [rsp+0x30]     ; Saved version of RSI
60         mov [rsi], rax
61         ; Undo the PUSH_GPR
62         add rsp, 0x80
63         mov rax, .newTask
64         ret
65 .newTask:
66 ;       mov rdi, 0
67 ;       mov rsi, 0x800000000000
68 ;       call MM_DumpTables
69         POP_GPR
70         xor eax, eax
71         ret
72
73 [global SaveState]
74 SaveState:
75         ; Save regs to RSI
76         add rsi, 0x80
77         SAVE_GPR rsi
78         ; Save return addr
79         mov rax, [rsp]
80         mov [rsi], rax
81         ; Return RSI as the RSP value
82         sub rsi, 0x80
83         mov [rdi], rsi
84         ; Check for 
85         mov rax, .restore
86         ret
87 .restore:
88         ; RSP = RSI now
89         POP_GPR
90         mov rax, [rsp]
91         mov rsp, [rsp-0x60]     ; Restore RSP from the saved value
92         mov [rsp], rax  ; Restore return address
93         xor eax, eax
94         ret
95
96 [global SwitchTasks]
97 ; rdi = New RSP
98 ; rsi = Old RSP save loc
99 ; rdx = New RIP
100 ; rcx = Old RIP save loc
101 ; r8 = CR3
102 SwitchTasks:
103         PUSH_GPR
104         
105         ; Save state RIP and RSP
106         lea rax, [rel .restore]
107         mov [rcx], rax
108         mov [rsi], rsp
109
110         ; Change CR3 if requested
111         test r8, r8
112         jz .setState
113         mov cr3, r8
114         
115         ; Make sure the stack is valid before jumping
116         invlpg [rdi]
117         invlpg [rdi+0x1000]
118         
119         ; Go to new state
120 .setState:
121         mov rsp, rdi
122         jmp rdx
123
124         ; Restore point for saved state
125 .restore:
126         POP_GPR
127         xor eax, eax    ; Return zero
128         ret
129
130 [global Proc_InitialiseSSE]
131 Proc_InitialiseSSE:
132         mov rax, cr4
133         or ax, (1 << 9)|(1 << 10)       ; Set OSFXSR and OSXMMEXCPT
134         mov cr4, rax
135         mov rax, cr0
136         and ax, ~(1 << 2)       ; Clear EM
137         or rax, (1 << 1)        ; Set MP
138         mov rax, cr0
139         ret
140 [global Proc_DisableSSE]
141 Proc_DisableSSE:
142         mov rax, cr0
143         or ax, 1 << 3   ; Set TS
144         mov cr0, rax
145         ret
146 [global Proc_EnableSSE]
147 Proc_EnableSSE:
148         mov rax, cr0
149         and ax, ~(1 << 3)       ; Clear TS
150         mov cr0, rax
151         ret
152
153 [global Proc_SaveSSE]
154 Proc_SaveSSE:
155         fxsave [rdi]
156         ret
157 [global Proc_RestoreSSE]
158 Proc_RestoreSSE:
159         fxrstor [rdi]
160         ret
161
162 ; vim: ft=nasm

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