[Qemu-devel] [Bug 824716] [NEW] linux-user broken for targets with TARGET_ABI32 (i.e. qemu-sparc32plus)

2011-08-11 Thread Matthias Braun
Public bug reported:

I just debugged a problem I had with linux-user for qemu-sparc32plus.
Turns out that sparc32plus is defined as a 64bit target with
TARGET_ABI32 set. This correctly leads to abi_ulong (and others) being
defined as uint32_t. However most of the code (in syscall.c) uses tswapl
for these values, which swaps the endianess of a target long (which is
64bit). This doesn't match the uin32_t abi_ulongs and fails!

So it appears to me like one would need to define something like an
aswapl which swaps abi_ulongs and replace most of the tswapls there...

** Affects: qemu
 Importance: Undecided
 Status: New

-- 
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/824716

Title:
  linux-user broken for targets with TARGET_ABI32 (i.e. qemu-
  sparc32plus)

Status in QEMU:
  New

Bug description:
  I just debugged a problem I had with linux-user for qemu-sparc32plus.
  Turns out that sparc32plus is defined as a 64bit target with
  TARGET_ABI32 set. This correctly leads to abi_ulong (and others) being
  defined as uint32_t. However most of the code (in syscall.c) uses
  tswapl for these values, which swaps the endianess of a target long
  (which is 64bit). This doesn't match the uin32_t abi_ulongs and fails!

  So it appears to me like one would need to define something like an
  aswapl which swaps abi_ulongs and replace most of the tswapls there...

To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/824716/+subscriptions



[Qemu-devel] [PATCH] linux-user: fix abi_(u)long, target_ulong mismatch

2011-08-15 Thread Matthias Braun
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

[Qemu-devel] [Bug 824716] Re: linux-user broken for targets with TARGET_ABI32 (i.e. qemu-sparc32plus)

2011-08-17 Thread Matthias Braun
Bugfix as sent to qemu-devel mailinglist on 2011/08/15


** Patch added: "0001-linux-user-fix-abi_-u-long-target_ulong-mismatch.patch"
   
https://bugs.launchpad.net/qemu/+bug/824716/+attachment/2285481/+files/0001-linux-user-fix-abi_-u-long-target_ulong-mismatch.patch

-- 
You received this bug notification because you are a member of qemu-
devel-ml, which is subscribed to QEMU.
https://bugs.launchpad.net/bugs/824716

Title:
  linux-user broken for targets with TARGET_ABI32 (i.e. qemu-
  sparc32plus)

Status in QEMU:
  New

Bug description:
  I just debugged a problem I had with linux-user for qemu-sparc32plus.
  Turns out that sparc32plus is defined as a 64bit target with
  TARGET_ABI32 set. This correctly leads to abi_ulong (and others) being
  defined as uint32_t. However most of the code (in syscall.c) uses
  tswapl for these values, which swaps the endianess of a target long
  (which is 64bit). This doesn't match the uin32_t abi_ulongs and fails!

  So it appears to me like one would need to define something like an
  aswapl which swaps abi_ulongs and replace most of the tswapls there...

To manage notifications about this bug go to:
https://bugs.launchpad.net/qemu/+bug/824716/+subscriptions