diff mbox

[v3] linux-user: avoid using glibc internals in _syscall5 and in definition of target_sigevent struct

Message ID 1398769880-1962-1-git-send-email-ncopa@alpinelinux.org
State New
Headers show

Commit Message

Natanael Copa April 29, 2014, 11:11 a.m. UTC
Use the public sigset_t instead of the glibc specific internal
__sigset_t in _syscall.

Calculate the sigevent pad size is calculated in similar way as kernel
does it instead of using glibc internal field _pad.

This is needed for building with musl libc.

Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
---
Changes v2 -> v3:
 - Fix another typ of PREAMBLE

 linux-user/syscall.c      |  2 +-
 linux-user/syscall_defs.h | 16 +++++++++++++++-
 2 files changed, 16 insertions(+), 2 deletions(-)

Comments

Peter Maydell May 2, 2014, 2:52 p.m. UTC | #1
On 29 April 2014 12:11, Natanael Copa <ncopa@alpinelinux.org> wrote:
> Use the public sigset_t instead of the glibc specific internal
> __sigset_t in _syscall.
>
> Calculate the sigevent pad size is calculated in similar way as kernel
> does it instead of using glibc internal field _pad.
>
> This is needed for building with musl libc.
>
> Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

-- PMM
diff mbox

Patch

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 9864813..c8989b6 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -406,7 +406,7 @@  static int sys_inotify_init1(int flags)
 #endif
 #define __NR_sys_ppoll __NR_ppoll
 _syscall5(int, sys_ppoll, struct pollfd *, fds, nfds_t, nfds,
-          struct timespec *, timeout, const __sigset_t *, sigmask,
+          struct timespec *, timeout, const sigset_t *, sigmask,
           size_t, sigsetsize)
 #endif
 
diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
index fdf9a47..69c3982 100644
--- a/linux-user/syscall_defs.h
+++ b/linux-user/syscall_defs.h
@@ -2552,12 +2552,26 @@  struct target_timer_t {
     abi_ulong ptr;
 };
 
+#define TARGET_SIGEV_MAX_SIZE 64
+
+/* This is architecture-specific but most architectures use the default */
+#ifdef TARGET_MIPS
+#define TARGET_SIGEV_PREAMBLE_SIZE (sizeof(int32_t) * 2 + sizeof(abi_long))
+#else
+#define TARGET_SIGEV_PREAMBLE_SIZE (sizeof(int32_t) * 2 \
+                                    + sizeof(target_sigval_t))
+#endif
+
+#define TARGET_SIGEV_PAD_SIZE ((TARGET_SIGEV_MAX_SIZE \
+                                - TARGET_SIGEV_PREAMBLE_SIZE) \
+                               / sizeof(int32_t))
+
 struct target_sigevent {
     target_sigval_t sigev_value;
     int32_t sigev_signo;
     int32_t sigev_notify;
     union {
-        int32_t _pad[ARRAY_SIZE(((struct sigevent *)0)->_sigev_un._pad)];
+        int32_t _pad[TARGET_SIGEV_PAD_SIZE];
         int32_t _tid;
 
         struct {