> Date: Sun, 12 May 2019 03:36:14 +0200 (CEST) > From: Mark Kettenis <mark.kette...@xs4all.nl> > > We encountered a machine that used the "extended" gasio description of > the ACPI PM registers, which is something we currently don't support. > This diff adds such support and with this diff ACPI support gets > enabled and the machine powers off fine if you run "halt -p". > > ok?
As found the hard way by aja@, I need to check that the table actually has the extended descriptions before attempting to use them. ok? Index: dev/acpi/acpi.c =================================================================== RCS file: /cvs/src/sys/dev/acpi/acpi.c,v retrieving revision 1.366 diff -u -p -r1.366 acpi.c --- dev/acpi/acpi.c 12 May 2019 02:21:13 -0000 1.366 +++ dev/acpi/acpi.c 12 May 2019 15:38:54 -0000 @@ -1601,7 +1601,7 @@ acpi_map_pmregs(struct acpi_softc *sc) if (fadt->pm1a_evt_blk) { addr = fadt->pm1a_evt_blk; access = 2; - } else { + } else if (fadt->hdr_revision >= 3) { addr = fadt->x_pm1a_evt_blk.address; access = 1 << fadt->x_pm1a_evt_blk.access_size; } @@ -1616,7 +1616,7 @@ acpi_map_pmregs(struct acpi_softc *sc) if (fadt->pm1a_cnt_blk) { addr = fadt->pm1a_cnt_blk; access = 2; - } else { + } else if (fadt->hdr_revision >= 3) { addr = fadt->x_pm1a_cnt_blk.address; access = 1 << fadt->x_pm1a_cnt_blk.access_size; } @@ -1628,7 +1628,7 @@ acpi_map_pmregs(struct acpi_softc *sc) if (fadt->pm1b_evt_blk) { addr = fadt->pm1b_evt_blk; access = 2; - } else { + } else if (fadt->hdr_revision >= 3) { addr = fadt->x_pm1b_evt_blk.address; access = 1 << fadt->x_pm1b_evt_blk.access_size; } @@ -1643,7 +1643,7 @@ acpi_map_pmregs(struct acpi_softc *sc) if (fadt->pm1b_cnt_blk) { addr = fadt->pm1b_cnt_blk; access = 2; - } else { + } else if (fadt->hdr_revision >= 3) { addr = fadt->x_pm1b_cnt_blk.address; access = 1 << fadt->x_pm1b_cnt_blk.access_size; } @@ -1654,7 +1654,7 @@ acpi_map_pmregs(struct acpi_softc *sc) if (fadt->pm2_cnt_blk) { addr = fadt->pm2_cnt_blk; access = size; - } else { + } else if (fadt->hdr_revision >= 3) { addr = fadt->x_pm2_cnt_blk.address; access = 1 << fadt->x_pm2_cnt_blk.access_size; } @@ -1667,7 +1667,7 @@ acpi_map_pmregs(struct acpi_softc *sc) if (fadt->pm_tmr_blk) { addr = fadt->pm_tmr_blk; access = 4; - } else { + } else if (fadt->hdr_revision >= 3) { addr = fadt->x_pm_tmr_blk.address; access = 1 << fadt->x_pm_tmr_blk.access_size; } @@ -1680,7 +1680,7 @@ acpi_map_pmregs(struct acpi_softc *sc) if (fadt->gpe0_blk) { addr = fadt->gpe0_blk; access = 1; - } else { + } else if (fadt->hdr_revision >= 3) { addr = fadt->x_gpe0_blk.address; access = 1 << fadt->x_gpe0_blk.access_size; } @@ -1701,7 +1701,7 @@ acpi_map_pmregs(struct acpi_softc *sc) if (fadt->gpe1_blk) { addr = fadt->gpe1_blk; access = 1; - } else { + } else if (fadt->hdr_revision >= 3) { addr = fadt->x_gpe1_blk.address; access = 1 << fadt->x_gpe1_blk.access_size; }