SIMICS-QSP-x86-6.0.53 会导致 PCIe MCFG 0xe0100000访问错误,这在 6.0.44 上不会发生



我正在为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             │  │                │            │      │    │     │    │
└────────────────┴────────────────┴──┴────────────────┴────────────┴──────┴────┴─────┴────┘

相关内容

  • 没有找到相关文章

最新更新