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]>
---
mingw-w64-headers/include/winnt.h | 98 +++++++++++++++++++++----------
1 file changed, 68 insertions(+), 30 deletions(-)
diff --git a/mingw-w64-headers/include/winnt.h b/mingw-w64-headers/include/winnt.h
index 3fe530f0a..df408e6c8 100644
--- a/mingw-w64-headers/include/winnt.h
+++ b/mingw-w64-headers/include/winnt.h
@@ -2213,28 +2213,46 @@ 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_ARM64_X18 (CONTEXT_ARM64 | 0x00000010)
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER)
-#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
-#define EXCEPTION_READ_FAULT 0
-#define EXCEPTION_WRITE_FAULT 1
-#define EXCEPTION_EXECUTE_FAULT 8
+#define CONTEXT_ARM64_FULL (CONTEXT_ARM64_CONTROL | CONTEXT_ARM64_INTEGER | CONTEXT_ARM64_FLOATING_POINT)
+#define CONTEXT_ARM64_ALL (CONTEXT_ARM64_CONTROL | CONTEXT_ARM64_INTEGER | CONTEXT_ARM64_FLOATING_POINT | CONTEXT_ARM64_DEBUG_REGISTERS | CONTEXT_ARM64_X18)
-#define ARM64_MAX_BREAKPOINTS 8
-#define ARM64_MAX_WATCHPOINTS 2
+#define CONTEXT_ARM64_UNWOUND_TO_CALL 0x20000000
+
+#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
+#define CONTEXT_UNWOUND_TO_CALL CONTEXT_ARM64_UNWOUND_TO_CALL
+
+#define CONTEXT_EXCEPTION_ACTIVE 0x08000000
+#define CONTEXT_SERVICE_ACTIVE 0x10000000
+#define CONTEXT_EXCEPTION_REQUEST 0x40000000
+#define CONTEXT_EXCEPTION_REPORTING 0x80000000
+
+#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;
@@ -2244,9 +2262,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 // _ARM64_
+
+ typedef struct DECLSPEC_ALIGN(16)
+#ifdef _ARM64_
+ _CONTEXT
+#else
+ _ARM64_NT_CONTEXT
+#endif
+ {
ULONG ContextFlags; /* 000 */
/* CONTEXT_INTEGER */
ULONG Cpsr; /* 004 */
@@ -2292,7 +2320,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 */
@@ -2300,35 +2328,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 // _ARM64_
+
+
+ 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 // _ARM64_
#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 // defined(_ARM64_)
+
+ typedef struct _KNONVOLATILE_CONTEXT_POINTERS_ARM64 {
PDWORD64 X19;
PDWORD64 X20;
PDWORD64 X21;
@@ -2350,12 +2387,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 // _ARM64_
+#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