qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Blue Swirl <blauwirbel@gmail.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 0/2] simplify global register save/restore
Date: Sat, 13 Feb 2010 19:58:41 +0200	[thread overview]
Message-ID: <f43fc5581002130958q17edaf68tf3d66c319059b617@mail.gmail.com> (raw)
In-Reply-To: <1265844362-29836-1-git-send-email-pbonzini@redhat.com>

On Thu, Feb 11, 2010 at 1:26 AM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> Since b567b38 (target-arm: remove T0 and T1, 2009-10-16) the only global
> register that is actually used is AREG0, so the complexity of
> hostregs_helper.h is unwarranted.
>
> Let's just say that env should be the only global register.  AREG1 and
> AREG2 in principle could still be used to work around bad register
> allocation in GCC, so I'm leaving them in dyngen-exec.h.
>
> Blue Swirl, can you check whether changing AREG0 to another register
> in dyngen-exec.h would fix the "annoying glibc bugs mangling global
> register variables"?  Or maybe we can remove the workaround altogether,
> considering the bug was fixed in version 2.3 of glibc dated 2001-11-29
> (at least that's what I'd guess from the history)?

The problem is with global register use by the system libraries. Sparc
V8 ABI reserves %g5 to %g7 for system. System may not use %g2 to %g4.
V9 ABI gives more registers to application use. For more information
see for example this page at Oracle:
http://developers.sun.com/solaris/articles/sparcv9abi.html

One part of the problem is that libraries are not compiled with
appropriate CFLAGS so that they avoid using global registers. The
second part is that the libraries may contain assembly language code
which directly uses the registers (especially setjmp/longjmp, which
are critical for QEMU).

Here are some statistics on Debian Lenny, with libc6 version 2.7-18lenny2:

$ objdump -d /lib/libc.so.6 |grep %g1|wc -l
73753
$ objdump -d /lib/libc.so.6 |grep %g2|wc -l
37571
$ objdump -d /lib/libc.so.6 |grep %g3|wc -l
23205
$ objdump -d /lib/libc.so.6 |grep %g4|wc -l
12267
$ objdump -d /lib/libc.so.6 |grep %g5|wc -l
444
$ objdump -d /lib/libc.so.6 |grep %g6|wc -l
150
$ objdump -d /lib/libc.so.6 |grep %g7|wc -l
2776

Same for OpenBSD 4.6, which is pure Sparc V9.

$ objdump -d /usr/lib/libc.so.51.0 |grep %g1|wc -l
   41040
$ objdump -d /usr/lib/libc.so.51.0 |grep %g2|wc -l
   21115
$ objdump -d /usr/lib/libc.so.51.0 |grep %g3|wc -l
   10945
$ objdump -d /usr/lib/libc.so.51.0 |grep %g4|wc -l
    6682
$ objdump -d /usr/lib/libc.so.51.0 |grep %g5|wc -l
    3712
$ objdump -d /usr/lib/libc.so.51.0 |grep %g6|wc -l
       4
$ objdump -d /usr/lib/libc.so.51.0 |grep %g7|wc -l
      20

So I guess changing the global register would not benefit Linux much.

If I remove the workaround from cpu-exec.c, a bus error is generated
almost immediately. Otherwise on Linux, sparc-softmmu can boot Linux
(sparc-test) image, but QEMU crashes just before command line. On
OpenBSD, the same test reaches command prompt.

  parent reply	other threads:[~2010-02-13 17:59 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-02-10 23:26 [Qemu-devel] [PATCH 0/2] simplify global register save/restore Paolo Bonzini
2010-02-10 23:26 ` [Qemu-devel] [PATCH 1/2] remove dead m68k global register definitions Paolo Bonzini
2010-02-10 23:26 ` [Qemu-devel] [PATCH 2/2] get rid of hostregs_helper.h Paolo Bonzini
2010-02-18 19:07   ` Blue Swirl
2010-02-18 20:25     ` [Qemu-devel] [PATCH v2 1/2] remove dead m68k definitions Paolo Bonzini
2010-02-18 20:25       ` [Qemu-devel] [PATCH v2 2/2] get rid of hostregs_helper.h Paolo Bonzini
2010-02-18 21:28         ` [Qemu-devel] " Blue Swirl
2010-02-25 11:40           ` Michael S. Tsirkin
2010-02-25 12:50             ` Paolo Bonzini
2010-02-25 13:04               ` Michael S. Tsirkin
2010-02-25 13:11                 ` Paolo Bonzini
2010-02-13 17:58 ` Blue Swirl [this message]
2010-02-13 20:26   ` [Qemu-devel] Re: [PATCH 0/2] simplify global register save/restore Paolo Bonzini
2010-02-13 20:57     ` Blue Swirl
2010-02-13 20:58       ` Paolo Bonzini
2010-02-26 11:30 ` [Qemu-devel] " Paul Brook
2010-02-26 13:05   ` Paolo Bonzini
2010-02-26 18:32     ` Paul Brook
2010-03-01 12:30       ` Paolo Bonzini
2010-03-01 14:02         ` Paul Brook

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f43fc5581002130958q17edaf68tf3d66c319059b617@mail.gmail.com \
    --to=blauwirbel@gmail.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).