about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2021-03-25 16:35:54 +0100
committerptitSeb <sebastien.chev@gmail.com>2021-03-25 16:35:54 +0100
commit6e78bc1726047f5462517d5fd1954fcbe080e1b4 (patch)
tree9839a0aceb8159c7227fa32e52cea2ed74a2a4c4 /src
parent3b4181c616a78678ceabed82482a2fcc8ce26699 (diff)
downloadbox64-6e78bc1726047f5462517d5fd1954fcbe080e1b4.tar.gz
box64-6e78bc1726047f5462517d5fd1954fcbe080e1b4.zip
Added wrapped libICE and libSM plus a few more libc wrapped functions
Diffstat (limited to 'src')
-rwxr-xr-xsrc/library_list.h4
-rw-r--r--src/wrapped/generated/functions_list.txt3
-rw-r--r--src/wrapped/generated/wrapper.c6
-rw-r--r--src/wrapped/generated/wrapper.h3
-rwxr-xr-xsrc/wrapped/wrappedlibc.c50
-rwxr-xr-xsrc/wrapped/wrappedlibc_private.h8
-rwxr-xr-xsrc/wrapped/wrappedlibice.c59
-rwxr-xr-xsrc/wrapped/wrappedlibice_private.h113
-rwxr-xr-xsrc/wrapped/wrappedlibsm.c175
-rwxr-xr-xsrc/wrapped/wrappedlibsm_private.h45
10 files changed, 411 insertions, 55 deletions
diff --git a/src/library_list.h b/src/library_list.h
index 906d5a7a..7fe5e905 100755
--- a/src/library_list.h
+++ b/src/library_list.h
@@ -114,8 +114,8 @@ GO("libpulse.so.0", pulse)
 //GO("libfontconfig.so.1", fontconfig)
 //GO("libfreetype.so.6", freetype)
 //GO("libbz2.so.1", bz2)
-//GO("libSM.so.6", libsm)
-//GO("libICE.so.6", libice)
+GO("libSM.so.6", libsm)
+GO("libICE.so.6", libice)
 //GO("libusb-1.0.so.0", libusb1)
 //GO("libncursesw.so.5", libncursesw)
 //GO("libformw.so.5", libformw)
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index 9c86247f..1a50a2f1 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -712,6 +712,7 @@
 #() vFuppppp
 #() vFffffff
 #() vFdddddd
+#() vFpiiiii
 #() vFpiiuuu
 #() vFpipipV
 #() vFpipppi
@@ -813,6 +814,7 @@
 #() vFuuddiip
 #() vFuffffff
 #() vFudddddd
+#() vFpiiliip
 #() vFpipipii
 #() vFpddiidd
 #() vFppiiipi
@@ -981,6 +983,7 @@
 #() iFiiiiiiiiiip
 #() iFpipllippppp
 #() iFppppiiuuiiL
+#() pFEppiiLpppip
 #() pFEppuiipuuii
 #() vFuuiiiiiiiuip
 #() vFuuiiiiiiiuup
diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c
index 257037ce..59db1f3e 100644
--- a/src/wrapped/generated/wrapper.c
+++ b/src/wrapped/generated/wrapper.c
@@ -745,6 +745,7 @@ typedef void (*vFupupip_t)(uint32_t, void*, uint32_t, void*, int32_t, void*);
 typedef void (*vFuppppp_t)(uint32_t, void*, void*, void*, void*, void*);
 typedef void (*vFffffff_t)(float, float, float, float, float, float);
 typedef void (*vFdddddd_t)(double, double, double, double, double, double);
+typedef void (*vFpiiiii_t)(void*, int32_t, int32_t, int32_t, int32_t, int32_t);
 typedef void (*vFpiiuuu_t)(void*, int32_t, int32_t, uint32_t, uint32_t, uint32_t);
 typedef void (*vFpipipV_t)(void*, int32_t, void*, int32_t, void*, void*);
 typedef void (*vFpipppi_t)(void*, int32_t, void*, void*, void*, int32_t);
