This is necessary to accommodate ARM64EC, under which CONTEXT refers to the
X86_64 context structure but the regular ARM64 context structure is still
exposed as ARM64_NT_CONTEXT.
Based on patch by Billy Laws.
Signed-off-by: Jacek Caban <[email protected]>
---
v3: Better split.
mingw-w64-headers/include/winnt.h | 86 +++++++++++++++++++++----------
1 file changed, 59 insertions(+), 27 deletions(-)
diff --git a/mingw-w64-headers/include/winnt.h b/mingw-w64-headers/include/winnt.h
index b4fab0174..2b76698f1 100644
--- a/mingw-w64-headers/include/winnt.h
+++ b/mingw-w64-headers/include/winnt.h
@@ -2213,24 +2213,36 @@ extern "C" {
#define EXCEPTION_READ_FAULT 0
#define EXCEPTION_WRITE_FAULT 1
#define EXCEPTION_EXECUTE_FAULT 8
+#endif /* defined(_ARM64_) || defined(_ARM64EC_) */
#if !defined(RC_INVOKED)
-#define CONTEXT_ARM64 0x400000
-#define CONTEXT_CONTROL (CONTEXT_ARM64 | 0x00000001)
-#define CONTEXT_INTEGER (CONTEXT_ARM64 | 0x00000002)
-#define CONTEXT_FLOATING_POINT (CONTEXT_ARM64 | 0x00000004)
-#define CONTEXT_DEBUG_REGISTERS (CONTEXT_ARM64 | 0x00000008)
+#define CONTEXT_ARM64 0x400000
+#define CONTEXT_ARM64_CONTROL (CONTEXT_ARM64 | 0x00000001)
+#define CONTEXT_ARM64_INTEGER (CONTEXT_ARM64 | 0x00000002)
+#define CONTEXT_ARM64_FLOATING_POINT (CONTEXT_ARM64 | 0x00000004)
+#define CONTEXT_ARM64_DEBUG_REGISTERS (CONTEXT_ARM64 | 0x00000008)
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER)
-#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
+#define CONTEXT_ARM64_FULL (CONTEXT_ARM64_CONTROL | CONTEXT_ARM64_INTEGER)
+#define CONTEXT_ARM64_ALL (CONTEXT_ARM64_CONTROL | CONTEXT_ARM64_INTEGER | CONTEXT_ARM64_FLOATING_POINT | CONTEXT_ARM64_DEBUG_REGISTERS)
-#define ARM64_MAX_BREAKPOINTS 8
-#define ARM64_MAX_WATCHPOINTS 2
+#ifdef _ARM64_
+
+#define CONTEXT_CONTROL CONTEXT_ARM64_CONTROL
+#define CONTEXT_INTEGER CONTEXT_ARM64_INTEGER
+#define CONTEXT_FLOATING_POINT CONTEXT_ARM64_FLOATING_POINT
+#define CONTEXT_DEBUG_REGISTERS CONTEXT_ARM64_DEBUG_REGISTERS
+#define CONTEXT_FULL CONTEXT_ARM64_FULL
+#define CONTEXT_ALL CONTEXT_ARM64_ALL
+
+#endif /* _ARM64_ */
#endif /* !defined(RC_INVOKED) */
- typedef union _NEON128 {
+#define ARM64_MAX_BREAKPOINTS 8
+#define ARM64_MAX_WATCHPOINTS 2
+
+ typedef union _ARM64_NT_NEON128 {
struct
{
ULONGLONG Low;
@@ -2240,9 +2252,19 @@ extern "C" {
float S[4];
WORD H[8];
BYTE B[16];
- } NEON128, *PNEON128;
+ } ARM64_NT_NEON128, *PARM64_NT_NEON128;
- typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
+#ifdef _ARM64_
+ typedef ARM64_NT_NEON128 NEON128, *PNEON128;
+#endif
+
+ typedef struct DECLSPEC_ALIGN(16)
+#ifdef _ARM64_
+ _CONTEXT
+#else
+ _ARM64_NT_CONTEXT
+#endif
+ {
ULONG ContextFlags; /* 000 */
/* CONTEXT_INTEGER */
ULONG Cpsr; /* 004 */
@@ -2288,7 +2310,7 @@ extern "C" {
DWORD64 Sp; /* 100 */
DWORD64 Pc; /* 108 */
/* CONTEXT_FLOATING_POINT */
- NEON128 V[32]; /* 110 */
+ ARM64_NT_NEON128 V[32]; /* 110 */
DWORD Fpcr; /* 310 */
DWORD Fpsr; /* 314 */
/* CONTEXT_DEBUG_REGISTERS */
@@ -2296,35 +2318,44 @@ extern "C" {
DWORD64 Bvr[ARM64_MAX_BREAKPOINTS]; /* 338 */
DWORD Wcr[ARM64_MAX_WATCHPOINTS]; /* 378 */
DWORD64 Wvr[ARM64_MAX_WATCHPOINTS]; /* 380 */
- } CONTEXT, *PCONTEXT;
+ } ARM64_NT_CONTEXT, *PARM64_NT_CONTEXT;
+
+#ifdef _ARM64_
+ typedef ARM64_NT_CONTEXT CONTEXT, *PCONTEXT;
+#endif
+
+ typedef struct _IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY ARM64_RUNTIME_FUNCTION, *PARM64_RUNTIME_FUNCTION;
+
+#ifdef _ARM64_
typedef struct _IMAGE_ARM64_RUNTIME_FUNCTION_ENTRY RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
typedef PRUNTIME_FUNCTION (*PGET_RUNTIME_FUNCTION_CALLBACK)(DWORD64 ControlPc,PVOID Context);
+#endif
#define UNW_FLAG_NHANDLER 0x0
#define UNW_FLAG_EHANDLER 0x1
#define UNW_FLAG_UHANDLER 0x2
- struct _DISPATCHER_CONTEXT;
- typedef struct _DISPATCHER_CONTEXT DISPATCHER_CONTEXT;
- typedef struct _DISPATCHER_CONTEXT *PDISPATCHER_CONTEXT;
-
- struct _DISPATCHER_CONTEXT {
+ typedef struct _DISPATCHER_CONTEXT_ARM64 {
ULONG_PTR ControlPc;
ULONG_PTR ImageBase;
- PRUNTIME_FUNCTION FunctionEntry;
+ PARM64_RUNTIME_FUNCTION FunctionEntry;
ULONG_PTR EstablisherFrame;
ULONG_PTR TargetPc;
- PCONTEXT ContextRecord;
+ PARM64_NT_CONTEXT ContextRecord;
PEXCEPTION_ROUTINE LanguageHandler;
PVOID HandlerData;
struct _UNWIND_HISTORY_TABLE *HistoryTable;
ULONG ScopeIndex;
BOOLEAN ControlPcIsUnwound;
PBYTE NonVolatileRegisters;
- };
+ } DISPATCHER_CONTEXT_ARM64, *PDISPATCHER_CONTEXT_ARM64;
- typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
+#if defined(_ARM64_)
+ typedef DISPATCHER_CONTEXT_ARM64 DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
+#endif
+
+ typedef struct _KNONVOLATILE_CONTEXT_POINTERS_ARM64 {
PDWORD64 X19;
PDWORD64 X20;
PDWORD64 X21;
@@ -2346,12 +2377,13 @@ extern "C" {
PDWORD64 D13;
PDWORD64 D14;
PDWORD64 D15;
- } KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
+ } KNONVOLATILE_CONTEXT_POINTERS_ARM64, *PKNONVOLATILE_CONTEXT_POINTERS_ARM64;
-#define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME "OutOfProcessFunctionTableCallback"
-
-#endif /* _ARM64_ */
+#ifdef _ARM64_
+ typedef KNONVOLATILE_CONTEXT_POINTERS_ARM64 KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
+#endif
+#define OUT_OF_PROCESS_FUNCTION_TABLE_CALLBACK_EXPORT_NAME "OutOfProcessFunctionTableCallback"
#ifdef _X86_
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public