mirror of
git://repo.or.cz/tinycc.git
synced 2026-11-05 05:36:35 +08:00
arm64-win32 support : runtime
This commit is contained in:
parent
ff5d3b4874
commit
03d58b0746
@ -224,7 +224,9 @@
|
|||||||
&~3), *(type *)(ap - ((sizeof(type)+3)&~3)))
|
&~3), *(type *)(ap - ((sizeof(type)+3)&~3)))
|
||||||
|
|
||||||
#elif defined __aarch64__
|
#elif defined __aarch64__
|
||||||
#if defined __APPLE__
|
#if defined _WIN32
|
||||||
|
typedef char *__builtin_va_list;
|
||||||
|
#elif defined __APPLE__
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void *__stack;
|
void *__stack;
|
||||||
} __builtin_va_list;
|
} __builtin_va_list;
|
||||||
|
|||||||
29
lib/bt-exe.c
29
lib/bt-exe.c
@ -11,6 +11,21 @@
|
|||||||
# define __declspec(n)
|
# define __declspec(n)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
static void bt_init_pe_prog_base(rt_context *p)
|
||||||
|
{
|
||||||
|
MEMORY_BASIC_INFORMATION mbi;
|
||||||
|
addr_t imagebase;
|
||||||
|
|
||||||
|
if (!p->prog_base)
|
||||||
|
return;
|
||||||
|
if (!VirtualQuery(p, &mbi, sizeof(mbi)) || !mbi.AllocationBase)
|
||||||
|
return;
|
||||||
|
imagebase = (addr_t)mbi.AllocationBase - p->prog_base;
|
||||||
|
p->prog_base = (addr_t)mbi.AllocationBase - (imagebase & 0xffffffffu);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
__declspec(dllexport)
|
__declspec(dllexport)
|
||||||
void __bt_init(rt_context *p, int is_exe)
|
void __bt_init(rt_context *p, int is_exe)
|
||||||
{
|
{
|
||||||
@ -24,6 +39,10 @@ void __bt_init(rt_context *p, int is_exe)
|
|||||||
if (p->bounds_start)
|
if (p->bounds_start)
|
||||||
__bound_init(p->bounds_start, -1);
|
__bound_init(p->bounds_start, -1);
|
||||||
|
|
||||||
|
#ifdef _WIN64
|
||||||
|
bt_init_pe_prog_base(p);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* add to chain */
|
/* add to chain */
|
||||||
rt_wait_sem();
|
rt_wait_sem();
|
||||||
p->next = g_rc, g_rc = p;
|
p->next = g_rc, g_rc = p;
|
||||||
@ -66,3 +85,13 @@ ST_FUNC char *pstrcpy(char *buf, size_t buf_size, const char *s)
|
|||||||
buf[l] = 0;
|
buf[l] = 0;
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(_WIN64) && defined(__aarch64__)
|
||||||
|
/* The bt-only Windows ARM64 build should not rely on importing this helper. */
|
||||||
|
LONG InterlockedExchange(LONG volatile *Target, LONG Value)
|
||||||
|
{
|
||||||
|
LONG Old = *Target;
|
||||||
|
*Target = Value;
|
||||||
|
return Old;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@ -630,6 +630,12 @@ long long __fixxfdi (long double a1)
|
|||||||
/* MSVC x64 intrinsic */
|
/* MSVC x64 intrinsic */
|
||||||
void __faststorefence(void)
|
void __faststorefence(void)
|
||||||
{
|
{
|
||||||
__asm__("lock; orl $0,(%rsp)");
|
#if defined(__aarch64__)
|
||||||
|
/* ARM64: Data Memory Barrier (Inner Shareable) */
|
||||||
|
__asm__("dmb ish");
|
||||||
|
#else
|
||||||
|
/* x86-64: lock prefix to flush store buffer */
|
||||||
|
__asm__("lock; orl $0,(%%rsp)" ::: "memory");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -70,12 +70,21 @@
|
|||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
#define __stdcall
|
#define __stdcall
|
||||||
|
#if defined(__aarch64__) || defined(_M_ARM64) || defined(_ARM64_)
|
||||||
|
#ifndef _M_ARM64
|
||||||
|
#define _M_ARM64 1
|
||||||
|
#endif
|
||||||
|
#ifndef _ARM64_
|
||||||
|
#define _ARM64_ 1
|
||||||
|
#endif
|
||||||
|
#else
|
||||||
#define _AMD64_ 1
|
#define _AMD64_ 1
|
||||||
#define __x86_64 1
|
#define __x86_64 1
|
||||||
#define _M_X64 100 /* Visual Studio */
|
#define _M_X64 100 /* Visual Studio */
|
||||||
#define _M_AMD64 100 /* Visual Studio */
|
#define _M_AMD64 100 /* Visual Studio */
|
||||||
#define USE_MINGW_SETJMP_TWO_ARGS
|
#define USE_MINGW_SETJMP_TWO_ARGS
|
||||||
#define mingw_getsp tinyc_getbp
|
#define mingw_getsp tinyc_getbp
|
||||||
|
#endif
|
||||||
#else
|
#else
|
||||||
#define __stdcall __attribute__((__stdcall__))
|
#define __stdcall __attribute__((__stdcall__))
|
||||||
#define _X86_ 1
|
#define _X86_ 1
|
||||||
|
|||||||
@ -124,6 +124,55 @@ extern "C" {
|
|||||||
SETJMP_FLOAT128 Xmm14;
|
SETJMP_FLOAT128 Xmm14;
|
||||||
SETJMP_FLOAT128 Xmm15;
|
SETJMP_FLOAT128 Xmm15;
|
||||||
} _JUMP_BUFFER;
|
} _JUMP_BUFFER;
|
||||||
|
#elif defined(_ARM_)
|
||||||
|
|
||||||
|
#define _JBLEN 28
|
||||||
|
#define _JBTYPE int
|
||||||
|
|
||||||
|
typedef struct __JUMP_BUFFER {
|
||||||
|
unsigned long Frame;
|
||||||
|
unsigned long R4;
|
||||||
|
unsigned long R5;
|
||||||
|
unsigned long R6;
|
||||||
|
unsigned long R7;
|
||||||
|
unsigned long R8;
|
||||||
|
unsigned long R9;
|
||||||
|
unsigned long R10;
|
||||||
|
unsigned long R11;
|
||||||
|
unsigned long Sp;
|
||||||
|
unsigned long Pc;
|
||||||
|
unsigned long Fpscr;
|
||||||
|
unsigned long long D[8];
|
||||||
|
} _JUMP_BUFFER;
|
||||||
|
#elif defined(_ARM64_)
|
||||||
|
|
||||||
|
#define _JBLEN 24
|
||||||
|
#define _JBTYPE unsigned __int64
|
||||||
|
|
||||||
|
typedef struct __JUMP_BUFFER {
|
||||||
|
unsigned __int64 Frame;
|
||||||
|
unsigned __int64 Reserved;
|
||||||
|
unsigned __int64 X19;
|
||||||
|
unsigned __int64 X20;
|
||||||
|
unsigned __int64 X21;
|
||||||
|
unsigned __int64 X22;
|
||||||
|
unsigned __int64 X23;
|
||||||
|
unsigned __int64 X24;
|
||||||
|
unsigned __int64 X25;
|
||||||
|
unsigned __int64 X26;
|
||||||
|
unsigned __int64 X27;
|
||||||
|
unsigned __int64 X28;
|
||||||
|
unsigned __int64 Fp;
|
||||||
|
unsigned __int64 Lr;
|
||||||
|
unsigned __int64 Sp;
|
||||||
|
unsigned long Fpcr;
|
||||||
|
unsigned long Fpsr;
|
||||||
|
double D[8];
|
||||||
|
} _JUMP_BUFFER;
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define _JBLEN 1
|
||||||
|
#define _JBTYPE int
|
||||||
#endif
|
#endif
|
||||||
#ifndef _JMP_BUF_DEFINED
|
#ifndef _JMP_BUF_DEFINED
|
||||||
typedef _JBTYPE jmp_buf[_JBLEN];
|
typedef _JBTYPE jmp_buf[_JBLEN];
|
||||||
|
|||||||
@ -21,7 +21,7 @@ extern "C" {
|
|||||||
#define __CRT_UNALIGNED
|
#define __CRT_UNALIGNED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(__ia64__) || defined(__x86_64)
|
#if defined(__ia64__) || defined(__x86_64) || defined(__aarch64__)
|
||||||
#define UNALIGNED __CRT_UNALIGNED
|
#define UNALIGNED __CRT_UNALIGNED
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
#define UNALIGNED64 __CRT_UNALIGNED
|
#define UNALIGNED64 __CRT_UNALIGNED
|
||||||
@ -47,6 +47,9 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(I_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(__aarch64__) && !defined(_ARM64_)
|
||||||
|
#define _ARM64_
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
#define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
|
#define MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
|
||||||
@ -65,7 +68,7 @@ extern "C" {
|
|||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
#ifdef _AMD64_
|
#ifdef _AMD64_
|
||||||
#define PROBE_ALIGNMENT(_s) TYPE_ALIGNMENT(DWORD)
|
#define PROBE_ALIGNMENT(_s) TYPE_ALIGNMENT(DWORD)
|
||||||
#elif defined(_IA64_)
|
#elif defined(_IA64_) || defined(_ARM64_)
|
||||||
#define PROBE_ALIGNMENT(_s) (TYPE_ALIGNMENT(_s) > TYPE_ALIGNMENT(DWORD) ? TYPE_ALIGNMENT(_s) : TYPE_ALIGNMENT(DWORD))
|
#define PROBE_ALIGNMENT(_s) (TYPE_ALIGNMENT(_s) > TYPE_ALIGNMENT(DWORD) ? TYPE_ALIGNMENT(_s) : TYPE_ALIGNMENT(DWORD))
|
||||||
#else
|
#else
|
||||||
#error No Target Architecture
|
#error No Target Architecture
|
||||||
@ -79,7 +82,7 @@ extern "C" {
|
|||||||
|
|
||||||
#include <basetsd.h>
|
#include <basetsd.h>
|
||||||
|
|
||||||
#if defined(_X86_) || defined(__ia64__) || defined(__x86_64)
|
#if defined(_X86_) || defined(__ia64__) || defined(__x86_64) || defined(__aarch64__)
|
||||||
#define DECLSPEC_IMPORT __declspec(dllimport)
|
#define DECLSPEC_IMPORT __declspec(dllimport)
|
||||||
#else
|
#else
|
||||||
#define DECLSPEC_IMPORT
|
#define DECLSPEC_IMPORT
|
||||||
@ -321,7 +324,7 @@ typedef DWORD LCID;
|
|||||||
#define Int32x32To64(a,b) (LONGLONG)((LONGLONG)(LONG)(a) *(LONG)(b))
|
#define Int32x32To64(a,b) (LONGLONG)((LONGLONG)(LONG)(a) *(LONG)(b))
|
||||||
#define UInt32x32To64(a,b) (ULONGLONG)((ULONGLONG)(DWORD)(a) *(DWORD)(b))
|
#define UInt32x32To64(a,b) (ULONGLONG)((ULONGLONG)(DWORD)(a) *(DWORD)(b))
|
||||||
#define Int64ShrlMod32(a,b) ((DWORDLONG)(a)>>(b))
|
#define Int64ShrlMod32(a,b) ((DWORDLONG)(a)>>(b))
|
||||||
#elif defined(__ia64__) || defined(__x86_64)
|
#elif defined(__ia64__) || defined(__x86_64) || defined(__aarch64__)
|
||||||
#define Int32x32To64(a,b) ((LONGLONG)((LONG)(a)) *(LONGLONG)((LONG)(b)))
|
#define Int32x32To64(a,b) ((LONGLONG)((LONG)(a)) *(LONGLONG)((LONG)(b)))
|
||||||
#define UInt32x32To64(a,b) ((ULONGLONG)((DWORD)(a)) *(ULONGLONG)((DWORD)(b)))
|
#define UInt32x32To64(a,b) ((ULONGLONG)((DWORD)(a)) *(ULONGLONG)((DWORD)(b)))
|
||||||
#define Int64ShrlMod32(a,b) ((ULONGLONG)(a) >> (b))
|
#define Int64ShrlMod32(a,b) ((ULONGLONG)(a) >> (b))
|
||||||
@ -829,7 +832,7 @@ typedef DWORD LCID;
|
|||||||
typedef ULONG_PTR KSPIN_LOCK;
|
typedef ULONG_PTR KSPIN_LOCK;
|
||||||
typedef KSPIN_LOCK *PKSPIN_LOCK;
|
typedef KSPIN_LOCK *PKSPIN_LOCK;
|
||||||
|
|
||||||
#ifdef _AMD64_
|
#if defined(_AMD64_) || defined(_ARM64_)
|
||||||
|
|
||||||
#if defined(__x86_64) && !defined(RC_INVOKED)
|
#if defined(__x86_64) && !defined(RC_INVOKED)
|
||||||
|
|
||||||
@ -1336,6 +1339,7 @@ typedef DWORD LCID;
|
|||||||
|
|
||||||
#define LEGACY_SAVE_AREA_LENGTH sizeof(XMM_SAVE_AREA32)
|
#define LEGACY_SAVE_AREA_LENGTH sizeof(XMM_SAVE_AREA32)
|
||||||
|
|
||||||
|
#if defined(__x86_64) || defined(_AMD64_)
|
||||||
typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
|
typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
|
||||||
DWORD64 P1Home;
|
DWORD64 P1Home;
|
||||||
DWORD64 P2Home;
|
DWORD64 P2Home;
|
||||||
@ -1407,6 +1411,7 @@ typedef DWORD LCID;
|
|||||||
DWORD64 LastExceptionToRip;
|
DWORD64 LastExceptionToRip;
|
||||||
DWORD64 LastExceptionFromRip;
|
DWORD64 LastExceptionFromRip;
|
||||||
} CONTEXT,*PCONTEXT;
|
} CONTEXT,*PCONTEXT;
|
||||||
|
#endif /* defined(__x86_64) || defined(_AMD64_) */
|
||||||
|
|
||||||
#define RUNTIME_FUNCTION_INDIRECT 0x1
|
#define RUNTIME_FUNCTION_INDIRECT 0x1
|
||||||
|
|
||||||
@ -1417,6 +1422,123 @@ typedef DWORD LCID;
|
|||||||
} RUNTIME_FUNCTION,*PRUNTIME_FUNCTION;
|
} RUNTIME_FUNCTION,*PRUNTIME_FUNCTION;
|
||||||
|
|
||||||
typedef PRUNTIME_FUNCTION (*PGET_RUNTIME_FUNCTION_CALLBACK)(DWORD64 ControlPc,PVOID Context);
|
typedef PRUNTIME_FUNCTION (*PGET_RUNTIME_FUNCTION_CALLBACK)(DWORD64 ControlPc,PVOID Context);
|
||||||
|
|
||||||
|
#if defined(_ARM64_) || defined(__aarch64__)
|
||||||
|
|
||||||
|
/* ARM64 Context Definition */
|
||||||
|
#define CONTEXT_ARM64 0x00400000
|
||||||
|
|
||||||
|
#ifndef CONTEXT_CONTROL
|
||||||
|
#define CONTEXT_CONTROL (CONTEXT_ARM64 | 0x00000001L)
|
||||||
|
#endif
|
||||||
|
#ifndef CONTEXT_INTEGER
|
||||||
|
#define CONTEXT_INTEGER (CONTEXT_ARM64 | 0x00000002L)
|
||||||
|
#endif
|
||||||
|
#ifndef CONTEXT_FLOATING_POINT
|
||||||
|
#define CONTEXT_FLOATING_POINT (CONTEXT_ARM64 | 0x00000004L)
|
||||||
|
#endif
|
||||||
|
#ifndef CONTEXT_DEBUG
|
||||||
|
#define CONTEXT_DEBUG (CONTEXT_ARM64 | 0x00000008L)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONTEXT_FULL
|
||||||
|
#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
|
||||||
|
#endif
|
||||||
|
#ifndef CONTEXT_ALL
|
||||||
|
#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ARM64_MAX_BREAKPOINTS
|
||||||
|
#define ARM64_MAX_BREAKPOINTS 8
|
||||||
|
#endif
|
||||||
|
#ifndef ARM64_MAX_WATCHPOINTS
|
||||||
|
#define ARM64_MAX_WATCHPOINTS 2
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _ARM64_NT_NEON128_DECLARED
|
||||||
|
#define _ARM64_NT_NEON128_DECLARED
|
||||||
|
typedef union _ARM64_NT_NEON128 {
|
||||||
|
struct {
|
||||||
|
ULONGLONG Low;
|
||||||
|
LONGLONG High;
|
||||||
|
} DUMMYSTRUCTNAME;
|
||||||
|
double D[2];
|
||||||
|
float S[4];
|
||||||
|
WORD H[8];
|
||||||
|
BYTE B[16];
|
||||||
|
} ARM64_NT_NEON128,*PARM64_NT_NEON128;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _ARM64_CONTEXT_DECLARED
|
||||||
|
#define _ARM64_CONTEXT_DECLARED
|
||||||
|
typedef struct DECLSPEC_ALIGN(16) _ARM64_NT_CONTEXT {
|
||||||
|
ULONG ContextFlags;
|
||||||
|
ULONG Cpsr;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
DWORD64 X0;
|
||||||
|
DWORD64 X1;
|
||||||
|
DWORD64 X2;
|
||||||
|
DWORD64 X3;
|
||||||
|
DWORD64 X4;
|
||||||
|
DWORD64 X5;
|
||||||
|
DWORD64 X6;
|
||||||
|
DWORD64 X7;
|
||||||
|
DWORD64 X8;
|
||||||
|
DWORD64 X9;
|
||||||
|
DWORD64 X10;
|
||||||
|
DWORD64 X11;
|
||||||
|
DWORD64 X12;
|
||||||
|
DWORD64 X13;
|
||||||
|
DWORD64 X14;
|
||||||
|
DWORD64 X15;
|
||||||
|
DWORD64 X16;
|
||||||
|
DWORD64 X17;
|
||||||
|
DWORD64 X18;
|
||||||
|
DWORD64 X19;
|
||||||
|
DWORD64 X20;
|
||||||
|
DWORD64 X21;
|
||||||
|
DWORD64 X22;
|
||||||
|
DWORD64 X23;
|
||||||
|
DWORD64 X24;
|
||||||
|
DWORD64 X25;
|
||||||
|
DWORD64 X26;
|
||||||
|
DWORD64 X27;
|
||||||
|
DWORD64 X28;
|
||||||
|
DWORD64 Fp;
|
||||||
|
DWORD64 Lr;
|
||||||
|
} DUMMYSTRUCTNAME;
|
||||||
|
DWORD64 X[31];
|
||||||
|
} DUMMYUNIONNAME;
|
||||||
|
DWORD64 Sp;
|
||||||
|
DWORD64 Pc;
|
||||||
|
ARM64_NT_NEON128 V[32];
|
||||||
|
DWORD Fpcr;
|
||||||
|
DWORD Fpsr;
|
||||||
|
DWORD Bcr[ARM64_MAX_BREAKPOINTS];
|
||||||
|
DWORD64 Bvr[ARM64_MAX_BREAKPOINTS];
|
||||||
|
DWORD Wcr[ARM64_MAX_WATCHPOINTS];
|
||||||
|
DWORD64 Wvr[ARM64_MAX_WATCHPOINTS];
|
||||||
|
} ARM64_NT_CONTEXT,*PARM64_NT_CONTEXT;
|
||||||
|
|
||||||
|
C_ASSERT(sizeof(ARM64_NT_CONTEXT) == 0x390);
|
||||||
|
C_ASSERT(offsetof(ARM64_NT_CONTEXT, ContextFlags) == 0x000);
|
||||||
|
C_ASSERT(offsetof(ARM64_NT_CONTEXT, X) == 0x008);
|
||||||
|
C_ASSERT(offsetof(ARM64_NT_CONTEXT, Fp) == 0x0f0);
|
||||||
|
C_ASSERT(offsetof(ARM64_NT_CONTEXT, Lr) == 0x0f8);
|
||||||
|
C_ASSERT(offsetof(ARM64_NT_CONTEXT, Sp) == 0x100);
|
||||||
|
C_ASSERT(offsetof(ARM64_NT_CONTEXT, Pc) == 0x108);
|
||||||
|
C_ASSERT(offsetof(ARM64_NT_CONTEXT, V) == 0x110);
|
||||||
|
C_ASSERT(sizeof(((ARM64_NT_CONTEXT *)0)->V[0]) == 16);
|
||||||
|
C_ASSERT(offsetof(ARM64_NT_CONTEXT, Fpcr) == 0x310);
|
||||||
|
C_ASSERT(offsetof(ARM64_NT_CONTEXT, Fpsr) == 0x314);
|
||||||
|
C_ASSERT(offsetof(ARM64_NT_CONTEXT, Bvr) == 0x338);
|
||||||
|
C_ASSERT(offsetof(ARM64_NT_CONTEXT, Wvr) == 0x380);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef ARM64_NT_CONTEXT CONTEXT,*PCONTEXT;
|
||||||
|
|
||||||
|
#endif /* _ARM64_ || __aarch64__ */
|
||||||
typedef DWORD (*POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK)(HANDLE Process,PVOID TableAddress,PDWORD Entries,PRUNTIME_FUNCTION *Functions);
|
typedef DWORD (*POUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK)(HANDLE Process,PVOID TableAddress,PDWORD Entries,PRUNTIME_FUNCTION *Functions);
|
||||||
|
|
||||||
#define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME "OutOfProcessFunctionTableCallback"
|
#define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME "OutOfProcessFunctionTableCallback"
|
||||||
@ -3701,6 +3823,7 @@ typedef DWORD LCID;
|
|||||||
#define IMAGE_FILE_MACHINE_CEF 0x0CEF
|
#define IMAGE_FILE_MACHINE_CEF 0x0CEF
|
||||||
#define IMAGE_FILE_MACHINE_EBC 0x0EBC
|
#define IMAGE_FILE_MACHINE_EBC 0x0EBC
|
||||||
#define IMAGE_FILE_MACHINE_AMD64 0x8664
|
#define IMAGE_FILE_MACHINE_AMD64 0x8664
|
||||||
|
#define IMAGE_FILE_MACHINE_ARM64 0xAA64
|
||||||
#define IMAGE_FILE_MACHINE_M32R 0x9041
|
#define IMAGE_FILE_MACHINE_M32R 0x9041
|
||||||
#define IMAGE_FILE_MACHINE_CEE 0xC0EE
|
#define IMAGE_FILE_MACHINE_CEE 0xC0EE
|
||||||
|
|
||||||
@ -3857,10 +3980,16 @@ typedef DWORD LCID;
|
|||||||
#define IMAGE_SUBSYSTEM_EFI_ROM 13
|
#define IMAGE_SUBSYSTEM_EFI_ROM 13
|
||||||
#define IMAGE_SUBSYSTEM_XBOX 14
|
#define IMAGE_SUBSYSTEM_XBOX 14
|
||||||
|
|
||||||
|
#define IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA 0x0020
|
||||||
|
#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040
|
||||||
|
#define IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY 0x0080
|
||||||
|
#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100
|
||||||
#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200
|
#define IMAGE_DLLCHARACTERISTICS_NO_ISOLATION 0x0200
|
||||||
#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400
|
#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400
|
||||||
#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800
|
#define IMAGE_DLLCHARACTERISTICS_NO_BIND 0x0800
|
||||||
|
#define IMAGE_DLLCHARACTERISTICS_APPCONTAINER 0x1000
|
||||||
#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000
|
#define IMAGE_DLLCHARACTERISTICS_WDM_DRIVER 0x2000
|
||||||
|
#define IMAGE_DLLCHARACTERISTICS_GUARD_CF 0x4000
|
||||||
#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
|
#define IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE 0x8000
|
||||||
|
|
||||||
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0
|
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0
|
||||||
|
|||||||
@ -8,7 +8,92 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* ---------------------------------------------- */
|
/* ---------------------------------------------- */
|
||||||
#ifndef __x86_64__
|
#if defined(__aarch64__)
|
||||||
|
/* ---------------------------------------------- */
|
||||||
|
|
||||||
|
.globl __chkstk
|
||||||
|
__chkstk:
|
||||||
|
/* Windows ARM64 stack probing helper.
|
||||||
|
arm64-gen.c passes the requested frame size in x15, scaled in 16-byte
|
||||||
|
units. Probe one 4 KiB page at a time and leave SP unchanged; the caller
|
||||||
|
subtracts SP after the probe returns. */
|
||||||
|
mov x16, sp
|
||||||
|
lsl x17, x15, 4
|
||||||
|
cbz x17, L_chkstk_done
|
||||||
|
L_chkstk_loop:
|
||||||
|
subs x0, x17, 4096
|
||||||
|
bls L_chkstk_tail
|
||||||
|
sub x16, x16, 4096
|
||||||
|
ldr xzr, [x16]
|
||||||
|
sub x17, x17, 4096
|
||||||
|
b L_chkstk_loop
|
||||||
|
L_chkstk_tail:
|
||||||
|
sub x16, x16, x17
|
||||||
|
ldr xzr, [x16]
|
||||||
|
L_chkstk_done:
|
||||||
|
ret
|
||||||
|
|
||||||
|
.globl _(tinyc_getbp)
|
||||||
|
_(tinyc_getbp):
|
||||||
|
mov x0, x29
|
||||||
|
ret
|
||||||
|
|
||||||
|
.globl _(mingw_getsp)
|
||||||
|
_(mingw_getsp):
|
||||||
|
mov x0, sp
|
||||||
|
ret
|
||||||
|
|
||||||
|
.globl _(__mingw_setjmp)
|
||||||
|
_(__mingw_setjmp):
|
||||||
|
/* _JUMP_BUFFER layout matches win32/include/setjmp.h for _ARM64_:
|
||||||
|
0x00 Frame, 0x08 Reserved, 0x10-0x68 X19-X30, 0x70 Sp,
|
||||||
|
0x78 Fpcr/Fpsr, 0x80-0xB8 D8-D15. */
|
||||||
|
str xzr, [x0] /* Frame = 0 */
|
||||||
|
stp x19, x20, [x0, 16]
|
||||||
|
stp x21, x22, [x0, 32]
|
||||||
|
stp x23, x24, [x0, 48]
|
||||||
|
stp x25, x26, [x0, 64]
|
||||||
|
stp x27, x28, [x0, 80]
|
||||||
|
stp x29, x30, [x0, 96]
|
||||||
|
mov x2, sp
|
||||||
|
str x2, [x0, 112] /* Sp */
|
||||||
|
mrs x2, FPCR
|
||||||
|
str w2, [x0, 120] /* Fpcr */
|
||||||
|
mrs x2, FPSR
|
||||||
|
str w2, [x0, 124] /* Fpsr */
|
||||||
|
stp d8, d9, [x0, 128]
|
||||||
|
stp d10, d11, [x0, 144]
|
||||||
|
stp d12, d13, [x0, 160]
|
||||||
|
stp d14, d15, [x0, 176]
|
||||||
|
mov x0, 0
|
||||||
|
ret
|
||||||
|
|
||||||
|
.globl _(__mingw_longjmp)
|
||||||
|
_(__mingw_longjmp):
|
||||||
|
ldp x19, x20, [x0, 16]
|
||||||
|
ldp x21, x22, [x0, 32]
|
||||||
|
ldp x23, x24, [x0, 48]
|
||||||
|
ldp x25, x26, [x0, 64]
|
||||||
|
ldp x27, x28, [x0, 80]
|
||||||
|
ldp x29, x30, [x0, 96]
|
||||||
|
ldr x2, [x0, 112] /* Sp */
|
||||||
|
mov sp, x2
|
||||||
|
ldr w2, [x0, 120] /* Fpcr */
|
||||||
|
msr FPCR, x2
|
||||||
|
ldr w2, [x0, 124] /* Fpsr */
|
||||||
|
msr FPSR, x2
|
||||||
|
ldp d8, d9, [x0, 128]
|
||||||
|
ldp d10, d11, [x0, 144]
|
||||||
|
ldp d12, d13, [x0, 160]
|
||||||
|
ldp d14, d15, [x0, 176]
|
||||||
|
mov x0, x1
|
||||||
|
cbnz x0, L_longjmp_done
|
||||||
|
mov x0, 1
|
||||||
|
L_longjmp_done:
|
||||||
|
ret
|
||||||
|
|
||||||
|
/* ---------------------------------------------- */
|
||||||
|
#elif !defined(__x86_64__)
|
||||||
/* ---------------------------------------------- */
|
/* ---------------------------------------------- */
|
||||||
|
|
||||||
.globl _(__chkstk)
|
.globl _(__chkstk)
|
||||||
@ -69,5 +154,3 @@ _(tinyc_getbp):
|
|||||||
/* ---------------------------------------------- */
|
/* ---------------------------------------------- */
|
||||||
#endif
|
#endif
|
||||||
/* ---------------------------------------------- */
|
/* ---------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user