@@ -846,6 +847,7 @@ typedef void (*vFuuffiip_t)(uint32_t, uint32_t, float, float, int32_t, int32_t,
 typedef void (*vFuuddiip_t)(uint32_t, uint32_t, double, double, int32_t, int32_t, void*);
 typedef void (*vFuffffff_t)(uint32_t, float, float, float, float, float, float);
 typedef void (*vFudddddd_t)(uint32_t, double, double, double, double, double, double);
+typedef void (*vFpiiliip_t)(void*, int32_t, int32_t, intptr_t, int32_t, int32_t, void*);
 typedef void (*vFpipipii_t)(void*, int32_t, void*, int32_t, void*, int32_t, int32_t);
 typedef void (*vFpddiidd_t)(void*, double, double, int32_t, int32_t, double, double);
 typedef void (*vFppiiipi_t)(void*, void*, int32_t, int32_t, int32_t, void*, int32_t);
@@ -1014,6 +1016,7 @@ typedef int32_t (*iFEppppiiiiuu_t)(x64emu_t*, void*, void*, void*, void*, int32_
 typedef int32_t (*iFiiiiiiiiiip_t)(int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, void*);
 typedef int32_t (*iFpipllippppp_t)(void*, int32_t, void*, intptr_t, intptr_t, int32_t, void*, void*, void*, void*, void*);
 typedef int32_t (*iFppppiiuuiiL_t)(void*, void*, void*, void*, int32_t, int32_t, uint32_t, uint32_t, int32_t, int32_t, uintptr_t);
+typedef void* (*pFEppiiLpppip_t)(x64emu_t*, void*, void*, int32_t, int32_t, uintptr_t, void*, void*, void*, int32_t, void*);
 typedef void* (*pFEppuiipuuii_t)(x64emu_t*, void*, void*, uint32_t, int32_t, int32_t, void*, uint32_t, uint32_t, int32_t, int32_t);
 typedef void (*vFuuiiiiiiiuip_t)(uint32_t, uint32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, uint32_t, int32_t, void*);
 typedef void (*vFuuiiiiiiiuup_t)(uint32_t, uint32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, uint32_t, uint32_t, void*);
@@ -1773,6 +1776,7 @@ void vFupupip(x64emu_t *emu, uintptr_t fcn) { vFupupip_t fn = (vFupupip_t)fcn; f
 void vFuppppp(x64emu_t *emu, uintptr_t fcn) { vFuppppp_t fn = (vFuppppp_t)fcn; fn((uint32_t)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (void*)R_R9); }
 void vFffffff(x64emu_t *emu, uintptr_t fcn) { vFffffff_t fn = (vFffffff_t)fcn; fn(emu->xmm[0].f[0], emu->xmm[1].f[0], emu->xmm[2].f[0], emu->xmm[3].f[0], emu->xmm[4].f[0], emu->xmm[5].f[0]); }
 void vFdddddd(x64emu_t *emu, uintptr_t fcn) { vFdddddd_t fn = (vFdddddd_t)fcn; fn(emu->xmm[0].d[0], emu->xmm[1].d[0], emu->xmm[2].d[0], emu->xmm[3].d[0], emu->xmm[4].d[0], emu->xmm[5].d[0]); }
+void vFpiiiii(x64emu_t *emu, uintptr_t fcn) { vFpiiiii_t fn = (vFpiiiii_t)fcn; fn((void*)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9); }
 void vFpiiuuu(x64emu_t *emu, uintptr_t fcn) { vFpiiuuu_t fn = (vFpiiuuu_t)fcn; fn((void*)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (uint32_t)R_RCX, (uint32_t)R_R8, (uint32_t)R_R9); }
 void vFpipipV(x64emu_t *emu, uintptr_t fcn) { vFpipipV_t fn = (vFpipipV_t)fcn; fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (int32_t)R_RCX, (void*)R_R8, (void*)(R_RSP + 8)); }
 void vFpipppi(x64emu_t *emu, uintptr_t fcn) { vFpipppi_t fn = (vFpipppi_t)fcn; fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (void*)R_RCX, (void*)R_R8, (int32_t)R_R9); }
@@ -1874,6 +1878,7 @@ void vFuuffiip(x64emu_t *emu, uintptr_t fcn) { vFuuffiip_t fn = (vFuuffiip_t)fcn
 void vFuuddiip(x64emu_t *emu, uintptr_t fcn) { vFuuddiip_t fn = (vFuuddiip_t)fcn; fn((uint32_t)R_RDI, (uint32_t)R_RSI, emu->xmm[0].d[0], emu->xmm[1].d[0], (int32_t)R_RDX, (int32_t)R_RCX, (void*)R_R8); }
 void vFuffffff(x64emu_t *emu, uintptr_t fcn) { vFuffffff_t fn = (vFuffffff_t)fcn; fn((uint32_t)R_RDI, emu->xmm[0].f[0], emu->xmm[1].f[0], emu->xmm[2].f[0], emu->xmm[3].f[0], emu->xmm[4].f[0], emu->xmm[5].f[0]); }
 void vFudddddd(x64emu_t *emu, uintptr_t fcn) { vFudddddd_t fn = (vFudddddd_t)fcn; fn((uint32_t)R_RDI, emu->xmm[0].d[0], emu->xmm[1].d[0], emu->xmm[2].d[0], emu->xmm[3].d[0], emu->xmm[4].d[0], emu->xmm[5].d[0]); }
+void vFpiiliip(x64emu_t *emu, uintptr_t fcn) { vFpiiliip_t fn = (vFpiiliip_t)fcn; fn((void*)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (intptr_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(void**)(R_RSP + 8)); }
 void vFpipipii(x64emu_t *emu, uintptr_t fcn) { vFpipipii_t fn = (vFpipipii_t)fcn; fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (int32_t)R_RCX, (void*)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8)); }
 void vFpddiidd(x64emu_t *emu, uintptr_t fcn) { vFpddiidd_t fn = (vFpddiidd_t)fcn; fn((void*)R_RDI, emu->xmm[0].d[0], emu->xmm[1].d[0], (int32_t)R_RSI, (int32_t)R_RDX, emu->xmm[2].d[0], emu->xmm[3].d[0]); }
 void vFppiiipi(x64emu_t *emu, uintptr_t fcn) { vFppiiipi_t fn = (vFppiiipi_t)fcn; fn((void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (void*)R_R9, *(int32_t*)(R_RSP + 8)); }
@@ -2042,6 +2047,7 @@ void iFEppppiiiiuu(x64emu_t *emu, uintptr_t fcn) { iFEppppiiiiuu_t fn = (iFEpppp
 void iFiiiiiiiiiip(x64emu_t *emu, uintptr_t fcn) { iFiiiiiiiiiip_t fn = (iFiiiiiiiiiip_t)fcn; R_RAX=fn((int32_t)R_RDI, (int32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8), *(int32_t*)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(int32_t*)(R_RSP + 32), *(void**)(R_RSP + 40)); }
 void iFpipllippppp(x64emu_t *emu, uintptr_t fcn) { iFpipllippppp_t fn = (iFpipllippppp_t)fcn; R_RAX=fn((void*)R_RDI, (int32_t)R_RSI, (void*)R_RDX, (intptr_t)R_RCX, (intptr_t)R_R8, (int32_t)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(void**)(R_RSP + 24), *(void**)(R_RSP + 32), *(void**)(R_RSP + 40)); }
 void iFppppiiuuiiL(x64emu_t *emu, uintptr_t fcn) { iFppppiiuuiiL_t fn = (iFppppiiuuiiL_t)fcn; R_RAX=fn((void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (void*)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(uint32_t*)(R_RSP + 8), *(uint32_t*)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(int32_t*)(R_RSP + 32), *(uintptr_t*)(R_RSP + 40)); }
+void pFEppiiLpppip(x64emu_t *emu, uintptr_t fcn) { pFEppiiLpppip_t fn = (pFEppiiLpppip_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (uintptr_t)R_R8, (void*)R_R9, *(void**)(R_RSP + 8), *(void**)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(void**)(R_RSP + 32)); }
 void pFEppuiipuuii(x64emu_t *emu, uintptr_t fcn) { pFEppuiipuuii_t fn = (pFEppuiipuuii_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (uint32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (void*)R_R9, *(uint32_t*)(R_RSP + 8), *(uint32_t*)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(int32_t*)(R_RSP + 32)); }
 void vFuuiiiiiiiuip(x64emu_t *emu, uintptr_t fcn) { vFuuiiiiiiiuip_t fn = (vFuuiiiiiiiuip_t)fcn; fn((uint32_t)R_RDI, (uint32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8), *(int32_t*)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(uint32_t*)(R_RSP + 32), *(int32_t*)(R_RSP + 40), *(void**)(R_RSP + 48)); }
 void vFuuiiiiiiiuup(x64emu_t *emu, uintptr_t fcn) { vFuuiiiiiiiuup_t fn = (vFuuiiiiiiiuup_t)fcn; fn((uint32_t)R_RDI, (uint32_t)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX, (int32_t)R_R8, (int32_t)R_R9, *(int32_t*)(R_RSP + 8), *(int32_t*)(R_RSP + 16), *(int32_t*)(R_RSP + 24), *(uint32_t*)(R_RSP + 32), *(uint32_t*)(R_RSP + 40), *(void**)(R_RSP + 48)); }
diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h
index 1ed68d5e..a908a234 100644
--- a/src/wrapped/generated/wrapper.h
+++ b/src/wrapped/generated/wrapper.h
@@ -742,6 +742,7 @@ void vFupupip(x64emu_t *emu, uintptr_t fnc);
 void vFuppppp(x64emu_t *emu, uintptr_t fnc);
 void vFffffff(x64emu_t *emu, uintptr_t fnc);
 void vFdddddd(x64emu_t *emu, uintptr_t fnc);
+void vFpiiiii(x64emu_t *emu, uintptr_t fnc);
 void vFpiiuuu(x64emu_t *emu, uintptr_t fnc);
 void vFpipipV(x64emu_t *emu, uintptr_t fnc);
 void vFpipppi(x64emu_t *emu, uintptr_t fnc);
@@ -843,6 +844,7 @@ void vFuuffiip(x64emu_t *emu, uintptr_t fnc);
 void vFuuddiip(x64emu_t *emu, uintptr_t fnc);
 void vFuffffff(x64emu_t *emu, uintptr_t fnc);
 void vFudddddd(x64emu_t *emu, uintptr_t fnc);
+void vFpiiliip(x64emu_t *emu, uintptr_t fnc);
 void vFpipipii(x64emu_t *emu, uintptr_t fnc);
 void vFpddiidd(x64emu_t *emu, uintptr_t fnc);
 void vFppiiipi(x64emu_t *emu, uintptr_t fnc);
@@ -1011,6 +1013,7 @@ void iFEppppiiiiuu(x64emu_t *emu, uintptr_t fnc);
 void iFiiiiiiiiiip(x64emu_t *emu, uintptr_t fnc);
 void iFpipllippppp(x64emu_t *emu, uintptr_t fnc);
 void iFppppiiuuiiL(x64emu_t *emu, uintptr_t fnc);
+void pFEppiiLpppip(x64emu_t *emu, uintptr_t fnc);
 void pFEppuiipuuii(x64emu_t *emu, uintptr_t fnc);
 void vFuuiiiiiiiuip(x64emu_t *emu, uintptr_t fnc);
 void vFuuiiiiiiiuup(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped/wrappedlibc.c b/src/wrapped/wrappedlibc.c
index cb99170a..21329bef 100755
--- a/src/wrapped/wrappedlibc.c
+++ b/src/wrapped/wrappedlibc.c
@@ -1658,54 +1658,6 @@ EXPORT int32_t my___cxa_thread_atexit_impl(x64emu_t* emu, void* dtor, void* obj,
     return 0;
 }
 
-extern void __chk_fail();
-EXPORT unsigned long int my___fdelt_chk (unsigned long int d)
-{
-  if (d >= FD_SETSIZE)
-    __chk_fail ();
-
-  return d / __NFDBITS;
-}
-#if 0
-EXPORT int32_t my_getrandom(x64emu_t* emu, void* buf, uint32_t buflen, uint32_t flags)
-{
-    // not always implemented on old linux version...
-    library_t* lib = my_lib;
-    if(!lib) return 0;
-    void* f = dlsym(lib->priv.w.lib, "getrandom");
-    if(f)
-        return ((iFpuu_t)f)(buf, buflen, flags);
-    // do what should not be done, but it's better then nothing....
-    FILE * rnd = fopen("/dev/urandom", "rb");
-    uint32_t r = fread(buf, 1, buflen, rnd);
-    fclose(rnd);
-    return r;
-}
-
-EXPORT int32_t my_recvmmsg(x64emu_t* emu, int32_t fd, void* msgvec, uint32_t vlen, uint32_t flags, void* timeout)
-{
-    // Implemented starting glibc 2.12+
-    library_t* lib = my_lib;
-    if(!lib) return 0;
-    void* f = dlsym(lib->priv.w.lib, "recvmmsg");
-    if(f)
-        return ((iFipuup_t)f)(fd, msgvec, vlen, flags, timeout);
-    // Use the syscall
-    return syscall(__NR_recvmmsg, fd, msgvec, vlen, flags, timeout);
-}
-
-EXPORT int32_t my___sendmmsg(x64emu_t* emu, int32_t fd, void* msgvec, uint32_t vlen, uint32_t flags)
-{
-    // Implemented starting glibc 2.14+
-    library_t* lib = my_lib;
-    if(!lib) return 0;
-    void* f = dlsym(lib->priv.w.lib, "__sendmmsg");
-    if(f)
-        return ((iFipuu_t)f)(fd, msgvec, vlen, flags);
-    // Use the syscall
-    return syscall(__NR_sendmmsg, fd, msgvec, vlen, flags);
-}
-
 EXPORT int32_t my___register_atfork(x64emu_t *emu, void* prepare, void* parent, void* child, void* handle)
 {
     // this is partly incorrect, because the emulated funcionts should be executed by actual fork and not by my_atfork...
@@ -1719,7 +1671,7 @@ EXPORT int32_t my___register_atfork(x64emu_t *emu, void* prepare, void* parent,
     my_context->atforks[my_context->atfork_sz].handle = handle;
     return 0;
 }
-
+#if 0
 EXPORT uint64_t my___umoddi3(uint64_t a, uint64_t b)
 {
     return a%b;
diff --git a/src/wrapped/wrappedlibc_private.h b/src/wrapped/wrappedlibc_private.h
index 55e4948c..fc1273be 100755
--- a/src/wrapped/wrappedlibc_private.h
+++ b/src/wrapped/wrappedlibc_private.h
@@ -18,8 +18,8 @@ GOW(access, iFpi)
 //GOW(advance, 
 //GO(alarm, 
 //GOW(aligned_alloc, 
-//GOW(alphasort, 
-//GOW(alphasort64, 
+GOW(alphasort, iFpp)
+GOW(alphasort64, iFpp)
 //GO(__arch_prctl, 
 //GOW(arch_prctl, 
 //DATA(argp_err_exit_status, 
@@ -298,9 +298,9 @@ GOW(_Exit, vFi)
 //GO(__fbufsize, 
 //GOW(fchdir, 
 //GO(fchflags, 
-//GOW(fchmod, 
+GOW(fchmod, iFiu)
 //GO(fchmodat, 
-//GOW(fchown, 
+GOW(fchown, iFiuu)
 //GO(fchownat, 
 GO(fclose, iFp)
 GOW(fcloseall, iFv)
diff --git a/src/wrapped/wrappedlibice.c b/src/wrapped/wrappedlibice.c
new file mode 100755
index 00000000..32334441
--- /dev/null
+++ b/src/wrapped/wrappedlibice.c
@@ -0,0 +1,59 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define _GNU_SOURCE         /* See feature_test_macros(7) */
+#include <dlfcn.h>
+
+#include "wrappedlibs.h"
+
+#include "debug.h"
+#include "wrapper.h"
+#include "bridge.h"
+#include "librarian/library_private.h"
+#include "x64emu.h"
+#include "emu/x64emu_private.h"
+#include "callback.h"
+#include "librarian.h"
+#include "box64context.h"
+#include "emu/x64emu_private.h"
+#include "myalign.h"
+
+const char* libiceName = "libICE.so.6";
+#define LIBNAME libice
+
+#if 0
+#define SUPER()
+    GO(BZ2_bzCompressInit, iFpiii_t)
+
+typedef struct libice_my_s {
+    // functions
+    #define GO(A, B)    B   A;
+    SUPER()
+    #undef GO
+} libice_my_t;
+
+void* getICEMy(library_t* lib)
+{
+    libice_my_t* my = (libice_my_t*)calloc(1, sizeof(libice_my_t));
+    #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A);
+    SUPER()
+    #undef GO
+    return my;
+}
+#undef SUPER
+
+void freeICEMy(void* lib)
+{
+    libice_my_t *my = (libice_my_t *)lib;
+}
+
+#define CUSTOM_INIT \
+    lib->priv.w.p2 = getICEMy(lib);
+
+#define CUSTOM_FINI \
+    freeICEMy(lib->priv.w.p2); \
+    free(lib->priv.w.p2);
+#endif
+
+#include "wrappedlib_init.h"
+
diff --git a/src/wrapped/wrappedlibice_private.h b/src/wrapped/wrappedlibice_private.h
new file mode 100755
index 00000000..813d5991
--- /dev/null
+++ b/src/wrapped/wrappedlibice_private.h
@@ -0,0 +1,113 @@
+#if !(defined(GO) && defined(GOM) && defined(GO2) && defined(DATA))
+#error meh!
+#endif
+
+//GO(IceAcceptConnection, 
+//GO(IceAddConnectionWatch, 
+//GO(_IceAddOpcodeMapping, 
+//GO(_IceAddReplyWait, 
+//GO(IceAllocScratch, 
+//GO(IceAppLockConn, 
+//GO(IceAppUnlockConn, 
+//GO(IceAuthFileName, 
+//GO(_IceCheckReplyReady, 
+//GO(IceCheckShutdownNegotiation, 
+//GO(IceCloseConnection, 
+//GO(IceComposeNetworkIdList, 
+//GO(_IceConnectionClosed, 
+GO(IceConnectionNumber, iFp)
+//GO(_IceConnectionOpened, 
+//GO(IceConnectionStatus, 
+//GO(IceConnectionString, 
+//GO(_IceErrorAuthenticationFailed, 
+//GO(_IceErrorAuthenticationRejected, 
+//GO(_IceErrorBadLength, 
+//GO(_IceErrorBadMajor, 
+//GO(_IceErrorBadMinor, 
+//GO(_IceErrorBadState, 
+//GO(_IceErrorBadValue, 
+//GO(_IceErrorMajorOpcodeDuplicate, 
+//GO(_IceErrorNoAuthentication, 
+//GO(_IceErrorNoVersion, 
+//GO(_IceErrorProtocolDuplicate, 
+//GO(_IceErrorSetupFailed, 
+//GO(_IceErrorUnknownProtocol, 
+//GO(IceFlush, 
+//GO(IceFreeAuthFileEntry, 
+//GO(_IceFreeConnection, 
+//GO(IceFreeListenObjs, 
+//GO(IceGenerateMagicCookie, 
+//GO(IceGetAuthFileEntry, 
+//GO(IceGetConnectionContext, 
+//GO(IceGetInBufSize, 
+//GO(IceGetListenConnectionNumber, 
+//GO(IceGetListenConnectionString, 
+//GO(IceGetOutBufSize, 
+//GO(_IceGetPaAuthData, 
+//GO(_IceGetPaValidAuthIndices, 
+//GO(IceGetPeerName, 
+//GO(_IceGetPeerName, 
+//GO(_IceGetPoAuthData, 
+//GO(_IceGetPoValidAuthIndices, 
+//GO(IceInitThreads, 
+//GO(IceLastReceivedSequenceNumber, 
+//GO(IceLastSentSequenceNumber, 
+//GO(IceListenForConnections, 
+//GO(IceListenForWellKnownConnections, 
+//GO(IceLockAuthFile, 
+//GO(IceOpenConnection, 
+//GO(_IcePaMagicCookie1Proc, 
+//GO(IcePing, 
+//GO(_IcePoMagicCookie1Proc, 
+GO(IceProcessMessages, iFppp)
+//GO(IceProtocolRevision, 
+//GO(IceProtocolSetup, 
+//GO(IceProtocolShutdown, 
+//GO(IceProtocolVersion, 
+//GO(_IceRead, 
+//GO(IceReadAuthFileEntry, 
+//GO(_IceReadSkip, 
+//GO(IceRegisterForProtocolReply, 
+//GO(IceRegisterForProtocolSetup, 
+//GO(IceRelease, 
+//GO(IceRemoveConnectionWatch, 
+//GO(_IceSearchReplyWaits, 
+//GO(IceSetErrorHandler, 
+//GO(IceSetHostBasedAuthProc, 
+//GO(IceSetIOErrorHandler, 
+//GO(IceSetPaAuthData, 
+//GO(_IceSetReplyReady, 
+//GO(IceSetShutdownNegotiation, 
+//GO(IceSwapping, 
+//GO(_IceTransAccept, 
+//GO(_IceTransBytesReadable, 
+//GO(_IceTransClose, 
+//GO(_IceTransCloseForCloning, 
+//GO(_IceTransConnect, 
+//GO(_IceTransCreateListener, 
+//GO(_IceTransDisconnect, 
+//GO(_IceTransFreeConnInfo, 
+//GO(_IceTransGetConnectionNumber, 
+//GO(_IceTransGetHostname, 
+//GO(_IceTransGetMyAddr, 
+//GO(_IceTransGetMyNetworkId, 
+//GO(_IceTransGetPeerAddr, 
+//GO(_IceTransGetPeerNetworkId, 
+//GO(_IceTransIsLocal, 
+//GO(_IceTransMakeAllCLTSServerListeners, 
+//GO(_IceTransMakeAllCOTSServerListeners, 
+//GO(_IceTransNoListen, 
+//GO(_IceTransOpenCLTSClient, 
+//GO(_IceTransOpenCLTSServer, 
+//GO(_IceTransOpenCOTSClient, 
+//GO(_IceTransOpenCOTSServer, 
+//GO(_IceTransRead, 
+//GO(_IceTransReadv, 
+//GO(_IceTransResetListener, 
+//GO(_IceTransSetOption, 
+//GO(_IceTransWrite, 
+//GO(_IceTransWritev, 
+//GO(IceUnlockAuthFile, 
+//GO(IceVendor, 
+//GO(_IceWrite, 
+//GO(IceWriteAuthFileEntry, 
diff --git a/src/wrapped/wrappedlibsm.c b/src/wrapped/wrappedlibsm.c
new file mode 100755
index 00000000..75f08e98
--- /dev/null
+++ b/src/wrapped/wrappedlibsm.c
@@ -0,0 +1,175 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#define _GNU_SOURCE         /* See feature_test_macros(7) */
+#include <dlfcn.h>
+
+#include "wrappedlibs.h"
+
+#include "debug.h"
+#include "wrapper.h"
+#include "bridge.h"
+#include "librarian/library_private.h"
+#include "x64emu.h"
+#include "emu/x64emu_private.h"
+#include "callback.h"
+#include "librarian.h"
+#include "box64context.h"
+#include "emu/x64emu_private.h"
+#include "myalign.h"
+
+const char* libsmName = "libSM.so.6";
+#define LIBNAME libsm
+
+typedef int     (*iFppp_t)          (void*, void*, void*);
+typedef int     (*iFpipp_t)         (void*, int, void*, void*);
+typedef void*   (*pFppiiLpppip_t)   (void*, void*, int, int, unsigned long, void*, void*, void*, int, void*);
+
+#define SUPER() \
+    GO(SmcOpenConnection, pFppiiLpppip_t)   \
+    GO(SmcInteractRequest, iFpipp_t)        \
+    GO(SmcRequestSaveYourselfPhase2, iFppp_t)
+
+typedef struct libsm_my_s {
+    // functions
+    #define GO(A, B)    B   A;
+    SUPER()
+    #undef GO
+} libsm_my_t;
+
+void* getSMMy(library_t* lib)
+{
+    libsm_my_t* my = (libsm_my_t*)calloc(1, sizeof(libsm_my_t));
+    #define GO(A, W) my->A = (W)dlsym(lib->priv.w.lib, #A);
+    SUPER()
+    #undef GO
+    return my;
+}
+#undef SUPER
+
+void freeSMMy(void* lib)
+{
+    //libsm_my_t *my = (libsm_my_t *)lib;
+}
+
+typedef struct my_SmcCallbacks_s {
+    struct {
+	void*	 callback;
+	void*	 client_data;
+    } save_yourself;
+
+    struct {
+	void*	 callback;
+	void*	 client_data;
+    } die;
+
+    struct {
+	void*	 callback;
+	void*		 client_data;
+    } save_complete;
+
+    struct {
+	void* callback;
+	void*		 client_data;
+    } shutdown_cancelled;
+} my_SmcCallbacks_t;
+#define SmcSaveYourselfProcMask		    (1L << 0)
+#define SmcDieProcMask			        (1L << 1)
+#define SmcSaveCompleteProcMask		    (1L << 2)
+#define SmcShutdownCancelledProcMask	(1L << 3)
+
+static uintptr_t my_save_yourself_fct = 0;
+static void my_save_yourself(void* smcConn, void* clientData, int saveType, int shutdown, int interactStyle, int fast)
+{
+    RunFunction(my_context, my_save_yourself_fct, 6, smcConn, clientData, saveType, shutdown, interactStyle, fast);
+}
+
+static uintptr_t my_die_fct = 0;
+static void my_die(void* smcConn, void* clientData)
+{
+    RunFunction(my_context, my_die_fct, 2, smcConn, clientData);
+}
+
+static uintptr_t my_shutdown_cancelled_fct = 0;
+static void my_shutdown_cancelled(void* smcConn, void* clientData)
+{
+    RunFunction(my_context, my_shutdown_cancelled_fct, 2, smcConn, clientData);
+}
+
+static uintptr_t my_save_complete_fct = 0;
+static void my_save_complete(void* smcConn, void* clientData)
+{
+    RunFunction(my_context, my_save_complete_fct, 2, smcConn, clientData);
+}
+
+
+EXPORT void* my_SmcOpenConnection(x64emu_t* emu, void* networkIdsList, void* context, int major, int minor, unsigned long mask, my_SmcCallbacks_t* cb, void* previousId, void* clientIdRet, int errorLength, void* errorRet)
+{
+    libsm_my_t* my = (libsm_my_t*)GetLibInternal(libsmName)->priv.w.p2;
+    my_SmcCallbacks_t nat = {0};
+    #define GO(A, B) if(mask&A) {my_##B##_fct = (uintptr_t)cb->B.callback; nat.B.callback = my_##B; nat.B.client_data=cb->B.client_data;}
+    GO(SmcSaveYourselfProcMask, save_yourself)
+    GO(SmcDieProcMask, die)
+    GO(SmcSaveCompleteProcMask, save_complete)
+    GO(SmcShutdownCancelledProcMask, shutdown_cancelled)
+    #undef GO
+    return my->SmcOpenConnection(networkIdsList, context, major, minor, mask, &nat, previousId, clientIdRet, errorLength, errorRet);
+}
+
+// utility functions
+#define SUPER() \
+GO(0)   \
+GO(1)   \
+GO(2)   \
+GO(3)   \
+GO(4)
+
+// Request
+#define GO(A)   \
+static uintptr_t my_Request_fct_##A = 0;        \
+static void my_Request_##A(void* a, void* b)     \
+{                                               \
+    RunFunction(my_context, my_Request_fct_##A, 2, a, b);\
+}
+SUPER()
+#undef GO
+static void* findRequestFct(void* fct)
+{
+    if(!fct) return NULL;
+    void* p;
+    if((p = GetNativeFnc((uintptr_t)fct))) return p;
+    #define GO(A) if(my_Request_fct_##A == (uintptr_t)fct) return my_Request_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_Request_fct_##A == 0) {my_Request_fct_##A = (uintptr_t)fct; return my_Request_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for libSM Request callback\n");
+    return NULL;
+}
+
+#undef SUPER
+
+EXPORT int my_SmcInteractRequest(x64emu_t* emu, void* smcConn, int f, void* cb, void* data)
+{
+    libsm_my_t* my = (libsm_my_t*)GetLibInternal(libsmName)->priv.w.p2;
+
+    return my->SmcInteractRequest(smcConn, f, findRequestFct(cb), data);
+}
+
+EXPORT int my_SmcRequestSaveYourselfPhase2(x64emu_t* emu, void* smcConn, void* cb, void* data)
+{
+    libsm_my_t* my = (libsm_my_t*)GetLibInternal(libsmName)->priv.w.p2;
+
+    return my->SmcRequestSaveYourselfPhase2(smcConn, findRequestFct(cb), data);
+}
+
+#define CUSTOM_INIT \
+    lib->priv.w.p2 = getSMMy(lib);
+
+#define CUSTOM_FINI \
+    freeSMMy(lib->priv.w.p2); \
+    free(lib->priv.w.p2);
+
+#include "wrappedlib_init.h"
+
diff --git a/src/wrapped/wrappedlibsm_private.h b/src/wrapped/wrappedlibsm_private.h
new file mode 100755
index 00000000..bc00fca9
--- /dev/null
+++ b/src/wrapped/wrappedlibsm_private.h
@@ -0,0 +1,45 @@
+#if !(defined(GO) && defined(GOM) && defined(GO2) && defined(DATA))
+#error meh!
+#endif
+
+GO(SmcClientID, pFp)
+GO(SmcCloseConnection, iFpip)
+GO(_SmcDefaultErrorHandler, vFpiiliip)
+GO(SmcDeleteProperties, vFpip)
+GO(SmcGetIceConnection, pFp)
+//GOM(SmcGetProperties, iFEpBp)
+GO(SmcInteractDone, iFpi)
+GOM(SmcInteractRequest, iFEpipp)
+//GOM(SmcModifyCallbacks, vFEpuB)
+GOM(SmcOpenConnection, pFEppiiLpppip)
+//GO(_SmcProcessMessage, 
+GO(SmcProtocolRevision, iFp)
+GO(SmcProtocolVersion, iFp)
+GO(SmcRelease, pFp)
+GO(SmcRequestSaveYourself, vFpiiiii)
+GOM(SmcRequestSaveYourselfPhase2, iFEppp)
+GO(SmcSaveYourselfDone, vFpi)
+//GOM(SmcSetErrorHandler, BFEB)
+GO(SmcSetProperties, vFpip)
+GO(SmcVendor, pFp)
+GO(SmFreeProperty, vFp)
+GO(SmFreeReasons, vFpp)
+GO(SmsCleanUp, vFp)
+GO(SmsClientHostName, pFp)
+GO(SmsClientID, pFp)
+GO(_SmsDefaultErrorHandler, vFpiiliip)
+GO(SmsDie, vFp)
+GO(SmsGenerateClientID, pFp)
+GO(SmsGetIceConnection, pFp)
+//GOM(SmsInitialize, iFppBpBip)
+GO(SmsInteract, vFp)
+//GO(_SmsProcessMessage, 
+GO(SmsProtocolRevision, iFp)
+GO(SmsProtocolVersion, iFp)
+GO(SmsRegisterClientReply, iFpp)
+GO(SmsReturnProperties, vFpip)
+GO(SmsSaveComplete, vFp)
+GO(SmsSaveYourself, vFpiiii)
+GO(SmsSaveYourselfPhase2, vFp)
+//GOM(SmsSetErrorHandler, BFEB)
+GO(SmsShutdownCancelled, vFp)