541abd6cb6790210e5ceb721c8439426a6d8ef69
[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         xchg bx, bx
54         add rsi, 0x80
55         SAVE_GPR rsi
56         sub rsi, 0x80
57         ; Return RSI as the RSP value
58         mov [rdi], rsi
59         call GetRIP
60         cmp eax, 0x80000000
61         ja .fastret
62 .restore:
63         ; RSP = RSI from call
64         xchg bx, bx
65         POP_GPR
66         mov rsp, [rsp-0x60]     ; Restore RSP from the saved value
67         xor eax, eax
68         ret
69 .fastret:
70         ; RAX is still the return addr
71         ret
72         

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