Hello!

Problem fixed! I resolved ACPI panic when booting OpenBSD7.4 as guest VM under Hyper-V Server 2012R2 in UEFI (Generation 2) mode with this simple patch:

--- usr/src/sys/dev/acpi/dsdt.c.orig    Tue Dec 19 07:49:12 2023
+++ usr/src/sys/dev/acpi/dsdt.c Wed Dec 20 07:43:05 2023
@@ -3742,7 +3742,7 @@
        struct acpi_dsdt *p_dsdt;
        struct acpi_q *entry;

-       if (strlen(rootpath) > 0)
+       if (strlen(rootpath) > 1 || ( strlen(rootpath)==1 && *rootpath != '\\') 
)
                aml_die("LoadTable: RootPathString unsupported");
        if (strlen(parameterpath) > 0)
                aml_die("LoadTable: ParameterPathString unsupported");

The 7.4 kernel booted fine and I was able to install OpenBSD over serial console (I was unable to make working efifb0 console). Here are relevant boot messages from ACPI:

cpihve0 at acpi0
"ACPI0004" at acpi0 not configured
"VMBus" at acpi0 not configured
"Hyper_V_Gen_Counter_V1" at acpi0 not configured
acpicmos0 at acpi0
com0 at acpi0 UAR1 addr 0x3f8/0x8 irq 4: ns16550a, 16 byte fifo
com0: console
com1 at acpi0 UAR2 addr 0x2f8/0x8 irq 3: ns16550a, 16 byte fifo
acpicpu at acpi0 not configured
pvbus0 at mainbus0: Hyper-V 6.3
hyperv0 at pvbus0: protocol 3.0, features 0xc7f
hyperv0: heartbeat, kvp, shutdown, timesync
hvn0 at hyperv0 channel 12: NVS 5.0 NDIS 6.30, address 00:15:5d:00:33:03
hvs0 at hyperv0 channel 13: scsi, protocol 6.0
scsibus0 at hvs0: 2 targets
sd0 at scsibus0 targ 0 lun 0: <Msft, Virtual Disk, 1.0> naa.600224806339816dd00df20d64df290b
sd0: 20480MB, 512 bytes/sector, 41943040 sectors, thin
sd1 at scsibus0 targ 0 lun 1: <Msft, Virtual Disk, 1.0> naa.60022480d40507eafb74508ae0298284
sd1: 664MB, 512 bytes/sector, 1360832 sectors, thin
pci0 at mainbus0 bus 0
isa0 at mainbus0
efifb0 at mainbus0: 1024x768, 32bpp
wsdisplay at efifb0 not configured
softraid0 at root
scsibus1 at softraid0: 256 targets
root on rd0a swap on rd0b dump on rd0b


Unpatched kernel panics on this:

> acpihve0 at acpi0
> LoadTable: RootPathString unsupported
> 0034 Called: \_SB_._INI
> 0034 Called: \_SB_._INI
> panic: aml_die aml_loadtable:3746

Here is relevant part of DSDT ACPI table that causes panic on stock kernel (dumped and decompiled on similar Linux guest with Intel acpi tools):

/*
 * Intel ACPI Component Architecture
 * AML/ASL+ Disassembler version 20220331 (64-bit version)
 * Copyright (c) 2000 - 2022 Intel Corporation
 *
 * Disassembling to symbolic ASL+ operators
 *
 * Disassembly of dsdt.dat, Tue Dec 19 19:55:19 2023
 *
 * Original Table Header:
 *     Signature        "DSDT"
 *     Length           0x00000D8E (3470)
 *     Revision         0x02
 *     Checksum         0x65
 *     OEM ID           "MSFTVM"
 *     OEM Table ID     "DSDT01"
 *     OEM Revision     0x00000001 (1)
 *     Compiler ID      "MSFT"
 *     Compiler Version 0x04000000 (67108864)
 */
