about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-14 20:56:07 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-14 20:56:07 +0100
commitd03c85da9045a67e178c98d94b607cc3cd8d22c0 (patch)
treefbd782d553156e68de26505ac514a532da98e4d6
parent6a5d8313312ca254b7382019dc99912cabc5dafd (diff)
downloadbox64-d03c85da9045a67e178c98d94b607cc3cd8d22c0.tar.gz
box64-d03c85da9045a67e178c98d94b607cc3cd8d22c0.zip
[BOX32][WRAPPER] More fixes to libc and X11 wrapping
-rwxr-xr-xsrc/include/myalign32.h4
-rw-r--r--src/library_list_32.h2
-rw-r--r--src/libtools/libc_net32.c16
-rw-r--r--src/libtools/my_x11_conv.c37
-rw-r--r--src/libtools/my_x11_defs.h35
-rw-r--r--src/libtools/my_x11_defs_32.h11
-rwxr-xr-xsrc/libtools/myalign32.c44
-rwxr-xr-xsrc/wrapped32/wrappedlibc.c25
-rw-r--r--system/box64.box64rc6
9 files changed, 82 insertions, 98 deletions
diff --git a/src/include/myalign32.h b/src/include/myalign32.h
index dbc8d055..caf2721f 100755
--- a/src/include/myalign32.h
+++ b/src/include/myalign32.h
@@ -527,7 +527,7 @@ struct i386_mmsghdr {
 
 struct i386_cmsghdr
 {
-  ulong_t cmsg_len;
+  uint32_t cmsg_len;
   int cmsg_level;
   int cmsg_type;
 } __attribute__((packed, aligned(4)));
@@ -535,7 +535,7 @@ struct i386_cmsghdr
 void AlignIOV_32(void* dest, void* source);   // x86 -> Native
 void UnalignIOV_32(void* dest, void* source); // Native -> x86
 
-void AlignMsgHdr_32(void* dest, void* dest_iov, void* dest_cmsg, void* source, int convert_control);   // x86 -> Native
+void AlignMsgHdr_32(void* dest, void* dest_iov, void* source);   // x86 -> Native
 void UnalignMsgHdr_32(void* dest, void* source); // back to Native -> x86
 
 struct i386_passwd
diff --git a/src/library_list_32.h b/src/library_list_32.h
index 487e4b64..b48c5042 100644
--- a/src/library_list_32.h
+++ b/src/library_list_32.h
@@ -80,6 +80,6 @@ GO("libvdpau.so", libvdpau)
 GO("libnsl.so.1", nsl)
 GO("libnsl.so", nsl)
 
-GO("crashhandler.so", crashhandler)
+//GO("crashhandler.so", crashhandler)
 GO("libtcmalloc_minimal.so.0", tcmallocminimal)
 GO("libtcmalloc_minimal.so.4", tcmallocminimal)
diff --git a/src/libtools/libc_net32.c b/src/libtools/libc_net32.c
index b3fde053..afc83f89 100644
--- a/src/libtools/libc_net32.c
+++ b/src/libtools/libc_net32.c
@@ -42,8 +42,7 @@ EXPORT ssize_t my32_recvmsg(x64emu_t* emu, int socket, struct i386_msghdr* msg,
 {
     struct iovec iov[msg->msg_iovlen];
     struct msghdr m;
-    uint8_t buff[msg->msg_controllen+256];
-    AlignMsgHdr_32(&m, iov, buff, msg, 0);
+    AlignMsgHdr_32(&m, iov, msg);
     ssize_t ret = recvmsg(socket, &m, flags);
     UnalignMsgHdr_32(msg, &m);
     return ret;
@@ -53,8 +52,7 @@ EXPORT ssize_t my32_sendmsg(x64emu_t* emu, int socket, struct i386_msghdr* msg,
 {
     struct iovec iov[msg->msg_iovlen];
     struct msghdr m;
-    uint8_t buff[msg->msg_controllen+256];
-    AlignMsgHdr_32(&m, iov, buff, msg, 1);
+    AlignMsgHdr_32(&m, iov, msg);
     ssize_t ret = sendmsg(socket, &m, flags);
     UnalignMsgHdr_32(msg, &m);
     return ret;
@@ -64,16 +62,13 @@ EXPORT int my32_recvmmsg(x64emu_t* emu, int socket, struct i386_mmsghdr* msgs, u
 {
     struct mmsghdr m[vlen];
     uint32_t iovlen = 0;
-    size_t ctrlen = 0;
     for(uint32_t i=0; i<vlen; ++i) {
         if(msgs[i].msg_hdr.msg_iovlen>iovlen) iovlen = msgs[i].msg_hdr.msg_iovlen;
-        if(msgs[i].msg_hdr.msg_controllen>ctrlen) ctrlen = msgs[i].msg_hdr.msg_controllen;
         m[i].msg_len = msgs[i].msg_len;
     }
     struct iovec iov[vlen][iovlen];
-    uint8_t buff[vlen][ctrlen+256];
     for(uint32_t i=0; i<vlen; ++i)
-        AlignMsgHdr_32(&m[i].msg_hdr, iov[i], buff[i], &msgs[i].msg_hdr, 1);
+        AlignMsgHdr_32(&m[i].msg_hdr, iov[i], &msgs[i].msg_hdr);
     int ret = recvmmsg(socket, m, vlen, flags, timeout);
     for(uint32_t i=0; i<vlen; ++i) {
         UnalignMsgHdr_32(&msgs[i].msg_hdr, &m[i].msg_hdr);
@@ -86,16 +81,13 @@ EXPORT int my32_sendmmsg(x64emu_t* emu, int socket, struct i386_mmsghdr* msgs, u
 {
     struct mmsghdr m[vlen];
     uint32_t iovlen = 0;
-    size_t ctrlen = 0;
     for(uint32_t i=0; i<vlen; ++i) {
         if(msgs[i].msg_hdr.msg_iovlen>iovlen) iovlen = msgs[i].msg_hdr.msg_iovlen;
-        if(msgs[i].msg_hdr.msg_controllen>ctrlen) ctrlen = msgs[i].msg_hdr.msg_controllen;
         m[i].msg_len = msgs[i].msg_len;
     }
     struct iovec iov[vlen][iovlen];
-    uint8_t buff[vlen][ctrlen+256];
     for(uint32_t i=0; i<vlen; ++i)
-        AlignMsgHdr_32(&m[i].msg_hdr, iov[i], buff[i], &msgs[i].msg_hdr, 1);
+        AlignMsgHdr_32(&m[i].msg_hdr, iov[i], &msgs[i].msg_hdr);
     int ret = sendmmsg(socket, m, vlen, flags);
     for(uint32_t i=0; i<vlen; ++i) {
         UnalignMsgHdr_32(&msgs[i].msg_hdr, &m[i].msg_hdr);
diff --git a/src/libtools/my_x11_conv.c b/src/libtools/my_x11_conv.c
index f271ea12..8978f4c9 100644
--- a/src/libtools/my_x11_conv.c
+++ b/src/libtools/my_x11_conv.c
@@ -1194,6 +1194,39 @@ void* inplace_XkbNamesRec_enlarge(void* a)
     return a;
 }
 
+void* inplace_XkbClientMapRec_shrink(void* a)
+{
+    if(a) {
+        my_XkbClientMapRec_t* src = a;
+        my_XkbClientMapRec_32_t* dst = a;
+        dst->size_types = src->size_types;
+        dst->num_types = src->num_types;
+        dst->types = to_ptrv(src->types);
+        dst->size_syms = src->size_syms;
+        dst->num_syms = src->num_syms;
+        dst->syms = to_ptrv(src->syms);
+        dst->key_sym_map = to_ptrv(src->key_sym_map);
+        dst->modmap = to_ptrv(src->modmap);
+    }
+    return a;
+}
+void* inplace_XkbClientMapRec_enlarge(void* a)
+{
+    if(a) {
+        my_XkbClientMapRec_32_t* src = a;
+        my_XkbClientMapRec_t* dst = a;
+        dst->modmap = from_ptrv(src->modmap);
+        dst->key_sym_map = from_ptrv(src->key_sym_map);
+        dst->syms = from_ptrv(src->syms);
+        dst->num_syms = src->num_syms;
+        dst->size_syms = src->size_syms;
+        dst->types = from_ptrv(src->types);
+        dst->num_types = src->num_types;
+        dst->size_types = src->size_types;
+    }
+    return a;
+}
+
 void* inplace_XkbDescRec_shrink(void* a)
 {
     if(a) {
@@ -1207,7 +1240,7 @@ void* inplace_XkbDescRec_shrink(void* a)
         dst->max_key_code = src->max_key_code;
         dst->ctrls = to_ptrv(src->ctrls);
         dst->server = to_ptrv(src->server);
-        dst->map = to_ptrv(src->map);
+        dst->map = to_ptrv(inplace_XkbClientMapRec_shrink(src->map));
         dst->indicators = to_ptrv(src->indicators);
         dst->names = to_ptrv(inplace_XkbNamesRec_shrink(src->names));
         dst->compat = to_ptrv(src->compat);
@@ -1225,7 +1258,7 @@ void* inplace_XkbDescRec_enlarge(void* a)
         dst->compat = from_ptrv(src->compat);
         dst->names = inplace_XkbNamesRec_enlarge(from_ptrv(src->names));
         dst->indicators = from_ptrv(src->indicators);
-        dst->map = from_ptrv(src->map);
+        dst->map = inplace_XkbClientMapRec_enlarge(from_ptrv(src->map));
         dst->server = from_ptrv(src->server);
         dst->ctrls = from_ptrv(src->ctrls);
         dst->max_key_code = src->max_key_code;
diff --git a/src/libtools/my_x11_defs.h b/src/libtools/my_x11_defs.h
index 889a47ec..0cf6081d 100644
--- a/src/libtools/my_x11_defs.h
+++ b/src/libtools/my_x11_defs.h
@@ -1366,19 +1366,30 @@ typedef struct my_XkbNamesRec_s {
     unsigned short  num_rg;
 } my_XkbNamesRec_t;
 
+typedef struct my_XkbClientMapRec_s {
+    unsigned char            size_types;
+    unsigned char            num_types;
+    void*                    types; //XkbKeyTypePtr
+    unsigned short           size_syms;
+    unsigned short           num_syms;
+    void*                    syms;  //KeySym*
+    void*                    key_sym_map;   //XkbSymMapPtr
+    unsigned char*           modmap;
+} my_XkbClientMapRec_t;
+
 typedef struct my_XkbDescRec_s {
-   my_XDisplay_t*     display;
-   unsigned short     flags;
-   unsigned short     device_spec;
-   uint8_t            min_key_code;
-   uint8_t            max_key_code;
-   void*              ctrls; //XkbControlsPtr
-   void*              server; //XkbServerMapPtr
-   void*              map; //XkbClientMapPtr
-   void*              indicators; //XkbIndicatorPtr
-   my_XkbNamesRec_t*  names;
-   void*              compat; //XkbCompatMapPtr
-   void*              geom; //XkbGeometryPtr
+   my_XDisplay_t*           display;
+   unsigned short           flags;
+   unsigned short           device_spec;
+   uint8_t                  min_key_code;
+   uint8_t                  max_key_code;
+   void*                    ctrls; //XkbControlsPtr
+   void*                    server; //XkbServerMapPtr
+   my_XkbClientMapRec_t*    map; //XkbClientMapPtr
+   void*                    indicators; //XkbIndicatorPtr
+   my_XkbNamesRec_t*        names;
+   void*                    compat; //XkbCompatMapPtr
+   void*                    geom; //XkbGeometryPtr
 } my_XkbDescRec_t;
 
 typedef struct my_XmbTextItem_s {
diff --git a/src/libtools/my_x11_defs_32.h b/src/libtools/my_x11_defs_32.h
index 56971dba..01144d1f 100644
--- a/src/libtools/my_x11_defs_32.h
+++ b/src/libtools/my_x11_defs_32.h
@@ -1299,6 +1299,17 @@ typedef struct my_XkbNamesRec_32_s {
     unsigned short  num_rg;
 } my_XkbNamesRec_32_t;
 
+typedef struct my_XkbClientMapRec_32_s {
+    unsigned char            size_types;
+    unsigned char            num_types;
+    ptr_t                    types; //XkbKeyTypePtr
+    unsigned short           size_syms;
+    unsigned short           num_syms;
+    ptr_t                    syms;  //KeySym*
+    ptr_t                    key_sym_map;   //XkbSymMapPtr
+    ptr_t                    modmap;    //unsigned char*
+} my_XkbClientMapRec_32_t;
+
 typedef struct my_XkbDescRec_32_s {
    ptr_t              display; //my_XDisplay_32_t*
    unsigned short     flags;
diff --git a/src/libtools/myalign32.c b/src/libtools/myalign32.c
index e32a9571..258fcc9e 100755
--- a/src/libtools/myalign32.c
+++ b/src/libtools/myalign32.c
@@ -1480,7 +1480,7 @@ void UnalignIOV_32(void* dest, void* source)
 void* my32___cmsg_nxthdr(struct i386_msghdr* mhdr, struct i386_cmsghdr* cmsg);
 
 // x86 -> Native
-void AlignMsgHdr_32(void* dest, void* dest_iov, void* dest_cmsg, void* source, int convert_control)
+void AlignMsgHdr_32(void* dest, void* dest_iov, void* source)
 {
     struct iovec* iov = dest_iov;
     struct msghdr* d = dest;
@@ -1496,29 +1496,7 @@ void AlignMsgHdr_32(void* dest, void* dest_iov, void* dest_cmsg, void* source, i
     }
     d->msg_iovlen = s->msg_iovlen;
     d->msg_controllen = s->msg_controllen;
-    if(convert_control) {
-        if(s->msg_control) {
-            d->msg_control = dest_cmsg;
-            struct i386_cmsghdr* cmsg = from_ptrv(s->msg_control);
-            struct cmsghdr* dcmsg = dest_cmsg;
-            while(cmsg) {
-                dcmsg->cmsg_len = from_ulong(cmsg->cmsg_len);
-                dcmsg->cmsg_level = cmsg->cmsg_level;
-                dcmsg->cmsg_type = cmsg->cmsg_type;
-                if(cmsg->cmsg_len) {
-                    dcmsg->cmsg_len += 4;
-                    memcpy(CMSG_DATA(dcmsg), cmsg+1, cmsg->cmsg_len-sizeof(struct i386_cmsghdr));
-                    d->msg_controllen += 4;
-                }
-                dcmsg = (struct cmsghdr*)(((uintptr_t)dcmsg) + ((dcmsg->cmsg_len+7)&~7));
-                cmsg = my32___cmsg_nxthdr(s, cmsg);
-            }
-        } else 
-            d->msg_control = NULL;
-    } else {
-        d->msg_control = (s->msg_control)?dest_cmsg:NULL;
-        if(d->msg_control) memset(d->msg_control, 0, d->msg_controllen);
-    }
+    d->msg_control = from_ptrv(s->msg_control);
     d->msg_flags = s->msg_flags;
 }
 
@@ -1537,23 +1515,7 @@ void UnalignMsgHdr_32(void* dest, void* source)
     }
     d->msg_iovlen = s->msg_iovlen;
     d->msg_controllen = s->msg_controllen;
-    if(s->msg_control) {
-        struct i386_cmsghdr* dcmsg = from_ptrv(d->msg_control);
-        struct cmsghdr* scmsg = s->msg_control;
-        while(scmsg) {
-            dcmsg->cmsg_len = to_ulong(scmsg->cmsg_len);
-            dcmsg->cmsg_level = scmsg->cmsg_level;
-            dcmsg->cmsg_type = scmsg->cmsg_type;
-            if(dcmsg->cmsg_len) {
-                dcmsg->cmsg_len -= 4;
-                memcpy(dcmsg+1, CMSG_DATA(scmsg), dcmsg->cmsg_len-sizeof(struct i386_cmsghdr));
-                d->msg_controllen -= 4;
-            }
-            (struct i386_cmsghdr*)(((uintptr_t)dcmsg) + ((dcmsg->cmsg_len+3)&~3));
-            scmsg = CMSG_NXTHDR(s, scmsg);
-        }
-    } else 
-        d->msg_control = 0;
+    d->msg_control = to_ptrv(s->msg_control);
     d->msg_flags = s->msg_flags;
 }
 
diff --git a/src/wrapped32/wrappedlibc.c b/src/wrapped32/wrappedlibc.c
index e0082e9e..284d04e8 100755
--- a/src/wrapped32/wrappedlibc.c
+++ b/src/wrapped32/wrappedlibc.c
@@ -2298,31 +2298,6 @@ EXPORT int my32_getgrgid_r(x64emu_t* emu, gid_t gid, struct i386_group *grp, cha
     return ret;
 }
 
-#if 0
-EXPORT int32_t my32_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 my32___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);
-}
-#endif
 EXPORT int32_t my32___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 my32_atfork...
diff --git a/system/box64.box64rc b/system/box64.box64rc
index 06c0fe06..3e69f181 100644
--- a/system/box64.box64rc
+++ b/system/box64.box64rc
@@ -231,9 +231,9 @@ BOX64_DYNAREC_BIGBLOCK=0
 BOX64_DYNAREC_STRONGMEM=2 #Likes to crash without it
 BOX64_PREFER_EMULATED=1
 
-[steam]
-BOX64_CRASHHANDLER=1
-BOX64_EMULATED_LIBS=libudev.so.0
+#[steam]
+#BOX64_CRASHHANDLER=1
+#BOX64_EMULATED_LIBS=libudev.so.0
 
 #[steamwebhelper]
 #BOX64_NOSANDBOX=1