From patchwork Fri Oct 27 18:26:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiaxun Yang X-Patchwork-Id: 738901 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 03335C25B6F for ; Fri, 27 Oct 2023 18:41:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232615AbjJ0SlY (ORCPT ); Fri, 27 Oct 2023 14:41:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41918 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235119AbjJ0SlW (ORCPT ); Fri, 27 Oct 2023 14:41:22 -0400 Received: from wout2-smtp.messagingengine.com (wout2-smtp.messagingengine.com [64.147.123.25]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1FC615599; Fri, 27 Oct 2023 11:30:53 -0700 (PDT) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.west.internal (Postfix) with ESMTP id 8487832009A7; Fri, 27 Oct 2023 14:27:13 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Fri, 27 Oct 2023 14:27:14 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=flygoat.com; h= cc:cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm1; t=1698431233; x= 1698517633; bh=Sq5it7B0rE/0Q3aU3yeL1Gvj43fO0gW92sFG+BSqBRU=; b=j CH83fraPQfq+6qQ71OQTXjxGNEMaAI5p20nIzLh3Kz/66zezG/8h/g7pciTM5xTV GCZI/7k/WYRIK/+dvwRScZdofLt/1/Q/+V1TbIGd8gS6fc0IoNXk8OwdlJ/D6cTZ w0r8fv8wjHz2BmhmtGEiV3BJWX7zsCjK4pSFElo8lcnS2gsXNcUyueL5OMdFHBjk 1wbeMyz8wtdZGeMMpJmi8PJCq9rmY1/n0ueiYUX+IuDlz9I2fd0INItz3GaD3txq kCUfc9CW6/PzZJEujm+H2AmZq0w5YlhgIyRWqzH69dF6Z2ZPiNB1crW6KOEh3nhm A+dYKJZBlTGQ07C77no+A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1698431233; x= 1698517633; bh=Sq5it7B0rE/0Q3aU3yeL1Gvj43fO0gW92sFG+BSqBRU=; b=c JWGrwxmbV7DdEFmp5b8PbUkubD4s5/R9PPaCFswFnij274shJl6SRIf/xPafZhOx mlwMSJQl4k3u7VdEB3VJUdwVoD2q058ClHA0IkWk3hcGFzU/N/JS79P0SmKYse6i objlC9Fvrag2MeXTJay+gm+9lEVrjayWQz04nGnFrtukmZSxqt32rfT+E1JDcQJU /0BhQzVtB/pe8hq7/ah82X2aG2VqbEH82bEjwIvXDyG0SiouiOJD27FXVnXulSNQ 5z1BfdKLm9fu6SgQkpHtkiI3y64c7S1lBl2baktBg+UIl3mGyok/USFHa9A6LmHM l64TcHTA2lBNKBEAJTAcw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvkedrleeggdduvdeiucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtke ertdertddtnecuhfhrohhmpeflihgrgihunhcujggrnhhguceojhhirgiguhhnrdihrghn ghesfhhlhihgohgrthdrtghomheqnecuggftrfgrthhtvghrnhepfeeludefheegvdeuvd dvgeekgfdvtdettdelieeihfegtedugeekhfdvhfejfedtnecuvehluhhsthgvrhfuihii vgepudenucfrrghrrghmpehmrghilhhfrhhomhepjhhirgiguhhnrdihrghnghesfhhlhi hgohgrthdrtghomh X-ME-Proxy: Feedback-ID: ifd894703:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 27 Oct 2023 14:27:11 -0400 (EDT) From: Jiaxun Yang To: linux-mips@vger.kernel.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, tsbogend@alpha.franken.de, gregkh@linuxfoundation.org, jirislaby@kernel.org, Jiaxun Yang Subject: [PATCH 1/3] MIPS: Add header for UHI semihosting defines Date: Fri, 27 Oct 2023 19:26:48 +0100 Message-Id: <20231027182650.281405-6-jiaxun.yang@flygoat.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231027182650.281405-1-jiaxun.yang@flygoat.com> References: <20231027182650.281405-1-jiaxun.yang@flygoat.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-serial@vger.kernel.org Add a header for MIPS UHI semihosting defines. Including calling number, data structures and functions to do UHI calls. Signed-off-by: Jiaxun Yang --- arch/mips/include/asm/uhi.h | 309 ++++++++++++++++++++++++++++++++++++ 1 file changed, 309 insertions(+) create mode 100644 arch/mips/include/asm/uhi.h diff --git a/arch/mips/include/asm/uhi.h b/arch/mips/include/asm/uhi.h new file mode 100644 index 000000000000..5e72fd5a67fb --- /dev/null +++ b/arch/mips/include/asm/uhi.h @@ -0,0 +1,309 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* + * MIPS UHI semihosting define and helpers + * + * Based on MD01069 - Unified Hosting Interface Reference Manual + * + * Copyright (C) 2023 Jiaxun Yang + */ + + +#ifndef _MIPS_UHI_H_ +#define _MIPS_UHI_H_ + +#include +#include + +#define UHI_NR_exit 1 +#define UHI_NR_open 2 +#define UHI_NR_close 3 +#define UHI_NR_read 4 +#define UHI_NR_write 5 +#define UHI_NR_lseek 6 +#define UHI_NR_unlink 7 +#define UHI_NR_fstat 8 +#define UHI_NR_argc 9 +#define UHI_NR_argnlen 10 +#define UHI_NR_argn 11 +#define UHI_NR_plog 13 +#define UHI_NR_assert 14 +#define UHI_NR_pread 19 +#define UHI_NR_pwrite 20 +#define UHI_NR_link 22 +#define UHI_NR_bootfailure 23 + +/* For SDDBP code and R2 */ +#define UHI_CALL_CODE "1" +#define UHI_CALL_CODE_RAW 1 + +struct uhi_stat { + int16_t st_dev; + uint16_t st_ino; + uint32_t st_mode; + uint16_t st_nlink; + uint16_t st_uid; + uint16_t st_gid; + int16_t st_rdev; + uint64_t st_size; + uint64_t st_atime; + uint64_t st_spare1; + uint64_t st_mtime; + uint64_t st_spare2; + uint64_t st_ctime; + uint64_t st_spare3; + uint64_t st_blksize; + uint64_t st_blocks; + uint64_t st_spare4[2]; +}; + +#define UHI_O_RDONLY 0x0 +#define UHI_O_WRONLY 0x1 +#define UHI_O_RDWR 0x2 +#define UHI_O_APPEND 0x8 +#define UHI_O_CREAT 0x200 +#define UHI_O_TRUNC 0x400 +#define UHI_O_EXCL 0x800 + +#define UHI_EACCESS 13 +#define UHI_EAGAIN 11 +#define UHI_EBADF 9 +#define UHI_EBADMSG 77 +#define UHI_EBUSY 16 +#define UHI_ECONNRESET 104 +#define UHI_EEXIST 17 +#define UHI_EFBIG 27 +#define UHI_EINTR 4 +#define UHI_EINVAL 22 +#define UHI_EIO 5 +#define UHI_EISDIR 21 +#define UHI_ELOOP 92 +#define UHI_EMFILE 24 +#define UHI_EMLINK 31 +#define UHI_ENAMETOOLONG 91 +#define UHI_ENETDOWN 115 +#define UHI_ENETUNREACH 114 +#define UHI_ENFILE 23 +#define UHI_ENOBUFS 105 +#define UHI_ENOENT 2 +#define UHI_ENOMEM 12 +#define UHI_ENOSPC 28 +#define UHI_ENOSR 63 +#define UHI_ENOTCONN 128 +#define UHI_ENOTDIR 20 +#define UHI_ENXIO 6 +#define UHI_EOVERFLOW 139 +#define UHI_EPERM 1 +#define UHI_EPIPE 32 +#define UHI_ERANGE 34 +#define UHI_EROFS 30 +#define UHI_ESPIPE 29 +#define UHI_ETIMEDOUT 116 +#define UHI_ETXTBSY 26 +#define UHI_EWOULDBLOCK 11 +#define UHI_EXDEV 18 + + +struct uhi_gpctx { + unsigned long r[31]; + unsigned long epc; + unsigned long badvaddr; + unsigned long hi; + unsigned long lo; + void *link; + uint32_t status; + uint32_t cause; + uint32_t badinstr; + uint32_t badpinstr; +}; + +static inline long __uhi_call0(long n) +{ + register long r2 __asm__("$2"); + register long r25 __asm__("$25") = n; + register long r3 __asm__("$3"); + + __asm__ __volatile__ ( + ".set push \n" + ".set " MIPS_ISA_LEVEL " \n" + "addu $2,$0,%2 \n" + "sdbbp " UHI_CALL_CODE " \n" + ".set pop \n" + : "=&r"(r2), "=r"(r3) + : "ir"(UHI_CALL_CODE_RAW), "0"(r2), "r"(r25) + : "memory"); + + return r2 == -1 ? -r3 : r2; +} + +static inline long __uhi_call1(long n, long a) +{ + register long r2 __asm__("$2"); + register long r25 __asm__("$25") = n; + register long r4 __asm__("$4") = a; + register long r3 __asm__("$3"); + + __asm__ __volatile__ ( + ".set push \n" + ".set " MIPS_ISA_LEVEL " \n" + "addu $2,$0,%2 \n" + "sdbbp " UHI_CALL_CODE " \n" + ".set pop \n" + : "=&r"(r2), "=r"(r3) + : "ir"(UHI_CALL_CODE_RAW), "0"(r2), "r"(r25), "r"(r4) + : "memory"); + + return r2 == -1 ? -r3 : r2; +} + +static inline long __uhi_call2(long n, long a, long b) +{ + register long r2 __asm__("$2"); + register long r25 __asm__("$25") = n; + register long r4 __asm__("$4") = a; + register long r5 __asm__("$5") = b; + register long r3 __asm__("$3"); + + __asm__ __volatile__ ( + ".set push \n" + ".set " MIPS_ISA_LEVEL " \n" + "addu $2,$0,%2 \n" + "sdbbp " UHI_CALL_CODE " \n" + ".set pop \n" + : "=&r"(r2), "=r"(r3) + : "ir"(UHI_CALL_CODE_RAW), "0"(r2), "r"(r25), "r"(r4), "r"(r5) + : "memory"); + + return r2 == -1 ? -r3 : r2; +} + +static inline long __uhi_call3(long n, long a, long b, long c) +{ + register long r2 __asm__("$2"); + register long r25 __asm__("$25") = n; + register long r4 __asm__("$4") = a; + register long r5 __asm__("$5") = b; + register long r6 __asm__("$6") = c; + register long r3 __asm__("$3"); + + __asm__ __volatile__ ( + ".set push \n" + ".set " MIPS_ISA_LEVEL " \n" + "addu $2,$0,%2 \n" + "sdbbp " UHI_CALL_CODE " \n" + ".set pop \n" + : "=&r"(r2), "=r"(r3) + : "ir"(UHI_CALL_CODE_RAW), "0"(r2), "r"(r25), "r"(r4), "r"(r5), "r"(r6) + : "memory"); + + return r2 == -1 ? -r3 : r2; +} + +static inline long __uhi_call4(long n, long a, long b, long c, long d) +{ + register long r2 __asm__("$2"); + register long r25 __asm__("$25") = n; + register long r4 __asm__("$4") = a; + register long r5 __asm__("$5") = b; + register long r6 __asm__("$6") = c; + register long r7 __asm__("$7") = d; + register long r3 __asm__("$3"); + + __asm__ __volatile__ ( + ".set push \n" + ".set " MIPS_ISA_LEVEL " \n" + "addu $2,$0,%2 \n" + "sdbbp " UHI_CALL_CODE " \n" + ".set pop \n" + : "=&r"(r2), "=r"(r3) + : "ir"(UHI_CALL_CODE_RAW), "0"(r2), "r"(r25), "r"(r4), "r"(r5), "r"(r6), "r"(r7) + : "memory"); + + return r2 == -1 ? -r3 : r2; +} + +static inline int32_t uhi_exit(int32_t code) +{ + return __uhi_call1(UHI_NR_exit, code); +} + +static inline int32_t uhi_open(const char *path, int32_t flags, int32_t mode) +{ + return __uhi_call3(UHI_NR_open, (long)path, flags, mode); +} + +static inline int32_t uhi_close(int32_t fd) +{ + return __uhi_call1(UHI_NR_close, fd); +} + +static inline int32_t uhi_read(int32_t fd, char *buf, long num) +{ + return __uhi_call3(UHI_NR_read, fd, (long)buf, num); +} + +static inline long uhi_write(int32_t fd, const char *buf, long num) +{ + return __uhi_call3(UHI_NR_write, fd, (long)buf, num); +} + +static inline int32_t uhi_lseek(int32_t fd, long offset, int32_t whence) +{ + return __uhi_call3(UHI_NR_lseek, fd, offset, whence); +} + +static inline int32_t uhi_unlink(const char *path) +{ + return __uhi_call1(UHI_NR_unlink, (long)path); +} + +static inline int32_t uhi_fstat(int32_t fd, struct uhi_stat *buf) +{ + return __uhi_call2(UHI_NR_fstat, fd, (long)buf); +} + +static inline int32_t uhi_argc(void) +{ + return __uhi_call0(UHI_NR_argc); +} + +static inline int32_t uhi_argnlen(int32_t n) +{ + return __uhi_call1(UHI_NR_argnlen, n); +} + +static inline int32_t uhi_argn(int32_t n, char *buf, int32_t num) +{ + return __uhi_call3(UHI_NR_argn, n, (long)buf, num); +} + +static inline int32_t uhi_plog(const char *buf, int32_t num) +{ + return __uhi_call2(UHI_NR_plog, (long)buf, num); +} + +static inline void uhi_assert(const char *msg, const char *file, int32_t line) +{ + __uhi_call3(UHI_NR_assert, (long)msg, (long)file, line); +} + +static inline int32_t uhi_link(const char *oldpath, const char *newpath) +{ + return __uhi_call2(UHI_NR_link, (long)oldpath, (long)newpath); +} + +static inline int32_t uhi_pread(int32_t fd, char *buf, long num, long offset) +{ + return __uhi_call4(UHI_NR_pread, fd, (long)buf, num, offset); +} + +static inline int32_t uhi_pwrite(int32_t fd, const char *buf, long num, long offset) +{ + return __uhi_call4(UHI_NR_pwrite, fd, (long)buf, num, offset); +} + +static inline void uhi_bootfailure(int reason) +{ + __uhi_call1(UHI_NR_bootfailure, reason); +} + +#endif From patchwork Fri Oct 27 18:26:45 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiaxun Yang X-Patchwork-Id: 738903 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 492DBC25B47 for ; Fri, 27 Oct 2023 18:30:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232339AbjJ0Saj (ORCPT ); Fri, 27 Oct 2023 14:30:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45920 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235227AbjJ0Sab (ORCPT ); Fri, 27 Oct 2023 14:30:31 -0400 Received: from wout2-smtp.messagingengine.com (wout2-smtp.messagingengine.com [64.147.123.25]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8DF4B47AC; Fri, 27 Oct 2023 11:29:53 -0700 (PDT) Received: from compute1.internal (compute1.nyi.internal [10.202.2.41]) by mailout.west.internal (Postfix) with ESMTP id E047C3200928; Fri, 27 Oct 2023 14:27:04 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute1.internal (MEProxy); Fri, 27 Oct 2023 14:27:05 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=flygoat.com; h= cc:cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm1; t=1698431224; x= 1698517624; bh=DsEFHXOmV/vlMNorRiSfNz2hmb8DBQjO66z36QC0Uz4=; b=c DaSv6h34dyBQZGk4Q+R3dbVsKnW++9bGUVJ3l53Wu5LT3cW4gcV5DiRw5ia9zDnD r5nRbcsFpOSihlrtbp+Q4fDgsD+vhS2NkrLUIGw4KHlxOEL8yLObz0g8LZ3XOgtM 8aHjXrqb96quA4MLXTJO5cWdEYkYFxq0O/GNtQpVhbnl6f6+6e2vpeAaWPdhsvVD v9mfkv8QSiIqBC7sonZHwc8DrKXK3b48w9EmVNre7azIQfRkKUbCkaUD07aJVRnq 2jOxjiYh+gWkGoT+mvqx0VnSOdQTj+vCUdPGIgK0TteJinFcQ5Jy7zPkU5NFPUmW KLTPDkkU5E1rizYoMbLhA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1698431224; x= 1698517624; bh=DsEFHXOmV/vlMNorRiSfNz2hmb8DBQjO66z36QC0Uz4=; b=f /pDHJyBrHQhfKMoGWAE209vCCOy6IGMd7jbSc/HYt1N8E9itRb8z5paNtGxRA++0 Rmict7v2r2JSO/r55Iyn6GAUMY2NXsP1u81924Xi5M66Qo/AeQ3RIFG04mVAlkMy l3z2DWPioiVI2Mpmw9BjdIAndSIjsojv63zkCkQldAkQbW5DvofNJbqEndN5VyFf vjC0aeMAhaFngekVUPv1LehYzChkqFZTTjBGGgSo1lbWGC4s9rHsESR5CM8OovQ5 1XTQ9ZdHJgOMKbkG/Fw1GmV3Hqu+GjTowRJtBy0Akxv7yBI5IaSI/gVZcWPwYCda z7oOPDWM6BdgoI+EqEv9Q== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvkedrleeggdduvdeiucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtke ertdertddtnecuhfhrohhmpeflihgrgihunhcujggrnhhguceojhhirgiguhhnrdihrghn ghesfhhlhihgohgrthdrtghomheqnecuggftrfgrthhtvghrnhepfeeludefheegvdeuvd dvgeekgfdvtdettdelieeihfegtedugeekhfdvhfejfedtnecuvehluhhsthgvrhfuihii vgeptdenucfrrghrrghmpehmrghilhhfrhhomhepjhhirgiguhhnrdihrghnghesfhhlhi hgohgrthdrtghomh X-ME-Proxy: Feedback-ID: ifd894703:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 27 Oct 2023 14:27:03 -0400 (EDT) From: Jiaxun Yang To: linux-mips@vger.kernel.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, tsbogend@alpha.franken.de, gregkh@linuxfoundation.org, jirislaby@kernel.org, Jiaxun Yang Subject: [PATCH 2/3] MIPS: zboot: Add UHI semihosting debug print support Date: Fri, 27 Oct 2023 19:26:45 +0100 Message-Id: <20231027182650.281405-3-jiaxun.yang@flygoat.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231027182650.281405-1-jiaxun.yang@flygoat.com> References: <20231027182650.281405-1-jiaxun.yang@flygoat.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-serial@vger.kernel.org Support print debug message via MIPS UHI semihosting Plog functions. Signed-off-by: Jiaxun Yang --- 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 + +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 #include @@ -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 #include +#include #include /* @@ -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 */ } From patchwork Fri Oct 27 18:26:46 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiaxun Yang X-Patchwork-Id: 738900 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4C091C25B47 for ; Fri, 27 Oct 2023 18:42:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235250AbjJ0SmB (ORCPT ); Fri, 27 Oct 2023 14:42:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56128 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235251AbjJ0Sls (ORCPT ); Fri, 27 Oct 2023 14:41:48 -0400 Received: from wout2-smtp.messagingengine.com (wout2-smtp.messagingengine.com [64.147.123.25]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A87843C30; Fri, 27 Oct 2023 11:29:52 -0700 (PDT) Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.west.internal (Postfix) with ESMTP id A98093200A19; Fri, 27 Oct 2023 14:27:07 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute5.internal (MEProxy); Fri, 27 Oct 2023 14:27:08 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=flygoat.com; h= cc:cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to; s=fm1; t=1698431227; x= 1698517627; bh=yIBHHJoeBZonb5tndpSrM+X2Yc5Shk4jUNpLuZRp3To=; b=n aUfD8yEGmPxYxKacatPB3aokAcd/AHtxWtRn1xZnTh5e/5RDVCjSlw8ynDpaXER/ f0ja4+MPIolnmtCwb1MZQi+cbpehap6itUwhMYMqaLAtKjkvHOxSKg3c3dlzXvPy PghO6Ko0s7gpSvzichGNLyBv2aGvqNL84zEuADPBf7sVnYBoQxkk5ZBMVAhIuKF3 MteufCcnpGzydQEpct2+cuubjxfLBI2i0vtd78m8XAjqliF1Z7EIWyHbc/QucT3v VuX7xuZ6vmNnsyR36arpSH7LN/ObhMpNL+tPRl5zrUCVySt8PIfCNeSqHSiVbQI3 /xMxZvSxwfGWPUpItLM4Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:feedback-id:feedback-id:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:sender:subject:subject:to:to:x-me-proxy:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1698431227; x= 1698517627; bh=yIBHHJoeBZonb5tndpSrM+X2Yc5Shk4jUNpLuZRp3To=; b=V Ly4xBC6UZz6S/C6L8cTheRblnlcx0MvsV0hA8rrS3Mhu5FFtMoBxjS3GELvF3Q3I /4M05QUTC9ygq66jB7zkjJEFiJodXBMlyVa2LnTissAPxH6J291LXSCLveQZkGpG TMF0J6pMGSePeAbVksg4Vysy4bJGw4r2mKANmX41lg2wzYgen8ZvJZNvudojd03+ AZB61cfwF3IJvi+f57HCUVHuszjE4R4nrtgoeWCaFG6TGnLDj//LLP5MweuWUdTQ OuYhgw/xomF3dOFqMyTDuLc2D4fpxfT+00R3JtTvanAEz9rBmnxaRfp/57GZqzDE MZSvb7BhdJqyBH9NjZKgw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvkedrleeggdduvdeiucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucenucfjughrpefhvfevufffkffojghfggfgsedtke ertdertddtnecuhfhrohhmpeflihgrgihunhcujggrnhhguceojhhirgiguhhnrdihrghn ghesfhhlhihgohgrthdrtghomheqnecuggftrfgrthhtvghrnhepfeeludefheegvdeuvd dvgeekgfdvtdettdelieeihfegtedugeekhfdvhfejfedtnecuvehluhhsthgvrhfuihii vgeptdenucfrrghrrghmpehmrghilhhfrhhomhepjhhirgiguhhnrdihrghnghesfhhlhi hgohgrthdrtghomh X-ME-Proxy: Feedback-ID: ifd894703:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 27 Oct 2023 14:27:05 -0400 (EDT) From: Jiaxun Yang To: linux-mips@vger.kernel.org Cc: linux-serial@vger.kernel.org, linux-kernel@vger.kernel.org, tsbogend@alpha.franken.de, gregkh@linuxfoundation.org, jirislaby@kernel.org, Jiaxun Yang Subject: [PATCH 3/3] serial: Add an earlycon driver for MIPS UHI semihosting Date: Fri, 27 Oct 2023 19:26:46 +0100 Message-Id: <20231027182650.281405-4-jiaxun.yang@flygoat.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231027182650.281405-1-jiaxun.yang@flygoat.com> References: <20231027182650.281405-1-jiaxun.yang@flygoat.com> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-serial@vger.kernel.org UHI is MIPS's implementation of semihosting. Add an earlycon driver to help with debugging on boot. This driver is capable for print log using UHI's "Plog" or interact with KGDB using UHI's stdio function. Signed-off-by: Jiaxun Yang --- drivers/tty/serial/Kconfig | 13 ++++ drivers/tty/serial/Makefile | 1 + drivers/tty/serial/earlycon-mips-uhi.c | 85 ++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 drivers/tty/serial/earlycon-mips-uhi.c diff --git a/drivers/tty/serial/Kconfig b/drivers/tty/serial/Kconfig index bdc568a4ab66..04c62c6b45cd 100644 --- a/drivers/tty/serial/Kconfig +++ b/drivers/tty/serial/Kconfig @@ -85,6 +85,19 @@ config SERIAL_EARLYCON_SEMIHOST This is enabled with "earlycon=smh" on the kernel command line. The console is enabled when early_param is processed. +config SERIAL_EARLYCON_UHI + bool "Early console using MIPS UHI semihosting" + depends on MIPS + select SERIAL_CORE + select SERIAL_CORE_CONSOLE + select SERIAL_EARLYCON + help + Support for early debug console using UHI semihosting. + This enables the console before standard serial driver is probed. + This is enabled with "earlycon=uhi" or "earlycon=uhi_stdio" on the + kernel command line. + The console is enabled when early_param is processed. + config SERIAL_EARLYCON_RISCV_SBI bool "Early console using RISC-V SBI" depends on RISCV_SBI_V01 diff --git a/drivers/tty/serial/Makefile b/drivers/tty/serial/Makefile index f6b8c220dcfb..ef5e9c87aea1 100644 --- a/drivers/tty/serial/Makefile +++ b/drivers/tty/serial/Makefile @@ -9,6 +9,7 @@ serial_base-y := serial_core.o serial_base_bus.o serial_ctrl.o serial_port.o obj-$(CONFIG_SERIAL_EARLYCON) += earlycon.o obj-$(CONFIG_SERIAL_EARLYCON_SEMIHOST) += earlycon-semihost.o obj-$(CONFIG_SERIAL_EARLYCON_RISCV_SBI) += earlycon-riscv-sbi.o +obj-$(CONFIG_SERIAL_EARLYCON_MIPS_UHI) += earlycon-mips-uhi.o # These Sparc drivers have to appear before others such as 8250 # which share ttySx minor node space. Otherwise console device diff --git a/drivers/tty/serial/earlycon-mips-uhi.c b/drivers/tty/serial/earlycon-mips-uhi.c new file mode 100644 index 000000000000..002bb2c37064 --- /dev/null +++ b/drivers/tty/serial/earlycon-mips-uhi.c @@ -0,0 +1,85 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * MIPS UHI semihosting based earlycon + * + * Copyright (C) 2023 Jiaxun Yang + */ + +#include +#include +#include +#include +#include + +static int stdin_fd = -1; +static int stdout_fd = -1; + +static void uhi_plog_write(struct console *con, const char *s, unsigned int n) +{ + uhi_plog(s, 0); +} + +static void uhi_stdout_write(struct console *con, const char *s, unsigned int n) +{ + if (stdout_fd < 0) + return; + + uhi_write(stdout_fd, s, n); +} + +#ifdef CONFIG_CONSOLE_POLL +static int uhi_stdin_read(struct console *con, char *s, unsigned int n) +{ + if (stdin_fd < 0) + return 0; + + return uhi_read(stdin_fd, s, n); +} +#endif + +static int uhi_stdio_fd_open(struct console *co, char *options) +{ + /* + * You have to open both stdin and stdout to get console work + * properly on some old CodeScape debugger. + */ + stdin_fd = uhi_open("/dev/stdin", UHI_O_RDONLY, 0); + stdout_fd = uhi_open("/dev/stdout", UHI_O_WRONLY, 0); + + return (stdin_fd < 0 || stdout_fd < 0) ? -ENODEV : 0; +} + +static int uhi_stdio_fd_close(struct console *co) +{ + int ret1 = 0, ret2 = 0; + + if (stdin_fd >= 0) + ret1 = uhi_close(stdin_fd); + if (stdout_fd >= 0) + ret2 = uhi_close(stdout_fd); + + return (ret1 < 0 || ret2 < 0) ? -ENODEV : 0; +} + +static int +__init early_uhi_setup(struct earlycon_device *device, const char *opt) +{ + device->con->write = uhi_plog_write; + return 0; +} + +static int +__init early_uhi_stdio_setup(struct earlycon_device *device, const char *opt) +{ + + device->con->setup = uhi_stdio_fd_open; + device->con->exit = uhi_stdio_fd_close; + device->con->write = uhi_stdout_write; +#ifdef CONFIG_CONSOLE_POLL + device->con->read = uhi_stdin_read; +#endif + return 0; +} + +EARLYCON_DECLARE(uhi, early_uhi_setup); +EARLYCON_DECLARE(uhi_stdio, early_uhi_stdio_setup);