Loading...
.. 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.