Skip to content

Commit

Permalink
qemu-options: bring the kernel and image options together
Browse files Browse the repository at this point in the history
How to control the booting of QEMU is often a source of confusion for
users. Bring the options that control this together in the manual
pages and add some verbiage to describe when each option is
appropriate. This attempts to codify some of the knowledge expressed
in:

  https://stackoverflow.com/questions/58420670/qemu-bios-vs-kernel-vs-device-loader-file/58434837#58434837

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20220725140520.515340-14-alex.bennee@linaro.org>
  • Loading branch information
stsquad committed Jul 29, 2022
1 parent 2805314 commit 1235cf7
Showing 1 changed file with 78 additions and 18 deletions.
96 changes: 78 additions & 18 deletions qemu-options.hx
Expand Up @@ -1585,13 +1585,6 @@ SRST
Use file as SecureDigital card image.
ERST

DEF("pflash", HAS_ARG, QEMU_OPTION_pflash,
"-pflash file use 'file' as a parallel flash image\n", QEMU_ARCH_ALL)
SRST
``-pflash file``
Use file as a parallel flash image.
ERST

DEF("snapshot", 0, QEMU_OPTION_snapshot,
"-snapshot write to temporary files instead of disk image files\n",
QEMU_ARCH_ALL)
Expand Down Expand Up @@ -3684,12 +3677,67 @@ DEFHEADING()

#endif

DEFHEADING(Linux/Multiboot boot specific:)
DEFHEADING(Boot Image or Kernel specific:)
SRST
There are broadly 4 ways you can boot a system with QEMU.

- specify a firmware and let it control finding a kernel
- specify a firmware and pass a hint to the kernel to boot
- direct kernel image boot
- manually load files into the guest's address space

The third method is useful for quickly testing kernels but as there is
no firmware to pass configuration information to the kernel the
hardware must either be probeable, the kernel built for the exact
configuration or passed some configuration data (e.g. a DTB blob)
which tells the kernel what drivers it needs. This exact details are
often hardware specific.

The final method is the most generic way of loading images into the
guest address space and used mostly for ``bare metal`` type
development where the reset vectors of the processor are taken into
account.

ERST

SRST
When using these options, you can use a given Linux or Multiboot kernel
without installing it in the disk image. It can be useful for easier
testing of various kernels.

For x86 machines and some other architectures ``-bios`` will generally
do the right thing with whatever it is given. For other machines the
more strict ``-pflash`` option needs an image that is sized for the
flash device for the given machine type.

Please see the :ref:`system-targets-ref` section of the manual for
more detailed documentation.

ERST

DEF("bios", HAS_ARG, QEMU_OPTION_bios, \
"-bios file set the filename for the BIOS\n", QEMU_ARCH_ALL)
SRST
``-bios file``
Set the filename for the BIOS.
ERST

DEF("pflash", HAS_ARG, QEMU_OPTION_pflash,
"-pflash file use 'file' as a parallel flash image\n", QEMU_ARCH_ALL)
SRST
``-pflash file``
Use file as a parallel flash image.
ERST

SRST

The kernel options were designed to work with Linux kernels although
other things (like hypervisors) can be packaged up as a kernel
executable image. The exact format of a executable image is usually
architecture specific.

The way in which the kernel is started (what address it is loaded at,
what if any information is passed to it via CPU registers, the state
of the hardware when it is started, and so on) is also architecture
specific. Typically it follows the specification laid down by the
Linux kernel for how kernels for that architecture must be started.

ERST

Expand Down Expand Up @@ -3729,6 +3777,25 @@ SRST
kernel on boot.
ERST

SRST

Finally you can also manually load images directly into the address
space of the guest. This is most useful for developers who already
know the layout of their guest and take care to ensure something sane
will happen when the reset vector executes.

The generic loader can be invoked by using the loader device:

``-device loader,addr=<addr>,data=<data>,data-len=<data-len>[,data-be=<data-be>][,cpu-num=<cpu-num>]``

there is also the guest loader which operates in a similar way but
tweaks the DTB so a hypervisor loaded via ``-kernel`` can find where
the guest image is:

``-device guest-loader,addr=<addr>[,kernel=<path>,[bootargs=<arguments>]][,initrd=<path>]``

ERST

DEFHEADING()

DEFHEADING(Debug/Expert options:)
Expand Down Expand Up @@ -4179,13 +4246,6 @@ SRST
To list all the data directories, use ``-L help``.
ERST

DEF("bios", HAS_ARG, QEMU_OPTION_bios, \
"-bios file set the filename for the BIOS\n", QEMU_ARCH_ALL)
SRST
``-bios file``
Set the filename for the BIOS.
ERST

DEF("enable-kvm", 0, QEMU_OPTION_enable_kvm, \
"-enable-kvm enable KVM full virtualization support\n",
QEMU_ARCH_ARM | QEMU_ARCH_I386 | QEMU_ARCH_MIPS | QEMU_ARCH_PPC |
Expand Down

0 comments on commit 1235cf7

Please sign in to comment.