diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2022-03-27 12:33:42 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2022-03-27 12:33:42 +0200 |
| commit | 35e35ec5db52c96e71f8ed207265941e8734d8a1 (patch) | |
| tree | 896633a09b219897d57abe30d160fc8b79429e91 /src | |
| parent | de2b3afa17112423551c757d153df8c73d2e275e (diff) | |
| download | box64-35e35ec5db52c96e71f8ed207265941e8734d8a1.tar.gz box64-35e35ec5db52c96e71f8ed207265941e8734d8a1.zip | |
Added clone wrapped function and libgbm wrapped lib
Diffstat (limited to 'src')
| -rwxr-xr-x | src/emu/x64syscall.c | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/functions_list.txt | 7 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedgbmdefs.h | 8 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedgbmtypes.h | 17 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedgbmundefs.h | 8 | ||||
| -rw-r--r-- | src/wrapped/generated/wrappedlibctypes.h | 4 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.c | 10 | ||||
| -rw-r--r-- | src/wrapped/generated/wrapper.h | 4 | ||||
| -rw-r--r-- | src/wrapped/wrappedgbm.c | 18 | ||||
| -rw-r--r-- | src/wrapped/wrappedgbm_private.h | 42 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc.c | 43 | ||||
| -rwxr-xr-x | src/wrapped/wrappedlibc_private.h | 4 |
12 files changed, 165 insertions, 4 deletions
diff --git a/src/emu/x64syscall.c b/src/emu/x64syscall.c index c9fa59dc..1dfe94fe 100755 --- a/src/emu/x64syscall.c +++ b/src/emu/x64syscall.c @@ -163,6 +163,7 @@ scwrap_t syscallwrap[] = { { 254, __NR_inotify_add_watch, 3}, { 255, __NR_inotify_rm_watch, 2}, { 257, __NR_openat, 4}, + { 272, __NR_unshare, 1}, { 274, __NR_get_robust_list, 3}, { 294, __NR_inotify_init1, 1}, { 298, __NR_perf_event_open, 5}, @@ -258,9 +259,10 @@ typedef struct old_utsname_s { // int xss; //}; -int clone_fn(void* arg) +static int clone_fn(void* arg) { x64emu_t *emu = (x64emu_t*)arg; + thread_set_emu(emu); R_RAX = 0; DynaRun(emu); int ret = R_EAX; diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt index fa0faa29..e97edea4 100644 --- a/src/wrapped/generated/functions_list.txt +++ b/src/wrapped/generated/functions_list.txt @@ -186,6 +186,7 @@ #() UFEp #() UFuu #() UFUp +#() UFpi #() UFpp #() fFEp #() fFif @@ -1475,6 +1476,7 @@ #() pFpCuuup #() pFpuuwwu #() pFpuuuuu +#() pFpuuupu #() pFplpppp #() pFppiiii #() pFppiipp @@ -1728,6 +1730,7 @@ #() vFpppppppp #() iFEpippppp #() iFEpuuLppp +#() iFEppipppp #() iFEppppipp #() iFiiiiiiip #() iFiiupiupi @@ -1784,6 +1787,7 @@ #() pFpCuuuCup #() pFpWWiCpup #() pFpuuWWCuu +#() pFpuuuuupp #() pFpuuuupup #() pFpuuupwwp #() pFpdwwWWui @@ -2180,6 +2184,7 @@ wrappedfreetype: - FT_Open_Face - iFpuuLppp: - FTC_Manager_New +wrappedgbm: wrappedgconf2: wrappedgdkpixbuf2: - pFpiiiiiipp: @@ -2838,6 +2843,8 @@ wrappedlibc: - mmap64 - iFpippppp: - __libc_start_main +- iFppipppp: + - clone wrappedlibcrypt: wrappedlibcups: wrappedlibdl: diff --git a/src/wrapped/generated/wrappedgbmdefs.h b/src/wrapped/generated/wrappedgbmdefs.h new file mode 100644 index 00000000..4da03ea4 --- /dev/null +++ b/src/wrapped/generated/wrappedgbmdefs.h @@ -0,0 +1,8 @@ +/******************************************************************* + * File automatically generated by rebuild_wrappers.py (v2.1.0.16) * + *******************************************************************/ +#ifndef __wrappedgbmDEFS_H_ +#define __wrappedgbmDEFS_H_ + + +#endif // __wrappedgbmDEFS_H_ diff --git a/src/wrapped/generated/wrappedgbmtypes.h b/src/wrapped/generated/wrappedgbmtypes.h new file mode 100644 index 00000000..a8e344a6 --- /dev/null +++ b/src/wrapped/generated/wrappedgbmtypes.h @@ -0,0 +1,17 @@ +/******************************************************************* + * File automatically generated by rebuild_wrappers.py (v2.1.0.16) * + *******************************************************************/ +#ifndef __wrappedgbmTYPES_H_ +#define __wrappedgbmTYPES_H_ + +#ifndef LIBNAME +#error You should only #include this file inside a wrapped*.c file +#endif +#ifndef ADDED_FUNCTIONS +#define ADDED_FUNCTIONS() +#endif + + +#define SUPER() ADDED_FUNCTIONS() + +#endif // __wrappedgbmTYPES_H_ diff --git a/src/wrapped/generated/wrappedgbmundefs.h b/src/wrapped/generated/wrappedgbmundefs.h new file mode 100644 index 00000000..1a87f0d3 --- /dev/null +++ b/src/wrapped/generated/wrappedgbmundefs.h @@ -0,0 +1,8 @@ +/******************************************************************* + * File automatically generated by rebuild_wrappers.py (v2.1.0.16) * + *******************************************************************/ +#ifndef __wrappedgbmUNDEFS_H_ +#define __wrappedgbmUNDEFS_H_ + + +#endif // __wrappedgbmUNDEFS_H_ diff --git a/src/wrapped/generated/wrappedlibctypes.h b/src/wrapped/generated/wrappedlibctypes.h index 9fa403f3..31559808 100644 --- a/src/wrapped/generated/wrappedlibctypes.h +++ b/src/wrapped/generated/wrappedlibctypes.h @@ -78,6 +78,7 @@ typedef int64_t (*iFpLiLpV_t)(void*, uintptr_t, int64_t, uintptr_t, void*, ...); typedef int64_t (*iFpppppp_t)(void*, void*, void*, void*, void*, void*); typedef void* (*pFpLiiil_t)(void*, uintptr_t, int64_t, int64_t, int64_t, intptr_t); typedef int64_t (*iFpippppp_t)(void*, int64_t, void*, void*, void*, void*, void*); +typedef int64_t (*iFppipppp_t)(void*, void*, int64_t, void*, void*, void*, void*); #define SUPER() ADDED_FUNCTIONS() \ GO(_Jv_RegisterClasses, vFv_t) \ @@ -226,6 +227,7 @@ typedef int64_t (*iFpippppp_t)(void*, int64_t, void*, void*, void*, void*, void* GO(posix_spawnp, iFpppppp_t) \ GO(mmap, pFpLiiil_t) \ GO(mmap64, pFpLiiil_t) \ - GO(__libc_start_main, iFpippppp_t) + GO(__libc_start_main, iFpippppp_t) \ + GO(clone, iFppipppp_t) #endif // __wrappedlibcTYPES_H_ diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c index a95b9938..df58b8b5 100644 --- a/src/wrapped/generated/wrapper.c +++ b/src/wrapped/generated/wrapper.c @@ -220,6 +220,7 @@ typedef uint64_t (*uFpp_t)(void*, void*); typedef uint64_t (*UFEp_t)(x64emu_t*, void*); typedef uint64_t (*UFuu_t)(uint64_t, uint64_t); typedef uint64_t (*UFUp_t)(uint64_t, void*); +typedef uint64_t (*UFpi_t)(void*, int64_t); typedef uint64_t (*UFpp_t)(void*, void*); typedef float (*fFEp_t)(x64emu_t*, void*); typedef float (*fFif_t)(int64_t, float); @@ -1509,6 +1510,7 @@ typedef void* (*pFpCuuWW_t)(void*, uint8_t, uint64_t, uint64_t, uint16_t, uint16 typedef void* (*pFpCuuup_t)(void*, uint8_t, uint64_t, uint64_t, uint64_t, void*); typedef void* (*pFpuuwwu_t)(void*, uint64_t, uint64_t, int16_t, int16_t, uint64_t); typedef void* (*pFpuuuuu_t)(void*, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t); +typedef void* (*pFpuuupu_t)(void*, uint64_t, uint64_t, uint64_t, void*, uint64_t); typedef void* (*pFplpppp_t)(void*, intptr_t, void*, void*, void*, void*); typedef void* (*pFppiiii_t)(void*, void*, int64_t, int64_t, int64_t, int64_t); typedef void* (*pFppiipp_t)(void*, void*, int64_t, int64_t, void*, void*); @@ -1762,6 +1764,7 @@ typedef void (*vFppppiipi_t)(void*, void*, void*, void*, int64_t, int64_t, void* typedef void (*vFpppppppp_t)(void*, void*, void*, void*, void*, void*, void*, void*); typedef int64_t (*iFEpippppp_t)(x64emu_t*, void*, int64_t, void*, void*, void*, void*, void*); typedef int64_t (*iFEpuuLppp_t)(x64emu_t*, void*, uint64_t, uint64_t, uintptr_t, void*, void*, void*); +typedef int64_t (*iFEppipppp_t)(x64emu_t*, void*, void*, int64_t, void*, void*, void*, void*); typedef int64_t (*iFEppppipp_t)(x64emu_t*, void*, void*, void*, void*, int64_t, void*, void*); typedef int64_t (*iFiiiiiiip_t)(int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, void*); typedef int64_t (*iFiiupiupi_t)(int64_t, int64_t, uint64_t, void*, int64_t, uint64_t, void*, int64_t); @@ -1818,6 +1821,7 @@ typedef void* (*pFpCuwwWWu_t)(void*, uint8_t, uint64_t, int16_t, int16_t, uint16 typedef void* (*pFpCuuuCup_t)(void*, uint8_t, uint64_t, uint64_t, uint64_t, uint8_t, uint64_t, void*); typedef void* (*pFpWWiCpup_t)(void*, uint16_t, uint16_t, int64_t, uint8_t, void*, uint64_t, void*); typedef void* (*pFpuuWWCuu_t)(void*, uint64_t, uint64_t, uint16_t, uint16_t, uint8_t, uint64_t, uint64_t); +typedef void* (*pFpuuuuupp_t)(void*, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, void*, void*); typedef void* (*pFpuuuupup_t)(void*, uint64_t, uint64_t, uint64_t, uint64_t, void*, uint64_t, void*); typedef void* (*pFpuuupwwp_t)(void*, uint64_t, uint64_t, uint64_t, void*, int16_t, int16_t, void*); typedef void* (*pFpdwwWWui_t)(void*, double, int16_t, int16_t, uint16_t, uint16_t, uint64_t, int64_t); @@ -2279,6 +2283,7 @@ void uFpp(x64emu_t *emu, uintptr_t fcn) { uFpp_t fn = (uFpp_t)fcn; R_RAX=(uint64 void UFEp(x64emu_t *emu, uintptr_t fcn) { UFEp_t fn = (UFEp_t)fcn; R_RAX=fn(emu, (void*)R_RDI); } void UFuu(x64emu_t *emu, uintptr_t fcn) { UFuu_t fn = (UFuu_t)fcn; R_RAX=fn((uint64_t)R_RDI, (uint64_t)R_RSI); } void UFUp(x64emu_t *emu, uintptr_t fcn) { UFUp_t fn = (UFUp_t)fcn; R_RAX=fn((uint64_t)R_RDI, (void*)R_RSI); } +void UFpi(x64emu_t *emu, uintptr_t fcn) { UFpi_t fn = (UFpi_t)fcn; R_RAX=fn((void*)R_RDI, (int64_t)R_RSI); } void UFpp(x64emu_t *emu, uintptr_t fcn) { UFpp_t fn = (UFpp_t)fcn; R_RAX=fn((void*)R_RDI, (void*)R_RSI); } void fFEp(x64emu_t *emu, uintptr_t fcn) { fFEp_t fn = (fFEp_t)fcn; emu->xmm[0].f[0]=fn(emu, (void*)R_RDI); } void fFif(x64emu_t *emu, uintptr_t fcn) { fFif_t fn = (fFif_t)fcn; emu->xmm[0].f[0]=fn((int64_t)R_RDI, emu->xmm[0].f[0]); } @@ -3568,6 +3573,7 @@ void pFpCuuWW(x64emu_t *emu, uintptr_t fcn) { pFpCuuWW_t fn = (pFpCuuWW_t)fcn; R void pFpCuuup(x64emu_t *emu, uintptr_t fcn) { pFpCuuup_t fn = (pFpCuuup_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uint8_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (uint64_t)R_R8, (void*)R_R9); } void pFpuuwwu(x64emu_t *emu, uintptr_t fcn) { pFpuuwwu_t fn = (pFpuuwwu_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (int16_t)R_RCX, (int16_t)R_R8, (uint64_t)R_R9); } void pFpuuuuu(x64emu_t *emu, uintptr_t fcn) { pFpuuuuu_t fn = (pFpuuuuu_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (uint64_t)R_R8, (uint64_t)R_R9); } +void pFpuuupu(x64emu_t *emu, uintptr_t fcn) { pFpuuupu_t fn = (pFpuuupu_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (void*)R_R8, (uint64_t)R_R9); } void pFplpppp(x64emu_t *emu, uintptr_t fcn) { pFplpppp_t fn = (pFplpppp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (intptr_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); } void pFppiiii(x64emu_t *emu, uintptr_t fcn) { pFppiiii_t fn = (pFppiiii_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (void*)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (int64_t)R_R8, (int64_t)R_R9); } void pFppiipp(x64emu_t *emu, uintptr_t fcn) { pFppiipp_t fn = (pFppiipp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (void*)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (void*)R_R8, (void*)R_R9); } @@ -3821,6 +3827,7 @@ void vFppppiipi(x64emu_t *emu, uintptr_t fcn) { vFppppiipi_t fn = (vFppppiipi_t) void vFpppppppp(x64emu_t *emu, uintptr_t fcn) { vFpppppppp_t fn = (vFpppppppp_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16)); } void iFEpippppp(x64emu_t *emu, uintptr_t fcn) { iFEpippppp_t fn = (iFEpippppp_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RDI, (int64_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8)); } void iFEpuuLppp(x64emu_t *emu, uintptr_t fcn) { iFEpuuLppp_t fn = (iFEpuuLppp_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uintptr_t)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8)); } +void iFEppipppp(x64emu_t *emu, uintptr_t fcn) { iFEppipppp_t fn = (iFEppipppp_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (int64_t)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9, *(void**)(R_RSP + 8)); } void iFEppppipp(x64emu_t *emu, uintptr_t fcn) { iFEppppipp_t fn = (iFEppppipp_t)fcn; R_RAX=(int64_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (int64_t)R_R8, (void*)R_R9, *(void**)(R_RSP + 8)); } void iFiiiiiiip(x64emu_t *emu, uintptr_t fcn) { iFiiiiiiip_t fn = (iFiiiiiiip_t)fcn; R_RAX=(int64_t)fn((int64_t)R_RDI, (int64_t)R_RSI, (int64_t)R_RDX, (int64_t)R_RCX, (int64_t)R_R8, (int64_t)R_R9, *(int64_t*)(R_RSP + 8), *(void**)(R_RSP + 16)); } void iFiiupiupi(x64emu_t *emu, uintptr_t fcn) { iFiiupiupi_t fn = (iFiiupiupi_t)fcn; R_RAX=(int64_t)fn((int64_t)R_RDI, (int64_t)R_RSI, (uint64_t)R_RDX, (void*)R_RCX, (int64_t)R_R8, (uint64_t)R_R9, *(void**)(R_RSP + 8), *(int64_t*)(R_RSP + 16)); } @@ -3877,6 +3884,7 @@ void pFpCuwwWWu(x64emu_t *emu, uintptr_t fcn) { pFpCuwwWWu_t fn = (pFpCuwwWWu_t) void pFpCuuuCup(x64emu_t *emu, uintptr_t fcn) { pFpCuuuCup_t fn = (pFpCuuuCup_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uint8_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (uint64_t)R_R8, (uint8_t)R_R9, *(uint64_t*)(R_RSP + 8), *(void**)(R_RSP + 16)); } void pFpWWiCpup(x64emu_t *emu, uintptr_t fcn) { pFpWWiCpup_t fn = (pFpWWiCpup_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uint16_t)R_RSI, (uint16_t)R_RDX, (int64_t)R_RCX, (uint8_t)R_R8, (void*)R_R9, *(uint64_t*)(R_RSP + 8), *(void**)(R_RSP + 16)); } void pFpuuWWCuu(x64emu_t *emu, uintptr_t fcn) { pFpuuWWCuu_t fn = (pFpuuWWCuu_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint16_t)R_RCX, (uint16_t)R_R8, (uint8_t)R_R9, *(uint64_t*)(R_RSP + 8), *(uint64_t*)(R_RSP + 16)); } +void pFpuuuuupp(x64emu_t *emu, uintptr_t fcn) { pFpuuuuupp_t fn = (pFpuuuuupp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (uint64_t)R_R8, (uint64_t)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16)); } void pFpuuuupup(x64emu_t *emu, uintptr_t fcn) { pFpuuuupup_t fn = (pFpuuuupup_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (uint64_t)R_R8, (void*)R_R9, *(uint64_t*)(R_RSP + 8), *(void**)(R_RSP + 16)); } void pFpuuupwwp(x64emu_t *emu, uintptr_t fcn) { pFpuuupwwp_t fn = (pFpuuupwwp_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, (uint64_t)R_RSI, (uint64_t)R_RDX, (uint64_t)R_RCX, (void*)R_R8, (int16_t)R_R9, *(int16_t*)(R_RSP + 8), *(void**)(R_RSP + 16)); } void pFpdwwWWui(x64emu_t *emu, uintptr_t fcn) { pFpdwwWWui_t fn = (pFpdwwWWui_t)fcn; R_RAX=(uintptr_t)fn((void*)R_RDI, emu->xmm[0].d[0], (int16_t)R_RSI, (int16_t)R_RDX, (uint16_t)R_RCX, (uint16_t)R_R8, (uint64_t)R_R9, *(int64_t*)(R_RSP + 8)); } @@ -4327,6 +4335,7 @@ int isSimpleWrapper(wrapper_t fun) { if (fun == &uFpp) return 1; if (fun == &UFuu) return 1; if (fun == &UFUp) return 1; + if (fun == &UFpi) return 1; if (fun == &UFpp) return 1; if (fun == &fFif) return -2; if (fun == &fFfi) return -2; @@ -5408,6 +5417,7 @@ int isSimpleWrapper(wrapper_t fun) { if (fun == &pFpCuuup) return 1; if (fun == &pFpuuwwu) return 1; if (fun == &pFpuuuuu) return 1; + if (fun == &pFpuuupu) return 1; if (fun == &pFplpppp) return 1; if (fun == &pFppiiii) return 1; if (fun == &pFppiipp) return 1; diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h index d28be157..8930f2c9 100644 --- a/src/wrapped/generated/wrapper.h +++ b/src/wrapped/generated/wrapper.h @@ -219,6 +219,7 @@ void uFpp(x64emu_t *emu, uintptr_t fnc); void UFEp(x64emu_t *emu, uintptr_t fnc); void UFuu(x64emu_t *emu, uintptr_t fnc); void UFUp(x64emu_t *emu, uintptr_t fnc); +void UFpi(x64emu_t *emu, uintptr_t fnc); void UFpp(x64emu_t *emu, uintptr_t fnc); void fFEp(x64emu_t *emu, uintptr_t fnc); void fFif(x64emu_t *emu, uintptr_t fnc); @@ -1508,6 +1509,7 @@ void pFpCuuWW(x64emu_t *emu, uintptr_t fnc); void pFpCuuup(x64emu_t *emu, uintptr_t fnc); void pFpuuwwu(x64emu_t *emu, uintptr_t fnc); void pFpuuuuu(x64emu_t *emu, uintptr_t fnc); +void pFpuuupu(x64emu_t *emu, uintptr_t fnc); void pFplpppp(x64emu_t *emu, uintptr_t fnc); void pFppiiii(x64emu_t *emu, uintptr_t fnc); void pFppiipp(x64emu_t *emu, uintptr_t fnc); @@ -1761,6 +1763,7 @@ void vFppppiipi(x64emu_t *emu, uintptr_t fnc); void vFpppppppp(x64emu_t *emu, uintptr_t fnc); void iFEpippppp(x64emu_t *emu, uintptr_t fnc); void iFEpuuLppp(x64emu_t *emu, uintptr_t fnc); +void iFEppipppp(x64emu_t *emu, uintptr_t fnc); void iFEppppipp(x64emu_t *emu, uintptr_t fnc); void iFiiiiiiip(x64emu_t *emu, uintptr_t fnc); void iFiiupiupi(x64emu_t *emu, uintptr_t fnc); @@ -1817,6 +1820,7 @@ void pFpCuwwWWu(x64emu_t *emu, uintptr_t fnc); void pFpCuuuCup(x64emu_t *emu, uintptr_t fnc); void pFpWWiCpup(x64emu_t *emu, uintptr_t fnc); void pFpuuWWCuu(x64emu_t *emu, uintptr_t fnc); +void pFpuuuuupp(x64emu_t *emu, uintptr_t fnc); void pFpuuuupup(x64emu_t *emu, uintptr_t fnc); void pFpuuupwwp(x64emu_t *emu, uintptr_t fnc); void pFpdwwWWui(x64emu_t *emu, uintptr_t fnc); diff --git a/src/wrapped/wrappedgbm.c b/src/wrapped/wrappedgbm.c new file mode 100644 index 00000000..39f000ad --- /dev/null +++ b/src/wrapped/wrappedgbm.c @@ -0,0 +1,18 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#define _GNU_SOURCE /* See feature_test_macros(7) */ +#include <dlfcn.h> + +#include "wrappedlibs.h" + +#include "wrapper.h" +#include "bridge.h" +#include "librarian/library_private.h" +#include "x64emu.h" + +const char* gbmName = "libgbm.so.1"; +#define LIBNAME gbm + +#include "wrappedlib_init.h" + diff --git a/src/wrapped/wrappedgbm_private.h b/src/wrapped/wrappedgbm_private.h new file mode 100644 index 00000000..5eb863da --- /dev/null +++ b/src/wrapped/wrappedgbm_private.h @@ -0,0 +1,42 @@ +#if !(defined(GO) && defined(GOM) && defined(GO2) && defined(DATA)) +#error Meh.... +#endif + +//GO(gbm_bo_create, +GO(gbm_bo_create_with_modifiers, pFpuuupu) +//GO(gbm_bo_create_with_modifiers2, +//GO(gbm_bo_destroy, +//GO(gbm_bo_get_bpp, +//GO(gbm_bo_get_device, +//GO(gbm_bo_get_fd, +//GO(gbm_bo_get_fd_for_plane, +//GO(gbm_bo_get_format, +//GO(gbm_bo_get_handle, +GO(gbm_bo_get_handle_for_plane, UFpi) +//GO(gbm_bo_get_height, +GO(gbm_bo_get_modifier, UFp) +GO(gbm_bo_get_offset, uFpi) +GO(gbm_bo_get_plane_count, iFp) +//GO(gbm_bo_get_stride, +GO(gbm_bo_get_stride_for_plane, uFpi) +//GO(gbm_bo_get_user_data, +//GO(gbm_bo_get_width, +//GO(gbm_bo_import, +GO(gbm_bo_map, pFpuuuuupp) +//GO(gbm_bo_set_user_data, +GO(gbm_bo_unmap, vFpp) +//GO(gbm_bo_write, +//GO(gbm_create_device, +//GO(gbm_device_destroy, +//GO(gbm_device_get_backend_name, +//GO(gbm_device_get_fd, +//GO(gbm_device_get_format_modifier_plane_count, +//GO(gbm_device_is_format_supported, +//GO(gbm_format_get_name, +//GO(gbm_surface_create, +//GO(gbm_surface_create_with_modifiers, +//GO(gbm_surface_create_with_modifiers2, +//GO(gbm_surface_destroy, +//GO(gbm_surface_has_free_buffers, +//GO(gbm_surface_lock_front_buffer, +//GO(gbm_surface_release_buffer, diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c index 2b311ece..4d2f2b1c 100755 --- a/src/wrapped/wrappedlibc.c +++ b/src/wrapped/wrappedlibc.c @@ -2674,6 +2674,49 @@ EXPORT int my_stime(x64emu_t* emu, const time_t *t) return -1; } +typedef struct clone_arg_s { + x64emu_t* emu; + uintptr_t fnc; + void* args; + int stack_clone_used; +} clone_arg_t; +static int clone_fn(void* p) +{ + clone_arg_t* arg = (clone_arg_t*)p; + x64emu_t *emu = arg->emu; + thread_set_emu(emu); + int ret = RunFunction(my_context, arg->fnc, 1, arg->args); + FreeX64Emu(&emu); + if(arg->stack_clone_used) + my_context->stack_clone_used = 0; + free(arg); + return ret; +} + +EXPORT int my_clone(x64emu_t* emu, void* fn, void* stack, int flags, void* args, void* parent, void* tls, void* child) +{ + x64emu_t * newemu = NewX64Emu(emu->context, R_RIP, (uintptr_t)stack, 0, 0); + SetupX64Emu(newemu); + CloneEmu(newemu, emu); + void* mystack = NULL; + clone_arg_t* arg = (clone_arg_t*)calloc(1, sizeof(clone_arg_t)); + if(my_context->stack_clone_used) { + mystack = malloc(1024*1024); // stack for own process... memory leak, but no practical way to remove it + } else { + if(!my_context->stack_clone) + my_context->stack_clone = malloc(1024*1024); + mystack = my_context->stack_clone; + my_context->stack_clone_used = 1; + arg->stack_clone_used = 1; + } + arg->emu = newemu; + arg->args = args; + arg->fnc = (uintptr_t)fn; + // x86_64 raw clone is long clone(unsigned long flags, void *stack, int *parent_tid, int *child_tid, unsigned long tls); + int64_t ret = clone(clone_fn, (void*)((uintptr_t)mystack+1024*1024), flags, arg, parent, tls, child); + return (uintptr_t)ret; +} + EXPORT char** my_environ = NULL; EXPORT char** my__environ = NULL; EXPORT char** my___environ = NULL; // all aliases diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h index 4618c139..39871a47 100755 --- a/src/wrapped/wrappedlibc_private.h +++ b/src/wrapped/wrappedlibc_private.h @@ -149,8 +149,8 @@ GOW(clock_nanosleep, iFiipp) //GO(__clock_settime, GOW(clock_settime, iFip) //GO(__clone, -//GOW(clone, iF@pipV) -//GO(__close, +GOWM(clone, iFEppipppp) +GO(__close, iFi) GOW(close, iFi) GOW(closedir, iFp) GO(closelog, vFv) |