Modules/FDD - Fixed random bug
[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 [global SaveState]
51 SaveState:
52         ; Save regs to RSI
53         add rsi, 0x80
54         SAVE_GPR rsi
55         ; Save return addr
56         mov rax, [rsp]
57         mov [rsi], rax
58         ; Return RSI as the RSP value
59         sub rsi, 0x80
60         mov [rdi], rsi
61         ; Check for 
62         mov rax, .restore
63         ret
64 .restore:
65         ; RSP = RSI now
66         POP_GPR
67         mov rax, [rsp]
68         mov rsp, [rsp-0x60]     ; Restore RSP from the saved value
69         mov [rsp], rax  ; Restore return address
70         xor eax, eax
71         ret
72         

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