Skip to content

Commit

Permalink
More x64 support
Browse files Browse the repository at this point in the history
  • Loading branch information
zero318 committed Jun 3, 2024
1 parent 7c80a44 commit a93defa
Show file tree
Hide file tree
Showing 21 changed files with 261 additions and 137 deletions.
2 changes: 1 addition & 1 deletion Base.props
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<Keyword>Win32Proj</Keyword>
</PropertyGroup>
<PropertyGroup>
<BitsSuffix Condition="'$(Platform)'=='x64'">_64</BitsSuffix>
<BitsSuffix Condition="'$(Platform)'=='x64' And '$(UseBitsSuffix)'==''">_64</BitsSuffix>
<DebugSuffix Condition="$(UseDebugLibraries)==true Or '$(Configuration)'=='Debug'">_d</DebugSuffix>
<Suffix>$(BitsSuffix)$(DebugSuffix)</Suffix>
</PropertyGroup>
Expand Down
2 changes: 1 addition & 1 deletion Release.props
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<FunctionLevelLinking>true</FunctionLevelLinking>
<EnableParallelCodeGeneration>true</EnableParallelCodeGeneration>
<EnableEnhancedInstructionSet>StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
<EnableEnhancedInstructionSet Condition="'$(Platform)'=='Win32'">StreamingSIMDExtensions2</EnableEnhancedInstructionSet>
<BufferSecurityCheck>false</BufferSecurityCheck>
<AdditionalOptions>/Qfast_transcendentals /Zo /Gw %(AdditionalOptions)</AdditionalOptions>
<!--<AdditionalOptions>/Qpar-report:2 /Qvec-report:2 %(AdditionalOptions)</AdditionalOptions>-->
Expand Down
8 changes: 4 additions & 4 deletions libs/external_deps.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,13 @@
<CopyFiles Include="$(InDir)bin\zlib-ng$(Suffix).lib" OutputFolder="$(OutDir)" />
<CopyFiles Include="$(InDir)bin\zlib-ng$(Suffix).pdb" OutputFolder="$(OutDir)" />

<CopyFiles Include="$(InDir)bin\libcrypto-1_1.dll" OutputFolder="$(OutDir)" />
<CopyFiles Include="$(InDir)bin\libssl-1_1.dll" OutputFolder="$(OutDir)" />
<CopyFiles Include="$(InDir)bin\libcrypto-1_1$(Suffix).dll" OutputFolder="$(OutDir)" />
<CopyFiles Include="$(InDir)bin\libssl-1_1$(Suffix).dll" OutputFolder="$(OutDir)" />

<CopyFiles Include="$(InDir)bin\libcurl$(Suffix).dll" OutputFolder="$(OutDir)" />
<CopyFiles Include="$(InDir)bin\libcurl$(Suffix).pdb" OutputFolder="$(OutDir)" />

<CopyFiles Include="$(InDir)bin\fribidi-0.dll" OutputFolder="$(OutDir)" />
<CopyFiles Include="$(InDir)bin\fribidi-0.pdb" OutputFolder="$(OutDir)" />
<CopyFiles Include="$(InDir)bin\fribidi-0$(Suffix).dll" OutputFolder="$(OutDir)" />
<CopyFiles Include="$(InDir)bin\fribidi-0$(Suffix).pdb" OutputFolder="$(OutDir)" />
</ItemGroup>
</Project>
20 changes: 12 additions & 8 deletions thcrap/src/binhack.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ void add_constpool(const char* data, size_t data_length, patch_value_type_t type
constpool_inputs.emplace_back(data_view);
has_str:
constpool_prerenders.emplace(std::piecewise_construct,
/* constpool_key_t */ std::forward_as_tuple(alignment, type, input_index),
/* constpool_key_t */ std::forward_as_tuple((uint8_t)alignment, type, input_index),
/* constpool_value_t */ std::forward_as_tuple(addr, source_module)
);
}
Expand All @@ -262,7 +262,7 @@ void add_constpool_raw_pointer(uintptr_t data, uintptr_t addr) {
constpool_inputs.emplace_back(data);
has_pointer:
constpool_prerenders.emplace(std::piecewise_construct,
/* constpool_key_t */ std::forward_as_tuple(alignof(void*), PVT_POINTER, input_index),
/* constpool_key_t */ std::forward_as_tuple((uint8_t)alignof(void*), PVT_POINTER, input_index),
/* constpool_value_t */ std::forward_as_tuple(addr, (HMODULE)NULL)
);
}
Expand Down Expand Up @@ -647,6 +647,13 @@ void constpool_apply(HackpointMemoryPage* page_array) {
value.render_index = render_index;
}
page_array[0].size = constpool_memory_size;

