abi_(u)long might be different from target_ulong, so don't use tswapl
but introduce a new tswapal
see also https://bugs.launchpad.net/qemu/+bug/824716
Signed-off-by: Matthias Braun
---
linux-user/qemu-types.h | 12 +++
linux-user/signal.c | 22 ++--
linux-user/strace.c |4 +-
linux-user/syscall.c | 240
++--
linux-user/syscall_defs.h |8 +-
linux-user/vm86.c |4 +-
6 files changed, 151 insertions(+), 139 deletions(-)
diff --git a/linux-user/qemu-types.h b/linux-user/qemu-types.h
index 1adda9f..fe7f662 100644
--- a/linux-user/qemu-types.h
+++ b/linux-user/qemu-types.h
@@ -9,6 +9,12 @@ typedef int32_t abi_long;
#define TARGET_ABI_FMT_ld "%d"
#define TARGET_ABI_FMT_lu "%u"
#define TARGET_ABI_BITS 32
+
+static inline abi_ulong tswapal(abi_ulong v)
+{
+return tswap32(v);
+}
+
#else
typedef target_ulong abi_ulong;
typedef target_long abi_long;
@@ -20,5 +26,11 @@ typedef target_long abi_long;
#if TARGET_ABI_BITS == 32
#define TARGET_ABI32 1
#endif
+
+static inline abi_ulong tswapal(abi_ulong v)
+{
+return tswapl(v);
+}
+
#endif
#endif
diff --git a/linux-user/signal.c b/linux-user/signal.c
index 07ad07a..c70f7b2 100644
--- a/linux-user/signal.c
+++ b/linux-user/signal.c
@@ -152,7 +152,7 @@ void host_to_target_sigset(target_sigset_t *d, const
sigset_t *s)
host_to_target_sigset_internal(&d1, s);
for(i = 0;i < TARGET_NSIG_WORDS; i++)
-d->sig[i] = tswapl(d1.sig[i]);
+d->sig[i] = tswapal(d1.sig[i]);
}
static void target_to_host_sigset_internal(sigset_t *d,
@@ -173,7 +173,7 @@ void target_to_host_sigset(sigset_t *d, const
target_sigset_t *s)
int i;
for(i = 0;i < TARGET_NSIG_WORDS; i++)
-s1.sig[i] = tswapl(s->sig[i]);
+s1.sig[i] = tswapal(s->sig[i]);
target_to_host_sigset_internal(d, &s1);
}
@@ -234,14 +234,14 @@ static void tswap_siginfo(target_siginfo_t *tinfo,
if (sig == SIGILL || sig == SIGFPE || sig == SIGSEGV ||
sig == SIGBUS || sig == SIGTRAP) {
tinfo->_sifields._sigfault._addr =
-tswapl(info->_sifields._sigfault._addr);
+tswapal(info->_sifields._sigfault._addr);
} else if (sig == SIGIO) {
tinfo->_sifields._sigpoll._fd = tswap32(info->_sifields._sigpoll._fd);
} else if (sig >= TARGET_SIGRTMIN) {
tinfo->_sifields._rt._pid = tswap32(info->_sifields._rt._pid);
tinfo->_sifields._rt._uid = tswap32(info->_sifields._rt._uid);
tinfo->_sifields._rt._sigval.sival_ptr =
-tswapl(info->_sifields._rt._sigval.sival_ptr);
+tswapal(info->_sifields._rt._sigval.sival_ptr);
}
}
@@ -262,7 +262,7 @@ void target_to_host_siginfo(siginfo_t *info, const
target_siginfo_t *tinfo)
info->si_pid = tswap32(tinfo->_sifields._rt._pid);
info->si_uid = tswap32(tinfo->_sifields._rt._uid);
info->si_value.sival_ptr =
-(void
*)(long)tswapl(tinfo->_sifields._rt._sigval.sival_ptr);
+(void
*)(long)tswapal(tinfo->_sifields._rt._sigval.sival_ptr);
}
static int fatal_signal (int sig)
@@ -586,19 +586,19 @@ int do_sigaction(int sig, const struct
target_sigaction *act,
sig, act, oact);
#endif
if (oact) {
-oact->_sa_handler = tswapl(k->_sa_handler);
-oact->sa_flags = tswapl(k->sa_flags);
+oact->_sa_handler = tswapal(k->_sa_handler);
+oact->sa_flags = tswapal(k->sa_flags);
#if !defined(TARGET_MIPS)
-oact->sa_restorer = tswapl(k->sa_restorer);
+oact->sa_restorer = tswapal(k->sa_restorer);
#endif
oact->sa_mask = k->sa_mask;
}
if (act) {
/* FIXME: This is not threadsafe. */
-k->_sa_handler = tswapl(act->_sa_handler);
-k->sa_flags = tswapl(act->sa_flags);
+k->_sa_handler = tswapal(act->_sa_handler);
+k->sa_flags = tswapal(act->sa_flags);
#if !defined(TARGET_MIPS)
-k->sa_restorer = tswapl(act->sa_restorer);
+k->sa_restorer = tswapal(act->sa_restorer);
#endif
k->sa_mask = act->sa_mask;
diff --git a/linux-user/strace.c b/linux-user/strace.c
index fe9326a..90027a1 100644
--- a/linux-user/strace.c
+++ b/linux-user/strace.c
@@ -169,7 +169,7 @@ print_fdset(int n, abi_ulong target_fds_addr)
return;
for (i=n; i>=0; i--) {
-if ((tswapl(target_fds[i / TARGET_ABI_BITS]) >> (i &
(TARGET_ABI_BITS - 1))) & 1)
+if ((tswapal(target_fds[i / TARGET_ABI_BITS]) >> (i &
(TARGET_ABI_BITS - 1))) & 1)
gemu_log("%d,", i );
}
unlock_user(target_fds, target_fds_addr, 0);
@@ -245,7 +245,7 @@ print_execve(const struct syscallname *name,
arg_ptr = lock_user(VERIFY_READ, arg_pt