> 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;
                        }

Reply via email to