Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src acpi: add character device for accessing ACPI tables
details: https://anonhg.NetBSD.org/src/rev/b69bed3d41db
branches: trunk
changeset: 946678:b69bed3d41db
user: jmcneill <jmcneill%NetBSD.org@localhost>
date: Sun Dec 06 02:57:29 2020 +0000
description:
acpi: add character device for accessing ACPI tables
The /dev/acpi character device gives an aperture into physical memory
that allows only read access to known ACPI tables: RSDP, XSDT/RSDT, and
the root tables. Adapt acpidump(8) to use this interface by default,
falling back to the old /dev/mem method if it is not available or if
ACPIDUMP_USE_DEVMEM=1 is set in the environment. The user visible benefit
of this change is that "options INSECURE" is no longer required to
dump ACPI tables.
diffstat:
etc/MAKEDEV.tmpl | 6 +-
etc/etc.aarch64/MAKEDEV.conf | 3 +-
etc/etc.amd64/MAKEDEV.conf | 3 +-
etc/etc.i386/MAKEDEV.conf | 3 +-
etc/etc.ia64/MAKEDEV.conf | 3 +-
share/man/man4/acpi.4 | 8 +-
sys/conf/majors | 3 +-
sys/dev/acpi/acpi_dev.c | 220 ++++++++++++++++++++++++++++++++
sys/dev/acpi/files.acpi | 3 +-
usr.sbin/acpitools/acpidump/acpi_user.c | 61 +++++++-
usr.sbin/acpitools/acpidump/acpidump.8 | 10 +-
usr.sbin/acpitools/acpidump/acpidump.c | 10 +-
12 files changed, 304 insertions(+), 29 deletions(-)
diffs (truncated from 564 to 300 lines):
diff -r b83ae49029c7 -r b69bed3d41db etc/MAKEDEV.tmpl
--- a/etc/MAKEDEV.tmpl Sun Dec 06 02:26:33 2020 +0000
+++ b/etc/MAKEDEV.tmpl Sun Dec 06 02:57:29 2020 +0000
@@ -1,5 +1,5 @@
#!/bin/sh -
-# $NetBSD: MAKEDEV.tmpl,v 1.221 2020/07/26 15:47:27 jdolecek Exp $
+# $NetBSD: MAKEDEV.tmpl,v 1.222 2020/12/06 02:57:29 jmcneill Exp $
#
# Copyright (c) 2003,2007,2008 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -2243,6 +2243,10 @@
mkdev ttyXMM${unit}1 c %wwanc_chr% $(($unit * 65536 + 4))
;;
+acpi)
+ mkdev acpi c %acpi_chr% 0
+ ;;
+
midevend)
%MI_DEVICES_END%
local)
diff -r b83ae49029c7 -r b69bed3d41db etc/etc.aarch64/MAKEDEV.conf
--- a/etc/etc.aarch64/MAKEDEV.conf Sun Dec 06 02:26:33 2020 +0000
+++ b/etc/etc.aarch64/MAKEDEV.conf Sun Dec 06 02:57:29 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: MAKEDEV.conf,v 1.7 2018/12/15 01:02:58 jmcneill Exp $
+# $NetBSD: MAKEDEV.conf,v 1.8 2020/12/06 02:57:30 jmcneill Exp $
all_md)
makedev wscons fd0 fd1 wd0 wd1 wd2 wd3 sd0 sd1 sd2 sd3
@@ -20,6 +20,7 @@
makedev spiflash0
makedev bpf
makedev openfirm
+ makedev acpi
;;
ramdisk|floppy)
diff -r b83ae49029c7 -r b69bed3d41db etc/etc.amd64/MAKEDEV.conf
--- a/etc/etc.amd64/MAKEDEV.conf Sun Dec 06 02:26:33 2020 +0000
+++ b/etc/etc.amd64/MAKEDEV.conf Sun Dec 06 02:57:29 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: MAKEDEV.conf,v 1.31 2020/08/03 04:32:13 nia Exp $
+# $NetBSD: MAKEDEV.conf,v 1.32 2020/12/06 02:57:30 jmcneill Exp $
# As of 2003-04-17, the "init" case must not create more than 890 entries.
all_md)
@@ -45,6 +45,7 @@
makedev kttcp
makedev bio
makedev xmm0
+ makedev acpi
;;
xen)
diff -r b83ae49029c7 -r b69bed3d41db etc/etc.i386/MAKEDEV.conf
--- a/etc/etc.i386/MAKEDEV.conf Sun Dec 06 02:26:33 2020 +0000
+++ b/etc/etc.i386/MAKEDEV.conf Sun Dec 06 02:57:29 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: MAKEDEV.conf,v 1.32 2020/08/03 04:32:13 nia Exp $
+# $NetBSD: MAKEDEV.conf,v 1.33 2020/12/06 02:57:30 jmcneill Exp $
# As of 2005-03-15, the "init" case must not create more than 1024 entries.
all_md)
@@ -49,6 +49,7 @@
makedev io
makedev bio
makedev cfs
+ makedev acpi
;;
xen)
diff -r b83ae49029c7 -r b69bed3d41db etc/etc.ia64/MAKEDEV.conf
--- a/etc/etc.ia64/MAKEDEV.conf Sun Dec 06 02:26:33 2020 +0000
+++ b/etc/etc.ia64/MAKEDEV.conf Sun Dec 06 02:57:29 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: MAKEDEV.conf,v 1.4 2020/04/05 14:09:18 jdolecek Exp $
+# $NetBSD: MAKEDEV.conf,v 1.5 2020/12/06 02:57:30 jmcneill Exp $
# As of 2005-03-15, the "init" case must not create more than 1024 entries.
all_md)
@@ -43,4 +43,5 @@
makedev io
makedev bio
makedev cfs
+ makedev acpi
;;
diff -r b83ae49029c7 -r b69bed3d41db share/man/man4/acpi.4
--- a/share/man/man4/acpi.4 Sun Dec 06 02:26:33 2020 +0000
+++ b/share/man/man4/acpi.4 Sun Dec 06 02:57:29 2020 +0000
@@ -1,4 +1,4 @@
-.\" $NetBSD: acpi.4,v 1.86 2018/03/04 02:10:26 pgoyette Exp $
+.\" $NetBSD: acpi.4,v 1.87 2020/12/06 02:57:30 jmcneill Exp $
.\"
.\" Copyright (c) 2002, 2004, 2010 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -24,7 +24,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd March 4, 2018
+.Dd December 5, 2020
.Dt ACPI 4
.Os
.Sh NAME
@@ -491,6 +491,10 @@
.Ic hw.acpi.debug.object
is set to 1, the message stored to the debug object
is printed every time the method is called by the interpreter.
+.Sh FILES
+.Bl -tag -width /dev/acpi
+.It Pa /dev/acpi
+.El
.Sh SEE ALSO
.Xr ioapic 4 ,
.Xr acpidump 8 ,
diff -r b83ae49029c7 -r b69bed3d41db sys/conf/majors
--- a/sys/conf/majors Sun Dec 06 02:26:33 2020 +0000
+++ b/sys/conf/majors Sun Dec 06 02:57:29 2020 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: majors,v 1.96 2020/08/28 14:58:25 riastradh Exp $
+# $NetBSD: majors,v 1.97 2020/12/06 02:57:30 jmcneill Exp $
#
# Device majors for Machine-Independent drivers.
#
@@ -90,3 +90,4 @@
device-major vio9p char 356 vio9p
device-major fault char 357 fault
device-major wwanc char 358 wwanc
+device-major acpi char 359 acpi
diff -r b83ae49029c7 -r b69bed3d41db sys/dev/acpi/acpi_dev.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/acpi/acpi_dev.c Sun Dec 06 02:57:29 2020 +0000
@@ -0,0 +1,220 @@
+/* $NetBSD: acpi_dev.c,v 1.1 2020/12/06 02:57:30 jmcneill Exp $ */
+
+/*-
+ * Copyright (c) 2020 Jared McNeill <jmcneill%invisible.ca@localhost>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: acpi_dev.c,v 1.1 2020/12/06 02:57:30 jmcneill Exp $");
+
+#include <sys/param.h>
+#include <sys/conf.h>
+#include <sys/mman.h>
+
+#include <dev/acpi/acpireg.h>
+#include <dev/acpi/acpivar.h>
+
+#define _COMPONENT ACPI_BUS_COMPONENT
+ACPI_MODULE_NAME ("acpi_dev")
+
+static dev_type_read(acpi_read);
+
+const struct cdevsw acpi_cdevsw = {
+ .d_open = nullopen,
+ .d_close = nullclose,
+ .d_read = acpi_read,
+ .d_write = nowrite,
+ .d_ioctl = noioctl,
+ .d_stop = nostop,
+ .d_tty = notty,
+ .d_poll = nopoll,
+ .d_mmap = nommap,
+ .d_kqfilter = nokqfilter,
+ .d_discard = nodiscard,
+ .d_flag = D_OTHER | D_MPSAFE,
+};
+
+/*
+ * acpi_find_table_rsdp --
+ *
+ * Returns true if the RSDP table is found and overlaps the specified
+ * physical address. The table's physical start address and length
+ * are placed in 'paddr' and 'plen' when found.
+ *
+ */
+static bool
+acpi_find_table_rsdp(ACPI_PHYSICAL_ADDRESS pa,
+ ACPI_PHYSICAL_ADDRESS *paddr, uint32_t *plen)
+{
+ ACPI_PHYSICAL_ADDRESS table_pa;
+
+ table_pa = AcpiOsGetRootPointer();
+ if (table_pa == 0) {
+ return false;
+ }
+ if (pa >= table_pa && pa < table_pa + sizeof(ACPI_TABLE_RSDP)) {
+ *paddr = table_pa;
+ *plen = sizeof(ACPI_TABLE_RSDP);
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * acpi_find_table_sdt --
+ *
+ * Returns true if the XSDT/RSDT table is found and overlaps the
+ * specified physical address. The table's physical start address
+ * and length are placed in 'paddr' and 'plen' when found.
+ *
+ */
+static bool
+acpi_find_table_sdt(ACPI_PHYSICAL_ADDRESS pa,
+ ACPI_PHYSICAL_ADDRESS *paddr, uint32_t *plen)
+{
+ ACPI_PHYSICAL_ADDRESS table_pa;
+ ACPI_TABLE_RSDP *rsdp;
+ ACPI_TABLE_HEADER *thdr;
+ uint32_t table_len;
+
+ table_pa = AcpiOsGetRootPointer();
+ KASSERT(table_pa != 0);
+
+ /*
+ * Find the XSDT/RSDT using the RSDP.
+ */
+ rsdp = AcpiOsMapMemory(table_pa, sizeof(ACPI_TABLE_RSDP));
+ if (rsdp == NULL) {
+ return false;
+ }
+ if (rsdp->Revision > 1 && rsdp->XsdtPhysicalAddress) {
+ table_pa = rsdp->XsdtPhysicalAddress;
+ } else {
+ table_pa = rsdp->RsdtPhysicalAddress;
+ }
+ AcpiOsUnmapMemory(rsdp, sizeof(ACPI_TABLE_RSDP));
+ if (table_pa == 0) {
+ return false;
+ }
+
+ /*
+ * Map the XSDT/RSDT and check access.
+ */
+ thdr = AcpiOsMapMemory(table_pa, sizeof(ACPI_TABLE_HEADER));
+ if (thdr == NULL) {
+ return false;
+ }
+ table_len = thdr->Length;
+ AcpiOsUnmapMemory(thdr, sizeof(ACPI_TABLE_HEADER));
+ if (pa >= table_pa && pa < table_pa + table_len) {
+ *paddr = table_pa;
+ *plen = table_len;
+ return true;
+ }
+
+ return false;
+}
+
+/*
+ * acpi_find_table --
+ *
+ * Find an ACPI table that overlaps the specified physical address.
+ * Returns true if the table is found and places the table start
+ * address into 'paddr' and the length into 'plen'.
+ *
+ */
+static bool
+acpi_find_table(ACPI_PHYSICAL_ADDRESS pa,
+ ACPI_PHYSICAL_ADDRESS *paddr, uint32_t *plen)
+{
+ ACPI_TABLE_DESC *tdesc;
+ bool found_table;
+ uint32_t i;
+
+ /* Check for RSDP access. */
+ if (acpi_find_table_rsdp(pa, paddr, plen)) {
+ return true;
+ }
+
+ /* Check for XSDT/RSDT access. */
+ if (acpi_find_table_sdt(pa, paddr, plen)) {
+ return true;
+ }
+
Home |
Main Index |
Thread Index |
Old Index