 ef073ebd32
			
		
	
	
		ef073ebd32
		
	
	
	
	
		
			
			A surprising feature of calls like SYS_READC is this can cause QEMU to indefinitely block as there is no handling for EOF. Clarifies: https://gitlab.com/qemu-project/qemu/-/issues/1963 Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20231120150833.2552739-8-alex.bennee@linaro.org>
		
			
				
	
	
		
			192 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			192 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| Emulation
 | |
| =========
 | |
| 
 | |
| QEMU's Tiny Code Generator (TCG) provides the ability to emulate a
 | |
| number of CPU architectures on any supported host platform. Both
 | |
| :ref:`System Emulation` and :ref:`User Mode Emulation` are supported
 | |
| depending on the guest architecture.
 | |
| 
 | |
| .. list-table:: Supported Guest Architectures for Emulation
 | |
|   :widths: 30 10 10 50
 | |
|   :header-rows: 1
 | |
| 
 | |
|   * - Architecture (qemu name)
 | |
|     - System
 | |
|     - User
 | |
|     - Notes
 | |
|   * - Alpha
 | |
|     - Yes
 | |
|     - Yes
 | |
|     - Legacy 64 bit RISC ISA developed by DEC
 | |
|   * - Arm (arm, aarch64)
 | |
|     - :ref:`Yes<ARM-System-emulator>`
 | |
|     - Yes
 | |
|     - Wide range of features, see :ref:`Arm Emulation` for details
 | |
|   * - AVR
 | |
|     - :ref:`Yes<AVR-System-emulator>`
 | |
|     - No
 | |
|     - 8 bit micro controller, often used in maker projects
 | |
|   * - Cris
 | |
|     - Yes
 | |
|     - Yes
 | |
|     - Embedded RISC chip developed by AXIS
 | |
|   * - Hexagon
 | |
|     - No
 | |
|     - Yes
 | |
|     - Family of DSPs by Qualcomm
 | |
|   * - PA-RISC (hppa)
 | |
|     - Yes
 | |
|     - Yes
 | |
|     - A legacy RISC system used in HP's old minicomputers
 | |
|   * - x86 (i386, x86_64)
 | |
|     - :ref:`Yes<QEMU-PC-System-emulator>`
 | |
|     - Yes
 | |
|     - The ubiquitous desktop PC CPU architecture, 32 and 64 bit.
 | |
|   * - Loongarch
 | |
|     - Yes
 | |
|     - Yes
 | |
|     - A MIPS-like 64bit RISC architecture developed in China
 | |
|   * - m68k
 | |
|     - :ref:`Yes<ColdFire-System-emulator>`
 | |
|     - Yes
 | |
|     - Motorola 68000 variants and ColdFire
 | |
|   * - Microblaze
 | |
|     - Yes
 | |
|     - Yes
 | |
|     - RISC based soft-core by Xilinx
 | |
|   * - MIPS (mips*)
 | |
|     - :ref:`Yes<MIPS-System-emulator>`
 | |
|     - Yes
 | |
|     - Venerable RISC architecture originally out of Stanford University
 | |
|   * - Nios2
 | |
|     - Yes
 | |
|     - Yes
 | |
|     - 32 bit embedded soft-core by Altera
 | |
|   * - OpenRISC
 | |
|     - :ref:`Yes<OpenRISC-System-emulator>`
 | |
|     - Yes
 | |
|     - Open source RISC architecture developed by the OpenRISC community
 | |
|   * - Power (ppc, ppc64)
 | |
|     - :ref:`Yes<PowerPC-System-emulator>`
 | |
|     - Yes
 | |
|     - A general purpose RISC architecture now managed by IBM
 | |
|   * - RISC-V
 | |
|     - :ref:`Yes<RISC-V-System-emulator>`
 | |
|     - Yes
 | |
|     - An open standard RISC ISA maintained by RISC-V International
 | |
|   * - RX
 | |
|     - :ref:`Yes<RX-System-emulator>`
 | |
|     - No
 | |
|     - A 32 bit micro controller developed by Renesas
 | |
|   * - s390x
 | |
|     - :ref:`Yes<s390x-System-emulator>`
 | |
|     - Yes
 | |
|     - A 64 bit CPU found in IBM's System Z mainframes
 | |
|   * - sh4
 | |
|     - Yes
 | |
|     - Yes
 | |
|     - A 32 bit RISC embedded CPU developed by Hitachi
 | |
|   * - SPARC (sparc, sparc64)
 | |
|     - :ref:`Yes<Sparc32-System-emulator>`
 | |
|     - Yes
 | |
|     - A RISC ISA originally developed by Sun Microsystems
 | |
|   * - Tricore
 | |
|     - Yes
 | |
|     - No
 | |
