public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Stefan Roese <sr@denx.de>
To: u-boot@lists.denx.de
Subject: [PATCH 01/26 v7] mips: add support to restore exception vector base before booting linux
Date: Tue, 21 Apr 2020 09:28:25 +0200	[thread overview]
Message-ID: <20200421072850.4970-2-sr@denx.de> (raw)
In-Reply-To: <20200421072850.4970-1-sr@denx.de>

From: Weijie Gao <weijie.gao@mediatek.com>

In U-Boot the exception vector base will be moved to top of memory, to be
used to display register dump when exception occurs.

But some old linux kernel does not honor the base set in CP0_EBASE. A
modified exception vector base will cause kernel crash.

This patch adds an option to enable reset exception vector base to its
previous value, or a user configured value before booting linux kernel.

Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
Signed-off-by: Weijie Gao <weijie.gao@mediatek.com>
---
Changes since v3: none

 arch/mips/Kconfig                   | 30 +++++++++++++++++++++++++++++
 arch/mips/include/asm/u-boot-mips.h |  2 ++
 arch/mips/lib/bootm.c               |  3 +++
 arch/mips/lib/traps.c               | 19 ++++++++++++++++++
 4 files changed, 54 insertions(+)

diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index a3ae603044..5e20feeefb 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -287,6 +287,36 @@ config MIPS_RELOCATION_TABLE_SIZE
 
 	  If unsure, leave at the default value.
 
+config RESTORE_EXCEPTION_VECTOR_BASE
+	bool "Restore exception vector base before booting linux kernel"
+	default n
+	help
+	  In U-Boot the exception vector base will be moved to top of memory,
+	  to be used to display register dump when exception occurs.
+	  But some old linux kernel does not honor the base set in CP0_EBASE.
+	  A modified exception vector base will cause kernel crash.
+
+	  This option will restore the exception vector base to its previous
+	  value.
+
+	  If unsure, say N.
+
+config OVERRIDE_EXCEPTION_VECTOR_BASE
+	bool "Override the exception vector base to be restored"
+	depends on RESTORE_EXCEPTION_VECTOR_BASE
+	default n
+	help
+	  Enable this option if you want to use a different exception vector
+	  base rather than the previously saved one.
+
+config NEW_EXCEPTION_VECTOR_BASE
+	hex "New exception vector base"
+	depends on OVERRIDE_EXCEPTION_VECTOR_BASE
+	range 0x80000000 0xbffff000
+	default 0x80000000
+	help
+	  The exception vector base to be restored before booting linux kernel
+
 endmenu
 
 menu "OS boot interface"
diff --git a/arch/mips/include/asm/u-boot-mips.h b/arch/mips/include/asm/u-boot-mips.h
index 88438b9576..8b37cc4029 100644
--- a/arch/mips/include/asm/u-boot-mips.h
+++ b/arch/mips/include/asm/u-boot-mips.h
@@ -9,4 +9,6 @@ void except_vec_ejtag_debug(void);
 
 int arch_misc_init(void);
 
+void trap_restore(void);
+
 #endif /* _U_BOOT_MIPS_H_ */
diff --git a/arch/mips/lib/bootm.c b/arch/mips/lib/bootm.c
index 8c0d7672f2..f1db6d23b8 100644
--- a/arch/mips/lib/bootm.c
+++ b/arch/mips/lib/bootm.c
@@ -294,6 +294,9 @@ static void boot_jump_linux(bootm_headers_t *images)
 	bootstage_report();
 #endif
 
+	if (CONFIG_IS_ENABLED(RESTORE_EXCEPTION_VECTOR_BASE))
+		trap_restore();
+
 	if (images->ft_len)
 		kernel(-2, (ulong)images->ft_addr, 0, 0);
 	else
diff --git a/arch/mips/lib/traps.c b/arch/mips/lib/traps.c
index b8568c00fe..8fff7541e3 100644
--- a/arch/mips/lib/traps.c
+++ b/arch/mips/lib/traps.c
@@ -20,6 +20,8 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static unsigned long saved_ebase;
+
 static void show_regs(const struct pt_regs *regs)
 {
 	const int field = 2 * sizeof(unsigned long);
@@ -102,7 +104,24 @@ void trap_init(ulong reloc_addr)
 	set_handler(0x180, &except_vec3_generic, 0x80);
 	set_handler(0x280, &except_vec_ejtag_debug, 0x80);
 
+	saved_ebase = read_c0_ebase() & 0xfffff000;
+
 	write_c0_ebase(ebase);
 	clear_c0_status(ST0_BEV);
 	execution_hazard_barrier();
 }
+
+void trap_restore(void)
+{
+	set_c0_status(ST0_BEV);
+	execution_hazard_barrier();
+
+#ifdef CONFIG_OVERRIDE_EXCEPTION_VECTOR_BASE
+	write_c0_ebase(CONFIG_NEW_EXCEPTION_VECTOR_BASE & 0xfffff000);
+#else
+	write_c0_ebase(saved_ebase);
+#endif
+
+	clear_c0_status(ST0_BEV);
+	execution_hazard_barrier();
+}
-- 
2.26.2

  reply	other threads:[~2020-04-21  7:28 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-04-21  7:28 [PATCH 00/26 v7] Refactor the architecture parts of mt7628 Stefan Roese
2020-04-21  7:28 ` Stefan Roese [this message]
2020-04-21  7:28 ` [PATCH 02/26 v7] mips: mtmips: add predefined i-cache/d-cache size and linesize Stefan Roese
2020-04-21  7:28 ` [PATCH 03/26 v7] mips: add an option to support initialize SRAM for initial stack Stefan Roese
2020-04-21  7:28 ` [PATCH 04/26 v7] mips: start.S: avoid overwriting outside gd when clearing global data in stack Stefan Roese
2020-04-21  7:28 ` [PATCH 05/26 v7] sysreset: add reset controller based reboot driver Stefan Roese
2020-04-21  7:28 ` [PATCH 06/26 v7] mips: mtmips: make use of sysreset-resetctrl for mt7628 soc Stefan Roese
2020-04-21  7:28 ` [PATCH 07/26 v7] configs: enable CONFIG_RESTORE_EXCEPTION_VECTOR_BASE for all mtmips boards Stefan Roese
2020-04-21  7:28 ` [PATCH 08/26 v7] mips: add a mtmips-specific field to architecture-specific global data Stefan Roese
2020-04-21  7:28 ` [PATCH 09/26 v7] mips: add a option to support not reserving malloc space on initial stack Stefan Roese
2020-04-21  7:28 ` [PATCH 10/26 v7] mips: mtmips: rewrite lowlevel codes of mt7628 Stefan Roese
2020-04-21  7:28 ` [PATCH 11/26 v7] dts: mtmips: add alternative pinmux node for uart2 Stefan Roese
2020-04-21  7:28 ` [PATCH 12/26 v7] mips: enable support for appending dtb to spl binary Stefan Roese
2020-04-21  7:28 ` [PATCH 13/26 v7] mips: add an option to enable u_boot_list section for SPL loaders in u-boot-spl.lds Stefan Roese
2020-04-21  7:28 ` [PATCH 14/26 v7] lib: enable lzma decompression support for SPL build Stefan Roese
2020-04-21  7:28 ` [PATCH 15/26 v7] Makefile: add support to generate LZMA compressed u-boot image Stefan Roese
2020-04-21  7:28 ` [PATCH 16/26 v7] tools: binman: add etype file for u-boot-lzma-img Stefan Roese
2020-04-21  7:28 ` [PATCH 17/26 v7] spl: Extract legacy image handling into separate file Stefan Roese
2020-04-23 19:28   ` Daniel Schwierzeck
2020-04-21  7:28 ` [PATCH 18/26 v7] spl: spl_legacy: Use IS_ENABLED() to remove #ifdef Stefan Roese
2020-04-23 19:28   ` Daniel Schwierzeck
2020-04-21  7:28 ` [PATCH 19/26 v7] spl: spl_nor: Move legacy image loading into spl_legacy.c Stefan Roese
2020-04-23 19:29   ` Daniel Schwierzeck
2020-04-21  7:28 ` [PATCH 20/26 v7] spl: spl_nor: Remove unused variable 'ret' warning Stefan Roese
2020-04-23 19:30   ` Daniel Schwierzeck
2020-04-21  7:28 ` [PATCH 21/26 v7] spl: spl_legacy: Add lzma decompression support for legacy image Stefan Roese
2020-04-21  7:28 ` [PATCH 22/26 v7] mips: spl: Flush cache before jumping to U-Boot proper Stefan Roese
2020-04-23 19:26   ` Daniel Schwierzeck
2020-04-21  7:28 ` [PATCH 23/26 v7] mips: mtmips: add SPL support Stefan Roese
2020-04-21 11:28   ` Daniel Schwierzeck
2020-04-21 11:34     ` Stefan Roese
2020-04-21 11:57       ` Daniel Schwierzeck
2020-04-21 12:04         ` Stefan Roese
2020-04-21  7:28 ` [PATCH 24/26 v7] mips: mtmips: enable SPL for all boards Stefan Roese
2020-04-21  7:28 ` [PATCH 25/26 v7] mips: mtmips: add support for mt7628-rfb Stefan Roese
2020-04-21  7:28 ` [PATCH 26/26 v7] mips: mtmips: Increase CONFIG_SPL_SYS_MALLOC_F_LEN Stefan Roese
2020-04-27 13:35 ` [PATCH 00/26 v7] Refactor the architecture parts of mt7628 Daniel Schwierzeck

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=20200421072850.4970-2-sr@denx.de \
    --to=sr@denx.de \
    --cc=u-boot@lists.denx.de \
    /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