diff options
Diffstat (limited to 'main/qemu/0001-linux-user-avoid-using-glibc-internals-in-_syscall5-.patch')
-rw-r--r-- | main/qemu/0001-linux-user-avoid-using-glibc-internals-in-_syscall5-.patch | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/main/qemu/0001-linux-user-avoid-using-glibc-internals-in-_syscall5-.patch b/main/qemu/0001-linux-user-avoid-using-glibc-internals-in-_syscall5-.patch new file mode 100644 index 0000000000..2ee0bbe7ff --- /dev/null +++ b/main/qemu/0001-linux-user-avoid-using-glibc-internals-in-_syscall5-.patch @@ -0,0 +1,68 @@ +From 73a0fc74069c5dd4c5895a406b9cc64358da90e6 Mon Sep 17 00:00:00 2001 +From: Natanael Copa <ncopa@alpinelinux.org> +Date: Wed, 23 Apr 2014 16:51:31 +0200 +Subject: [PATCH 1/6] linux-user: avoid using glibc internals in _syscall5 and + in definition of target_sigevent struct + +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> +--- + linux-user/syscall.c | 2 +- + linux-user/syscall_defs.h | 16 +++++++++++++++- + 2 files changed, 16 insertions(+), 2 deletions(-) + +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 { +-- +1.9.2 + |