我正在为QSP移植UEFI BIOS,最近尝试了新版本2021.50,但发现引导失败。我的BIOS使用pcie-mcfg内存空间0xe000000~0xf0000000进行pci设备枚举,这会在simics-qsp-x86-6.0.53上造成问题。Simics停止,Simics日志显示
4364572099 board.mb.cpu0.mem[0]错误0在0xe100000访问(写入4个字节(,没有映射任何内容。
我试图打开ignore_unmapped_writes,但它仍然失败。
board.mb.cpu0.mem[0]->ignore_unmapped_writes=真
还可以尝试通过将mcfg范围添加到board.mb.cpu0.mem[0]
board.mb.cpu0.mem[0][0]。添加映射板.mb.socket[0]。qpi_arch.port.cfg 0xe0000000x10000000
但仍然无法工作。这让我很烦恼,请帮帮我!
bios在simics-qsp-x86-6.0.44上运行没有问题。
分析
更新两次:
这里的问题似乎是如何启用PCIe ECAM。首次启动QSP时,对0xe000_0000的访问将进入RAM。然后,PCIe系统由UEFI初始化(在QPI控制器中写入PCIEXBAR寄存器(,并访问0xe000_0000,访问PCI配置空间。使用标准QSP UEFI,PCIEXBAR被写入,mcfg空间显示在QSP 6.0.42和6.0.53中。
Simics中PCIe的实现在这两个版本之间确实发生了变化。最新的QSP版本中使用了一个新的PCIe库,它改变了PCIe的内部结构。这解释了在最新的QSP中进入内存访问路径的转换器,而在旧模型中有一个不透明的对象。软件功能相同,模型实现方式不同。
要在新型号中发现对PCIEXBAR的写入,请使用以下Simics CLI命令:
simics> print-device-regs "board.mb.socket[0].qpi_arch"
查看插槽0的设备寄存器,默认情况下,所有处理器核心都位于插槽0中。
要在UEFI写入寄存器时停止,请执行以下操作:
simics> break-io device = "board.mb.socket[0].qpi_arch.bank.f1"
在断点之前,pci_bus内存的映射如下所示:
simics> board.mb.nb.pci_bus.port.mem.map
┌───────────┬───────────────────────┬──┬──────┬───────────┬───────────────────┬────┬─────┬────┐
│ Base│Object │Fn│Offset│ Length│Target │Prio│Align│Swap│
├───────────┼───────────────────────┼──┼──────┼───────────┼───────────────────┼────┼─────┼────┤
│0x000a_0000│board.mb.gpu.dmap_space│ │0x0000│0x0002_0000│ │ 0│ │ │
│0x000c_0000│board.mb.shadow │ │0x0000│0x0004_0000│board.mb.shadow_mem│ 1│ │ │
│0xfec0_0000│board.mb.sb.ioapic │ │0x0000│ 0x0020│ │ -1│ 8│ │
│0xffe0_0000│board.mb.rom │ │0x0000│0x0020_0000│ │ 0│ │ │
│ -default-│board.mb.dram_space │ │0x0000│ │ │ │ │ │
└───────────┴───────────────────────┴──┴──────┴───────────┴───────────────────┴────┴─────┴────┘
然后在写入寄存器之后:
simics> board.mb.nb.pci_bus.port.mem.map
┌───────────┬─────────────────────────────────────┬──┬──────┬───────────┬───────────────────┬────┬─────┬────┐
│ Base│Object │Fn│Offset│ Length│Target │Prio│Align│Swap│
├───────────┼─────────────────────────────────────┼──┼──────┼───────────┼───────────────────┼────┼─────┼────┤
│0x000a_0000│board.mb.gpu.dmap_space │ │0x0000│0x0002_0000│ │ 0│ │ │
│0x000c_0000│board.mb.shadow │ │0x0000│0x0004_0000│board.mb.shadow_mem│ 1│ │ │
│0xe000_0000│board.mb.socket[0].qpi_arch.port.mcfg│ │0x0000│0x1000_0000│ │ 0│ │ │
│0xfec0_0000│board.mb.sb.ioapic │ │0x0000│ 0x0020│ │ -1│ 8│ │
│0xffe0_0000│board.mb.rom │ │0x0000│0x0020_0000│ │ 0│ │ │
│ -default-│board.mb.dram_space │ │0x0000│ │ │ │ │ │
└───────────┴─────────────────────────────────────┴──┴──────┴───────────┴───────────────────┴────┴─────┴────┘
因此,问题实际上是UEFI正在写什么来激活PCIEXBAR,以及它在旧型号中是如何工作的,而在新型号中却没有。
UEFI运行后
虚拟几秒钟后,随着PCIe ECAM的启用,内存映射将发生更改。
新QSP:
simics> probe-address p:0xe000_0000
┌─────────────────────────────────────┬───────────┬─────┐
│ Target │ Offset │Notes│
├─────────────────────────────────────┼───────────┼─────┤
│board.mb.cpu0.mem[0][0] │0xe000_0000│ │
│board.mb.phys_mem │0xe000_0000│ │
│board.mb.nb.pci_bus.port.mem │0xe000_0000│~ │
│board.mb.nb.pci_bus.mem_space │0xe000_0000│ │
│board.mb.socket[0].qpi_arch.port.mcfg│0x0000_0000│* │
│board.mb.nb.pci_bus.port.cfg │0x0000_0000│~ │
│board.mb.nb.pci_bus.cfg_space │0x0000_0000│ │
│board.mb.nb.bridge.bank.pcie_config │0x0000_0000│ │
└─────────────────────────────────────┴───────────┴─────┘
'*' - Translator implementing 'translator' interface
'~' - Translator implementing 'transaction_translator' interface
Destination: board.mb.nb.bridge.bank.pcie_config offset 0x0
Register: vendor_id @ 0x0 (2 bytes) + 0
旧的QSP(具有功能较弱的CLI探测命令(:
simics> probe-address p:0xe0000000
┌─────────────────────────┬───────────┬─────┐
│ Target │ Offset │Notes│
├─────────────────────────┼───────────┼─────┤
│board.mb.cpu0.mem[0][0] │0xe000_0000│ │
│board.mb.phys_mem │0xe000_0000│ │
│board.mb.nb.pci_mem │0xe000_0000│ │
│board.mb.socket_sad_f1[0]│0x0000_0000│ │
└─────────────────────────┴───────────┴─────┘
Destination: board.mb.socket_sad_f1[0] offset 0x0 - no register information available
模拟初始状态
调出目标的两个版本,检查物理内存映射。
看看新的QSP,在运行任何代码之前,从targets/qsp-x86/qsp-clear-linux.simics
脚本开始,我看到的是:
simics> probe-address obj = "board.mb.cpu0.mem[0][0]" p:0xe010_0000
┌─────────────────────────────┬───────────┬─────┐
│ Target │ Offset │Notes│
├─────────────────────────────┼───────────┼─────┤
│board.mb.cpu0.mem[0][0] │0xe010_0000│ │
│board.mb.phys_mem │0xe010_0000│ │
│board.mb.nb.pci_bus.port.mem │0xe010_0000│~ │
│board.mb.nb.pci_bus.mem_space│0xe010_0000│ │
│board.mb.dram_space │0xe010_0000│ │
│board.mb.ram │0xe010_0000│ │
└─────────────────────────────┴───────────┴─────┘
'~' - Translator implementing 'transaction_translator' interface
Destination: board.mb.ram offset 0xe0100000
simics> board.mb.cpu0.mem[0][0].map
┌───────────┬────────────────────────┬──┬──────┬──────┬──────┬────┬─────┬────┐
│ Base│Object │Fn│Offset│Length│Target│Prio│Align│Swap│
├───────────┼────────────────────────┼──┼──────┼──────┼──────┼────┼─────┼────┤
│0xfee0_0000│board.mb.cpu0.apic[0][0]│ │0x0000│0x1000│ │ 0│ 8│ │
│ -default-│board.mb.phys_mem │ │0x0000│ │ │ │ │ │
└───────────┴────────────────────────┴──┴──────┴──────┴──────┴────┴─────┴────┘
simics> board.mb.phys_mem.map
┌────────────────┬────────────────┬──┬────────────────┬────────────┬──────┬────┬─────┬────┐
│ Base│Object │Fn│ Offset│ Length│Target│Prio│Align│Swap│
├────────────────┼────────────────┼──┼────────────────┼────────────┼──────┼────┼─────┼────┤
│ 0x0000│board.mb.dram_ │ │ 0x0000│ 0x000a_0000│ │ 0│ │ │
│ │space │ │ │ │ │ │ │ │
├────────────────┼────────────────┼──┼────────────────┼────────────┼──────┼────┼─────┼────┤
│ 0x0010_0000│board.mb.dram_ │ │ 0x0010_0000│ 0xdff0_0000│ │ 0│ │ │
│ │space │ │ │ │ │ │ │ │
├────────────────┼────────────────┼──┼────────────────┼────────────┼──────┼────┼─────┼────┤
│0x0001_0000_0000│board.mb.dram_ │ │0x0001_0000_0000│0x0001_0000_│ │ 0│ │ │
│ │space │ │ │ 0000│ │ │ │ │
├────────────────┼────────────────┼──┼────────────────┼────────────┼──────┼────┼─────┼────┤
│ -default-│board.mb.nb.pci_│ │ 0x0000│ │ │ │ │ │
│ │bus.port.mem │ │ │ │ │ │ │ │
└────────────────┴────────────────┴──┴────────────────┴────────────┴──────┴────┴─────┴────┘
也就是说,那个位置应该是RAM。
您不能忽略未映射的写入—如果您想在那里保存一些状态,则需要将内存或某些设备映射到物理内存中。如果处理器被告知将数据写入位置"0",则处理器不能做太多合理的工作;在空隙中";。
那么,你的UEFI期望在这些地址是什么?如何模拟PCIe访问?
在Simics QSP 6.0.44中,图片看起来类似:
simics> probe-address obj = "board.mb.cpu0.mem[0][0]" p:0xe010_0000
┌───────────────────────┬───────────┬─────┐
│ Target │ Offset │Notes│
├───────────────────────┼───────────┼─────┤
│board.mb.cpu0.mem[0][0]│0xe010_0000│ │
│board.mb.phys_mem │0xe010_0000│ │
│board.mb.nb.pci_mem │0xe010_0000│ │
│board.mb.dram_space │0xe010_0000│ │
│board.mb.ram │0xe010_0000│ │
└───────────────────────┴───────────┴─────┘
Destination: board.mb.ram offset 0xe0100000
simics> board.mb.cpu0.mem[0][0].map
┌───────────┬────────────────────────┬──┬──────┬──────┬──────┬────┬─────┬────┐
│ Base│Object │Fn│Offset│Length│Target│Prio│Align│Swap│
├───────────┼────────────────────────┼──┼──────┼──────┼──────┼────┼─────┼────┤
│0xfee0_0000│board.mb.cpu0.apic[0][0]│ │0x0000│0x1000│ │ 0│ 8│ │
│ -default-│board.mb.phys_mem │ │0x0000│ │ │ │ │ │
└───────────┴────────────────────────┴──┴──────┴──────┴──────┴────┴─────┴────┘
simics> board.mb.phys_mem.map
┌────────────────┬────────────────┬──┬────────────────┬────────────┬──────┬────┬─────┬────┐
│ Base│Object │Fn│ Offset│ Length│Target│Prio│Align│Swap│
├────────────────┼────────────────┼──┼────────────────┼────────────┼──────┼────┼─────┼────┤
│ 0x0000│board.mb.dram_ │ │ 0x0000│ 0x000a_0000│ │ 0│ │ │
│ │space │ │ │ │ │ │ │ │
├────────────────┼────────────────┼──┼────────────────┼────────────┼──────┼────┼─────┼────┤
│ 0x0010_0000│board.mb.dram_ │ │ 0x0010_0000│ 0xdff0_0000│ │ 0│ │ │
│ │space │ │ │ │ │ │ │ │
├────────────────┼────────────────┼──┼────────────────┼────────────┼──────┼────┼─────┼────┤
│0x0001_0000_0000│board.mb.dram_ │ │0x0001_0000_0000│0x0001_0000_│ │ 0│ │ │
│ │space │ │ │ 0000│ │ │ │ │
├────────────────┼────────────────┼──┼────────────────┼────────────┼──────┼────┼─────┼────┤
│ -default-│board.mb.nb.pci_│ │ 0x0000│ │ │ │ │ │
│ │mem │ │ │ │ │ │ │ │
└────────────────┴────────────────┴──┴────────────────┴────────────┴──────┴────┴─────┴────┘