QEMU 与 ACPI BIOS 内存热插拔接口

ACPI BIOS 的 GPE.3 处理程序专门向操作系统通知内存热添加和热移除事件。

内存热插拔接口(I/O 端口 0xa00–0xa17,1–4 字节访问)

读取行为

[0x0-0x3]

内存设备物理地址低位部分。

[0x4-0x7]

内存设备物理地址高位部分。

[0x8-0xb]

内存设备字节大小低位部分。

[0xc-0xf]

内存设备字节大小高位部分。

[0x10-0x13]

内存设备邻近域。

[0x14]

内存设备状态字段。

位定义:

0:

设备已启用,客户机可使用。

1:

设备插入事件,用于识别尚未向 OSPM 发送设备检查事件的设备。 仅在位 1 已设置时有效。

2:

设备移除事件,用于识别尚未向 OSPM 发送设备弹出请求的设备。

3-7:

保留,OSPM 应忽略。

[0x15-0x17]

保留。

写入行为

[0x0-0x3]

内存设备插槽选择器,选择当前活动设备。 此后访问 0xa00–0xa17 其他寄存器时,均读写所选设备的数据。

[0x4-0x7]

OSPM 报告的 OST 事件码。

[0x8-0xb]

OSPM 报告的 OST 状态码。

[0xc-0x13]

保留,忽略写入。

[0x14]

内存设备控制字段。

位定义:

0:

保留,OSPM 写寄存器前必须清零。 2.4 之前版本的错误使此位在其他字段写入时未清零,因此必须保留,不能重新使用。

1:

写 1 清除设备插入事件。OSPM 为所选内存设备发出设备检查事件后设置。

2:

写 1 清除设备移除事件。OSPM 为所选内存设备发出设备弹出请求后设置。

3:

写 1 发起弹出。OSPM 触发内存设备移除并调用 _EJ0 时设置。

4-7:

保留,OSPM 写寄存器前必须清零。

选择超出现有范围的内存插槽不影响平台:

  • 忽略对上述未记录热插拔寄存器的写入。

  • 读取上述未记录寄存器时,所有位返回 1。

内存热移除流程图

+-------------+     +-----------------------+      +------------------+
|  1. QEMU    |     | 2. QEMU               |      |3. QEMU           |
|  device_del +---->+ 设备拔出请求          +----->+向客户机发 SCI,  |
|             |     |         cb            |      |控制权返回        |
|             |     |                       |      |管理层            |
+-------------+     +-----------------------+      +------------------+

+---------------------------------------------------------------------+

+---------------------+              +-------------------------+
| OSPM:               | 移除事件     | OSPM:                   |
| 发送弹出请求,      |              | 扫描内存设备            |
| 清除移除事件        +<-------------+ 查找事件标志            |
|                     |              |                         |
+---------------------+              +-------------------------+
          |
          |
+---------v--------+            +-----------------------+
| 客户机OS:        |  成功      | OSPM:                 |
| 处理弹出         +----------->+ 执行 _EJ0 方法,      |
| 请求             |            | 设置弹出标志位        |
+------------------+            +-----------------------+
          |失败                            |
          v                                v
+------------------------+      +-----------------------+
| OSPM:                  |      | QEMU:                 |
| 设置 OST 事件和状态    |      | 调用设备拔出回调      |
| 字段                   |      |                       |
+------------------------+      +-----------------------+
         |                                  |
         v                                  v
+------------------+              +-------------------+
|QEMU:             |              |QEMU:              |
|发送 OST QMP 事件 |              |发送设备删除       |
|                  |              |QMP 事件           |
+------------------+              |                   |
                                  +-------------------+