From: Peter Chubb <peter.chubb@nicta.com.au>
To: linux-kernel@vger.kernel.org, linux@arm.linux.org.uk,
kexec@lists.infradead.org
Subject: [PATCH] Fix kexec reboot on ARM
Date: Wed, 14 Dec 2011 15:02:10 +1100 [thread overview]
Message-ID: <w4fwgnhkcd.wl%peter@chubb.wattle.id.au> (raw)
When kexec() runs, it eventually sets up a 1-to-1 memory map, then
invokes cpu_reset(). When it invokes cpu_reset (which turns
off the MMU), it does so at its virtual address. Across the code that
disables the MMU, virtual and physical addresses have to be the same,
otherwise after disabling the MMU, the PC is invalid.
The simplest fix is to invoke cpu_reset() at its one-to-one mapped
address.
I've tested on KZM (arm v6) and Beagleboard (omap)
---
arch/arm/kernel/machine_kexec.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
Index: linux-2.6/arch/arm/kernel/machine_kexec.c
===================================================================
--- linux-2.6.orig/arch/arm/kernel/machine_kexec.c 2011-12-04 21:11:53.280725573 +1100
+++ linux-2.6/arch/arm/kernel/machine_kexec.c 2011-12-14 14:37:08.227654151 +1100
@@ -120,5 +120,13 @@ void machine_kexec(struct kimage *image)
cpu_proc_fin();
outer_inv_all();
flush_cache_all();
- cpu_reset(reboot_code_buffer_phys);
+ /*
+ * cpu_reset disables the MMU, so branch to its (1-to-1 mapped)
+ * physical address not its virtual one.
+ */
+ {
+ void (*cpu_reset_phys)(unsigned long dest) =
+ virt_to_phys(cpu_reset);
+ cpu_reset_phys(reboot_code_buffer_phys);
+ }
}
--
Dr Peter Chubb http://www.gelato.unsw.edu.au peterc AT gelato.unsw.edu.au
http://www.ertos.nicta.com.au ERTOS within National ICT Australia
next reply other threads:[~2011-12-14 4:02 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-12-14 4:02 Peter Chubb [this message]
2011-12-14 8:08 ` Russell King - ARM Linux
2011-12-14 8:08 ` Russell King - ARM Linux
2011-12-14 10:36 ` Peter Chubb
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=w4fwgnhkcd.wl%peter@chubb.wattle.id.au \
--to=peter.chubb@nicta.com.au \
--cc=kexec@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
/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
all inboxes | Powered by JetHome®