Files
u-boot/doc/usage/cmd/qfw.rst
Simon Glass 2fdacb4753 qfw: Add a subcommand to decode the QEMU E820 data
Provide a simple command to display the memory map described by this
table.

Signed-off-by: Simon Glass <sjg@chromium.org>
2025-07-09 23:33:25 +02:00

222 lines
6.7 KiB
ReStructuredText

.. SPDX-License-Identifier: GPL-2.0+
.. index::
single: qfw (command)
qfw command
===========
Synopsis
--------
::
qfw dump
qfw list
qfw cpus
qfw load [kernel_addr [initrd_addr]]
qfw table
qfw arch
qfw read <addr> <filename>
qfw e820
Description
-----------
The *qfw* command is used to retrieve information from the QEMU firmware.
The *qfw list* sub-command displays the QEMU firmware files.
The *qfw dump* sub-command displays the QEMU configuration entries.
The *qfw cpus* sub-command displays the available CPUs.
The *qfw load* command is used to load a kernel and an initial RAM disk.
The *qfw table* command shows the instructions U-Boot uses to construct the
ACPI tables. This is not as simple as a single blob of data, since some entries
must be updated to take account of the address to which the tables are copied.
The *qfw arch* command shows some items marked as 'arch local' in QEMU.
The *qfw read* command allowing a QEMU file to be read into memory.
The *qfw e820* command shows the memory-map information provided by QEMU. It
uses the x86 e820 format.
kernel_addr
address to which the file specified by the -kernel parameter of QEMU shall
be loaded. Defaults to environment variable *loadaddr* and further to
the value of *CONFIG_SYS_LOAD_ADDR*.
initrd_addr
address to which the file specified by the -initrd parameter of QEMU shall
be loaded. Defaults to environment variable *ramdiskaddr* and further to
the value of *CFG_RAMDISK_ADDR*.
addr
address to which `filename` is read into memory
filename
filename of file to read into memory (as shown by *qfw list*)
Examples
--------
QEMU firmware files are listed via the *qfw list* command:
::
=> qfw list
Addr Size Sel Name
-------- -------- --- ------------
0 0 20 bios-geometry
0 0 21 bootorder
1fc6c000 14 22 etc/acpi/rsdp
1fc6c040 20000 23 etc/acpi/tables
0 4 24 etc/boot-fail-wait
0 28 25 etc/e820
0 8 26 etc/msr_feature_control
0 18 27 etc/smbios/smbios-anchor
0 151 28 etc/smbios/smbios-tables
0 6 29 etc/system-states
0 1000 2a etc/table-loader
0 0 2b etc/tpm/log
0 2400 2c genroms/kvmvapic.bin
Where an address is shown, it indicates where the data is available for
inspection, e.g. using the :doc:`md`.
This shows the *qfw dump* command on an x86 target:
::
signature = QEMU
id = 0x00000003
uuid = dc8275a0-59c6-11f0-b383-0f1ea10dd2f7
ram_size = 0x0000000020000000
nographic = 0x00000000
nb cpus = 0x00000004
machine id = 0x00000000
kernel addr = 0x00100000
kernel size = 0x00e9e988
kernel cmdl = 0x00000000
initrd addr = 0x1b446000
initrd size = 0x04b91d57
boot device = 0x00000000
numa = 0x00000000
boot menu = 0x00000000
max cpus = 0x00000004
kernel entry= 0x00000000
cmdline addr= 0x00020000
cmdline size= 0x0000000f
cmdline data= root=/dev/sda1
setup addr = 0x00010000
setup size = 0x00005000
file dir le = 0x0000000d
The available CPUs can be shown via the *qfw cpus* command:
::
=> qfw cpu
2 cpu(s) online
The *-kernel* and *-initrd* parameters allow to specify a kernel and an
initial RAM disk for QEMU:
.. code-block:: bash
$ qemu-system-x86_64 -machine pc-i440fx-2.5 -bios u-boot.rom -m 1G \
-nographic -kernel vmlinuz -initrd initrd
Now the kernel and the initial RAM disk can be loaded to the U-Boot memory via
the *qfw load* command and booted thereafter.
::
=> qfw load ${kernel_addr_r} ${ramdisk_addr_r}
loading kernel to address 0000000001000000 size 5048f0 initrd 0000000004000000 size 3c94891
=> zboot 1000000 5048f0 4000000 3c94891
Valid Boot Flag
Magic signature found
Linux kernel version 4.19.0-14-amd64 (debian-kernel@lists.debian.org) #1 SMP Debian 4.19.171-2 (2021-01-30)
Building boot_params at 0x00090000
Loading bzImage at address 100000 (5260160 bytes)
This shows the *qfw table* command on an x86 target:
::
=> qfw table
0 alloc: align 10 zone fseg name 'etc/acpi/rsdp'
1 alloc: align 40 zone high name 'etc/acpi/tables'
2 add-chksum offset 49 start 40 length 1ab4 name 'etc/acpi/tables'
3 add-ptr offset 1b18 size 4 dest 'etc/acpi/tables' src 'etc/acpi/tables'
4 add-ptr offset 1b1c size 4 dest 'etc/acpi/tables' src 'etc/acpi/tables'
5 add-chksum offset 1afd start 1af4 length 74 name 'etc/acpi/tables'
6 add-chksum offset 1b71 start 1b68 length 78 name 'etc/acpi/tables'
7 add-chksum offset 1be9 start 1be0 length 38 name 'etc/acpi/tables'
8 add-chksum offset 1c21 start 1c18 length 28 name 'etc/acpi/tables'
9 add-ptr offset 1c64 size 4 dest 'etc/acpi/tables' src 'etc/acpi/tables'
10 add-ptr offset 1c68 size 4 dest 'etc/acpi/tables' src 'etc/acpi/tables'
11 add-ptr offset 1c6c size 4 dest 'etc/acpi/tables' src 'etc/acpi/tables'
12 add-ptr offset 1c70 size 4 dest 'etc/acpi/tables' src 'etc/acpi/tables'
13 add-chksum offset 1c49 start 1c40 length 34 name 'etc/acpi/tables'
14 add-ptr offset 10 size 4 dest 'etc/acpi/rsdp' src 'etc/acpi/tables'
15 add-chksum offset 8 start 0 length 14 name 'etc/acpi/rsdp'
This shows the *qfw table* command on an x86 target:
::
=> qfw arch
acpi tables = 0x00000000
smbios entrs= 0x00000000
irq0 overr = 0x00000001
hpet = 0x00000000
This shows reading a named qfw file into memory then dumping it, using the
provided size information:
::
=> qfw list
Addr Size Sel Name
-------- -------- --- ------------
0 0 20 bios-geometry
0 0 21 bootorder
1ec3f000 14 22 etc/acpi/rsdp
1ec3f040 20000 23 etc/acpi/tables
0 4 24 etc/boot-fail-wait
0 28 25 etc/e820
0 18 26 etc/smbios/smbios-anchor
0 151 27 etc/smbios/smbios-tables
0 6 28 etc/system-states
0 1000 29 etc/table-loader
0 0 2a etc/tpm/log
0 2400 2b genroms/kvmvapic.bin
=> qfw read 1000 etc/acpi/rsdp
=> md.b 1000 14
00001000: 52 53 44 20 50 54 52 20 00 42 4f 43 48 53 20 00 RSD PTR .BOCHS .
00001010: 40 1c 00 00 @...
This shows dumping the E820 table, showing the emulated RAM as well as some
reserved memory:
::
=> qfw e820
Addr Size Type
fd00000000 300000000 Reserved
0 20000000 RAM
=>
Configuration
-------------
The qfw command is only available if CONFIG_CMD_QFW=y.