DefinitionBlock ("", "DSDT", 2, "MSFTVM", "DSDT01", 0x00000001)
{
    Scope (_SB)
    {
        Method (_INI, 0, NotSerialized)  // _INI: Initialize
        {
            If ((SCFG > Zero))
            {
                LoadTable ("OEM1", "MSFTVM", "UARTS", "\\", "", Zero)
            }

            If ((BFLG & 0x02))
            {
                LoadTable ("OEMP", "MSFTVM", "SPCI", "\\", "", Zero)
            }
        }
    }

    OperationRegion (BIOS, SystemMemory, 0x7FDD7000, 0xFF)
    Field (BIOS, ByteAcc, NoLock, Preserve)
....


Personally I'm fine with that solution. Hoping that it may help anybody else using OpenBSD on Hyper-V Gen2 mode.

Best regards
  --Henryk Paluch


On 12/19/23 18:36, Henryk Paluch wrote:
Hello!

I was able to gather additional information - using small path for stock OpenBSD 7.4/amd64 kernel to print few debug messages. Additionally I used  ACPI tools under Linux guest (under same Hyper-V in UEFI mode) to get details on ACPI tables.

The kernel patch is this primitive:

diff -u /usr/src/sys/dev/acpi/dsdt.c{.orig,}
--- /usr/src/sys/dev/acpi/dsdt.c.orig    Tue Dec 19 07:49:12 2023
+++ /usr/src/sys/dev/acpi/dsdt.c    Tue Dec 19 17:59:29 2023
@@ -3742,11 +3742,23 @@
      struct acpi_dsdt *p_dsdt;
      struct acpi_q *entry;

-    if (strlen(rootpath) > 0)
-        aml_die("LoadTable: RootPathString unsupported");
+    printf("HP4\n");
+    if (strlen(rootpath) > 0){
+        aml_showvalue(parameterdata);
+        aml_die("LoadTable: RootPathString unsupported: rootpath='%s', "
+            "sign='%s', oemid='%s', oemtableid='%s', "
+            "ppath='%s'\n",
+            rootpath, signature, oemid, oemtableid, parameterpath);
+    }
      if (strlen(parameterpath) > 0)
          aml_die("LoadTable: ParameterPathString unsupported");

+    printf("%s:%d OK: Processing rootpath='%s', "
+            "sign='%s', oemid='%s', oemtableid='%s', "
+            "ppath='%s'\n",
+            __func__,__LINE__,
+            rootpath, signature, oemid, oemtableid, parameterpath);
+    aml_showvalue(parameterdata);
      SIMPLEQ_FOREACH(entry, &sc->sc_tables, q_next) {
          hdr = entry->q_table;
          if (strncmp(hdr->signature, signature,


Here is what I see on console output right before panic (what is strange that it seems to be first call to aml_loadtable() function):

acpihve0 at acpi0
HP4
  0xffff800000041608 cnt:01 stk:00 integer: 0
LoadTable: RootPathString unsupported: rootpath='\', sign='OEM1', oemid='MSFTVM', oemtableid='UARTS', ppath=''

0034 Called: \_SB_._INI
0034 Called: \_SB_._INI
panic: aml_die aml_loadtable:3751
Stopped at      db_enter+0x14:  popq    %rbp

Using acpidump and iasl under Linux guest (same Hyper-V and also in UEFI mode) I got these details of OEM1 table:

OEM1 @ 0x0000000000000000
0000: 4F 45 4D 31 9E 00 00 00 02 92 4D 53 46 54 56 4D  OEM1......MSFTVM
0010: 55 41 52 54 53 00 00 00 01 00 00 00 4D 53 46 54  UARTS.......MSFT
0020: 00 00 00 04 10 49 07 5F 53 42 5F 5B 82 37 55 41  .....I._SB_[.7UA
0030: 52 31 08 5F 48 49 44 0C 41 D0 05 01 08 5F 44 44  R1._HID.A...._DD
0040: 4E 0D 43 4F 4D 31 00 08 5F 55 49 44 01 08 5F 43  N.COM1.._UID.._C
0050: 52 53 11 11 0A 0E 23 10 00 01 47 01 F8 03 F8 03  RS....#...G.....
0060: 01 08 79 00 5B 82 38 55 41 52 32 08 5F 48 49 44  ..y.[.8UAR2._HID
0070: 0C 41 D0 05 01 08 5F 44 44 4E 0D 43 4F 4D 32 00  .A...._DDN.COM2.
0080: 08 5F 55 49 44 0A 02 08 5F 43 52 53 11 11 0A 0E  ._UID..._CRS....
0090: 23 08 00 01 47 01 F8 02 F8 02 01 08 79 00        #...G.......y.

And here is output of iasl decompiler:

/*
  * Intel ACPI Component Architecture
  * AML/ASL+ Disassembler version 20220331 (64-bit version)
  * Copyright (c) 2000 - 2022 Intel Corporation
  *
  * Disassembling to symbolic ASL+ operators
  *
  * Disassembly of oem1.dat, Tue Dec 19 17:44:02 2023
  *
  * Original Table Header:
  *     Signature        "OEM1"
  *     Length           0x0000009E (158)
  *     Revision         0x02
  *     Checksum         0x92
  *     OEM ID           "MSFTVM"
  *     OEM Table ID     "UARTS"
  *     OEM Revision     0x00000001 (1)
  *     Compiler ID      "MSFT"
  *     Compiler Version 0x04000000 (67108864)
  */
DefinitionBlock ("", "OEM1", 2, "MSFTVM", "UARTS", 0x00000001)
{
     Scope (_SB)
     {
         Device (UAR1)
         {
            Name (_HID, EisaId ("PNP0501") /* 16550A-compatible COM Serial Port */)  // _HID: Hardware ID
             Name (_DDN, "COM1")  // _DDN: DOS Device Name
             Name (_UID, One)  // _UID: Unique ID
            Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
             {
                 IRQ (Edge, ActiveHigh, Exclusive, )
                     {4}
                 IO (Decode16,
                     0x03F8,             // Range Minimum
                     0x03F8,             // Range Maximum
                     0x01,               // Alignment
                     0x08,               // Length
                     )
             })
         }

         Device (UAR2)
         {
            Name (_HID, EisaId ("PNP0501") /* 16550A-compatible COM Serial Port */)  // _HID: Hardware ID
             Name (_DDN, "COM2")  // _DDN: DOS Device Name
             Name (_UID, 0x02)  // _UID: Unique ID
            Name (_CRS, ResourceTemplate ()  // _CRS: Current Resource Settings
             {
                 IRQ (Edge, ActiveHigh, Exclusive, )
                     {3}
                 IO (Decode16,
                     0x02F8,             // Range Minimum
                     0x02F8,             // Range Maximum
                     0x01,               // Alignment
                     0x08,               // Length
                     )
             })
         }
     }
}

Summary:
It seems (confirmed from Linux guest kernel messages) that Hyper-V always exposes 2 serial ports (I configured Pipe only for 1st port!) in ACPI table OEM1, which current OpenBSD kernel is unable to process for some reason. However I'm too new to ACPI to understand what is the problem.

Please let me know if I can provide any additional details to resolve this problem.

Best regards
   --Henryk Paluch


On 12/18/23 16:51, Henryk Paluch wrote:
Hello!

While playing with GENERIC 7.4/amd64 (install74.img) under various UEFI environments (works fine under both Proxmox/KVM and LibVirt/KVM with i440fx machine) I had accidentally found that under Hyper-V/UEFI kernel panics on early ACPI enumeration (originally I thought that it was efifb0 console bug, because it was empty, but it was not that case...).

Most important messages:

acpihve0 at acpi0
LoadTable: RootPathString unsupported
0034 Called: \_SB_._INI
0034 Called: \_SB_._INI
panic: aml_die aml_loadtable:3746



Please first let me know if OpenBSD7.4 is supposed to work under Hyper-V in UEFI mode - it seems that there already exist all necessary PV devices to run as Gen2, but I was unable not find official stance on that.



Environment details:
- Host OS: Windows Server 2012R2 Standard with Hyper-V role and Hyper-V Manager - Guest OS: Openbsd7.4/amd64, official https://cdn.openbsd.org/pub/OpenBSD/7.4/amd64/install74.img
- VM running as Generation 2 (UEFI, secure boot disabled - see below).

How to reproduce
----------------

1. Download official installation image from: https://cdn.openbsd.org/pub/OpenBSD/7.4/amd64/install74.img

2. Convert it to VHDX using command like:

   qemu-img convert -p -f raw -O vhdx install74.img obsd74-uefi.vhdx

3. Under Hyper-V Create Generation 2 (UEFI) VM and attach above VHDX file as existing disk

4. disable Secure Boot under Firmware

5. before starting VM create Virtual COM port to see messages and panic, run this command in PowerShell:

   Set-VMComPort VM_NAME 1 \\.\pipe\HyperPipe

6. now start VM and press space to halt at boot> prompt

7. run Putty and select connection type `Serial` and
    enter `\\.\pipe\HyperPipe`  as `Serial line` name (you can keep speed 9600 - it does not matter for pipes)

8. now back on Hyper-V in `boot>` type:

   set tty com0

9. you should see now boot> prompt in Putty.

10. now boot full GENERIC kernel (to have DDB trace - therefore bsd.rd will not help much) using this command:

   boot 7.4/amd64/bsd

11. after while you should see early boot messages and panic.

boot> boot 7.4/amd64/bsd
cannot open hd0a:/etc/random.seed: No such file or directory
booting hd0a:7.4/amd64/bsd: 17163596+4137992+363792+0+1236992 [1342507+128+13178         40+1011174]=0x1959a68
entry point at 0x1001000
[ using 3672680 bytes of bsd ELF symbol table ]
Copyright (c) 1982, 1986, 1989, 1991, 1993
         The Regents of the University of California.  All rights reserved. Copyright (c) 1995-2023 OpenBSD. All rights reserved. https://www.OpenBSD.org

OpenBSD 7.4 (GENERIC) #1336: Tue Oct 10 08:52:22 MDT 2023
     dera...@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC
real mem = 1036947456 (988MB)
avail mem = 985939968 (940MB)
random: good seed from bootblocks
mpath0 at root
scsibus0 at mpath0: 256 targets
mainbus0 at root
bios0 at mainbus0: SMBIOS rev. 2.4 @ 0x3fdf1000 (12 entries)
bios0: vendor Microsoft Corporation version "Hyper-V UEFI Release v1.0" date 11/ 26/2012
bios0: Microsoft Corporation Virtual Machine
efi0 at bios0: UEFI 2.3.1
efi0: EDK II rev 0x10000
acpi0 at bios0: ACPI 4.0
acpi0: sleep states S0 S5
acpi0: tables DSDT FACP APIC OEM0 WAET OEM1 SRAT BGRT
acpi0: wakeup devices
acpitimer0 at acpi0: 3579545 Hz, 32 bits
acpimadt0 at acpi0 addr 0xfee00000
ioapic0 at mainbus0: apid 1 pa 0xfec00000, version 11, 24 pins
cpu0 at mainbus0: apid 0 (boot processor)
cpu0: AMD Athlon(tm) 64 X2 Dual Core Processor 3800+, 2000.27 MHz, 0f-4b-02 cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CF
LUSH,MMX,FXSR,SSE,SSE2,SSE3,CX16,HV,NXE,MMXX,FFXSR,LONG,3DNOW2,3DNOW,LAHF,CMPLEG
                                                               ,AMCR8
cpu0: 64KB 64b/line 2-way D-cache, 64KB 64b/line 2-way I-cache
cpu0: 512KB 64b/line 16-way L2 cache
cpu0: smt 0, core 0, package 0
mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges
cpu0: apic clock running at 200MHz
acpihve0 at acpi0
LoadTable: RootPathString unsupported
0034 Called: \_SB_._INI
0034 Called: \_SB_._INI
panic: aml_die aml_loadtable:3746
Stopped at      db_enter+0x14:  popq    %rbp
     TID    PID    UID     PRFLAGS     PFLAGS  CPU  COMMAND
*     0      0      0     0x10000      0x200    0  swapper
db_enter(10,ffffffff829605c0,286,8,ffffffff81835b24,ffffffff829605c0)
  at db_enter+0x14
panic(ffffffff820e210e,ffffffff820e210e,ffffffff8209b736,ea2,ffffffff824a18c2,ffffffff829605d0)
  at panic+0xbc
_aml_die(ffffffff8209b736,ea2,ffffffff820c2fd5,ffffffff8209b736,ffff80000002e148,ffff80000002e158)
  at _aml_die+0x3e7
aml_loadtable(ffff800000029400,ffff80000002e138,ffff80000002e148,ffff80000002e158,ffff80000002e168,ffff80000002e178)
  at aml_loadtable+0x1f0
aml_parse(ffff800000041088,54,ffff800000041088,ffff800000041088,8b6e818bf00372aa,ffff800000041088)
  at aml_parse+0xab5
aml_eval(0,ffff800000030288,74,0,0,0)
  at aml_eval+0x301
aml_evalnode(ffff800000029400,ffff800000030208,0,0,0,ffff800000029400)
  at aml_evalnode+0xb8
acpi_inidev(ffff800000030208,ffff800000029400,50be2c891493ae1a,ffffffff81db7b50,ffff800000029400,ffffffff820ce20b)
  at acpi_inidev+0x6e
aml_find_node(ffff80000002be08,ffffffff820ce20b,ffffffff81db7b50,ffff800000029400,3f2da558de4bb6c9,ffffffff81db7b50)
  at aml_find_node+0x84
aml_find_node(ffffffff825679c0,ffffffff820ce20b,ffffffff81db7b50,ffff800000029400,3f2da558dee5b49f,ffffffff82960a80)
  at aml_find_node+0xd1
acpi_attach_common(ffff800000029400,3fdfa014,be11230416b4dc44,ffff80000002b500,ffffffff82960ca0,ffffffff824951a0)
  at acpi_attach_common+0x607
config_attach(ffff80000002b500,ffffffff824a9470,ffffffff82960ca0,ffffffff81cefcc0,1be10fea7e145b1d,ffffffff82960c60)
  at config_attach+0x1f4
bios_attach(ffff80000002b480,ffff80000002b500,ffffffff82960dc8,ffff80000002b480,a29e677d6a51afb1,ffff80000002b480)
  at bios_attach+0x77e
config_attach(ffff80000002b480,ffffffff824a3970,ffffffff82960dc8,ffffffff819ccb70,1be10fea7e467a4f,ffffffff82960dc8)
  at config_attach+0x1f4
end trace frame: 0xffffffff82960e70, count: 0
https://www.openbsd.org/ddb.html describes the minimum info required in bug
reports.  Insufficient info makes it difficult to find and fix bugs.
ddb>
ddb> show panic
*cpu0: aml_die aml_loadtable:3746

Best regards
   --Henryk Paluch


Reply via email to