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.
This commit is contained in:
parent
f9f4337ba5
commit
161b30af53
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/sh -
|
#!/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.
|
# Copyright (c) 2003,2007,2008 The NetBSD Foundation, Inc.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
@ -2243,6 +2243,10 @@ xmm[0-9])
|
||||||
mkdev ttyXMM${unit}1 c %wwanc_chr% $(($unit * 65536 + 4))
|
mkdev ttyXMM${unit}1 c %wwanc_chr% $(($unit * 65536 + 4))
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
acpi)
|
||||||
|
mkdev acpi c %acpi_chr% 0
|
||||||
|
;;
|
||||||
|
|
||||||
midevend)
|
midevend)
|
||||||
%MI_DEVICES_END%
|
%MI_DEVICES_END%
|
||||||
local)
|
local)
|
||||||
|
|
|
@ -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)
|
all_md)
|
||||||
makedev wscons fd0 fd1 wd0 wd1 wd2 wd3 sd0 sd1 sd2 sd3
|
makedev wscons fd0 fd1 wd0 wd1 wd2 wd3 sd0 sd1 sd2 sd3
|
||||||
|
@ -20,6 +20,7 @@ all_md)
|
||||||
makedev spiflash0
|
makedev spiflash0
|
||||||
makedev bpf
|
makedev bpf
|
||||||
makedev openfirm
|
makedev openfirm
|
||||||
|
makedev acpi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
ramdisk|floppy)
|
ramdisk|floppy)
|
||||||
|
|
|
@ -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.
|
# As of 2003-04-17, the "init" case must not create more than 890 entries.
|
||||||
all_md)
|
all_md)
|
||||||
|
@ -45,6 +45,7 @@ all_md)
|
||||||
makedev kttcp
|
makedev kttcp
|
||||||
makedev bio
|
makedev bio
|
||||||
makedev xmm0
|
makedev xmm0
|
||||||
|
makedev acpi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
xen)
|
xen)
|
||||||
|
|
|
@ -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.
|
# As of 2005-03-15, the "init" case must not create more than 1024 entries.
|
||||||
all_md)
|
all_md)
|
||||||
|
@ -49,6 +49,7 @@ all_md)
|
||||||
makedev io
|
makedev io
|
||||||
makedev bio
|
makedev bio
|
||||||
makedev cfs
|
makedev cfs
|
||||||
|
makedev acpi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
xen)
|
xen)
|
||||||
|
|
|
@ -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.
|
# As of 2005-03-15, the "init" case must not create more than 1024 entries.
|
||||||
all_md)
|
all_md)
|
||||||
|
@ -43,4 +43,5 @@ all_md)
|
||||||
makedev io
|
makedev io
|
||||||
makedev bio
|
makedev bio
|
||||||
makedev cfs
|
makedev cfs
|
||||||
|
makedev acpi
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -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.
|
.\" Copyright (c) 2002, 2004, 2010 The NetBSD Foundation, Inc.
|
||||||
.\" All rights reserved.
|
.\" All rights reserved.
|
||||||
|
@ -24,7 +24,7 @@
|
||||||
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
.\" POSSIBILITY OF SUCH DAMAGE.
|
.\" POSSIBILITY OF SUCH DAMAGE.
|
||||||
.\"
|
.\"
|
||||||
.Dd March 4, 2018
|
.Dd December 5, 2020
|
||||||
.Dt ACPI 4
|
.Dt ACPI 4
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
|
@ -491,6 +491,10 @@ When
|
||||||
.Ic hw.acpi.debug.object
|
.Ic hw.acpi.debug.object
|
||||||
is set to 1, the message stored to the debug object
|
is set to 1, the message stored to the debug object
|
||||||
is printed every time the method is called by the interpreter.
|
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
|
.Sh SEE ALSO
|
||||||
.Xr ioapic 4 ,
|
.Xr ioapic 4 ,
|
||||||
.Xr acpidump 8 ,
|
.Xr acpidump 8 ,
|
||||||
|
|
|
@ -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.
|
# Device majors for Machine-Independent drivers.
|
||||||
#
|
#
|
||||||
|
@ -90,3 +90,4 @@ device-major vhci char 355 vhci
|
||||||
device-major vio9p char 356 vio9p
|
device-major vio9p char 356 vio9p
|
||||||
device-major fault char 357 fault
|
device-major fault char 357 fault
|
||||||
device-major wwanc char 358 wwanc
|
device-major wwanc char 358 wwanc
|
||||||
|
device-major acpi char 359 acpi
|
||||||
|
|
|
@ -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>
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check for root table access. */
|
||||||
|
found_table = false;
|
||||||
|
AcpiUtAcquireMutex(ACPI_MTX_TABLES);
|
||||||
|
for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++) {
|
||||||
|
tdesc = &AcpiGbl_RootTableList.Tables[i];
|
||||||
|
if (pa >= tdesc->Address &&
|
||||||
|
pa < tdesc->Address + tdesc->Length) {
|
||||||
|
*paddr = tdesc->Address;
|
||||||
|
*plen = tdesc->Length;
|
||||||
|
found_table = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
AcpiUtReleaseMutex(ACPI_MTX_TABLES);
|
||||||
|
return found_table;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* acpi_read --
|
||||||
|
*
|
||||||
|
* Read data from an ACPI configuration table that resides in
|
||||||
|
* physical memory. Only supports reading one table at a time.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
acpi_read(dev_t dev, struct uio *uio, int flag)
|
||||||
|
{
|
||||||
|
ACPI_PHYSICAL_ADDRESS pa, table_pa;
|
||||||
|
uint32_t table_len;
|
||||||
|
uint8_t *data;
|
||||||
|
int error;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
if (uio->uio_rw != UIO_READ) {
|
||||||
|
return EPERM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure this is a read of a known table */
|
||||||
|
if (!acpi_find_table(uio->uio_offset, &table_pa, &table_len)) {
|
||||||
|
return EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the contents of the table to user-space */
|
||||||
|
pa = uio->uio_offset;
|
||||||
|
len = uimin(pa - table_pa + table_len, uio->uio_resid);
|
||||||
|
data = AcpiOsMapMemory(pa, len);
|
||||||
|
if (data == NULL) {
|
||||||
|
return ENOMEM;
|
||||||
|
}
|
||||||
|
error = uiomove(data, len, uio);
|
||||||
|
AcpiOsUnmapMemory(data, len);
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
# $NetBSD: files.acpi,v 1.115 2020/02/22 02:28:06 jmcneill Exp $
|
# $NetBSD: files.acpi,v 1.116 2020/12/06 02:57:30 jmcneill Exp $
|
||||||
|
|
||||||
include "dev/acpi/acpica/files.acpica"
|
include "dev/acpi/acpica/files.acpica"
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ device acpi: acpica, acpiapmbus, acpinodebus, acpiecdtbus, acpisdtbus, acpigtdtb
|
||||||
attach acpi at acpibus
|
attach acpi at acpibus
|
||||||
file dev/acpi/acpi.c acpi
|
file dev/acpi/acpi.c acpi
|
||||||
file dev/acpi/acpi_debug.c acpi
|
file dev/acpi/acpi_debug.c acpi
|
||||||
|
file dev/acpi/acpi_dev.c acpi
|
||||||
file dev/acpi/acpi_event.c acpi
|
file dev/acpi/acpi_event.c acpi
|
||||||
file dev/acpi/acpi_i2c.c acpi
|
file dev/acpi/acpi_i2c.c acpi
|
||||||
file dev/acpi/acpi_mcfg.c acpi & pci
|
file dev/acpi/acpi_mcfg.c acpi & pci
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: acpi_user.c,v 1.5 2020/08/20 15:54:12 riastradh Exp $ */
|
/* $NetBSD: acpi_user.c,v 1.6 2020/12/06 02:57:30 jmcneill Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 1999 Doug Rabson
|
* Copyright (c) 1999 Doug Rabson
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__RCSID("$NetBSD: acpi_user.c,v 1.5 2020/08/20 15:54:12 riastradh Exp $");
|
__RCSID("$NetBSD: acpi_user.c,v 1.6 2020/12/06 02:57:30 jmcneill Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
|
@ -39,6 +39,7 @@ __RCSID("$NetBSD: acpi_user.c,v 1.5 2020/08/20 15:54:12 riastradh Exp $");
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
|
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -48,6 +49,7 @@ __RCSID("$NetBSD: acpi_user.c,v 1.5 2020/08/20 15:54:12 riastradh Exp $");
|
||||||
|
|
||||||
static char machdep_acpi_root[] = "hw.acpi.root";
|
static char machdep_acpi_root[] = "hw.acpi.root";
|
||||||
static int acpi_mem_fd = -1;
|
static int acpi_mem_fd = -1;
|
||||||
|
static bool acpi_mem_mmap = false;
|
||||||
|
|
||||||
struct acpi_user_mapping {
|
struct acpi_user_mapping {
|
||||||
LIST_ENTRY(acpi_user_mapping) link;
|
LIST_ENTRY(acpi_user_mapping) link;
|
||||||
|
@ -61,15 +63,48 @@ static LIST_HEAD(acpi_user_mapping_list, acpi_user_mapping) maplist;
|
||||||
static void
|
static void
|
||||||
acpi_user_init(void)
|
acpi_user_init(void)
|
||||||
{
|
{
|
||||||
|
int saved_errno, use_devmem;
|
||||||
|
const char *s;
|
||||||
|
|
||||||
if (acpi_mem_fd == -1) {
|
if (acpi_mem_fd == -1) {
|
||||||
|
s = getenv("ACPIDUMP_USE_DEVMEM");
|
||||||
|
use_devmem = s != NULL && *s == '1';
|
||||||
|
if (!use_devmem) {
|
||||||
|
acpi_mem_fd = open("/dev/acpi", O_RDONLY);
|
||||||
|
}
|
||||||
|
if (acpi_mem_fd == -1) {
|
||||||
|
saved_errno = errno;
|
||||||
acpi_mem_fd = open("/dev/mem", O_RDONLY);
|
acpi_mem_fd = open("/dev/mem", O_RDONLY);
|
||||||
if (acpi_mem_fd == -1)
|
if (acpi_mem_fd == -1) {
|
||||||
err(EXIT_FAILURE, "opening /dev/mem");
|
errno = saved_errno;
|
||||||
|
} else {
|
||||||
|
acpi_mem_mmap = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (acpi_mem_fd == -1) {
|
||||||
|
err(EXIT_FAILURE, "opening /dev/acpi");
|
||||||
|
}
|
||||||
LIST_INIT(&maplist);
|
LIST_INIT(&maplist);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *
|
||||||
|
acpi_user_read_table(vm_offset_t pa, size_t psize)
|
||||||
|
{
|
||||||
|
void *data;
|
||||||
|
ssize_t len;
|
||||||
|
|
||||||
|
data = calloc(1, psize);
|
||||||
|
if (!data)
|
||||||
|
errx(EXIT_FAILURE, "out of memory");
|
||||||
|
|
||||||
|
len = pread(acpi_mem_fd, data, psize, pa);
|
||||||
|
if (len == -1)
|
||||||
|
errx(EXIT_FAILURE, "can't read table");
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
static struct acpi_user_mapping *
|
static struct acpi_user_mapping *
|
||||||
acpi_user_find_mapping(vm_offset_t pa, size_t size)
|
acpi_user_find_mapping(vm_offset_t pa, size_t size)
|
||||||
{
|
{
|
||||||
|
@ -82,16 +117,22 @@ acpi_user_find_mapping(vm_offset_t pa, size_t size)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Then create a new one */
|
/* Then create a new one */
|
||||||
|
if (acpi_mem_mmap) {
|
||||||
size = round_page(pa + size) - trunc_page(pa);
|
size = round_page(pa + size) - trunc_page(pa);
|
||||||
pa = trunc_page(pa);
|
pa = trunc_page(pa);
|
||||||
|
}
|
||||||
map = malloc(sizeof(struct acpi_user_mapping));
|
map = malloc(sizeof(struct acpi_user_mapping));
|
||||||
if (!map)
|
if (!map)
|
||||||
errx(EXIT_FAILURE, "out of memory");
|
errx(EXIT_FAILURE, "out of memory");
|
||||||
map->pa = pa;
|
map->pa = pa;
|
||||||
|
if (acpi_mem_mmap) {
|
||||||
map->va = mmap(0, size, PROT_READ, MAP_SHARED, acpi_mem_fd, pa);
|
map->va = mmap(0, size, PROT_READ, MAP_SHARED, acpi_mem_fd, pa);
|
||||||
map->size = size;
|
|
||||||
if ((intptr_t) map->va == -1)
|
if ((intptr_t) map->va == -1)
|
||||||
err(EXIT_FAILURE, "can't map address");
|
err(EXIT_FAILURE, "can't map address");
|
||||||
|
} else {
|
||||||
|
map->va = acpi_user_read_table(pa, size);
|
||||||
|
}
|
||||||
|
map->size = size;
|
||||||
LIST_INSERT_HEAD(&maplist, map, link);
|
LIST_INSERT_HEAD(&maplist, map, link);
|
||||||
|
|
||||||
return map;
|
return map;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.\" $NetBSD: acpidump.8,v 1.16 2019/06/22 12:39:40 maxv Exp $
|
.\" $NetBSD: acpidump.8,v 1.17 2020/12/06 02:57:30 jmcneill Exp $
|
||||||
.\" ACPI (ACPI Package)
|
.\" ACPI (ACPI Package)
|
||||||
.\"
|
.\"
|
||||||
.\" Copyright (c) 1999 Doug Rabson <dfr@FreeBSD.org>
|
.\" Copyright (c) 1999 Doug Rabson <dfr@FreeBSD.org>
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD: head/usr.sbin/acpi/acpidump/acpidump.8 267668 2014-06-20 09:57:27Z bapt $
|
.\" $FreeBSD: head/usr.sbin/acpi/acpidump/acpidump.8 267668 2014-06-20 09:57:27Z bapt $
|
||||||
.\"
|
.\"
|
||||||
.Dd June 22, 2019
|
.Dd December 4, 2020
|
||||||
.Dt ACPIDUMP 8
|
.Dt ACPIDUMP 8
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
|
@ -73,7 +73,7 @@ When
|
||||||
is invoked without the
|
is invoked without the
|
||||||
.Fl f
|
.Fl f
|
||||||
option, it will read ACPI tables from physical memory via
|
option, it will read ACPI tables from physical memory via
|
||||||
.Pa /dev/mem .
|
.Pa /dev/acpi .
|
||||||
First it searches for the RSDP
|
First it searches for the RSDP
|
||||||
(Root System Description Pointer),
|
(Root System Description Pointer),
|
||||||
which has the signature
|
which has the signature
|
||||||
|
@ -173,8 +173,8 @@ Dump the contents of the various fixed tables listed above.
|
||||||
Enable verbose messages.
|
Enable verbose messages.
|
||||||
.El
|
.El
|
||||||
.Sh FILES
|
.Sh FILES
|
||||||
.Bl -tag -width /dev/mem
|
.Bl -tag -width /dev/acpi
|
||||||
.It Pa /dev/mem
|
.It Pa /dev/acpi
|
||||||
.El
|
.El
|
||||||
.Sh EXAMPLES
|
.Sh EXAMPLES
|
||||||
If a developer requests a copy of your ASL, please use the following
|
If a developer requests a copy of your ASL, please use the following
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: acpidump.c,v 1.7 2017/08/04 06:30:36 msaitoh Exp $ */
|
/* $NetBSD: acpidump.c,v 1.8 2020/12/06 02:57:30 jmcneill Exp $ */
|
||||||
|
|
||||||
/*-
|
/*-
|
||||||
* Copyright (c) 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
|
* Copyright (c) 2000 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
|
||||||
|
@ -29,7 +29,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__RCSID("$NetBSD: acpidump.c,v 1.7 2017/08/04 06:30:36 msaitoh Exp $");
|
__RCSID("$NetBSD: acpidump.c,v 1.8 2020/12/06 02:57:30 jmcneill Exp $");
|
||||||
|
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
|
@ -104,7 +104,7 @@ main(int argc, char *argv[])
|
||||||
argc -= optind;
|
argc -= optind;
|
||||||
argv += optind;
|
argv += optind;
|
||||||
|
|
||||||
/* Get input either from file or /dev/mem */
|
/* Get input either from file or /dev/acpi */
|
||||||
if (dsdt_input_file != NULL) {
|
if (dsdt_input_file != NULL) {
|
||||||
if (dflag == 0 && tflag == 0) {
|
if (dflag == 0 && tflag == 0) {
|
||||||
warnx("Need to specify -d or -t with DSDT input file");
|
warnx("Need to specify -d or -t with DSDT input file");
|
||||||
|
@ -118,11 +118,11 @@ main(int argc, char *argv[])
|
||||||
rsdt = dsdt_load_file(dsdt_input_file);
|
rsdt = dsdt_load_file(dsdt_input_file);
|
||||||
} else {
|
} else {
|
||||||
if (vflag)
|
if (vflag)
|
||||||
warnx("loading RSD PTR from /dev/mem");
|
warnx("loading RSD PTR from /dev/acpi");
|
||||||
rsdt = sdt_load_devmem();
|
rsdt = sdt_load_devmem();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Display misc. SDT tables (only available when using /dev/mem) */
|
/* Display misc. SDT tables (only available when using /dev/acpi) */
|
||||||
if (tflag) {
|
if (tflag) {
|
||||||
if (vflag)
|
if (vflag)
|
||||||
warnx("printing various SDT tables");
|
warnx("printing various SDT tables");
|
||||||
|
|
Loading…
Reference in New Issue