- Make syscalls ARM compatible

svn path=/trunk/; revision=67640
This commit is contained in:
Timo Kreuzer 2015-05-10 21:03:53 +00:00
parent 89ee675f59
commit 9fbce543e9
6 changed files with 1075 additions and 995 deletions

View file

@ -1,4 +1,57 @@
#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
@ -35,16 +88,6 @@ MACRO(STUBCODE_K, Name, SyscallId, ArgCount)
mov r10, ArgCount * 8
jmp KiZwSystemService
ENDM
#elif defined(_M_ARM)
MACRO(STUBCODE_U, Name, SyscallId, ArgCount)
swi #SyscallId
bx lr
ENDM
MACRO(STUBCODE_K, Name, SyscallId, ArgCount)
mov ip, lr
swi #SyscallId
bx ip
ENDM
#elif defined(_M_PPC)
MACRO(STUBCODE_U, Name, SyscallId, ArgCount)
stwu 1,-16(1)
@ -107,3 +150,5 @@ MACRO(STUB_K, Name, ArgCount)
.ENDP
SyscallId = SyscallId + 1
ENDM
#endif

View file

@ -1,7 +1,16 @@
#include <asm.inc>
#include <syscalls.inc>
#ifdef _M_ARM
TEXTAREA
#define SVC_(name, argcount) STUB_K name
#include <sysfuncs.h>
#else
#ifdef _M_IX86
EXTERN _KiSystemService:PROC
#elif defined(_M_AMD64)
@ -12,9 +21,10 @@ EXTERN KiZwSystemService:PROC
.code
SyscallId = 0
#define SVC_(name, argcount) STUB_K name, argcount
#include <sysfuncs.h>
#endif
END

View file

@ -1,12 +1,23 @@
#include <asm.inc>
#include <syscalls.inc>
#ifdef _M_ARM
TEXTAREA
#define SVC_(name, argcount) STUB_U name
#include <sysfuncs.h>
END
#else
.code
SyscallId = 0
#define SVC_(name, argcount) STUB_U name, argcount
#include <sysfuncs.h>
END
#endif

View file

@ -1,7 +1,18 @@
#include <asm.inc>
#include <syscalls.inc>
#ifdef _M_ARM
TEXTAREA
#define SVC_(name, argcount) STUB_U name
#include "w32ksvc.h"
END
#else
.code
SyscallId = HEX(1000)
@ -10,3 +21,5 @@ SyscallId = HEX(1000)
#include "w32ksvc.h"
END
#endif

View file

@ -1,6 +1,7 @@
// SVC_(<NAME>, <ARG_COUNT>)
//
// Funcs order should match Windows XP 5.1.2600 SP2
// Note: these MUST be indented for the ARM assembler!
//
SVC_(GdiAbortDoc, 1)
SVC_(GdiAbortPath, 1)