Crate qemu_exit

source ·
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.