[ASM]
[reactos.git] / reactos / include / asm / syscalls.inc
1
2 #ifdef _M_IX86
3 #define KUSER_SHARED_SYSCALL HEX(7ffe0300)
4 #define KGDT_R0_CODE 8
5 MACRO(STUBCODE_U, SyscallId, StackBytes)
6 FPO 0, 0, 0, 0, 0, FRAME_FPO
7 mov eax, SyscallId
8 mov ecx, KUSER_SHARED_SYSCALL
9 call dword ptr [ecx]
10 ret StackBytes
11 ENDM
12 MACRO(STUBCODE_K, SyscallId, StackBytes)
13 FPO 0, 0, 0, 0, 0, FRAME_FPO
14 mov eax, SyscallId
15 lea edx, [esp + 4]
16 pushfd
17 push KGDT_R0_CODE
18 call _KiSystemService
19 ret StackBytes
20 ENDM
21 #elif defined(_M_AMD64)
22 MACRO(STUBCODE_U, SyscallId, StackBytes)
23 .ENDPROLOG
24 mov eax, SyscallId
25 mov r10, rcx
26 syscall
27 ret StackBytes
28 ENDM
29 MACRO(STUBCODE_K, SyscallId, StackBytes)
30 .ENDPROLOG
31 mov eax, SyscallId
32 call KiSystemService
33 ret StackBytes
34 ENDM
35 #elif defined(_M_ARM)
36 MACRO(STUBCODE_U, SyscallId, StackBytes)
37 swi #SyscallId
38 bx lr
39 ENDM
40 MACRO(STUBCODE_K, SyscallId, StackBytes)
41 mov ip, lr
42 swi #SyscallId
43 bx ip
44 ENDM
45 #elif defined(_M_PPC)
46 MACRO(STUBCODE_U, SyscallId, StackBytes)
47 stwu 1,-16(1)
48 mflr 0
49 stw 0,0(1)
50 li 0, SyscallId
51 sc
52 lwz 0,0(1)
53 mtlr 0
54 addi 1,1,16
55 blr
56 ENDM
57 #define STUBCODE_K STUBCODE_U
58 #elif defined(_M_MIPS)
59 MACRO(STUBCODE_U, SyscallId, StackBytes)
60 li $8, KUSER_SHARED_SYSCALL
61 lw $8,0($8)
62 j $8
63 nop
64 ENDM
65 MACRO(STUBCODE_K, SyscallId, StackBytes)
66 j KiSystemService
67 nop
68 ENDM
69 #else
70 #error unsupported architecture
71 #endif
72
73 #ifdef _M_IX86
74 MACRO(MAKE_LABEL, Name, Stackbytes)
75 PUBLIC _&Name&@&Stackbytes
76 _&Name&@&Stackbytes:
77 ENDM
78 MACRO(START_PROC, Name, Stackbytes)
79 PUBLIC _&Name&@&Stackbytes
80 .PROC &Name&@&Stackbytes
81 ENDM
82 MACRO(END_PROC, Name, Stackbytes)
83 .ENDP &Name&@&Stackbytes
84 ENDM
85 #else
86 MACRO(MAKE_LABEL, Name, Stackbytes)
87 PUBLIC &Name
88 &Name:
89 ENDM
90 MACRO(START_PROC, Name, Stackbytes)
91 PUBLIC &Name
92 .PROC &Name
93 ENDM
94 MACRO(END_PROC, Name, Stackbytes)
95 .ENDP &Name
96 ENDM
97 #endif
98
99 MACRO(STUB_U, Name, ArgCount)
100 Stackbytes = 4 * &ArgCount
101 MAKE_LABEL Zw&Name, %Stackbytes
102 START_PROC Nt&Name, %Stackbytes
103 STUBCODE_U SyscallId, %Stackbytes
104 END_PROC Nt&Name, %Stackbytes
105 SyscallId = SyscallId + 1
106 ENDM
107
108 MACRO(STUB_K, Name, ArgCount)
109 Stackbytes = 4 * &ArgCount
110 START_PROC Zw&Name, %Stackbytes
111 STUBCODE_K SyscallId, %Stackbytes
112 END_PROC Zw&Name, %Stackbytes
113 SyscallId = SyscallId + 1
114 ENDM