| .. _user-mode: | |
| QEMU User space emulator | |
| ======================== | |
| Supported Operating Systems | |
| --------------------------- | |
| The following OS are supported in user space emulation: | |
| - Linux (referred as qemu-linux-user) | |
| - BSD (referred as qemu-bsd-user) | |
| Features | |
| -------- | |
| QEMU user space emulation has the following notable features: | |
| **System call translation:** | |
| QEMU includes a generic system call translator. This means that the | |
| parameters of the system calls can be converted to fix endianness and | |
| 32/64-bit mismatches between hosts and targets. IOCTLs can be | |
| converted too. | |
| **POSIX signal handling:** | |
| QEMU can redirect to the running program all signals coming from the | |
| host (such as ``SIGALRM``), as well as synthesize signals from | |
| virtual CPU exceptions (for example ``SIGFPE`` when the program | |
| executes a division by zero). | |
| QEMU relies on the host kernel to emulate most signal system calls, | |
| for example to emulate the signal mask. On Linux, QEMU supports both | |
| normal and real-time signals. | |
| **Threading:** | |
| On Linux, QEMU can emulate the ``clone`` syscall and create a real | |
| host thread (with a separate virtual CPU) for each emulated thread. | |
| Note that not all targets currently emulate atomic operations | |
| correctly. x86 and Arm use a global lock in order to preserve their | |
| semantics. | |
| QEMU was conceived so that ultimately it can emulate itself. Although it | |
| is not very useful, it is an important test to show the power of the | |
| emulator. | |
| .. _linux-user-mode: | |
| Linux User space emulator | |
| ------------------------- | |
| Command line options | |
| ~~~~~~~~~~~~~~~~~~~~ | |
| :: | |
| qemu-i386 [-h] [-d] [-L path] [-s size] [-cpu model] [-g endpoint] [-B offset] [-R size] program [arguments...] | |
| ``-h`` | |
| Print the help | |
| ``-L path`` | |
| Set the x86 elf interpreter prefix (default=/usr/local/qemu-i386) | |
| ``-s size`` | |
| Set the x86 stack size in bytes (default=524288) | |
| ``-cpu model`` | |
| Select CPU model (-cpu help for list and additional feature | |
| selection) | |
| ``-E var=value`` | |
| Set environment var to value. | |
| ``-U var`` | |
| Remove var from the environment. | |
| ``-B offset`` | |
| Offset guest address by the specified number of bytes. This is useful | |
| when the address region required by guest applications is reserved on | |
| the host. This option is currently only supported on some hosts. | |
| ``-R size`` | |
| Pre-allocate a guest virtual address space of the given size (in | |
| bytes). \"G\", \"M\", and \"k\" suffixes may be used when specifying | |
| the size. | |
| Debug options: | |
| ``-d item1,...`` | |
| Activate logging of the specified items (use '-d help' for a list of | |
| log items) | |
| ``-g endpoint`` | |
| Wait gdb connection to a port (e.g., ``1234``) or a unix socket (e.g., | |
| ``/tmp/qemu.sock``). | |
| If a unix socket path contains single ``%d`` placeholder (e.g., | |
| ``/tmp/qemu-%d.sock``), it is replaced by the emulator PID, which is useful | |
| when passing this option via the ``QEMU_GDB`` environment variable to a | |
| multi-process application. | |
| If the endpoint address is followed by ``,suspend=n`` (e.g., | |
| ``1234,suspend=n``), then the emulated program starts without waiting for a | |
| connection, which can be established at any later point in time. | |
| ``-one-insn-per-tb`` | |
| Run the emulation with one guest instruction per translation block. | |
| This slows down emulation a lot, but can be useful in some situations, | |
| such as when trying to analyse the logs produced by the ``-d`` option. | |
| Environment variables: | |
| QEMU_STRACE | |
| Print system calls and arguments similar to the 'strace' program | |
| (NOTE: the actual 'strace' program will not work because the user | |
| space emulator hasn't implemented ptrace). At the moment this is | |
| incomplete. All system calls that don't have a specific argument | |
| format are printed with information for six arguments. Many | |
| flag-style arguments don't have decoders and will show up as numbers. | |
| Other binaries | |
| ~~~~~~~~~~~~~~ | |
| - user mode (Alpha) | |
| * ``qemu-alpha`` TODO. | |
| - user mode (Arm) | |
| * ``qemu-armeb`` TODO. | |
| * ``qemu-arm`` is also capable of running Arm \"Angel\" semihosted ELF | |
| binaries (as implemented by the arm-elf and arm-eabi Newlib/GDB | |
| configurations), and arm-uclinux bFLT format binaries. | |
| - user mode (ColdFire) | |
| - user mode (M68K) | |
| * ``qemu-m68k`` is capable of running semihosted binaries using the BDM | |
| (m5xxx-ram-hosted.ld) or m68k-sim (sim.ld) syscall interfaces, and | |
| coldfire uClinux bFLT format binaries. | |
| The binary format is detected automatically. | |
| - user mode (i386) | |
| * ``qemu-i386`` TODO. | |
| * ``qemu-x86_64`` TODO. | |
| - user mode (Microblaze) | |
| * ``qemu-microblaze`` TODO. | |
| - user mode (MIPS) | |
| * ``qemu-mips`` executes 32-bit big endian MIPS binaries (MIPS O32 ABI). | |
| * ``qemu-mipsel`` executes 32-bit little endian MIPS binaries (MIPS O32 ABI). | |
| * ``qemu-mips64`` executes 64-bit big endian MIPS binaries (MIPS N64 ABI). | |
| * ``qemu-mips64el`` executes 64-bit little endian MIPS binaries (MIPS N64 | |
| ABI). | |
| * ``qemu-mipsn32`` executes 32-bit big endian MIPS binaries (MIPS N32 ABI). | |
| * ``qemu-mipsn32el`` executes 32-bit little endian MIPS binaries (MIPS N32 | |
| ABI). | |
| - user mode (PowerPC) | |
| * ``qemu-ppc64`` TODO. | |
| * ``qemu-ppc`` TODO. | |
| - user mode (SH4) | |
| * ``qemu-sh4eb`` TODO. | |
| * ``qemu-sh4`` TODO. | |
| - user mode (SPARC) | |
| * ``qemu-sparc`` can execute Sparc32 binaries (Sparc32 CPU, 32 bit ABI). | |
| * ``qemu-sparc32plus`` can execute Sparc32 and SPARC32PLUS binaries | |
| (Sparc64 CPU, 32 bit ABI). | |
| * ``qemu-sparc64`` can execute some Sparc64 (Sparc64 CPU, 64 bit ABI) and | |
| SPARC32PLUS binaries (Sparc64 CPU, 32 bit ABI). | |
| .. _bsd-user-mode: | |
| BSD User space emulator | |
| ----------------------- | |
| BSD Status | |
| ~~~~~~~~~~ | |
| - target Sparc64 on Sparc64: Some trivial programs work. | |
| Quick Start | |
| ~~~~~~~~~~~ | |
| In order to launch a BSD process, QEMU needs the process executable | |
| itself and all the target dynamic libraries used by it. | |
| - On Sparc64, you can just try to launch any process by using the | |
| native libraries:: | |
| qemu-sparc64 /bin/ls | |
| Command line options | |
| ~~~~~~~~~~~~~~~~~~~~ | |
| :: | |
| qemu-sparc64 [-h] [-d] [-L path] [-s size] [-bsd type] program [arguments...] | |
| ``-h`` | |
| Print the help | |
| ``-L path`` | |
| Set the library root path (default=/) | |
| ``-s size`` | |
| Set the stack size in bytes (default=524288) | |
| ``-ignore-environment`` | |
| Start with an empty environment. Without this option, the initial | |
| environment is a copy of the caller's environment. | |
| ``-E var=value`` | |
| Set environment var to value. | |
| ``-U var`` | |
| Remove var from the environment. | |
| ``-bsd type`` | |
| Set the type of the emulated BSD Operating system. Valid values are | |
| FreeBSD, NetBSD and OpenBSD (default). | |
| Debug options: | |
| ``-d item1,...`` | |
| Activate logging of the specified items (use '-d help' for a list of | |
| log items) | |
| ``-p pagesize`` | |
| Act as if the host page size was 'pagesize' bytes | |
| ``-one-insn-per-tb`` | |
| Run the emulation with one guest instruction per translation block. | |
| This slows down emulation a lot, but can be useful in some situations, | |
| such as when trying to analyse the logs produced by the ``-d`` option. |