All of lore.kernel.org
 help / color / mirror / Atom feed
From: Aurelien Jarno <aurelien@aurel32.net>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: Aurelien Jarno <aurelien@aurel32.net>,
	"open list:All patches CC here" <qemu-devel@nongnu.org>
Subject: [Qemu-devel] [PULL 2/5] target/sh4: fix reset when using a kernel and an initrd
Date: Mon, 29 May 2017 21:30:13 +0200	[thread overview]
Message-ID: <20170529193016.6888-3-aurelien@aurel32.net> (raw)
In-Reply-To: <20170529193016.6888-1-aurelien@aurel32.net>

When a masked exception happens, the SH4 CPU generates a non-masked
reset exception, which then jumps to the reset vector at address
0xA0000000. While this is emulated correctly in QEMU, this does not
work when using a kernel and initrd as this address then contain an
illegal instruction (and there is no guarantee the kernel and initrd
haven't been overwritten).

Therefore call qemu_system_reset_request to reload the kernel and initrd
and load the program counter to the kernel entry point.

Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
 target/sh4/helper.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/target/sh4/helper.c b/target/sh4/helper.c
index 4c024f9529..5296e7cf4e 100644
--- a/target/sh4/helper.c
+++ b/target/sh4/helper.c
@@ -21,6 +21,7 @@
 #include "cpu.h"
 #include "exec/exec-all.h"
 #include "exec/log.h"
+#include "sysemu/sysemu.h"
 
 #if !defined(CONFIG_USER_ONLY)
 #include "hw/sh4/sh_intc.h"
@@ -92,7 +93,14 @@ void superh_cpu_do_interrupt(CPUState *cs)
 
     if (env->sr & (1u << SR_BL)) {
         if (do_exp && cs->exception_index != 0x1e0) {
-            cs->exception_index = 0x000; /* masked exception -> reset */
+            /* In theory a masked exception generates a reset exception,
+               which in turn jumps to the reset vector. However this only
+               works when using a bootloader. When using a kernel and an
+               initrd, they need to be reloaded and the program counter
+               should be loaded with the kernel entry point.
+               qemu_system_reset_request takes care of that.  */
+            qemu_system_reset_request();
+            return;
         }
         if (do_irq && !env->in_sleep) {
             return; /* masked */
-- 
2.11.0

  parent reply	other threads:[~2017-05-29 19:30 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20170529193016.6888-1-aurelien@aurel32.net>
2017-05-29 19:30 ` [Qemu-devel] [PULL 1/5] target/sh4: log unauthorized accesses using qemu_log_mask Aurelien Jarno
2017-05-30  9:52   ` Stefan Hajnoczi
2017-05-30 11:12     ` Aurelien Jarno
2017-05-30 10:18   ` Stefan Hajnoczi
2017-05-30 11:12     ` Aurelien Jarno
2017-05-29 19:30 ` Aurelien Jarno [this message]
2017-05-30 10:17   ` [Qemu-devel] [PULL 2/5] target/sh4: fix reset when using a kernel and an initrd Stefan Hajnoczi
2017-05-30 15:02     ` Eric Blake
2017-05-30 16:21       ` Aurelien Jarno
2017-05-29 19:30 ` [Qemu-devel] [PULL 3/5] target/sh4: introduce DELAY_SLOT_MASK Aurelien Jarno
2017-05-29 19:30 ` [Qemu-devel] [PULL 4/5] target/sh4: ignore interrupts in a delay slot Aurelien Jarno
2017-05-29 19:30 ` [Qemu-devel] [PULL 5/5] target/sh4: fix RTE instruction " Aurelien Jarno

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=20170529193016.6888-3-aurelien@aurel32.net \
    --to=aurelien@aurel32.net \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    /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.