[PATCH v2 00/28] arm: semihosting: Cleanups and new features
Sean Anderson
sean.anderson at seco.com
Fri Mar 11 20:20:08 CET 2022
Hi Andre,
On 3/11/22 1:22 PM, Andre Przywara wrote:
> On Thu, 10 Mar 2022 15:50:30 -0500
> Sean Anderson <sean.anderson at seco.com> wrote:
>
> Hi Sean,
>
> many thanks for doing this, I like that clean up.
>
>> This cleans up the semihosting code and adds the following new features:
>>
>> - hostfs support (like sandbox)
>> - support for being used as a SPL boot device
>> - serial device support
>> - falling back to normal drivers if semihosting is disabled
>>
>> The main device affected by these changes is vexpress64, so I'd appreciate
>> if Andre (or anyone else) could try booting.
>
> So I did this. Apart from the missing return in 26/28, as you figured
> yourself, the bootcmd_smh definition is missing the (dummy) device number,
> so it should read:
> "if load hostfs 0 ${boot_addr_r} ${boot_name}; then" ....
>
> With that (and the other three occasions) fixed the automatic boot worked
> on the v8A model. The device number seems to be missing from some
> documentation patches as well.
Ah, looks like I forgot about this parameter. Will update.
> Also: I couldn't get the semihosting serial to work, it didn't show up in
> coninfo, so I couldn't switch with "setenv stdout". I enabled
> SEMIHOSTING_FALLBACK and SEMIHOSTING_SERIAL, I am surely missing something?
The problem is that U-Boot only probes /chosen/stdout-path by default.
You can change this by enabling CONFIG_SERIAL_PROBE_ALL. Then, U-Boot
will use CONFIG_CONS_INDEX, which defaults to 1 (aka seq 0). Since we
use U_BOOT_DRVINFO to create the semihosting serial, it will tend to be
before any other serials, so we will be seq 0 (and get selected).
However, it doesn't seem like SYS_READC works in QEMU for whatever
reason. You can apply the below patch to use open/read instead:
---
diff --git a/drivers/serial/serial_semihosting.c b/drivers/serial/serial_semihosting.c
index 049dca5428..b182f5ab93 100644
--- a/drivers/serial/serial_semihosting.c
+++ b/drivers/serial/serial_semihosting.c
@@ -14,13 +14,18 @@
* @outfd: stdout file descriptor (or error)
*/
struct smh_serial_priv {
+ int infd;
int outfd;
};
#if CONFIG_IS_ENABLED(DM_SERIAL)
static int smh_serial_getc(struct udevice *dev)
{
- return smh_getc();
+ char ch = 0;
+ struct smh_serial_priv *priv = dev_get_priv(dev);
+
+ smh_read(priv->infd, &ch, sizeof(ch));
+ return ch;
}
static int smh_serial_putc(struct udevice *dev, const char ch)
@@ -77,6 +82,7 @@ static int smh_serial_probe(struct udevice *dev)
{
struct smh_serial_priv *priv = dev_get_priv(dev);
+ priv->infd = smh_open(":tt", MODE_READ);
priv->outfd = smh_open(":tt", MODE_WRITE);
return 0;
}
---
> And btw.: QEMU supports semihosting, and I have used that in the past to
> easily load files from my host into U-Boot:
>
> $ make qemu_arm_defconfig
> $ /src/linux/scripts/config --enable CONFIG_SEMIHOSTING
> $ make
> $ qemu-system-arm -M virt -cpu cortex-a15 -m 256M -semihosting -bios
> u-boot.bin -nographic OR
> $ qemu-system-aarch64 -M virt -cpu cortex-a57 -m 256M -semihosting -bios
> u-boot.bin -nographic
Thanks for suggesting the command lines. Though arm32 will not support
fallback (which should have been added to Kconfig).
> did the trick for me.
> Please note that QEMU does not seem to implement ISERROR:
> =======
> qemu: Unsupported SemiHosting SWI 0x08
> =======
> Might be relatively easy to fix there, haven't checked, but can you use
> something else for the detection?
Looks like it was added in commit 767ba049b8 ("semihosting: Implement
SYS_ISERROR"). I think SYS_ERRNO will work fine instead.
> I am in the process of going through the patches more thoroughly, and will
> reply next week.
Thanks.
--Sean
>
> Thanks,
> Andre
>
>> These changes are motivated by bringup for ls1046a. When forcing JTAG
>> boot, this device disables most communication peripherals, including
>> serial and ethernet devices. This appears to be fixed in later
>> generation devices, but we are stuck with it for now. Semihosting
>> provides an easy way to run a few console commands.
>>
>> The patches in this series are organized as follows:
>>
>> 0-4: rST conversions and other documentation updates
>> 5-9: Semihosting cleanups
>> 10-14: Filesystem support (including SPL boot device)
>> 15-16: Serial support
>> 16: Documentation update
>> 17: JTAG boot support for LS1046A
>> 19-25: Semihosting fallback
>> 26-28: DM puts support
>>
>> The last two groups of patches are "bonus;" the first 17 patches stand
>> on their own. The last two groups could be broken out as separate
>> series, but I have kept them in this one to help with my sanity (and not
>> have to deal with too many outstanding series).
>>
>> This series depends on [1]. Patch 17 depends on [2].
>>
>> [1] https://lore.kernel.org/u-boot/CACRpkdZ+9fmNjC_mvrbPa9-iuTQVd8UkJ7Zpe7cL0c5vZygsVw@mail.gmail.com/T/
>> [2] https://lore.kernel.org/u-boot/20220222183840.1355337-2-sean.anderson@seco.com/
>>
>> Changes in v2:
>> - Document debug uart
>> - Make CONFIG_SPL_SEMIHOSTING depend on SPL
>> - Compile arch/arm/lib/semihosting.o in SPL
>> - Rebase on Andre's series
>> - Fix typos in commit message
>> - Fix baud numbers being off by 10
>> - Rename non-DM driver struct to match format of other drivers
>> - Add migration instructions for smhload
>> - Add semihosting fallback implementation
>> - Add implementation of puts for DM
>>
>> Sean Anderson (28):
>> doc: Convert semihosting readme to rST
>> nxp: ls1046ardb: Convert README to rST
>> doc: ls1046ardb: Expand boot mode section
>> doc: ls1046ardb: Document debug uart
>> arm: smh: Add semihosting entry to MAINTAINERS
>> arm: smh: Export semihosting functions
>> arm: smh: Use numeric modes for smh_open
>> arm: smh: Return errno on error
>> arm: smh: Document functions in header
>> arm: smh: Add some file manipulation commands
>> spl: Add semihosting boot method
>> fs: Add semihosting filesystem
>> cmd: fdt: Use start/size for chosen instead of start/end
>> arm: smh: Remove smhload command
>> arm: smh: Add some functions for working with the host console
>> serial: Add semihosting driver
>> doc: smh: Update semihosting documentation
>> ls1046ardb: Add support for JTAG boot
>> arm64: Save esr in pt_regs
>> arm64: Save spsr in pt_regs
>> arm64: Import some ESR and SPSR defines from Linux
>> arm: smh: Add option to detect semihosting
>> arm: Catch non-emulated semihosting calls
>> serial: smh: Initialize serial only if semihosting is enabled
>> arm64: ls1046a: Support semihosting fallback
>> serial: dm: Add support for puts
>> serial: sandbox: Implement puts
>> serial: smh: Implement puts for DM
>>
>> MAINTAINERS | 5 +
>> arch/arm/Kconfig | 47 +++-
>> arch/arm/cpu/armv8/exceptions.S | 9 +-
>> arch/arm/cpu/armv8/fsl-layerscape/spl.c | 3 +
>> arch/arm/include/asm/esr.h | 343 ++++++++++++++++++++++++
>> arch/arm/include/asm/proc-armv/ptrace.h | 75 ++++++
>> arch/arm/include/asm/spl.h | 1 +
>> arch/arm/include/asm/u-boot-arm.h | 7 +-
>> arch/arm/lib/Makefile | 2 +-
>> arch/arm/lib/interrupts_64.c | 80 ++++--
>> arch/arm/lib/semihosting.c | 230 ++++++++--------
>> arch/arm/mach-imx/imx8m/soc.c | 4 +-
>> board/freescale/ls1046ardb/MAINTAINERS | 1 +
>> board/freescale/ls1046ardb/README | 76 ------
>> board/freescale/ls1046ardb/ls1046ardb.c | 11 +
>> cmd/fdt.c | 6 +-
>> common/spl/Makefile | 1 +
>> common/spl/spl_semihosting.c | 71 +++++
>> disk/part.c | 4 +-
>> doc/README.semihosting | 38 ---
>> doc/board/nxp/index.rst | 1 +
>> doc/board/nxp/ls1046ardb.rst | 191 +++++++++++++
>> doc/usage/index.rst | 1 +
>> doc/usage/semihosting.rst | 73 +++++
>> drivers/serial/Kconfig | 22 ++
>> drivers/serial/Makefile | 1 +
>> drivers/serial/sandbox.c | 21 +-
>> drivers/serial/serial-uclass.c | 27 +-
>> drivers/serial/serial.c | 2 +
>> drivers/serial/serial_semihosting.c | 168 ++++++++++++
>> fs/Makefile | 1 +
>> fs/fs.c | 20 ++
>> fs/semihostingfs.c | 115 ++++++++
>> include/configs/ls1046ardb.h | 2 +
>> include/configs/vexpress_aemv8.h | 10 +-
>> include/fs.h | 1 +
>> include/semihosting.h | 149 ++++++++++
>> include/semihostingfs.h | 21 ++
>> include/serial.h | 19 ++
>> 39 files changed, 1581 insertions(+), 278 deletions(-)
>> create mode 100644 arch/arm/include/asm/esr.h
>> delete mode 100644 board/freescale/ls1046ardb/README
>> create mode 100644 common/spl/spl_semihosting.c
>> delete mode 100644 doc/README.semihosting
>> create mode 100644 doc/board/nxp/ls1046ardb.rst
>> create mode 100644 doc/usage/semihosting.rst
>> create mode 100644 drivers/serial/serial_semihosting.c
>> create mode 100644 fs/semihostingfs.c
>> create mode 100644 include/semihosting.h
>> create mode 100644 include/semihostingfs.h
>>
>
More information about the U-Boot
mailing list