AMD SEV 和 SEV-ES 的 QEMU/客户机固件接口

概述

客户机固件镜像 OVMF 可能包含 QEMU 在客户机启动前使用的配置条目。 它们列在固件中已知位置、以 GUID 标识的表中。 QEMU 将固件加载到内存时解析该表,需要时读取各条目值。

表结构本身并不专用于 SEV,但目前所有条目都与 SEV、SEV-ES 功能有关。

QEMU 中的表解析

从表尾开始解析:先验证 0xffffffd0 处是否存在表尾 GUID 96b582de-1fb2-45f7-baea-a366c55a082d。 存在时,0xffffffce 处的两个字节表示整个表的长度。

随后向前反向扫描,寻找指定条目 GUID。

相关 QEMU 文件:

  • hw/i386/pc_sysfw_ovmf.c

构造此结构的 edk2 代码位于 OVMF Reset Vector file。

表内存布局

GPA

长度

描述

0xffffff80

4

零填充

0xffffff84

4

SEV 哈希表基址

0xffffff88

4

SEV 哈希表大小(0x400)

0xffffff8c

2

SEV 哈希表条目长度(0x1a)

0xffffff8e

16

SEV 哈希表 GUID:7255371f-3a3b-4b04-927b-1da6efa8d454

0xffffff9e

4

SEV 秘密数据块基址

0xffffffa2

4

SEV 秘密数据块大小(0xc00)

0xffffffa6

2

SEV 秘密数据块条目长度(0x1a)

0xffffffa8

16

SEV 秘密数据块 GUID:4c2eb361-7d9b-4cc3-8081-127c90d3d294

0xffffffb8

4

SEV-ES AP 复位 RIP

0xffffffbc

2

SEV-ES 复位块条目长度(0x16)

0xffffffbe

16

SEV-ES 复位块条目 GUID:00f771de-1a7e-4fcb-890e-68c77e2fb44e

0xffffffce

2

整个表的长度,含表尾 GUID 和长度字段(0x72)

0xffffffd0

16

OVMF GUID 表的表尾 GUID:96b582de-1fb2-45f7-baea-a366c55a082d

0xffffffe0

8

应用处理器入口代码

0xffffffe8

8

"0000VTF0"

0xfffffff0

16

复位向量代码

表条目说明

SEV-ES 复位块

条目 GUID:00f771de-1a7e-4fcb-890e-68c77e2fb44e

SEV-ES 下 AP 首次启动时,复位 RIP 必须设为此条目定义的 RAM 区域。 条目格式:

  • IP 值 [0:15]

  • CS 段基址 [31:16]

虚拟机管理器读取 CS 段基址和 IP。 其中的 CS 基址值表示实际段基址的高 16 位,因此必须左移 16 位, 形成写入 CS 段寄存器的完整基址;EIP 则设为直接读取的 IP 值。

SEV 秘密数据块

条目 GUID:4c2eb361-7d9b-4cc3-8081-127c90d3d294

描述虚拟机管理器通过 SEV_LAUNCH_SECRET 注入客户机所有者秘密数据的客户机 RAM 区域。

SEV 哈希表

条目 GUID:7255371f-3a3b-4b04-927b-1da6efa8d454

描述虚拟机管理器应安装哈希表的客户机 RAM 区域。 表记录特定固件配置设备文件的哈希,否则这些文件将未经检查地传入。 目前用于内核、initrd 和命令行值,将来可能增加其他内容。