reactos/sdk/include/asm/syscalls.inc

155 lines
2.8 KiB
PHP

#ifdef _M_ARM
#include <ksarm.h>
GBLA SyscallId
SyscallId SETA 0
MACRO
STUB_K $Name
LCLS ZwFuncName
LCLS ZwFuncEndName
ZwFuncName SETS "Zw$Name"
ZwFuncEndName SETS "$ZwFuncName":CC:"_end"
ALIGN 2
EXPORT $ZwFuncName [FUNC]
$ZwFuncName
ROUT
mov r12, #SyscallId
svc #1
bx lr
$ZwFuncEndName
MEND
MACRO
STUB_U $Name
LCLS NtFuncName
LCLS NtFuncEndName
LCLS ZwFuncName
LCLS ZwFuncEndName
NtFuncName SETS "Nt$Name"
NtFuncEndName SETS "$NtFuncName":CC:"_end"
ZwFuncName SETS "Zw$Name"
ZwFuncEndName SETS "$ZwFuncName":CC:"_end"
ALIGN 2
EXPORT $NtFuncName [FUNC]
$NtFuncName
EXPORT $ZwFuncName [FUNC]
$ZwFuncName
ROUT
mov r12, #SyscallId
svc #1
bx lr
$NtFuncEndName
$ZwFuncEndName
MEND
#else
#include <asm.inc>
SyscallId = 0
#ifdef _M_IX86
#define KUSER_SHARED_SYSCALL HEX(7ffe0300)
#define KGDT_R0_CODE 8
MACRO(STUBCODE_U, Name, SyscallId, ArgCount)
StackBytes = 4 * ArgCount
FPO 0, 0, 0, 0, 0, FRAME_FPO
mov eax, SyscallId
mov edx, KUSER_SHARED_SYSCALL
call dword ptr [edx]
ret StackBytes
ENDM
MACRO(STUBCODE_K, Name, SyscallId, ArgCount)
StackBytes = 4 * &ArgCount
FPO 0, 0, 0, 0, 0, FRAME_FPO
mov eax, SyscallId
lea edx, [esp + 4]
pushfd
push KGDT_R0_CODE
call _KiSystemService
ret StackBytes
ENDM
#elif defined(_M_AMD64)
MACRO(STUBCODE_U, Name, SyscallId, ArgCount)
.ENDPROLOG
mov eax, SyscallId
mov r10, rcx
syscall
ret
ENDM
MACRO(STUBCODE_K, Name, SyscallId, ArgCount)
.ENDPROLOG
EXTERN Nt&Name:PROC
lea rax, Nt&Name[rip]
mov r10, ArgCount * 8
jmp KiZwSystemService
ENDM
#elif defined(_M_PPC)
MACRO(STUBCODE_U, Name, SyscallId, ArgCount)
stwu 1,-16(1)
mflr 0
stw 0,0(1)
li 0, SyscallId
sc
lwz 0,0(1)
mtlr 0
addi 1,1,16
blr
ENDM
#define STUBCODE_K STUBCODE_U
#elif defined(_M_MIPS)
MACRO(STUBCODE_U, Name, SyscallId, ArgCount)
li $8, KUSER_SHARED_SYSCALL
lw $8,0($8)
j $8
nop
ENDM
MACRO(STUBCODE_K, Name, SyscallId, ArgCount)
j KiSystemService
nop
ENDM
#else
#error unsupported architecture
#endif
#ifdef _M_IX86
MACRO(MAKE_LABEL, Name, StackBytes)
PUBLIC _&Name&@&StackBytes
_&Name&@&StackBytes:
ENDM
MACRO(START_PROC, Name, StackBytes)
PUBLIC _&Name&@&StackBytes
.PROC _&Name&@&StackBytes
ENDM
#else
MACRO(MAKE_LABEL, Name, StackBytes)
PUBLIC &Name
&Name:
ENDM
MACRO(START_PROC, Name, StackBytes)
PUBLIC &Name
.PROC &Name
ENDM
#endif
MACRO(STUB_U, Name, ArgCount)
MAKE_LABEL Zw&Name, %ArgCount * 4
START_PROC Nt&Name, %ArgCount * 4
STUBCODE_U Name, SyscallId, %ArgCount
.ENDP
SyscallId = SyscallId + 1
ENDM
MACRO(STUB_K, Name, ArgCount)
START_PROC Zw&Name, %ArgCount * 4
STUBCODE_K Name, SyscallId, %ArgCount
.ENDP
SyscallId = SyscallId + 1
ENDM
#endif