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 | 91 ++++++++++++++++++++++--------- 1 file changed, 64 insertions(+), 27 deletions(-)
diff --git a/mingw-w64-headers/include/winnt.h b/mingw-w64-headers/include/winnt.h index b4fab0174..241be645e 100644 --- a/mingw-w64-headers/include/winnt.h +++ b/mingw-w64-headers/include/winnt.h @@ -2213,24 +2213,41 @@ 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 + +#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; @@ -2240,9 +2257,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 +2315,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 +2323,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 +2382,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 Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public