| =========================================== | 
 | QEMU Firmware Configuration (fw_cfg) Device | 
 | =========================================== | 
 |  | 
 | Guest-side Hardware Interface | 
 | ============================= | 
 |  | 
 | This hardware interface allows the guest to retrieve various data items | 
 | (blobs) that can influence how the firmware configures itself, or may | 
 | contain tables to be installed for the guest OS. Examples include device | 
 | boot order, ACPI and SMBIOS tables, virtual machine UUID, SMP and NUMA | 
 | information, kernel/initrd images for direct (Linux) kernel booting, etc. | 
 |  | 
 | Selector (Control) Register | 
 | --------------------------- | 
 |  | 
 | * Write only | 
 | * Location: platform dependent (IOport or MMIO) | 
 | * Width: 16-bit | 
 | * Endianness: little-endian (if IOport), or big-endian (if MMIO) | 
 |  | 
 | A write to this register sets the index of a firmware configuration | 
 | item which can subsequently be accessed via the data register. | 
 |  | 
 | Setting the selector register will cause the data offset to be set | 
 | to zero. The data offset impacts which data is accessed via the data | 
 | register, and is explained below. | 
 |  | 
 | Bit14 of the selector register indicates whether the configuration | 
 | setting is being written. A value of 0 means the item is only being | 
 | read, and all write access to the data port will be ignored. A value | 
 | of 1 means the item's data can be overwritten by writes to the data | 
 | register. In other words, configuration write mode is enabled when | 
 | the selector value is between 0x4000-0x7fff or 0xc000-0xffff. | 
 |  | 
 | .. NOTE:: | 
 |       As of QEMU v2.4, writes to the fw_cfg data register are no | 
 |       longer supported, and will be ignored (treated as no-ops)! | 
 |  | 
 | .. NOTE:: | 
 |       As of QEMU v2.9, writes are reinstated, but only through the DMA | 
 |       interface (see below). Furthermore, writeability of any specific item is | 
 |       governed independently of Bit14 in the selector key value. | 
 |  | 
 | Bit15 of the selector register indicates whether the configuration | 
 | setting is architecture specific. A value of 0 means the item is a | 
 | generic configuration item. A value of 1 means the item is specific | 
 | to a particular architecture. In other words, generic configuration | 
 | items are accessed with a selector value between 0x0000-0x7fff, and | 
 | architecture specific configuration items are accessed with a selector | 
 | value between 0x8000-0xffff. | 
 |  | 
 | Data Register | 
 | ------------- | 
 |  | 
 | * Read/Write (writes ignored as of QEMU v2.4, but see the DMA interface) | 
 | * Location: platform dependent (IOport [#]_ or MMIO) | 
 | * Width: 8-bit (if IOport), 8/16/32/64-bit (if MMIO) | 
 | * Endianness: string-preserving | 
 |  | 
 | .. [#] | 
 |     On platforms where the data register is exposed as an IOport, its | 
 |     port number will always be one greater than the port number of the | 
 |     selector register. In other words, the two ports overlap, and can not | 
 |     be mapped separately. | 
 |  | 
 | The data register allows access to an array of bytes for each firmware | 
 | configuration data item. The specific item is selected by writing to | 
 | the selector register, as described above. | 
 |  | 
 | Initially following a write to the selector register, the data offset | 
 | will be set to zero. Each successful access to the data register will | 
 | increment the data offset by the appropriate access width. | 
 |  | 
 | Each firmware configuration item has a maximum length of data | 
 | associated with the item. After the data offset has passed the | 
 | end of this maximum data length, then any reads will return a data | 
 | value of 0x00, and all writes will be ignored. | 
 |  | 
 | An N-byte wide read of the data register will return the next available | 
 | N bytes of the selected firmware configuration item, as a substring, in | 
 | increasing address order, similar to memcpy(). | 
 |  | 
 | Register Locations | 
 | ------------------ | 
 |  | 
 | x86, x86_64 | 
 |     * Selector Register IOport: 0x510 | 
 |     * Data Register IOport:     0x511 | 
 |     * DMA Address IOport:       0x514 | 
 |  | 
 | Arm | 
 |     * Selector Register address: Base + 8 (2 bytes) | 
 |     * Data Register address:     Base + 0 (8 bytes) | 
 |     * DMA Address address:       Base + 16 (8 bytes) | 
 |  | 
 | ACPI Interface | 
 | -------------- | 
 |  | 
 | The fw_cfg device is defined with ACPI ID ``QEMU0002``. Since we expect | 
 | ACPI tables to be passed into the guest through the fw_cfg device itself, | 
 | the guest-side firmware can not use ACPI to find fw_cfg. However, once the | 
 | firmware is finished setting up ACPI tables and hands control over to the | 
 | guest kernel, the latter can use the fw_cfg ACPI node for a more accurate | 
 | inventory of in-use IOport or MMIO regions. | 
 |  | 
 | Firmware Configuration Items | 
 | ---------------------------- | 
 |  | 
 | Signature (Key 0x0000, ``FW_CFG_SIGNATURE``) | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | The presence of the fw_cfg selector and data registers can be verified | 
 | by selecting the "signature" item using key 0x0000 (``FW_CFG_SIGNATURE``), | 
 | and reading four bytes from the data register. If the fw_cfg device is | 
 | present, the four bytes read will contain the characters ``QEMU``. | 
 |  | 
 | If the DMA interface is available, then reading the DMA Address | 
 | Register returns 0x51454d5520434647 (``QEMU CFG`` in big-endian format). | 
 |  | 
 | Revision / feature bitmap (Key 0x0001, ``FW_CFG_ID``) | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | A 32-bit little-endian unsigned int, this item is used to check for enabled | 
 | features. | 
 |  | 
 | - Bit 0: traditional interface. Always set. | 
 | - Bit 1: DMA interface. | 
 |  | 
 | File Directory (Key 0x0019, ``FW_CFG_FILE_DIR``) | 
 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | .. highlight:: c | 
 |  | 
 | Firmware configuration items stored at selector keys 0x0020 or higher | 
 | (``FW_CFG_FILE_FIRST`` or higher) have an associated entry in a directory | 
 | structure, which makes it easier for guest-side firmware to identify | 
 | and retrieve them. The format of this file directory (from ``fw_cfg.h`` in | 
 | the QEMU source tree) is shown here, slightly annotated for clarity:: | 
 |  | 
 |     struct FWCfgFiles {		/* the entire file directory fw_cfg item */ | 
 |         uint32_t count;		/* number of entries, in big-endian format */ | 
 |         struct FWCfgFile f[];	/* array of file entries, see below */ | 
 |     }; | 
 |  | 
 |     struct FWCfgFile {		/* an individual file entry, 64 bytes total */ | 
 |         uint32_t size;		/* size of referenced fw_cfg item, big-endian */ | 
 |         uint16_t select;	/* selector key of fw_cfg item, big-endian */ | 
 |         uint16_t reserved; | 
 |         char name[56];		/* fw_cfg item name, NUL-terminated ascii */ | 
 |     }; | 
 |  | 
 | All Other Data Items | 
 | ~~~~~~~~~~~~~~~~~~~~ | 
 |  | 
 | Please consult the QEMU source for the most up-to-date and authoritative list | 
 | of selector keys and their respective items' purpose, format and writeability. | 
 |  | 
 | Ranges | 
 | ~~~~~~ | 
 |  | 
 | Theoretically, there may be up to 0x4000 generic firmware configuration | 
 | items, and up to 0x4000 architecturally specific ones. | 
 |  | 
 | ===============  =========== | 
 | Selector Reg.    Range Usage | 
 | ===============  =========== | 
 | 0x0000 - 0x3fff  Generic (0x0000 - 0x3fff, generally RO, possibly RW through | 
 |                  the DMA interface in QEMU v2.9+) | 
 | 0x4000 - 0x7fff  Generic (0x0000 - 0x3fff, RW, ignored in QEMU v2.4+) | 
 | 0x8000 - 0xbfff  Arch. Specific (0x0000 - 0x3fff, generally RO, possibly RW | 
 |                  through the DMA interface in QEMU v2.9+) | 
 | 0xc000 - 0xffff  Arch. Specific (0x0000 - 0x3fff, RW, ignored in v2.4+) | 
 | ===============  =========== | 
 |  | 
 | In practice, the number of allowed firmware configuration items depends on the | 
 | machine type/version. | 
 |  | 
 | Guest-side DMA Interface | 
 | ======================== | 
 |  | 
 | If bit 1 of the feature bitmap is set, the DMA interface is present. This does | 
 | not replace the existing fw_cfg interface, it is an add-on. This interface | 
 | can be used through the 64-bit wide address register. | 
 |  | 
 | The address register is in big-endian format. The value for the register is 0 | 
 | at startup and after an operation. A write to the least significant half (at | 
 | offset 4) triggers an operation. This means that operations with 32-bit | 
 | addresses can be triggered with just one write, whereas operations with | 
 | 64-bit addresses can be triggered with one 64-bit write or two 32-bit writes, | 
 | starting with the most significant half (at offset 0). | 
 |  | 
 | In this register, the physical address of a ``FWCfgDmaAccess`` structure in RAM | 
 | should be written. This is the format of the ``FWCfgDmaAccess`` structure:: | 
 |  | 
 |     typedef struct FWCfgDmaAccess { | 
 |         uint32_t control; | 
 |         uint32_t length; | 
 |         uint64_t address; | 
 |     } FWCfgDmaAccess; | 
 |  | 
 | The fields of the structure are in big endian mode, and the field at the lowest | 
 | address is the ``control`` field. | 
 |  | 
 | The ``control`` field has the following bits: | 
 |  | 
 | - Bit 0: Error | 
 | - Bit 1: Read | 
 | - Bit 2: Skip | 
 | - Bit 3: Select. The upper 16 bits are the selected index. | 
 | - Bit 4: Write | 
 |  | 
 | When an operation is triggered, if the ``control`` field has bit 3 set, the | 
 | upper 16 bits are interpreted as an index of a firmware configuration item. | 
 | This has the same effect as writing the selector register. | 
 |  | 
 | If the ``control`` field has bit 1 set, a read operation will be performed. | 
 | ``length`` bytes for the current selector and offset will be copied into the | 
 | physical RAM address specified by the ``address`` field. | 
 |  | 
 | If the ``control`` field has bit 4 set (and not bit 1), a write operation will be | 
 | performed. ``length`` bytes will be copied from the physical RAM address | 
 | specified by the ``address`` field to the current selector and offset. QEMU | 
 | prevents starting or finishing the write beyond the end of the item associated | 
 | with the current selector (i.e., the item cannot be resized). Truncated writes | 
 | are dropped entirely. Writes to read-only items are also rejected. All of these | 
 | write errors set bit 0 (the error bit) in the ``control`` field. | 
 |  | 
 | If the ``control`` field has bit 2 set (and neither bit 1 nor bit 4), a skip | 
 | operation will be performed. The offset for the current selector will be | 
 | advanced ``length`` bytes. | 
 |  | 
 | To check the result, read the ``control`` field: | 
 |  | 
 | Error bit set | 
 |     Something went wrong. | 
 | All bits cleared | 
 |     Transfer finished successfully. | 
 | Otherwise | 
 |     Transfer still in progress | 
 |     (doesn't happen today due to implementation not being async, | 
 |     but may in the future). | 
 |  | 
 | Externally Provided Items | 
 | ========================= | 
 |  | 
 | Since v2.4, "file" fw_cfg items (i.e., items with selector keys above | 
 | ``FW_CFG_FILE_FIRST``, and with a corresponding entry in the fw_cfg file | 
 | directory structure) may be inserted via the QEMU command line, using | 
 | the following syntax:: | 
 |  | 
 |     -fw_cfg [name=]<item_name>,file=<path> | 
 |  | 
 | Or:: | 
 |  | 
 |     -fw_cfg [name=]<item_name>,string=<string> | 
 |  | 
 | Since v5.1, QEMU allows some objects to generate fw_cfg-specific content, | 
 | the content is then associated with a "file" item using the 'gen_id' option | 
 | in the command line, using the following syntax:: | 
 |  | 
 |     -object <generator-type>,id=<generated_id>,[generator-specific-options] \ | 
 |     -fw_cfg [name=]<item_name>,gen_id=<generated_id> | 
 |  | 
 | See QEMU man page for more documentation. | 
 |  | 
 | Using item_name with plain ASCII characters only is recommended. | 
 |  | 
 | Item names beginning with ``opt/`` are reserved for users.  QEMU will | 
 | never create entries with such names unless explicitly ordered by the | 
 | user. | 
 |  | 
 | To avoid clashes among different users, it is strongly recommended | 
 | that you use names beginning with ``opt/RFQDN/``, where RFQDN is a reverse | 
 | fully qualified domain name you control.  For instance, if SeaBIOS | 
 | wanted to define additional names, the prefix ``opt/org.seabios/`` would | 
 | be appropriate. | 
 |  | 
 | For historical reasons, ``opt/ovmf/`` is reserved for OVMF firmware. | 
 |  | 
 | Prefix ``opt/org.qemu/`` is reserved for QEMU itself. | 
 |  | 
 | Use of names not beginning with ``opt/`` is potentially dangerous and | 
 | entirely unsupported.  QEMU will warn if you try. | 
 |  | 
 | Use of names not beginning with ``opt/`` is tolerated with 'gen_id' (that | 
 | is, the warning is suppressed), but you must know exactly what you're | 
 | doing. | 
 |  | 
 | All externally provided fw_cfg items are read-only to the guest. |