1==================================================== 2QEMU/Guest Firmware Interface for AMD SEV and SEV-ES 3==================================================== 4 5Overview 6======== 7 8The guest firmware image (OVMF) may contain some configuration entries 9which are used by QEMU before the guest launches. These are listed in a 10GUIDed table at a known location in the firmware image. QEMU parses 11this table when it loads the firmware image into memory, and then QEMU 12reads individual entries when their values are needed. 13 14Though nothing in the table structure is SEV-specific, currently all the 15entries in the table are related to SEV and SEV-ES features. 16 17 18Table parsing in QEMU 19--------------------- 20 21The table is parsed from the footer: first the presence of the table 22footer GUID (96b582de-1fb2-45f7-baea-a366c55a082d) at 0xffffffd0 is 23verified. If that is found, two bytes at 0xffffffce are the entire 24table length. 25 26Then the table is scanned backwards looking for the specific entry GUID. 27 28QEMU files related to parsing and scanning the OVMF table: 29 - ``hw/i386/pc_sysfw_ovmf.c`` 30 31The edk2 firmware code that constructs this structure is in the 32`OVMF Reset Vector file`_. 33 34 35Table memory layout 36------------------- 37 38+------------+--------+-----------------------------------------+ 39| GPA | Length | Description | 40+============+========+=========================================+ 41| 0xffffff80 | 4 | Zero padding | 42+------------+--------+-----------------------------------------+ 43| 0xffffff84 | 4 | SEV hashes table base address | 44+------------+--------+-----------------------------------------+ 45| 0xffffff88 | 4 | SEV hashes table size (=0x400) | 46+------------+--------+-----------------------------------------+ 47| 0xffffff8c | 2 | SEV hashes table entry length (=0x1a) | 48+------------+--------+-----------------------------------------+ 49| 0xffffff8e | 16 | SEV hashes table GUID: | 50| | | 7255371f-3a3b-4b04-927b-1da6efa8d454 | 51+------------+--------+-----------------------------------------+ 52| 0xffffff9e | 4 | SEV secret block base address | 53+------------+--------+-----------------------------------------+ 54| 0xffffffa2 | 4 | SEV secret block size (=0xc00) | 55+------------+--------+-----------------------------------------+ 56| 0xffffffa6 | 2 | SEV secret block entry length (=0x1a) | 57+------------+--------+-----------------------------------------+ 58| 0xffffffa8 | 16 | SEV secret block GUID: | 59| | | 4c2eb361-7d9b-4cc3-8081-127c90d3d294 | 60+------------+--------+-----------------------------------------+ 61| 0xffffffb8 | 4 | SEV-ES AP reset RIP | 62+------------+--------+-----------------------------------------+ 63| 0xffffffbc | 2 | SEV-ES reset block entry length (=0x16) | 64+------------+--------+-----------------------------------------+ 65| 0xffffffbe | 16 | SEV-ES reset block entry GUID: | 66| | | 00f771de-1a7e-4fcb-890e-68c77e2fb44e | 67+------------+--------+-----------------------------------------+ 68| 0xffffffce | 2 | Length of entire table including table | 69| | | footer GUID and length (=0x72) | 70+------------+--------+-----------------------------------------+ 71| 0xffffffd0 | 16 | OVMF GUIDed table footer GUID: | 72| | | 96b582de-1fb2-45f7-baea-a366c55a082d | 73+------------+--------+-----------------------------------------+ 74| 0xffffffe0 | 8 | Application processor entry point code | 75+------------+--------+-----------------------------------------+ 76| 0xffffffe8 | 8 | "\0\0\0\0VTF\0" | 77+------------+--------+-----------------------------------------+ 78| 0xfffffff0 | 16 | Reset vector code | 79+------------+--------+-----------------------------------------+ 80 81 82Table entries description 83========================= 84 85SEV-ES reset block 86------------------ 87 88Entry GUID: 00f771de-1a7e-4fcb-890e-68c77e2fb44e 89 90For the initial boot of an AP under SEV-ES, the "reset" RIP must be 91programmed to the RAM area defined by this entry. The entry's format 92is: 93 94* IP value [0:15] 95* CS segment base [31:16] 96 97A hypervisor reads the CS segment base and IP value. The CS segment 98base value represents the high order 16-bits of the CS segment base, so 99the hypervisor must left shift the value of the CS segment base by 16 100bits to form the full CS segment base for the CS segment register. It 101would then program the EIP register with the IP value as read. 102 103 104SEV secret block 105---------------- 106 107Entry GUID: 4c2eb361-7d9b-4cc3-8081-127c90d3d294 108 109This describes the guest RAM area where the hypervisor should inject the 110Guest Owner secret (using SEV_LAUNCH_SECRET). 111 112 113SEV hashes table 114---------------- 115 116Entry GUID: 7255371f-3a3b-4b04-927b-1da6efa8d454 117 118This describes the guest RAM area where the hypervisor should install a 119table describing the hashes of certain firmware configuration device 120files that would otherwise be passed in unchecked. The current use is 121for the kernel, initrd and command line values, but others may be added. 122 123 124.. _OVMF Reset Vector file: 125 https://github.com/tianocore/edk2/blob/master/OvmfPkg/ResetVector/Ia16/ResetVectorVtf0.asm 126