On 22/09/2024 14:11, Ricardo Ribalda wrote:

Hi Mark

On Sun, 22 Sept 2024 at 13:57, Mark Cave-Ayland
<mark.cave-ayl...@ilande.co.uk> wrote:

On 21/08/2024 15:45, Igor Mammedov wrote:

On Wed, 14 Aug 2024 11:56:08 +0000
Ricardo Ribalda <riba...@chromium.org> wrote:

Today for x86 the _PRT() table is computed in runtime.
Under some configurations, computing the _PRT table can take more than
30 seconds and the ACPI timeout is violated.

This patchset modifies _PRT() to return a pre-computed table.

To be sure we are not breaking anything boot tested it with
rhel6.7/9.0, winxp, ws2022

Hi Ricardo/Igor,

Unfortunately it seems that this series (and in particular commit 99cb2c6c7b
("hw/i386/acpi-build: Return a pre-computed _PRT table") breaks my WinXP ISO 
boot
test case using the dc390/am53C974 SCSI device.

Current master hangs when booting WinXP from a dc390 SCSI CD just after loading 
the
kernel device drivers and displaying "Setup is starting Windows" instead of
proceeding to the "Welcome to Setup" screen.

Note that there is a separate timeout issue caused by a bug in SeaBIOS which is 
fixed
in the SeaBIOS repository as commit 2424e4c0 ("esp-scsi: indicate acceptance of
MESSAGE IN phase data"). As the QEMU SeaBIOS binaries haven't yet been updated 
to
contain this fix, I've uploaded a pre-built bios.bin to
https://www.ilande.co.uk/tmp/qemu/bios.bin to help reproduce the issue.

Once the above file is downloaded the issue can be reproduced with the command 
line
below:

./qemu-system-x86_64 \
    -m 1G \
    -device dc390,id=scsi0 \
    -device scsi-cd,drive=drive0,bus=scsi0.0,channel=0,scsi-id=6,lun=0 \
    -drive file=winxp.iso,if=none,id=drive0 \
    -vga cirrus \
    -boot d \
    -trace 'esp*' \
    -bios bios.bin

With the ESP tracing enabled it is possible to see that WinXP appears to get 
stuck in
a loop trying to send a SCSI command followed by a "Bus Reset". Reverting 
99cb2c6c7b
allows the WinXP ISO to boot to the "Welcome to Setup" screen as before.


ATB,

Mark.

Thanks for the detailed report, and sorry for breaking your testcase.

I managed to reproduce locally.

Could you check if this patch fixes your issue and the rest of your testcases?
If so, I will prepare a proper patchset.

Thanks!

diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 4967aa7459..e7db51afba 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -741,7 +741,7 @@ static Aml *build_prt(bool is_pci0_prt)
      int pin;

      method = aml_method("_PRT", 0, AML_NOTSERIALIZED);
-    rt_pkg = aml_varpackage(nroutes);
+    rt_pkg = aml_package(nroutes);

      for (pin = 0; pin < nroutes; pin++) {
          Aml *pkg = aml_package(4);

Hi Ricardo,

I can confirm that the above patch fixes my particular test case here - thanks so much for the quick reply!


ATB,

Mark.

Changelog v3->v4 Thanks Richard:
- Make link_name struct static

Changelog v3->v4 Thanks Igor:
- Add missing files to tests/qtest/bios-tables-test-allowed-diff.h

Changelog v2->v3 Thanks Michael:
- Code style
- Add cover letter

Ricardo Ribalda (3):
    tests/acpi: pc: allow DSDT acpi table changes
    hw/i386/acpi-build: Return a pre-computed _PRT table
    tests/acpi: pc: update golden masters for DSDT

   hw/i386/acpi-build.c                 | 120 +++++----------------------
   tests/data/acpi/x86/pc/DSDT          | Bin 6830 -> 8527 bytes
   tests/data/acpi/x86/pc/DSDT.acpierst | Bin 6741 -> 8438 bytes
   tests/data/acpi/x86/pc/DSDT.acpihmat | Bin 8155 -> 9852 bytes
   tests/data/acpi/x86/pc/DSDT.bridge   | Bin 13701 -> 15398 bytes
   tests/data/acpi/x86/pc/DSDT.cphp     | Bin 7294 -> 8991 bytes
   tests/data/acpi/x86/pc/DSDT.dimmpxm  | Bin 8484 -> 10181 bytes
   tests/data/acpi/x86/pc/DSDT.hpbridge | Bin 6781 -> 8478 bytes
   tests/data/acpi/x86/pc/DSDT.hpbrroot | Bin 3337 -> 5034 bytes
   tests/data/acpi/x86/pc/DSDT.ipmikcs  | Bin 6902 -> 8599 bytes
   tests/data/acpi/x86/pc/DSDT.memhp    | Bin 8189 -> 9886 bytes
   tests/data/acpi/x86/pc/DSDT.nohpet   | Bin 6688 -> 8385 bytes
   tests/data/acpi/x86/pc/DSDT.numamem  | Bin 6836 -> 8533 bytes
   tests/data/acpi/x86/pc/DSDT.roothp   | Bin 10623 -> 12320 bytes
   tests/data/acpi/x86/q35/DSDT.cxl     | Bin 9714 -> 13148 bytes
   tests/data/acpi/x86/q35/DSDT.viot    | Bin 9464 -> 14615 bytes
   16 files changed, 22 insertions(+), 98 deletions(-)


Reply via email to