Bug 51859
| Summary: | Не отображается nvme диск в boot menu при RAM > 3Gb | ||||||||
|---|---|---|---|---|---|---|---|---|---|
| Product: | Sisyphus | Reporter: | Sergey Ivanov <zagagyka> | ||||||
| Component: | seabios | Assignee: | Alexey Shabalin <shaba> | ||||||
| Status: | NEW --- | QA Contact: | qa-sisyphus | ||||||
| Severity: | normal | ||||||||
| Priority: | P5 | CC: | glebfm, iv, shaba, vt | ||||||
| Version: | unstable | ||||||||
| Hardware: | x86_64 | ||||||||
| OS: | Linux | ||||||||
| Attachments: |
|
||||||||
Created attachment 17072 [details]
3Gb RAM
Проблема наблюдалась на qemu 9.0.2. Сейчас в Sisyphus qemu 10.2.4 с обновлённым SeaBIOS. Если nvme по-прежнему не отображается в boot menu на текущей версии — заведите новый баг. В Sisyphus на версии qemu-10.2.4-alt1 ошибка воспроизводится Если к вызову qemu добавить такую строку: -chardev stdio,id=seabios -device isa-debugcon,iobase=0x402,chardev=seabios\ то в stdout можно увидеть логи seabios и попытаться понять, что происходит. У меня тут пока только Intel Core i5-11400, поэтому потыкал в 3 конфигурации: - 3Gb, -cpu=host, NVME есть - 4Gb, -cpu=host, NVME нет, то есть проблема воспроизводится - 4Gb, -cpu=qemu64, NVME есть В логах seabious можно заметить, что в конфигурации, когда проблема воспроизводится, NVME (устройство bdf=00:04.0 id=1b36:0010) отображается на другой адрес, далеко за пределами младших 4Gb, и у seabios не получается с ним работать. 3Gb (нет проблем): PCI: IO: c000 - c04f PCI: 32: 00000000c0000000 - 00000000fec00000 PCI: map device bdf=00:03.0 bar 1, addr 0000c000, size 00000040 [io] PCI: map device bdf=00:01.1 bar 4, addr 0000c040, size 00000010 [io] PCI: map device bdf=00:03.0 bar 6, addr feb80000, size 00040000 [mem] PCI: map device bdf=00:03.0 bar 0, addr febc0000, size 00020000 [mem] PCI: map device bdf=00:02.0 bar 6, addr febe0000, size 00010000 [mem] PCI: map device bdf=00:04.0 bar 0, addr febf0000, size 00004000 [mem] PCI: map device bdf=00:02.0 bar 2, addr febf4000, size 00001000 [mem] PCI: map device bdf=00:02.0 bar 0, addr fd000000, size 01000000 [prefmem] 4 Gb (проблема воспроизводится): PCI: IO: c000 - c04f PCI: 32: 00000000c0000000 - 00000000fec00000 PCI: 64: 0000007000000000 - 0000007040000000 PCI: map device bdf=00:04.0 bar 0, addr 7000000000, size 00004000 [mem] PCI: map device bdf=00:03.0 bar 1, addr 0000c000, size 00000040 [io] PCI: map device bdf=00:01.1 bar 4, addr 0000c040, size 00000010 [io] PCI: map device bdf=00:03.0 bar 6, addr feb80000, size 00040000 [mem] PCI: map device bdf=00:03.0 bar 0, addr febc0000, size 00020000 [mem] PCI: map device bdf=00:02.0 bar 6, addr febe0000, size 00010000 [mem] PCI: map device bdf=00:02.0 bar 2, addr febf0000, size 00001000 [mem] PCI: map device bdf=00:02.0 bar 0, addr fd000000, size 01000000 [prefmem] [...] Can not map memory bar over 4Gig Вряд ли seabios научится когда-нибудь работать с 64-битными адресами, так что могу рекомендовать только workaround'ы - как-то отключить такое поведение qemu; - перейти на OVMF fimrware. У NVME в QEMU BAR0 всегда 64-битный:
pci_register_bar(pci_dev, 0, PCI_BASE_ADDRESS_SPACE_MEMORY |
PCI_BASE_ADDRESS_MEM_TYPE_64, &n->bar0);
В случае, если памяти >= 4G и у процессора достаточно бит в физических адресах, seabios создаёт для PCI устройств второе окно. В моём случае это
PCI: 64: 0000007000000000 - 0000007040000000
В это второе окно отправляются все 64-битные BAR'ы. И это, видимо, очень хорошее, правильное поведение.
Однако сам seabios не умеет работать с BAR'ами, замапленными выше 4Gb -- по крайней мере наш, 1.16.3, и в мастере я не вижу чтобы что-нибудь поменялось. Из-за этого NVME в seabios не видно, оно будет работать потом, в уже загруженной операционной системе.
Как это преодолеть?
- перейти на efi/OVMF, или
- не пытаться загружаться с эмулируемого NVME или ставить памяти поменьше, или
- искуственно уменьшить заявленное количество бит в физическом адресе у CPU до 32-35, например так: -cpu host,phys-bits=35
Как это исправить нормально? Мне кажется, исправить это можно только серьёзно сломав что-то другое. Разве что найдётся способ научить seabios рабоать с BAR'ами замапленными выше 32 бит, но вряд ли кто-то будет этим заниматься.
Перевешу на seabios, но по-моему это WONTFIX.
|

Description
Sergey Ivanov 2024-10-28 12:18:27 MSKCreated attachment 17071 [details] 4Gb RAM Система: alt-server-10.2-x86_64.iso (обновленная до sisyphus) Пакет: qemu-9.0.2-alt2.x86_64 Ядро: 6.6.58-un-def-alt1 Шаги воспроизведения: Запустить виртуальную машину с эмуляцией nvme диска: # qemu-img create -f qcow2 ~/disk.qcow2 25G # /usr/bin/qemu-system-x86_64 \ -m 4096 \ -cpu qemu64 \ -boot menu=on \ -enable-kvm \ -vnc :1 \ -blockdev driver=file,node-name=hd0-file,filename=/root/disk.qcow2,cache.no-flush=on \ -blockdev driver=qcow2,node-name=hd0,file=hd0-file,cache.no-flush=on,discard=unmap \ -device nvme,id=hd0-device,drive=hd0,serial=hd0 Подключиться по VNC к данной машине и перейти в boot menu $ vncviewer 192.168.0.1:5901 -Shared Результат: В boot menu не отображается nvme диск, указанный в параметрах виртуалки (скриншот 4gb.png). Соответственно нет возможности загрузить установленную систему Примечание 1: Если указать объем оперативной памяти 3072 Mb (-m 3072), то диск отображается в boot menu (скриншот 3gb.png) Примечание 2: Если указать другой тип диска, например virtio-blk или scsi-hd (-device virtio-blk,id=hd0-device,drive=hd0,serial=hd0), то этот диск отображается в boot menu Примечание 3: Данная ошибка у меня воспроизводится только на машинах с процессорами amd. Проверял на: AMD Ryzen 5 8600G with Radeon 760M Graphics AMD EPYC 7262 8-Core Processor AMD EPYC 9754 128-Core Processor На процессорах Intel: Intel(R) Core(TM) i5-14600K To Be Filled By O.E.M. CPU @ 3.5GHz Intel(R) Xeon(R) Gold 5218R CPU @ 2.10GHz данная ошибка у меня не воспроизводится. НО воспроизводится если выставить параметр -cpu host