|     - A 32 bit RISC/uController/DSP developed by Infineon
 | |
|   * - Xtensa
 | |
|     - :ref:`Yes<Xtensa-System-emulator>`
 | |
|     - Yes
 | |
|     - A configurable 32 bit soft core now owned by Cadence
 | |
| 
 | |
| A number of features are only available when running under
 | |
| emulation including :ref:`Record/Replay<replay>` and :ref:`TCG Plugins`.
 | |
| 
 | |
| .. _Semihosting:
 | |
| 
 | |
| Semihosting
 | |
| -----------
 | |
| 
 | |
| Semihosting is a feature defined by the owner of the architecture to
 | |
| allow programs to interact with a debugging host system. On real
 | |
| hardware this is usually provided by an In-circuit emulator (ICE)
 | |
| hooked directly to the board. QEMU's implementation allows for
 | |
| semihosting calls to be passed to the host system or via the
 | |
| ``gdbstub``.
 | |
| 
 | |
| Generally semihosting makes it easier to bring up low level code before a
 | |
| more fully functional operating system has been enabled. On QEMU it
 | |
| also allows for embedded micro-controller code which typically doesn't
 | |
| have a full libc to be run as "bare-metal" code under QEMU's user-mode
 | |
| emulation. It is also useful for writing test cases and indeed a
 | |
| number of compiler suites as well as QEMU itself use semihosting calls
 | |
| to exit test code while reporting the success state.
 | |
| 
 | |
| Semihosting is only available using TCG emulation. This is because the
 | |
| instructions to trigger a semihosting call are typically reserved
 | |
| causing most hypervisors to trap and fault on them.
 | |
| 
 | |
| .. warning::
 | |
|    Semihosting inherently bypasses any isolation there may be between
 | |
|    the guest and the host. As a result a program using semihosting can
 | |
|    happily trash your host system. Some semihosting calls (e.g.
 | |
|    ``SYS_READC``) can block execution indefinitely. You should only
 | |
|    ever run trusted code with semihosting enabled.
 | |
| 
 | |
| Redirection
 | |
| ~~~~~~~~~~~
 | |
| 
 | |
| Semihosting calls can be re-directed to a (potentially remote) gdb
 | |
| during debugging via the :ref:`gdbstub<GDB usage>`. Output to the
 | |
| semihosting console is configured as a ``chardev`` so can be
 | |
| redirected to a file, pipe or socket like any other ``chardev``
 | |
| device.
 | |
| 
 | |
| Supported Targets
 | |
| ~~~~~~~~~~~~~~~~~
 | |
| 
 | |
| Most targets offer similar semihosting implementations with some
 | |
| minor changes to define the appropriate instruction to encode the
 | |
| semihosting call and which registers hold the parameters. They tend to
 | |
| presents a simple POSIX-like API which allows your program to read and
 | |
| write files, access the console and some other basic interactions.
 | |
| 
 | |
| For full details of the ABI for a particular target, and the set of
 | |
| calls it provides, you should consult the semihosting specification
 | |
| for that architecture.
 | |
| 
 | |
| .. note::
 | |
|    QEMU makes an implementation decision to implement all file
 | |
|    access in ``O_BINARY`` mode. The user-visible effect of this is
 | |
|    regardless of the text/binary mode the program sets QEMU will
 | |
|    always select a binary mode ensuring no line-terminator conversion
 | |
|    is performed on input or output. This is because gdb semihosting
 | |
|    support doesn't make the distinction between the modes and
 | |
|    magically processing line endings can be confusing.
 | |
| 
 | |
| .. list-table:: Guest Architectures supporting Semihosting
 | |
|   :widths: 10 10 80
 | |
|   :header-rows: 1
 | |
| 
 | |
|   * - Architecture
 | |
|     - Modes
 | |
|     - Specification
 | |
|   * - Arm
 | |
|     - System and User-mode
 | |
|     - https://github.com/ARM-software/abi-aa/blob/main/semihosting/semihosting.rst
 | |
|   * - m68k
 | |
|     - System
 | |
|     - https://sourceware.org/git/?p=newlib-cygwin.git;a=blob;f=libgloss/m68k/m68k-semi.txt;hb=HEAD
 | |
|   * - MIPS
 | |
|     - System
 | |
|     - Unified Hosting Interface (MD01069)
 | |
|   * - Nios II
 | |
|     - System
 | |
|     - https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=libgloss/nios2/nios2-semi.txt;hb=HEAD
 | |
|   * - RISC-V
 | |
|     - System and User-mode
 | |
|     - https://github.com/riscv/riscv-semihosting-spec/blob/main/riscv-semihosting-spec.adoc
 | |
|   * - Xtensa
 | |
|     - System
 | |
|     - Tensilica ISS SIMCALL
 |