[PATCH 2/3] MIPS: zboot: Add UHI semihosting debug print support

From: Jiaxun Yang
Date: Fri Oct 27 2023 - 14:41:39 EST


Support print debug message via MIPS UHI semihosting Plog
functions.

Signed-off-by: Jiaxun Yang <jiaxun.yang@xxxxxxxxxxx>
---
arch/mips/Kconfig.debug | 11 +++++++++++
arch/mips/boot/compressed/Makefile | 1 +
arch/mips/boot/compressed/dbg-uhi.c | 11 +++++++++++
arch/mips/boot/compressed/dbg.c | 4 ++--
arch/mips/boot/compressed/decompress.c | 4 ++++
5 files changed, 29 insertions(+), 2 deletions(-)
create mode 100644 arch/mips/boot/compressed/dbg-uhi.c

diff --git a/arch/mips/Kconfig.debug b/arch/mips/Kconfig.debug
index f4ae7900fcd3..1393bdb33f5c 100644
--- a/arch/mips/Kconfig.debug
+++ b/arch/mips/Kconfig.debug
@@ -98,6 +98,17 @@ config DEBUG_ZBOOT
to reduce the kernel image size and speed up the booting procedure a
little.

+config ZBOOT_DBG_UHI
+ bool "Enable UHI debugging"
+ depends on DEBUG_ZBOOT
+ default n
+ help
+ Enable this option to debug compressed kernel support via UHI.
+ Logs will be outputed to the host machine via UHI Plog function.
+ You MUST connect system to a debugger with UHI semihosting support
+ or use a boot montor implemented UHI exceptions, otherwise the
+ system will hang.
+
config ZBOOT_INGENIC_UART
int "UART to use for compressed kernel debugging"
depends on DEBUG_ZBOOT && MACH_INGENIC_SOC
diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile
index 6cc28173bee8..5667597c3584 100644
--- a/arch/mips/boot/compressed/Makefile
+++ b/arch/mips/boot/compressed/Makefile
@@ -45,6 +45,7 @@ vmlinuzobjs-y := $(obj)/head.o $(obj)/decompress.o $(obj)/string.o $(obj)/bswaps

ifdef CONFIG_DEBUG_ZBOOT
vmlinuzobjs-$(CONFIG_DEBUG_ZBOOT) += $(obj)/dbg.o
+vmlinuzobjs-$(CONFIG_ZBOOT_DBG_UHI) += $(obj)/dbg-uhi.o
vmlinuzobjs-$(CONFIG_SYS_SUPPORTS_ZBOOT_UART16550) += $(obj)/uart-16550.o
vmlinuzobjs-$(CONFIG_SYS_SUPPORTS_ZBOOT_UART_PROM) += $(obj)/uart-prom.o
vmlinuzobjs-$(CONFIG_MIPS_ALCHEMY) += $(obj)/uart-alchemy.o
diff --git a/arch/mips/boot/compressed/dbg-uhi.c b/arch/mips/boot/compressed/dbg-uhi.c
new file mode 100644
index 000000000000..7daa8de717b0
--- /dev/null
+++ b/arch/mips/boot/compressed/dbg-uhi.c
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * zboot debug output for MIPS UHI semihosting
+ */
+
+#include <asm/uhi.h>
+
+void puts(const char *s)
+{
+ uhi_plog(s, 0);
+}
diff --git a/arch/mips/boot/compressed/dbg.c b/arch/mips/boot/compressed/dbg.c
index f6728a8fd1c3..7fa5242e2b7d 100644
--- a/arch/mips/boot/compressed/dbg.c
+++ b/arch/mips/boot/compressed/dbg.c
@@ -4,7 +4,7 @@
*
* NOTE: putc() is board specific, if your board have a 16550 compatible uart,
* please select SYS_SUPPORTS_ZBOOT_UART16550 for your machine. othewise, you
- * need to implement your own putc().
+ * need to implement your own putc() or puts().
*/
#include <linux/compiler.h>
#include <linux/types.h>
@@ -13,7 +13,7 @@ void __weak putc(char c)
{
}

-void puts(const char *s)
+void __weak puts(const char *s)
{
char c;
while ((c = *s++) != '\0') {
diff --git a/arch/mips/boot/compressed/decompress.c b/arch/mips/boot/compressed/decompress.c
index c5dd415254d3..f4e69dfe2923 100644
--- a/arch/mips/boot/compressed/decompress.c
+++ b/arch/mips/boot/compressed/decompress.c
@@ -17,6 +17,7 @@

#include <asm/addrspace.h>
#include <asm/unaligned.h>
+#include <asm/uhi.h>
#include <asm-generic/vmlinux.lds.h>

/*
@@ -46,6 +47,9 @@ void error(char *x)
puts(x);
puts("\n\n -- System halted");

+#ifdef CONFIG_ZBOOT_DBG_UHI
+ uhi_bootfailure(0);
+#endif
while (1)
; /* Halt */
}
--
2.34.1