#pragma warning(push)
// The entire purpose of this code on x64 is to allocate memory in the
// bottom 2GB of the address space so that is can be accessed from anywhere
// with a sign extended 32 bit immediate address. That means that any warnings
// about truncating pointers to int don't apply here.
#pragma warning(disable : 4311 4302 4244)
if (constpool_memory_size) {
uint8_t* constpool = page_array[0].address = (uint8_t*)VirtualAllocLow(0, constpool_memory_size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

Expand All @@ -668,6 +675,7 @@ void constpool_apply(HackpointMemoryPage* page_array) {
PatchRegion((void*)value.addr, NULL, &constpool_write, sizeof(uint32_t));
}
}
#pragma warning(pop)
}
#pragma warning(pop)

Expand Down Expand Up @@ -1467,12 +1475,8 @@ bool codecave_from_json(const char *name, json_t *in, codecave_t *out) {
return false;
case JEVAL_SUCCESS:
// Round the alignment to the next power of 2 (including 1)
#if TH_X86
if (unsigned long bit; _BitScanReverse(&bit, align_val - 1)) {
#else
if (unsigned long bit; _BitScanReverse64(&bit, align_val - 1)) {
#endif
align_val = 1u << (bit + 1);
if (unsigned long bit; _BitScanReverseZ(&bit, align_val - 1)) {
align_val = (size_t)1u << (bit + 1);
} else {
align_val = 1u;
}
Expand Down
161 changes: 95 additions & 66 deletions thcrap/src/compiler_support.h
Original file line number Diff line number Diff line change
Expand Up @@ -554,24 +554,24 @@ extern "C++" {

// - Segmented Addressing
#if __has_attribute(address_space)
#define read_fs_byte(offset) (*(uint8_t __attribute__((address_space(257)))*)((uintptr_t)offset))
#define read_fs_word(offset) (*(uint16_t __attribute__((address_space(257)))*)((uintptr_t)offset))
#define read_fs_dword(offset) (*(uint32_t __attribute__((address_space(257)))*)((uintptr_t)offset))
#define read_fs_qword(offset) (*(uint64_t __attribute__((address_space(257)))*)((uintptr_t)offset))
#define write_fs_byte(offset, data) ((void)(*(uint8_t __attribute__((address_space(257)))*)((uintptr_t)offset) = (uint8_t)(data)))
#define write_fs_word(offset, data) ((void)(*(uint16_t __attribute__((address_space(257)))*)((uintptr_t)offset) = (uint16_t)(data)))
#define write_fs_dword(offset, data) ((void)(*(uint32_t __attribute__((address_space(257)))*)((uintptr_t)offset) = (uint32_t)(data)))
#define write_fs_qword(offset, data) ((void)(*(uint64_t __attribute__((address_space(257)))*)((uintptr_t)offset) = (uint64_t)(data)))
#define read_fs_byte(offset) (*(uint8_t __attribute__((address_space(257)))*)((uintptr_t)(offset)))
#define read_fs_word(offset) (*(uint16_t __attribute__((address_space(257)))*)((uintptr_t)(offset)))
#define read_fs_dword(offset) (*(uint32_t __attribute__((address_space(257)))*)((uintptr_t)(offset)))
#define read_fs_qword(offset) (*(uint64_t __attribute__((address_space(257)))*)((uintptr_t)(offset)))
#define write_fs_byte(offset, data) ((void)(*(uint8_t __attribute__((address_space(257)))*)((uintptr_t)(offset)) = (uint8_t)(data)))
#define write_fs_word(offset, data) ((void)(*(uint16_t __attribute__((address_space(257)))*)((uintptr_t)(offset)) = (uint16_t)(data)))
#define write_fs_dword(offset, data) ((void)(*(uint32_t __attribute__((address_space(257)))*)((uintptr_t)(offset)) = (uint32_t)(data)))
#define write_fs_qword(offset, data) ((void)(*(uint64_t __attribute__((address_space(257)))*)((uintptr_t)(offset)) = (uint64_t)(data)))
#elif defined(__SEG_FS)
#if CLANG_COMPAT || !defined(__cplusplus) // __seg_fs isn't recognized by GCC when compiling C++
#define read_fs_byte(offset) (*(__seg_fs uint8_t*)((uintptr_t)offset))
#define read_fs_word(offset) (*(__seg_fs uint16_t*)((uintptr_t)offset))
#define read_fs_dword(offset) (*(__seg_fs uint32_t*)((uintptr_t)offset))
#define read_fs_qword(offset) (*(__seg_fs uint64_t*)((uintptr_t)offset))
#define write_fs_byte(offset, data) ((void)(*(__seg_fs uint8_t*)((uintptr_t)offset) = (uint8_t)(data)))
#define write_fs_word(offset, data) ((void)(*(__seg_fs uint16_t*)((uintptr_t)offset) = (uint16_t)(data)))
#define write_fs_dword(offset, data) ((void)(*(__seg_fs uint32_t*)((uintptr_t)offset) = (uint32_t)(data)))
#define write_fs_qword(offset, data) ((void)(*(__seg_fs uint64_t*)((uintptr_t)offset) = (uint64_t)(data)))
#define read_fs_byte(offset) (*(__seg_fs uint8_t*)((uintptr_t)(offset)))
#define read_fs_word(offset) (*(__seg_fs uint16_t*)((uintptr_t)(offset)))
#define read_fs_dword(offset) (*(__seg_fs uint32_t*)((uintptr_t)(offset)))
#define read_fs_qword(offset) (*(__seg_fs uint64_t*)((uintptr_t)(offset)))
#define write_fs_byte(offset, data) ((void)(*(__seg_fs uint8_t*)((uintptr_t)(offset)) = (uint8_t)(data)))
#define write_fs_word(offset, data) ((void)(*(__seg_fs uint16_t*)((uintptr_t)(offset)) = (uint16_t)(data)))
#define write_fs_dword(offset, data) ((void)(*(__seg_fs uint32_t*)((uintptr_t)(offset)) = (uint32_t)(data)))
#define write_fs_qword(offset, data) ((void)(*(__seg_fs uint64_t*)((uintptr_t)(offset)) = (uint64_t)(data)))
#else
extern "C" {
uint8_t read_fs_byte_gcc(size_t offset);
Expand All @@ -587,49 +587,49 @@ void write_fs_qword_gcc(size_t offset, uint32_t data);
#define read_fs_word(offset) read_fs_word_gcc(offset)
#define read_fs_dword(offset) read_fs_dword_gcc(offset)
#define read_fs_qword(offset) read_fs_qword_gcc(offset)
#define write_fs_byte(offset, data) write_fs_byte_gcc(offset, data)
#define write_fs_word(offset, data) write_fs_word_gcc(offset, data)
#define write_fs_dword(offset, data) write_fs_dword_gcc(offset, data)
#define write_fs_qword(offset, data) write_fs_qword_gcc(offset, data)
#define write_fs_byte(offset, data) write_fs_byte_gcc((offset), (data))
#define write_fs_word(offset, data) write_fs_word_gcc((offset), (data))
#define write_fs_dword(offset, data) write_fs_dword_gcc((offset), (data))
#define write_fs_qword(offset, data) write_fs_qword_gcc((offset), (data))
#endif
#elif MSVC_COMPAT
#define read_fs_byte(offset) __readfsbyte(offset)
#define read_fs_word(offset) __readfsword(offset)
#define read_fs_dword(offset) __readfsdword(offset)
#define read_fs_qword(offset) __readfsqword(offset)
#define write_fs_byte(offset, data) __writefsbyte(offset, data)
#define write_fs_word(offset, data) __writefsword(offset, data)
#define write_fs_dword(offset, data) __writefsdword(offset, data)
#define write_fs_qword(offset, data) __writefsqword(offset, data)
#else
#define read_fs_byte(offset) (*(uint8_t*)((uintptr_t)offset))
#define read_fs_word(offset) (*(uint16_t*)((uintptr_t)offset))
#define read_fs_dword(offset) (*(uint32_t*)((uintptr_t)offset))
#define read_fs_qword(offset) (*(uint64_t*)((uintptr_t)offset))
#define write_fs_byte(offset, data) ((void)(*(uint8_t*)((uintptr_t)offset) = (uint8_t)(data)))
#define write_fs_word(offset, data) ((void)(*(uint16_t*)((uintptr_t)offset) = (uint16_t)(data)))
#define write_fs_dword(offset, data) ((void)(*(uint32_t*)((uintptr_t)offset) = (uint32_t)(data)))
#define write_fs_qword(offset, data) ((void)(*(uint64_t*)((uintptr_t)offset) = (uint64_t)(data)))
#define write_fs_byte(offset, data) __writefsbyte((offset), (data))
#define write_fs_word(offset, data) __writefsword((offset), (data))
#define write_fs_dword(offset, data) __writefsdword((offset), (data))
#define write_fs_qword(offset, data) __writefsqword((offset), (data))
#else
#define read_fs_byte(offset) (*(uint8_t*)((uintptr_t)(offset)))
#define read_fs_word(offset) (*(uint16_t*)((uintptr_t)(offset)))
#define read_fs_dword(offset) (*(uint32_t*)((uintptr_t)(offset)))
#define read_fs_qword(offset) (*(uint64_t*)((uintptr_t)(offset)))
#define write_fs_byte(offset, data) ((void)(*(uint8_t*)((uintptr_t)(offset)) = (uint8_t)(data)))
#define write_fs_word(offset, data) ((void)(*(uint16_t*)((uintptr_t)(offset)) = (uint16_t)(data)))
#define write_fs_dword(offset, data) ((void)(*(uint32_t*)((uintptr_t)(offset)) = (uint32_t)(data)))
#define write_fs_qword(offset, data) ((void)(*(uint64_t*)((uintptr_t)(offset)) = (uint64_t)(data)))
#endif
#if __has_attribute(address_space)
#define read_gs_byte(offset) (*(uint8_t __attribute__((address_space(256)))*)((uintptr_t)offset))
#define read_gs_word(offset) (*(uint16_t __attribute__((address_space(256)))*)((uintptr_t)offset))
#define read_gs_dword(offset) (*(uint32_t __attribute__((address_space(256)))*)((uintptr_t)offset))
#define read_gs_qword(offset) (*(uint64_t __attribute__((address_space(256)))*)((uintptr_t)offset))
#define write_gs_byte(offset, data) ((void)(*(uint8_t __attribute__((address_space(256)))*)((uintptr_t)offset) = (uint8_t)(data)))
#define write_gs_word(offset, data) ((void)(*(uint16_t __attribute__((address_space(256)))*)((uintptr_t)offset) = (uint16_t)(data)))
#define write_gs_dword(offset, data) ((void)(*(uint32_t __attribute__((address_space(256)))*)((uintptr_t)offset) = (uint32_t)(data)))
#define write_gs_qword(offset, data) ((void)(*(uint64_t __attribute__((address_space(256)))*)((uintptr_t)offset) = (uint64_t)(data)))
#define read_gs_byte(offset) (*(uint8_t __attribute__((address_space(256)))*)((uintptr_t)(offset)))
#define read_gs_word(offset) (*(uint16_t __attribute__((address_space(256)))*)((uintptr_t)(offset)))
#define read_gs_dword(offset) (*(uint32_t __attribute__((address_space(256)))*)((uintptr_t)(offset)))
#define read_gs_qword(offset) (*(uint64_t __attribute__((address_space(256)))*)((uintptr_t)(offset)))
#define write_gs_byte(offset, data) ((void)(*(uint8_t __attribute__((address_space(256)))*)((uintptr_t)(offset)) = (uint8_t)(data)))
#define write_gs_word(offset, data) ((void)(*(uint16_t __attribute__((address_space(256)))*)((uintptr_t)(offset)) = (uint16_t)(data)))
#define write_gs_dword(offset, data) ((void)(*(uint32_t __attribute__((address_space(256)))*)((uintptr_t)(offset)) = (uint32_t)(data)))
#define write_gs_qword(offset, data) ((void)(*(uint64_t __attribute__((address_space(256)))*)((uintptr_t)(offset)) = (uint64_t)(data)))
#elif defined(__SEG_GS)
#if CLANG_COMPAT || !defined(__cplusplus) // __seg_gs isn't recognized by GCC when compiling C++
#define read_gs_byte(offset) (*(__seg_gs uint8_t*)((uintptr_t)offset))
#define read_gs_word(offset) (*(__seg_gs uint16_t*)((uintptr_t)offset))
#define read_gs_dword(offset) (*(__seg_gs uint32_t*)((uintptr_t)offset))
#define read_gs_qword(offset) (*(__seg_gs uint64_t*)((uintptr_t)offset))
#define write_gs_byte(offset, data) ((void)(*(__seg_gs uint8_t*)((uintptr_t)offset) = (uint8_t)(data)))
#define write_gs_word(offset, data) ((void)(*(__seg_gs uint16_t*)((uintptr_t)offset) = (uint16_t)(data)))
#define write_gs_dword(offset, data) ((void)(*(__seg_gs uint32_t*)((uintptr_t)offset) = (uint32_t)(data)))
#define write_gs_qword(offset, data) ((void)(*(__seg_gs uint64_t*)((uintptr_t)offset) = (uint64_t)(data)))
#define read_gs_byte(offset) (*(__seg_gs uint8_t*)((uintptr_t)(offset)))
#define read_gs_word(offset) (*(__seg_gs uint16_t*)((uintptr_t)(offset)))
#define read_gs_dword(offset) (*(__seg_gs uint32_t*)((uintptr_t)(offset)))
#define read_gs_qword(offset) (*(__seg_gs uint64_t*)((uintptr_t)(offset)))
#define write_gs_byte(offset, data) ((void)(*(__seg_gs uint8_t*)((uintptr_t)(offset)) = (uint8_t)(data)))
#define write_gs_word(offset, data) ((void)(*(__seg_gs uint16_t*)((uintptr_t)(offset)) = (uint16_t)(data)))
#define write_gs_dword(offset, data) ((void)(*(__seg_gs uint32_t*)((uintptr_t)(offset)) = (uint32_t)(data)))
#define write_gs_qword(offset, data) ((void)(*(__seg_gs uint64_t*)((uintptr_t)(offset)) = (uint64_t)(data)))
#else
extern "C" {
uint8_t read_gs_byte_gcc(size_t offset);
Expand All @@ -645,29 +645,58 @@ void write_gs_qword_gcc(size_t offset, uint64_t data);
#define read_gs_word(offset) read_gs_word_gcc(offset)
#define read_gs_dword(offset) read_gs_dword_gcc(offset)
#define read_gs_qword(offset) read_gs_qword_gcc(offset)
#define write_gs_byte(offset, data) write_gs_byte_gcc(offset, data)
#define write_gs_word(offset, data) write_gs_word_gcc(offset, data)
#define write_gs_dword(offset, data) write_gs_dword_gcc(offset, data)
#define write_gs_qword(offset, data) write_gs_qword_gcc(offset, data)
#define write_gs_byte(offset, data) write_gs_byte_gcc((offset), (data))
#define write_gs_word(offset, data) write_gs_word_gcc((offset), (data))
#define write_gs_dword(offset, data) write_gs_dword_gcc((offset), (data))
#define write_gs_qword(offset, data) write_gs_qword_gcc((offset), (data))
#endif
#elif MSVC_COMPAT
#define read_gs_byte(offset) __readgsbyte(offset)
#define read_gs_word(offset) __readgsword(offset)
#define read_gs_dword(offset) __readgsdword(offset)
#define read_gs_qword(offset) __readgsqword(offset)
#define write_gs_byte(offset, data) __writegsbyte(offset, data)
#define write_gs_word(offset, data) __writegsword(offset, data)
#define write_gs_dword(offset, data) __writegsdword(offset, data)
#define write_gs_qword(offset, data) __writegsqword(offset, data)
#else
#define read_gs_byte(offset) (*(uint8_t*)((uintptr_t)offset))
#define read_gs_word(offset) (*(uint16_t*)((uintptr_t)offset))
#define read_gs_dword(offset) (*(uint32_t*)((uintptr_t)offset))
#define read_gs_qword(offset) (*(uint64_t*)((uintptr_t)offset))
#define write_gs_byte(offset, data) ((void)(*(uint8_t*)((uintptr_t)offset) = (uint8_t)(data)))
#define write_gs_word(offset, data) ((void)(*(uint16_t*)((uintptr_t)offset) = (uint16_t)(data)))
#define write_gs_dword(offset, data) ((void)(*(uint32_t*)((uintptr_t)offset) = (uint32_t)(data)))
#define write_gs_qword(offset, data) ((void)(*(uint64_t*)((uintptr_t)offset) = (uint64_t)(data)))
#define write_gs_byte(offset, data) __writegsbyte((offset), (data))
#define write_gs_word(offset, data) __writegsword((offset), (data))
#define write_gs_dword(offset, data) __writegsdword((offset), (data))
#define write_gs_qword(offset, data) __writegsqword((offset), (data))
#else
#define read_gs_byte(offset) (*(uint8_t*)((uintptr_t)(offset)))
#define read_gs_word(offset) (*(uint16_t*)((uintptr_t)(offset)))
#define read_gs_dword(offset) (*(uint32_t*)((uintptr_t)(offset)))
#define read_gs_qword(offset) (*(uint64_t*)((uintptr_t)(offset)))
#define write_gs_byte(offset, data) ((void)(*(uint8_t*)((uintptr_t)(offset)) = (uint8_t)(data)))
#define write_gs_word(offset, data) ((void)(*(uint16_t*)((uintptr_t)(offset)) = (uint16_t)(data)))
#define write_gs_dword(offset, data) ((void)(*(uint32_t*)((uintptr_t)(offset)) = (uint32_t)(data)))
#define write_gs_qword(offset, data) ((void)(*(uint64_t*)((uintptr_t)(offset)) = (uint64_t)(data)))
#endif

#define read_teb32_byte(offset) read_fs_byte(offset)
#define read_teb32_word(offset) read_fs_word(offset)
#define read_teb32_dword(offset) read_fs_dword(offset)
#define read_teb32_qword(offset) read_fs_qword(offset)
#define write_teb32_byte(offset, data) write_fs_byte((offset), (data))
#define write_teb32_word(offset, data) write_fs_word((offset), (data))
#define write_teb32_dword(offset, data) write_fs_dword((offset), (data))
#define write_teb32_qword(offset, data) write_fs_qword((offset), (data))

#if !TH_X64
#define read_teb_byte(offset) read_teb32_byte(offset)
#define read_teb_word(offset) read_teb32_word(offset)
#define read_teb_dword(offset) read_teb32_dword(offset)
#define read_teb_qword(offset) read_teb32_qword(offset)
#define write_teb_byte(offset, data) write_teb32_byte((offset), (data))
#define write_teb_word(offset, data) write_teb32_word((offset), (data))
#define write_teb_dword(offset, data) write_teb32_dword((offset), (data))
#define write_teb_qword(offset, data) write_teb32_qword((offset), (data))
#else
#define read_teb_byte(offset) read_gs_byte(offset)
#define read_teb_word(offset) read_gs_word(offset)
#define read_teb_dword(offset) read_gs_dword(offset)
#define read_teb_qword(offset) read_gs_qword(offset)
#define write_teb_byte(offset, data) write_gs_byte((offset), (data))
#define write_teb_word(offset, data) write_gs_word((offset), (data))
#define write_teb_dword(offset, data) write_gs_dword((offset), (data))
#define write_teb_qword(offset, data) write_gs_qword((offset), (data))
#endif

#if GCC_COMPAT
Expand Down
4 changes: 2 additions & 2 deletions thcrap/src/exception.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ static void log_print_context(CONTEXT* ctx)
#endif

#define TagWordString(index) \
fpu_tag_strings[(ctx->FloatSave.TagWord >> ((index) * 2)) & 0b11]
fpu_tag_strings[((uint32_t)ctx->FloatSave.TagWord >> ((index) * 2)) & 0b11]

#define FPUReg(index) \
*(uint16_t*)&(((uint8_t*)ctx->FloatSave.RegisterArea)[(10 * (index)) + sizeof(uint64_t)]), *(uint64_t*)&(((uint8_t*)ctx->FloatSave.RegisterArea)[10 * (index)])
Expand Down Expand Up @@ -547,7 +547,7 @@ void manual_stack_walk(uintptr_t current_esp) {
"(Execute Write-Copy)",
"(Execute Read Write)"
};
uint8_t stack_offset_length = snprintf(NULL, 0, "%X", (uintptr_t)(stack_top - 1) - current_esp);
uint8_t stack_offset_length = snprintf(NULL, 0, "%p", (uintptr_t)(stack_top - 1) - current_esp);
for (
uintptr_t* stack_addr = (uintptr_t*)current_esp;
stack_addr < stack_top - 1; // These don't necessarily align cleanly, so array indexing would be tricky to use here
Expand Down
Loading

0 comments on commit a93defa

Please sign in to comment.