Expand description
Semihosting for AArch64, Arm, RISC-V, MIPS32, MIPS64, and Xtensa.
This library provides access to semihosting, a mechanism for programs running on the real or virtual (e.g., QEMU) target to communicate with I/O facilities on the host system. See the Arm documentation for more information on semihosting.
APIs are categorized into the following four types:
-
The top-level API (
semihosting::{io,fs,..}) provides a subset of the standard library’s similar APIs.io: Provide no-std io traits andstd{in,out,err}. (std{in,out,err}requiresstdiofeature, others are unconditionally provided)fs: Provide methods to manipulate the contents of the host filesystem. (requiresfsfeature)process: Provideabortandexit.dbg!/print{,ln}!/eprint{,ln}!: macros to output to stdout/stderr. (requiresstdiofeature)
Note that some APIs are not strictly a subset of the standard library.
- API that uses types not available in
coresuch asPath(technically, the same thing could be implemented, but it makes sense to useCStrdirectly, because when converting a longPath/OsStrtoCStr, it needs to either do an allocation or return an error) - API that panics on failure in
std(in no-std it makes sense to returnResultsincepanic=abortis default)
-
Helpers that are useful when using this library.
c!:CStrliteral macro. (Since Rust 1.77, this macro is soft-deprecated in favor of C string literals (c"...").)
-
semihosting::sysmodule, which provides low-level access to platform-specific semihosting interfaces. -
semihosting::experimentalmodule, which provides experimental APIs. See optional features for more.
Additionally, this library provides a panic handler for semihosting, -C panic=unwind support, backtrace support, via optional features.
§Platform Support
The following target architectures are supported:
| target_arch | Specification | semihosting::sys module | Note |
|---|---|---|---|
| aarch64 | Semihosting for AArch32 and AArch64 | sys::arm_compat | |
| arm | Semihosting for AArch32 and AArch64 | sys::arm_compat | use SVC on A+R profile by default based on Arm’s recommendation but it can be changed by trap-hlt feature. |
| riscv32/riscv64 | RISC-V Semihosting | sys::arm_compat | |
| xtensa | OpenOCD Semihosting | sys::arm_compat | requires openocd-semihosting feature |
| mips/mips32r6/mips64/mips64r6 | Unified Hosting Interface (MD01069) | sys::mips |
The host must be running an emulator or a debugger attached to the target.
The following targets have been tested on CI. (qemu-system has been tested on Linux, macOS, and Windows hosts, and qemu-user on Linux host.)
| target | exit | all-apis [1] (system) | all-apis [1] (user-mode) | panic-unwind (system [2]) | note |
|---|---|---|---|---|---|
aarch64-unknown-none{,-softfloat} | ✓ | ✓ | ✓ | ✓ | |
{arm,thumb}v4t-none-eabi | ✓ | ✓ | |||
{arm,thumb}v5te-none-eabi | ✓ | ✓ | ✓ | ||
armv7a-none-eabi{,hf} | ✓ | ✓ | ✓ | ||
armv7r-none-eabi{,hf} | ✓ | ✓ | ✓ | ||
armebv7r-none-eabi{,hf} | ✓ | ✓ | |||
armv8r-none-eabihf | ✓ | ✓ | ✓ | ||
thumbv6m-none-eabi | ✓ | ✓ | N/A | ||
thumbv7m-none-eabi | ✓ | ✓ | N/A | ||
thumbv7em-none-eabi{,hf} | ✓ | ✓ | N/A | ||
thumbv8m.base-none-eabi | ✓ | ✓ | N/A | ||
thumbv8m.main-none-eabi{,hf} | ✓ | ✓ | N/A | ||
riscv32*-unknown-none-elf | ✓ | ✓ | ✓ | ✓ | |
riscv64*-unknown-none-elf | ✓ | ✓ | ✓ | ✓ | |
mips{,el}-unknown-none | ✓ | ✓ | N/A | [3] [4] | |
mips64{,el}-unknown-none | ✓ | ✓ | N/A | [3] [4] | |
mipsisa32r6{,el}-unknown-none | ✓ | ✓ | N/A | [3] [4] | |
mipsisa64r6{,el}-unknown-none | ✓ | ✓ | N/A | [3] [4] |
[1] stdio, fs, time, and args.
[2] I’m not sure how to test panic-unwind on qemu-user.
[3] Requires nightly due to #![feature(asm_experimental_arch)].
[4] It seems unsupported on QEMU 8.0+.
§Optional features
All features are disabled by default.
In general use cases, you probably only need the stdio feature that enables print-related macros and/or the panic-handler feature that exits with a non-zero error code on panic.
[dependencies]
semihosting = { version = "0.1", features = ["stdio", "panic-handler"] }-
alloc
Usealloc. -
stdio
Enablesemihosting::io::{stdin,stdout,stderr}andsemihosting::{print*,eprint*,dbg}. -
fs
Enablesemihosting::fs. -
panic-handler
Provide panic handler based onsemihosting::process::exit.If the
stdiofeature is also enabled, this attempt to output panic message and location to stderr. -
trap-hlt
Arm-specific: Use HLT instruction on A+R profile.Arm documentation says:
The
HLTencodings are new in version 2.0 of the semihosting specification. Where possible, have semihosting callers continue to use the previously existing trap instructions to ensure compatibility with legacy semihosting implementations. These trap instructions areHLTfor A64,SVCon A+R profile A32 or T32, andBKPTon M profile. However, it is necessary to change from SVC to HLT instructions to support AArch32 semihosting properly in a mixed AArch32/AArch64 system.ARM encourages semihosting callers to implement support for trapping using
HLTon A32 and T32 as a configurable option. ARM strongly discourages semihosting callers from mixing theHLTandSVCmechanisms within the same executable.Based on the Arm’s recommendation, this is implemented as an optional feature.
Enabling this feature on architectures other than Arm A+R profile will result in a compile error.
-
openocd-semihosting
Xtensa-specific: Use OpenOCD Semihosting.Xtensa has two semihosting interfaces:
- Tensilica ISS SIMCALL used in Cadence tools and QEMU.
- Arm-semihosting-compatible semihosting interface used in OpenOCD and probe-rs. (This crate calls it “OpenOCD Semihosting”, which is the same as the option name in newlib-esp32.)
This crate does not currently support SIMCALL-based semihosting, but users need to explicitly enable the feature to avoid accidentally selecting a different one than one actually want to use.
Enabling this feature on architectures other than Xtensa will result in a compile error.
-
portable-atomic
Use portable-atomic’s atomic types.portable-atomic provides atomic CAS on targets where the standard library does not provide atomic CAS. To use the
panic-unwindfeature on such targets (e.g., RISC-V without A-extension), you need to enable this feature.See its documentation for details.
-
args
Enablesemihosting::experimental::env::args.Note:
- This feature is experimental (tracking issue: #1) and outside of the normal semver guarantees and minor or patch versions of semihosting may make breaking changes to them at any time.
-
time
Enablesemihosting::experimental::time.Note:
- This feature is experimental (tracking issue: #2) and outside of the normal semver guarantees and minor or patch versions of semihosting may make breaking changes to them at any time.
-
panic-unwind
Provide-C panic=unwindsupport for panic handler and enablesemihosting::experimental::panic::catch_unwind.This currently uses unwinding crate to support unwinding. See its documentation for supported platforms and requirements.
Note:
- This feature is experimental (tracking issue: #3) and outside of the normal semver guarantees and minor or patch versions of semihosting may make breaking changes to them at any time.
- This requires nightly compiler.
- This implicitly enables the
allocandpanic-handlerfeatures. - This uses atomic CAS. You need to use
portable-atomicfeature together if your target doesn’t support atomic CAS (e.g., RISC-V without A-extension). - When enabling this feature, you may need to rebuild the standard library with
-C panic=unwindforcatch_unwindto work properly. The recommended way to rebuild the standard library is passing-Z build-std="core,alloc"option to cargo.
-
backtrace
Provide backtrace support for panic handler.This currently uses unwinding crate to support backtrace. See its documentation for supported platforms and requirements.
Note:
-
This feature is experimental (tracking issue: #3) and outside of the normal semver guarantees and minor or patch versions of semihosting may make breaking changes to them at any time.
-
This requires nightly compiler.
-
This implicitly enables the
stdiofeature. -
When enabling this, it is recommended to also enable the
panic-unwindfeature. Otherwise, a decent backtrace will not be displayed at this time. (Using-C force-unwind-tablesmay work, but has not been tested yet.) -
Currently, the backtrace generated is not human-readable.
panicked at 'a', src/main.rs:86:13 stack backtrace: 0x84dc0 0x8ed80 0x8332c 0x83654 0x80644 0x803cc 0x809dc 0x800bcYou can use
addr2lineto resolve the addresses and rustfilt to demangle Rust symbols. For example, run the following command (please replace<path/to/binary>with your binary path), then paste the addresses:llvm-addr2line -fipe <path/to/binary> | rustfilt
-
Modules§
- experimental
- Experimental APIs.
- fd
- Owned and borrowed Unix-like file descriptors.
- fs
fs - Host filesystem manipulation operations.
- io
- Traits, helpers, and type definitions for core I/O functionality.
- process
- A module for working with processes.
- sys
- Low-level access to platform-specific semihosting interfaces.