about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2022-03-27 12:33:42 +0200
committerptitSeb <sebastien.chev@gmail.com>2022-03-27 12:33:42 +0200
commit35e35ec5db52c96e71f8ed207265941e8734d8a1 (patch)
tree896633a09b219897d57abe30d160fc8b79429e91 /src
parentde2b3afa17112423551c757d153df8c73d2e275e (diff)
downloadbox64-35e35ec5db52c96e71f8ed207265941e8734d8a1.tar.gz
box64-35e35ec5db52c96e71f8ed207265941e8734d8a1.zip
Added clone wrapped function and libgbm wrapped lib
Diffstat (limited to 'src')
-rwxr-xr-xsrc/emu/x64syscall.c4
-rw-r--r--src/wrapped/generated/functions_list.txt7
-rw-r--r--src/wrapped/generated/wrappedgbmdefs.h8
-rw-r--r--src/wrapped/generated/wrappedgbmtypes.h17
-rw-r--r--src/wrapped/generated/wrappedgbmundefs.h8
-rw-r--r--src/wrapped/generated/wrappedlibctypes.h4
-rw-r--r--src/wrapped/generated/wrapper.c10
-rw-r--r--src/wrapped/generated/wrapper.h4
-rw-r--r--src/wrapped/wrappedgbm.c18
-rw-r--r--src/wrapped/wrappedgbm_private.h42
-rwxr-xr-xsrc/wrapped/wrappedlibc.c43
-rwxr-xr-xsrc/wrapped/wrappedlibc_private.h4
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)