From d592c1996d74e9e6e728026486cdab6a75f43aaa Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Wed, 9 Apr 2025 01:12:55 +0800 Subject: [WOW64] Add wow64 PE build scaffolding (#2513) --- src/include/custommem.h | 8 ++------ src/include/debug.h | 20 ++++++++++++++++++++ src/include/os.h | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 6 deletions(-) (limited to 'src/include') diff --git a/src/include/custommem.h b/src/include/custommem.h index b17eff99..5e883570 100644 --- a/src/include/custommem.h +++ b/src/include/custommem.h @@ -138,13 +138,9 @@ int checkInHotPage(uintptr_t addr); #endif // this will simulate an x86_64 version of the function (no tracking will done, but tracking will be used) -void* box_mmap(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset); +void* box_mmap(void* addr, size_t length, int prot, int flags, int fd, ssize_t offset); // this will simulate an x86_64 version of the function (no tracking will done) -int box_munmap(void* addr, unsigned long length); -// this will call the syscall directly -void* internal_mmap(void *addr, unsigned long length, int prot, int flags, int fd, ssize_t offset); -// this will call the syscall directly -int internal_munmap(void* addr, unsigned long length); +int box_munmap(void* addr, size_t length); void reserveHighMem(); diff --git a/src/include/debug.h b/src/include/debug.h index 631e35d7..93268420 100644 --- a/src/include/debug.h +++ b/src/include/debug.h @@ -68,6 +68,7 @@ extern int box64_tcmalloc_minimal; // when using tcmalloc_minimal #define LOG_NEVER 3 #define LOG_VERBOSE 3 +#ifndef _WIN32 // TODO: better wow64 support? void printf_ftrace(int prefix, const char* fmt, ...); #define printf_log_prefix(prefix, L, ...) \ @@ -98,6 +99,18 @@ void printf_ftrace(int prefix, const char* fmt, ...); #define dynarec_log(L, ...) dynarec_log_prefix(1, L, __VA_ARGS__) +#else +#define printf_log_prefix(prefix, L, ...) +#define printf_log(L, ...) +#define printf_dump_prefix(prefix, L, ...) +#define printf_dump(L, ...) +#define printf_dlsym_prefix(prefix, L, ...) +#define printf_dlsym(L, ...) +#define dynarec_log_prefix(prefix, L, ...) +#define dynarec_log(L, ...) +#endif + + #define EXPORT __attribute__((visibility("default"))) #ifdef BUILD_DYNAMIC #define EXPORTDYN __attribute__((visibility("default"))) @@ -105,6 +118,7 @@ void printf_ftrace(int prefix, const char* fmt, ...); #define EXPORTDYN #endif +#ifndef _WIN32 // TODO: better wow64 support? #ifndef STATICBUILD void init_malloc_hook(void); #endif @@ -131,6 +145,12 @@ extern void* __libc_memalign(size_t, size_t); extern char* box_strdup(const char* s); extern char* box_realpath(const char* path, char* ret); #endif +#else +#define box_malloc WinMalloc +#define box_realloc WinRealloc +#define box_calloc WinCalloc +#define box_free WinFree +#endif //use actual_XXXX for internal memory that should be in 32bits space when box32 is active //use box_XXX for internal memory that doesn't need anything special diff --git a/src/include/os.h b/src/include/os.h index 6968df19..2ab70722 100644 --- a/src/include/os.h +++ b/src/include/os.h @@ -2,6 +2,37 @@ #define __OS_H_ #include +#include + +#ifndef _WIN32 +#include +#include +#else +typedef __int64 ssize_t; + +#define PROT_READ 0x1 +#define PROT_WRITE 0x2 +#define PROT_EXEC 0x4 + +#define MAP_FAILED ((void*)-1) +#define MAP_PRIVATE 0x02 +#define MAP_FIXED 0x10 +#define MAP_ANONYMOUS 0x20 +#define MAP_32BIT 0x40 +#define MAP_NORESERVE 0 + +void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset); +int munmap(void* addr, size_t length); +int mprotect(void* addr, size_t len, int prot); + +void* WinMalloc(size_t size); +void* WinRealloc(void* ptr, size_t size); +void* WinCalloc(size_t nmemb, size_t size); +void WinFree(void* ptr); +#endif + +void* InternalMmap(void* addr, unsigned long length, int prot, int flags, int fd, ssize_t offset); +int InternalMunmap(void* addr, unsigned long length); int GetTID(void); int SchedYield(void); @@ -17,6 +48,8 @@ int IsBridgeSignature(char s, char c); int IsNativeCall(uintptr_t addr, int is32bits, uintptr_t* calladdress, uint16_t* retn); void EmuInt3(void* emu, void* addr); void* EmuFork(void* emu, int forktype); + +void PersonalityAddrLimit32Bit(void); // ---------------------------------------------------------------- #ifndef _WIN32 -- cgit 1.4.1