mirror of https://github.com/x64dbg/GleeBug
Fix crash with AVX-512 on 32-bit
This commit is contained in:
parent
20d8c4a6eb
commit
8cad0a496f
|
|
@ -194,11 +194,13 @@ __declspec(dllexport) void TITCALL Getx87FPURegisters(x87FPURegister_t x87FPUReg
|
|||
(1ui64 << (XSTATE_AVX512_ZMM)))
|
||||
#endif
|
||||
|
||||
static bool SetAVX512ContextFallbackToAVX(HANDLE hActiveThread, TITAN_ENGINE_CONTEXT_AVX512_t* titcontext) {
|
||||
static bool SetAVX512ContextFallbackToAVX(HANDLE hActiveThread, TITAN_ENGINE_CONTEXT_AVX512_t* titcontext)
|
||||
{
|
||||
// Fall back to using AVX and ignore the rest
|
||||
TITAN_ENGINE_CONTEXT_t Avx;
|
||||
memset(&Avx, 0, sizeof(Avx));
|
||||
for (int i = 0; i < _countof(Avx.YmmRegisters); i++) {
|
||||
for(int i = 0; i < _countof(Avx.YmmRegisters); i++)
|
||||
{
|
||||
Avx.YmmRegisters[i] = titcontext->ZmmRegisters[i].Low;
|
||||
}
|
||||
return SetAVXContext(hActiveThread, &Avx);
|
||||
|
|
@ -270,11 +272,13 @@ __declspec(dllexport) bool TITCALL SetAVX512Context(HANDLE hActiveThread, TITAN_
|
|||
Avx512_ZMM_H[i] = titcontext->ZmmRegisters[i].High;
|
||||
}
|
||||
|
||||
#ifdef _WIN64
|
||||
if(Avx512_ZMM != NULL) //If the feature is unsupported by the processor it will return NULL
|
||||
{
|
||||
for(size_t i = 0; i < MIN(FeatureLengthAvx512_ZMM / sizeof(ZmmRegister_t), _countof(titcontext->ZmmRegisters) - FeatureLengthAvx / sizeof(XmmRegister_t)); i++)
|
||||
Avx512_ZMM[i] = titcontext->ZmmRegisters[i + FeatureLengthAvx / sizeof(XmmRegister_t)];
|
||||
}
|
||||
#endif // _WIN64
|
||||
|
||||
if(Avx512_KMASK != NULL) //If the feature is unsupported by the processor it will return NULL
|
||||
{
|
||||
|
|
@ -290,12 +294,14 @@ static bool GetAVX512ContextFallbackToAVX(HANDLE hActiveThread, TITAN_ENGINE_CON
|
|||
// Fall back to using AVX and fill the rest with 0
|
||||
TITAN_ENGINE_CONTEXT_t Avx;
|
||||
memset(titcontext, 0, sizeof(*titcontext));
|
||||
if (GetAVXContext(hActiveThread, &Avx)) {
|
||||
if(GetAVXContext(hActiveThread, &Avx))
|
||||
{
|
||||
for(int i = 0; i < _countof(Avx.YmmRegisters); i++)
|
||||
titcontext->ZmmRegisters[i].Low = Avx.YmmRegisters[i];
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -337,6 +343,9 @@ __declspec(dllexport) bool TITCALL GetAVX512Context(HANDLE hActiveThread, TITAN_
|
|||
if(_GetXStateFeaturesMask(Context, &FeatureMask) == FALSE)
|
||||
return false;
|
||||
|
||||
// References:
|
||||
// - https://github.com/rnpnr/raddebugger/blob/14860ad71da7d5cce7106180bd4e3feefd30e5d0/src/demon/win32/demon_core_win32.c#L826
|
||||
// - https://github.com/jdpatdiscord/ExceptionHandler/blob/f845854fcbe9ee48f141260e81f39eca37db5e26/ExceptionHandler.cpp#L382
|
||||
DWORD FeatureLengthSse;
|
||||
DWORD FeatureLengthAvx;
|
||||
DWORD FeatureLengthAvx512_KMASK;
|
||||
|
|
@ -366,11 +375,13 @@ __declspec(dllexport) bool TITCALL GetAVX512Context(HANDLE hActiveThread, TITAN_
|
|||
titcontext->ZmmRegisters[i].High = Avx512_ZMM_H[i];
|
||||
}
|
||||
|
||||
#ifdef _WIN64
|
||||
if(Avx512_ZMM != NULL) //If the feature is unsupported by the processor it will return NULL
|
||||
{
|
||||
for(size_t i = 0; i < MIN(FeatureLengthAvx512_ZMM / sizeof(ZmmRegister_t), _countof(titcontext->ZmmRegisters) - FeatureLengthAvx / sizeof(XmmRegister_t)); i++)
|
||||
titcontext->ZmmRegisters[i + FeatureLengthAvx / sizeof(XmmRegister_t)] = Avx512_ZMM[i];
|
||||
}
|
||||
#endif // _WIN64
|
||||
|
||||
if(Avx512_KMASK != NULL) //If the feature is unsupported by the processor it will return NULL
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue