lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [day] [month] [year] [list]
Date:   Sun,  1 Aug 2021 10:36:59 -0700
From:   Guenter Roeck <linux@...ck-us.net>
To:     Chris Zankel <chris@...kel.net>
Cc:     Max Filippov <jcmvbkbc@...il.com>, linux-xtensa@...ux-xtensa.org,
        linux-kernel@...r.kernel.org, Guenter Roeck <linux@...ck-us.net>
Subject: [RFC PATCH] xtensa: xtfpga: Try software restart before simulating CPU reset

Rebooting xtensa images in qemu does not work. When executing a reboot
command, the qemu session either hangs or experiences an endless sequence
of error messages.

Kernel panic - not syncing: Unrecoverable error in exception handler

Debugging in qemu shows that the code jumps to the CPU restart address,
but Linux can not recover from there.

As it turns out, the FPGA has a means to reset the CPU by writing 0xdead
into a specific FPGA IO address. Use that mechanism to attempt a platform
reset. If it does not work, fall back to the existing mechanism.

Signed-off-by: Guenter Roeck <linux@...ck-us.net>
---
No idea if this is acceptable, but I thought it might be worth a try.

 arch/xtensa/platforms/xtfpga/setup.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/arch/xtensa/platforms/xtfpga/setup.c b/arch/xtensa/platforms/xtfpga/setup.c
index 4f7d6142d41f..9b1e36b06530 100644
--- a/arch/xtensa/platforms/xtfpga/setup.c
+++ b/arch/xtensa/platforms/xtfpga/setup.c
@@ -51,8 +51,12 @@ void platform_power_off(void)
 
 void platform_restart(void)
 {
-	/* Flush and reset the mmu, simulate a processor reset, and
-	 * jump to the reset vector. */
+	/* Try software reset first. */
+	*((unsigned int *)XTFPGA_SWRST_VADDR) = 0xdead;
+
+	/* If software reset did not work, flush and reset the mmu,
+	 * simulate a processor reset, and jump to the reset vector.
+	 */
 	cpu_reset();
 	/* control never gets here */
 }
-- 
2.25.1

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