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 <ja...@codeweavers.com> --- 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 Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public