From: Peter Maydell <peter.maydell@linaro.org>
To: qemu-devel@nongnu.org
Cc: patches@linaro.org, Richard Henderson <rth@twiddle.net>
Subject: [Qemu-devel] [PATCH for-2.9 1/2] tcg/sparc: Zero extend data argument to store helpers
Date: Mon, 27 Mar 2017 17:04:29 +0100 [thread overview]
Message-ID: <1490630670-15818-2-git-send-email-peter.maydell@linaro.org> (raw)
In-Reply-To: <1490630670-15818-1-git-send-email-peter.maydell@linaro.org>
The C store helper functions take the data argument as a uint8_t,
uint16_t, etc depending on the store size. The SPARC calling
convention requires that data types smaller than the register
size must be extended by the caller. We weren't doing this,
which meant that if QEMU was compiled with optimizations enabled
we could end up storing incorrect values to guest memory.
(In particular the i386 guest BIOS would crash on startup.)
Add code to the trampolines that call the store helpers to
do the zero extension as required.
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
tcg/sparc/tcg-target.inc.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/tcg/sparc/tcg-target.inc.c b/tcg/sparc/tcg-target.inc.c
index d1f4c0d..548bea2 100644
--- a/tcg/sparc/tcg-target.inc.c
+++ b/tcg/sparc/tcg-target.inc.c
@@ -843,6 +843,31 @@ static void tcg_out_mb(TCGContext *s, TCGArg a0)
static tcg_insn_unit *qemu_ld_trampoline[16];
static tcg_insn_unit *qemu_st_trampoline[16];
+static void emit_extend(TCGContext *s, TCGReg r, int op)
+{
+ /* Emit zero extend of 8, 16 or 32 bit data as
+ * required by the MO_* value op; do nothing for 64 bit.
+ */
+ switch (op) {
+ case MO_UB:
+ tcg_out_arithi(s, r, r, 0xff, ARITH_AND);
+ break;
+ case MO_LEUW:
+ case MO_BEUW:
+ tcg_out_arithi(s, r, r, 16, SHIFT_SLL);
+ tcg_out_arithi(s, r, r, 16, SHIFT_SRL);
+ break;
+ case MO_LEUL:
+ case MO_BEUL:
+ if (SPARC64) {
+ tcg_out_arith(s, r, r, 0, SHIFT_SRL);
+ }
+ break;
+ default:
+ break;
+ }
+}
+
static void build_trampolines(TCGContext *s)
{
static void * const qemu_ld_helpers[16] = {
@@ -910,6 +935,7 @@ static void build_trampolines(TCGContext *s)
qemu_st_trampoline[i] = s->code_ptr;
if (SPARC64) {
+ emit_extend(s, TCG_REG_O2, i);
ra = TCG_REG_O4;
} else {
ra = TCG_REG_O1;
@@ -925,6 +951,7 @@ static void build_trampolines(TCGContext *s)
tcg_out_arithi(s, ra, ra + 1, 32, SHIFT_SRLX);
ra += 2;
} else {
+ emit_extend(s, i, ra);
ra += 1;
}
/* Skip the oi argument. */
--
2.7.4
next prev parent reply other threads:[~2017-03-27 16:04 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-27 16:04 [Qemu-devel] [PATCH for-2.9 0/2] tcg/sparc: zero extend ld/st helper args Peter Maydell
2017-03-27 16:04 ` Peter Maydell [this message]
2017-03-28 15:52 ` [Qemu-devel] [PATCH for-2.9 1/2] tcg/sparc: Zero extend data argument to store helpers Philippe Mathieu-Daudé
2017-03-28 15:55 ` Peter Maydell
2017-03-27 16:04 ` [Qemu-devel] [PATCH for-2.9 2/2] tcg/sparc: Zero extend address argument to ld/st helpers Peter Maydell
2017-03-27 23:35 ` [Qemu-devel] [PATCH for-2.9 0/2] tcg/sparc: zero extend ld/st helper args Richard Henderson
2017-04-03 12:34 ` Peter Maydell
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=1490630670-15818-2-git-send-email-peter.maydell@linaro.org \
--to=peter.maydell@linaro.org \
--cc=patches@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=rth@twiddle.net \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.