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 事件 |
+------------------+ | |
+-------------------+