Expand description
Exit QEMU with user-defined code.
Quit a running QEMU session with user-defined exit code. Useful for unit or integration tests using QEMU.
TL;DR
use qemu_exit::QEMUExit;
#[cfg(target_arch = "aarch64")]
let qemu_exit_handle = qemu_exit::AArch64::new();
// addr: The address of sifive_test.
#[cfg(target_arch = "riscv64")]
let qemu_exit_handle = qemu_exit::RISCV64::new(addr);
// io_base: I/O-base of isa-debug-exit.
// custom_exit_success: A custom success code; Must be an odd number.
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
let qemu_exit_handle = qemu_exit::X86::new(io_base, custom_exit_success);
qemu_exit_handle.exit(1337);
qemu_exit_handle.exit_success();
qemu_exit_handle.exit_failure();
Architecture Specific Configuration
AArch64
Pass the -semihosting
argument to the QEMU invocation, e.g.:
qemu-system-aarch64 -M raspi3 -serial stdio -semihosting -kernel kernel8.img
RISCV64
You need to chose a machine with the sifive_test
device, for exemple -M virt
:
qemu-system-riscv64 -M virt -nographic -monitor none -serial stdio -kernel kernel.elf
x86_64
Add the special ISA debug exit device by passing the flags:
-device isa-debug-exit,iobase=0xf4,iosize=0x04
When instantiating the handle, iobase
must be given as the first parameter.
The second parameter must be an EXIT_SUCCESS
code of your choice that is an odd number, aka
bit number zero must be 1
. This is needed because in QEMU, the provided code is internally
binary-OR’ed with 0x1
. This is hardcoded and therefore, with isa-debug-exit
, it is not
possible to let QEMU invoke exit(0)
.
let qemu_exit_handle = qemu_exit::X86::new(io_base, custom_exit_success);
Literature
Re-exports
pub use x86::*;
Modules
- x86 (i386) and x86_64.
Traits
- Generic interface for exiting QEMU.