16cec43e1SGabriel L. SomloQEMU Firmware Configuration (fw_cfg) Device 26cec43e1SGabriel L. Somlo=========================================== 36cec43e1SGabriel L. Somlo 46cec43e1SGabriel L. Somlo= Guest-side Hardware Interface = 56cec43e1SGabriel L. Somlo 66cec43e1SGabriel L. SomloThis hardware interface allows the guest to retrieve various data items 76cec43e1SGabriel L. Somlo(blobs) that can influence how the firmware configures itself, or may 86cec43e1SGabriel L. Somlocontain tables to be installed for the guest OS. Examples include device 96cec43e1SGabriel L. Somloboot order, ACPI and SMBIOS tables, virtual machine UUID, SMP and NUMA 106cec43e1SGabriel L. Somloinformation, kernel/initrd images for direct (Linux) kernel booting, etc. 116cec43e1SGabriel L. Somlo 126cec43e1SGabriel L. Somlo== Selector (Control) Register == 136cec43e1SGabriel L. Somlo 146cec43e1SGabriel L. Somlo* Write only 156cec43e1SGabriel L. Somlo* Location: platform dependent (IOport or MMIO) 166cec43e1SGabriel L. Somlo* Width: 16-bit 176cec43e1SGabriel L. Somlo* Endianness: little-endian (if IOport), or big-endian (if MMIO) 186cec43e1SGabriel L. Somlo 196cec43e1SGabriel L. SomloA write to this register sets the index of a firmware configuration 206cec43e1SGabriel L. Somloitem which can subsequently be accessed via the data register. 216cec43e1SGabriel L. Somlo 226cec43e1SGabriel L. SomloSetting the selector register will cause the data offset to be set 236cec43e1SGabriel L. Somloto zero. The data offset impacts which data is accessed via the data 246cec43e1SGabriel L. Somloregister, and is explained below. 256cec43e1SGabriel L. Somlo 266cec43e1SGabriel L. SomloBit14 of the selector register indicates whether the configuration 276cec43e1SGabriel L. Somlosetting is being written. A value of 0 means the item is only being 286cec43e1SGabriel L. Somloread, and all write access to the data port will be ignored. A value 296cec43e1SGabriel L. Somloof 1 means the item's data can be overwritten by writes to the data 306cec43e1SGabriel L. Somloregister. In other words, configuration write mode is enabled when 316cec43e1SGabriel L. Somlothe selector value is between 0x4000-0x7fff or 0xc000-0xffff. 326cec43e1SGabriel L. Somlo 336cec43e1SGabriel L. SomloNOTE: As of QEMU v2.4, writes to the fw_cfg data register are no 346cec43e1SGabriel L. Somlo longer supported, and will be ignored (treated as no-ops)! 356cec43e1SGabriel L. Somlo 366cec43e1SGabriel L. SomloBit15 of the selector register indicates whether the configuration 376cec43e1SGabriel L. Somlosetting is architecture specific. A value of 0 means the item is a 386cec43e1SGabriel L. Somlogeneric configuration item. A value of 1 means the item is specific 396cec43e1SGabriel L. Somloto a particular architecture. In other words, generic configuration 406cec43e1SGabriel L. Somloitems are accessed with a selector value between 0x0000-0x7fff, and 416cec43e1SGabriel L. Somloarchitecture specific configuration items are accessed with a selector 426cec43e1SGabriel L. Somlovalue between 0x8000-0xffff. 436cec43e1SGabriel L. Somlo 446cec43e1SGabriel L. Somlo== Data Register == 456cec43e1SGabriel L. Somlo 466cec43e1SGabriel L. Somlo* Read/Write (writes ignored as of QEMU v2.4) 476cec43e1SGabriel L. Somlo* Location: platform dependent (IOport [*] or MMIO) 486cec43e1SGabriel L. Somlo* Width: 8-bit (if IOport), 8/16/32/64-bit (if MMIO) 496cec43e1SGabriel L. Somlo* Endianness: string-preserving 506cec43e1SGabriel L. Somlo 516cec43e1SGabriel L. Somlo[*] On platforms where the data register is exposed as an IOport, its 526cec43e1SGabriel L. Somloport number will always be one greater than the port number of the 536cec43e1SGabriel L. Somloselector register. In other words, the two ports overlap, and can not 546cec43e1SGabriel L. Somlobe mapped separately. 556cec43e1SGabriel L. Somlo 566cec43e1SGabriel L. SomloThe data register allows access to an array of bytes for each firmware 576cec43e1SGabriel L. Somloconfiguration data item. The specific item is selected by writing to 586cec43e1SGabriel L. Somlothe selector register, as described above. 596cec43e1SGabriel L. Somlo 606cec43e1SGabriel L. SomloInitially following a write to the selector register, the data offset 616cec43e1SGabriel L. Somlowill be set to zero. Each successful access to the data register will 626cec43e1SGabriel L. Somloincrement the data offset by the appropriate access width. 636cec43e1SGabriel L. Somlo 646cec43e1SGabriel L. SomloEach firmware configuration item has a maximum length of data 656cec43e1SGabriel L. Somloassociated with the item. After the data offset has passed the 666cec43e1SGabriel L. Somloend of this maximum data length, then any reads will return a data 676cec43e1SGabriel L. Somlovalue of 0x00, and all writes will be ignored. 686cec43e1SGabriel L. Somlo 696cec43e1SGabriel L. SomloAn N-byte wide read of the data register will return the next available 706cec43e1SGabriel L. SomloN bytes of the selected firmware configuration item, as a substring, in 716cec43e1SGabriel L. Somloincreasing address order, similar to memcpy(). 726cec43e1SGabriel L. Somlo 736cec43e1SGabriel L. Somlo== Register Locations == 746cec43e1SGabriel L. Somlo 756cec43e1SGabriel L. Somlo=== x86, x86_64 Register Locations === 766cec43e1SGabriel L. Somlo 776cec43e1SGabriel L. SomloSelector Register IOport: 0x510 786cec43e1SGabriel L. SomloData Register IOport: 0x511 79c9eae1d4SMarc MaríDMA Address IOport: 0x514 80c9eae1d4SMarc Marí 81c9eae1d4SMarc Marí=== ARM Register Locations === 82c9eae1d4SMarc Marí 83c9eae1d4SMarc MaríSelector Register address: Base + 8 (2 bytes) 84c9eae1d4SMarc MaríData Register address: Base + 0 (8 bytes) 85c9eae1d4SMarc MaríDMA Address address: Base + 16 (8 bytes) 866cec43e1SGabriel L. Somlo 876cec43e1SGabriel L. Somlo== Firmware Configuration Items == 886cec43e1SGabriel L. Somlo 896cec43e1SGabriel L. Somlo=== Signature (Key 0x0000, FW_CFG_SIGNATURE) === 906cec43e1SGabriel L. Somlo 916cec43e1SGabriel L. SomloThe presence of the fw_cfg selector and data registers can be verified 926cec43e1SGabriel L. Somloby selecting the "signature" item using key 0x0000 (FW_CFG_SIGNATURE), 936cec43e1SGabriel L. Somloand reading four bytes from the data register. If the fw_cfg device is 946cec43e1SGabriel L. Somlopresent, the four bytes read will contain the characters "QEMU". 956cec43e1SGabriel L. Somlo 96*2cc06a88SKevin O'ConnorIf the DMA interface is available, then reading the DMA Address 97*2cc06a88SKevin O'ConnorRegister returns 0x51454d5520434647 ("QEMU CFG" in big-endian format). 98*2cc06a88SKevin O'Connor 99c9eae1d4SMarc Marí=== Revision / feature bitmap (Key 0x0001, FW_CFG_ID) === 1006cec43e1SGabriel L. Somlo 101c9eae1d4SMarc MaríA 32-bit little-endian unsigned int, this item is used to check for enabled 102c9eae1d4SMarc Marífeatures. 103c9eae1d4SMarc Marí - Bit 0: traditional interface. Always set. 104c9eae1d4SMarc Marí - Bit 1: DMA interface. 1056cec43e1SGabriel L. Somlo 1066cec43e1SGabriel L. Somlo=== File Directory (Key 0x0019, FW_CFG_FILE_DIR) === 1076cec43e1SGabriel L. Somlo 1086cec43e1SGabriel L. SomloFirmware configuration items stored at selector keys 0x0020 or higher 1096cec43e1SGabriel L. Somlo(FW_CFG_FILE_FIRST or higher) have an associated entry in a directory 1106cec43e1SGabriel L. Somlostructure, which makes it easier for guest-side firmware to identify 1116cec43e1SGabriel L. Somloand retrieve them. The format of this file directory (from fw_cfg.h in 1126cec43e1SGabriel L. Somlothe QEMU source tree) is shown here, slightly annotated for clarity: 1136cec43e1SGabriel L. Somlo 1146cec43e1SGabriel L. Somlostruct FWCfgFiles { /* the entire file directory fw_cfg item */ 1156cec43e1SGabriel L. Somlo uint32_t count; /* number of entries, in big-endian format */ 1166cec43e1SGabriel L. Somlo struct FWCfgFile f[]; /* array of file entries, see below */ 1176cec43e1SGabriel L. Somlo}; 1186cec43e1SGabriel L. Somlo 1196cec43e1SGabriel L. Somlostruct FWCfgFile { /* an individual file entry, 64 bytes total */ 1206cec43e1SGabriel L. Somlo uint32_t size; /* size of referenced fw_cfg item, big-endian */ 1216cec43e1SGabriel L. Somlo uint16_t select; /* selector key of fw_cfg item, big-endian */ 1226cec43e1SGabriel L. Somlo uint16_t reserved; 1236cec43e1SGabriel L. Somlo char name[56]; /* fw_cfg item name, NUL-terminated ascii */ 1246cec43e1SGabriel L. Somlo}; 1256cec43e1SGabriel L. Somlo 1266cec43e1SGabriel L. Somlo=== All Other Data Items === 1276cec43e1SGabriel L. Somlo 1286cec43e1SGabriel L. SomloPlease consult the QEMU source for the most up-to-date and authoritative 1296cec43e1SGabriel L. Somlolist of selector keys and their respective items' purpose and format. 1306cec43e1SGabriel L. Somlo 1316cec43e1SGabriel L. Somlo=== Ranges === 1326cec43e1SGabriel L. Somlo 1336cec43e1SGabriel L. SomloTheoretically, there may be up to 0x4000 generic firmware configuration 1346cec43e1SGabriel L. Somloitems, and up to 0x4000 architecturally specific ones. 1356cec43e1SGabriel L. Somlo 1366cec43e1SGabriel L. SomloSelector Reg. Range Usage 1376cec43e1SGabriel L. Somlo--------------- ----------- 1386cec43e1SGabriel L. Somlo0x0000 - 0x3fff Generic (0x0000 - 0x3fff, RO) 1396cec43e1SGabriel L. Somlo0x4000 - 0x7fff Generic (0x0000 - 0x3fff, RW, ignored in QEMU v2.4+) 1406cec43e1SGabriel L. Somlo0x8000 - 0xbfff Arch. Specific (0x0000 - 0x3fff, RO) 1416cec43e1SGabriel L. Somlo0xc000 - 0xffff Arch. Specific (0x0000 - 0x3fff, RW, ignored in v2.4+) 1426cec43e1SGabriel L. Somlo 1436cec43e1SGabriel L. SomloIn practice, the number of allowed firmware configuration items is given 1446cec43e1SGabriel L. Somloby the value of FW_CFG_MAX_ENTRY (see fw_cfg.h). 1456cec43e1SGabriel L. Somlo 146c9eae1d4SMarc Marí= Guest-side DMA Interface = 147c9eae1d4SMarc Marí 148c9eae1d4SMarc MaríIf bit 1 of the feature bitmap is set, the DMA interface is present. This does 149c9eae1d4SMarc Marínot replace the existing fw_cfg interface, it is an add-on. This interface 150c9eae1d4SMarc Marícan be used through the 64-bit wide address register. 151c9eae1d4SMarc Marí 152c9eae1d4SMarc MaríThe address register is in big-endian format. The value for the register is 0 153c9eae1d4SMarc Maríat startup and after an operation. A write to the least significant half (at 154c9eae1d4SMarc Maríoffset 4) triggers an operation. This means that operations with 32-bit 155c9eae1d4SMarc Maríaddresses can be triggered with just one write, whereas operations with 156c9eae1d4SMarc Marí64-bit addresses can be triggered with one 64-bit write or two 32-bit writes, 157c9eae1d4SMarc Marístarting with the most significant half (at offset 0). 158c9eae1d4SMarc Marí 159c9eae1d4SMarc MaríIn this register, the physical address of a FWCfgDmaAccess structure in RAM 160c9eae1d4SMarc Maríshould be written. This is the format of the FWCfgDmaAccess structure: 161c9eae1d4SMarc Marí 162c9eae1d4SMarc Marítypedef struct FWCfgDmaAccess { 163c9eae1d4SMarc Marí uint32_t control; 164c9eae1d4SMarc Marí uint32_t length; 165c9eae1d4SMarc Marí uint64_t address; 166c9eae1d4SMarc Marí} FWCfgDmaAccess; 167c9eae1d4SMarc Marí 168c9eae1d4SMarc MaríThe fields of the structure are in big endian mode, and the field at the lowest 169c9eae1d4SMarc Maríaddress is the "control" field. 170c9eae1d4SMarc Marí 171c9eae1d4SMarc MaríThe "control" field has the following bits: 172c9eae1d4SMarc Marí - Bit 0: Error 173c9eae1d4SMarc Marí - Bit 1: Read 174c9eae1d4SMarc Marí - Bit 2: Skip 175c9eae1d4SMarc Marí - Bit 3: Select. The upper 16 bits are the selected index. 176c9eae1d4SMarc Marí 177c9eae1d4SMarc MaríWhen an operation is triggered, if the "control" field has bit 3 set, the 178c9eae1d4SMarc Maríupper 16 bits are interpreted as an index of a firmware configuration item. 179c9eae1d4SMarc MaríThis has the same effect as writing the selector register. 180c9eae1d4SMarc Marí 181c9eae1d4SMarc MaríIf the "control" field has bit 1 set, a read operation will be performed. 182c9eae1d4SMarc Marí"length" bytes for the current selector and offset will be copied into the 183c9eae1d4SMarc Maríphysical RAM address specified by the "address" field. 184c9eae1d4SMarc Marí 185c9eae1d4SMarc MaríIf the "control" field has bit 2 set (and not bit 1), a skip operation will be 186c9eae1d4SMarc Maríperformed. The offset for the current selector will be advanced "length" bytes. 187c9eae1d4SMarc Marí 188c9eae1d4SMarc MaríTo check the result, read the "control" field: 189c9eae1d4SMarc Marí error bit set -> something went wrong. 190c9eae1d4SMarc Marí all bits cleared -> transfer finished successfully. 191c9eae1d4SMarc Marí otherwise -> transfer still in progress (doesn't happen 192c9eae1d4SMarc Marí today due to implementation not being async, 193c9eae1d4SMarc Marí but may in the future). 194c9eae1d4SMarc Marí 1956cec43e1SGabriel L. Somlo= Host-side API = 1966cec43e1SGabriel L. Somlo 1976cec43e1SGabriel L. SomloThe following functions are available to the QEMU programmer for adding 1986cec43e1SGabriel L. Somlodata to a fw_cfg device during guest initialization (see fw_cfg.h for 1996cec43e1SGabriel L. Somloeach function's complete prototype): 2006cec43e1SGabriel L. Somlo 2016cec43e1SGabriel L. Somlo== fw_cfg_add_bytes() == 2026cec43e1SGabriel L. Somlo 2036cec43e1SGabriel L. SomloGiven a selector key value, starting pointer, and size, create an item 2046cec43e1SGabriel L. Somloas a raw "blob" of the given size, available by selecting the given key. 2056cec43e1SGabriel L. SomloThe data referenced by the starting pointer is only linked, NOT copied, 2066cec43e1SGabriel L. Somlointo the data structure of the fw_cfg device. 2076cec43e1SGabriel L. Somlo 2086cec43e1SGabriel L. Somlo== fw_cfg_add_string() == 2096cec43e1SGabriel L. Somlo 2106cec43e1SGabriel L. SomloInstead of a starting pointer and size, this function accepts a pointer 2116cec43e1SGabriel L. Somloto a NUL-terminated ascii string, and inserts a newly allocated copy of 2126cec43e1SGabriel L. Somlothe string (including the NUL terminator) into the fw_cfg device data 2136cec43e1SGabriel L. Somlostructure. 2146cec43e1SGabriel L. Somlo 2156cec43e1SGabriel L. Somlo== fw_cfg_add_iXX() == 2166cec43e1SGabriel L. Somlo 2176cec43e1SGabriel L. SomloInsert an XX-bit item, where XX may be 16, 32, or 64. These functions 2186cec43e1SGabriel L. Somlowill convert a 16-, 32-, or 64-bit integer to little-endian, then add 2196cec43e1SGabriel L. Somloa dynamically allocated copy of the appropriately sized item to fw_cfg 2206cec43e1SGabriel L. Somlounder the given selector key value. 2216cec43e1SGabriel L. Somlo 22257c3d238SGabriel L. Somlo== fw_cfg_modify_iXX() == 22357c3d238SGabriel L. Somlo 22457c3d238SGabriel L. SomloModify the value of an XX-bit item (where XX may be 16, 32, or 64). 22557c3d238SGabriel L. SomloSimilarly to the corresponding fw_cfg_add_iXX() function set, convert 22657c3d238SGabriel L. Somloa 16-, 32-, or 64-bit integer to little endian, create a dynamically 22757c3d238SGabriel L. Somloallocated copy of the required size, and replace the existing item at 22857c3d238SGabriel L. Somlothe given selector key value with the newly allocated one. The previous 22957c3d238SGabriel L. Somloitem, assumed to have been allocated during an earlier call to 23057c3d238SGabriel L. Somlofw_cfg_add_iXX() or fw_cfg_modify_iXX() (of the same width XX), is freed 23157c3d238SGabriel L. Somlobefore the function returns. 23257c3d238SGabriel L. Somlo 2336cec43e1SGabriel L. Somlo== fw_cfg_add_file() == 2346cec43e1SGabriel L. Somlo 2356cec43e1SGabriel L. SomloGiven a filename (i.e., fw_cfg item name), starting pointer, and size, 2366cec43e1SGabriel L. Somlocreate an item as a raw "blob" of the given size. Unlike fw_cfg_add_bytes() 2376cec43e1SGabriel L. Somloabove, the next available selector key (above 0x0020, FW_CFG_FILE_FIRST) 2386cec43e1SGabriel L. Somlowill be used, and a new entry will be added to the file directory structure 2396cec43e1SGabriel L. Somlo(at key 0x0019), containing the item name, blob size, and automatically 2406cec43e1SGabriel L. Somloassigned selector key value. The data referenced by the starting pointer 2416cec43e1SGabriel L. Somlois only linked, NOT copied, into the fw_cfg data structure. 2426cec43e1SGabriel L. Somlo 2436cec43e1SGabriel L. Somlo== fw_cfg_add_file_callback() == 2446cec43e1SGabriel L. Somlo 2456cec43e1SGabriel L. SomloLike fw_cfg_add_file(), but additionally sets pointers to a callback 2466cec43e1SGabriel L. Somlofunction (and opaque argument), which will be executed host-side by 2476cec43e1SGabriel L. SomloQEMU each time a byte is read by the guest from this particular item. 2486cec43e1SGabriel L. Somlo 2496cec43e1SGabriel L. SomloNOTE: The callback function is given the opaque argument set by 2506cec43e1SGabriel L. Somlofw_cfg_add_file_callback(), but also the current data offset, 2516cec43e1SGabriel L. Somloallowing it the option of only acting upon specific offset values 2526cec43e1SGabriel L. Somlo(e.g., 0, before the first data byte of the selected item is 2536cec43e1SGabriel L. Somloreturned to the guest). 2546cec43e1SGabriel L. Somlo 2556cec43e1SGabriel L. Somlo== fw_cfg_modify_file() == 2566cec43e1SGabriel L. Somlo 2576cec43e1SGabriel L. SomloGiven a filename (i.e., fw_cfg item name), starting pointer, and size, 2586cec43e1SGabriel L. Somlocompletely replace the configuration item referenced by the given item 2596cec43e1SGabriel L. Somloname with the new given blob. If an existing blob is found, its 2606cec43e1SGabriel L. Somlocallback information is removed, and a pointer to the old data is 2616cec43e1SGabriel L. Somloreturned to allow the caller to free it, helping avoid memory leaks. 2626cec43e1SGabriel L. SomloIf a configuration item does not already exist under the given item 2636cec43e1SGabriel L. Somloname, a new item will be created as with fw_cfg_add_file(), and NULL 2646cec43e1SGabriel L. Somlois returned to the caller. In any case, the data referenced by the 2656cec43e1SGabriel L. Somlostarting pointer is only linked, NOT copied, into the fw_cfg data 2666cec43e1SGabriel L. Somlostructure. 2676cec43e1SGabriel L. Somlo 2686cec43e1SGabriel L. Somlo== fw_cfg_add_callback() == 2696cec43e1SGabriel L. Somlo 2706cec43e1SGabriel L. SomloLike fw_cfg_add_bytes(), but additionally sets pointers to a callback 2716cec43e1SGabriel L. Somlofunction (and opaque argument), which will be executed host-side by 2726cec43e1SGabriel L. SomloQEMU each time a guest-side write operation to this particular item 2736cec43e1SGabriel L. Somlocompletes fully overwriting the item's data. 2746cec43e1SGabriel L. Somlo 2756cec43e1SGabriel L. SomloNOTE: This function is deprecated, and will be completely removed 2766cec43e1SGabriel L. Somlostarting with QEMU v2.4. 27781b2b810SGabriel L. Somlo 27881b2b810SGabriel L. Somlo== Externally Provided Items == 27981b2b810SGabriel L. Somlo 28081b2b810SGabriel L. SomloAs of v2.4, "file" fw_cfg items (i.e., items with selector keys above 28181b2b810SGabriel L. SomloFW_CFG_FILE_FIRST, and with a corresponding entry in the fw_cfg file 28281b2b810SGabriel L. Somlodirectory structure) may be inserted via the QEMU command line, using 28381b2b810SGabriel L. Somlothe following syntax: 28481b2b810SGabriel L. Somlo 28581b2b810SGabriel L. Somlo -fw_cfg [name=]<item_name>,file=<path> 28681b2b810SGabriel L. Somlo 28781b2b810SGabriel L. Somlowhere <item_name> is the fw_cfg item name, and <path> is the location 28881b2b810SGabriel L. Somloon the host file system of a file containing the data to be inserted. 28981b2b810SGabriel L. Somlo 2906407d76eSGabriel L. SomloSmall enough items may be provided directly as strings on the command 2916407d76eSGabriel L. Somloline, using the syntax: 2926407d76eSGabriel L. Somlo 2936407d76eSGabriel L. Somlo -fw_cfg [name=]<item_name>,string=<string> 2946407d76eSGabriel L. Somlo 2956407d76eSGabriel L. SomloThe terminating NUL character of the content <string> will NOT be 2966407d76eSGabriel L. Somloincluded as part of the fw_cfg item data, which is consistent with 2976407d76eSGabriel L. Somlothe absence of a NUL terminator for items inserted via the file option. 2986407d76eSGabriel L. Somlo 2996407d76eSGabriel L. SomloBoth <item_name> and, if applicable, the content <string> are passed 3006407d76eSGabriel L. Somlothrough by QEMU without any interpretation, expansion, or further 3016407d76eSGabriel L. Somloprocessing. Any such processing (potentially performed e.g., by the shell) 3026407d76eSGabriel L. Somlois outside of QEMU's responsibility; as such, using plain ASCII characters 3036407d76eSGabriel L. Somlois recommended. 3046407d76eSGabriel L. Somlo 30581b2b810SGabriel L. SomloNOTE: Users *SHOULD* choose item names beginning with the prefix "opt/" 30681b2b810SGabriel L. Somlowhen using the "-fw_cfg" command line option, to avoid conflicting with 30781b2b810SGabriel L. Somloitem names used internally by QEMU. For instance: 30881b2b810SGabriel L. Somlo 30981b2b810SGabriel L. Somlo -fw_cfg name=opt/my_item_name,file=./my_blob.bin 31081b2b810SGabriel L. Somlo 31181b2b810SGabriel L. SomloSimilarly, QEMU developers *SHOULD NOT* use item names prefixed with 31281b2b810SGabriel L. Somlo"opt/" when inserting items programmatically, e.g. via fw_cfg_add_file(). 313