Home | History | Annotate | Line # | Download | only in acpidump
acpi.c revision 1.8
      1  1.8  jmcneill /* $NetBSD: acpi.c,v 1.8 2011/02/17 10:18:05 jmcneill Exp $ */
      2  1.1  christos 
      3  1.1  christos /*-
      4  1.1  christos  * Copyright (c) 1998 Doug Rabson
      5  1.1  christos  * Copyright (c) 2000 Mitsuru IWASAKI <iwasaki (at) FreeBSD.org>
      6  1.1  christos  * All rights reserved.
      7  1.1  christos  *
      8  1.1  christos  * Redistribution and use in source and binary forms, with or without
      9  1.1  christos  * modification, are permitted provided that the following conditions
     10  1.1  christos  * are met:
     11  1.1  christos  * 1. Redistributions of source code must retain the above copyright
     12  1.1  christos  *    notice, this list of conditions and the following disclaimer.
     13  1.1  christos  * 2. Redistributions in binary form must reproduce the above copyright
     14  1.1  christos  *    notice, this list of conditions and the following disclaimer in the
     15  1.1  christos  *    documentation and/or other materials provided with the distribution.
     16  1.1  christos  *
     17  1.1  christos  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     18  1.1  christos  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     19  1.1  christos  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     20  1.1  christos  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     21  1.1  christos  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     22  1.1  christos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     23  1.1  christos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     24  1.1  christos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     25  1.1  christos  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     26  1.1  christos  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     27  1.1  christos  * SUCH DAMAGE.
     28  1.1  christos  *
     29  1.5    cegger  *	$FreeBSD: src/usr.sbin/acpi/acpidump/acpi.c,v 1.37 2009/08/25 20:35:57 jhb Exp $
     30  1.1  christos  */
     31  1.1  christos 
     32  1.5    cegger #include <sys/cdefs.h>
     33  1.8  jmcneill __RCSID("$NetBSD: acpi.c,v 1.8 2011/02/17 10:18:05 jmcneill Exp $");
     34  1.5    cegger 
     35  1.5    cegger #include <sys/param.h>
     36  1.5    cegger #include <sys/endian.h>
     37  1.5    cegger #include <sys/stat.h>
     38  1.5    cegger #include <sys/wait.h>
     39  1.5    cegger #include <assert.h>
     40  1.5    cegger #include <err.h>
     41  1.5    cegger #include <fcntl.h>
     42  1.5    cegger #include <paths.h>
     43  1.5    cegger #include <stdio.h>
     44  1.5    cegger #include <stdint.h>
     45  1.5    cegger #include <stdlib.h>
     46  1.5    cegger #include <string.h>
     47  1.5    cegger #include <unistd.h>
     48  1.5    cegger #include <stddef.h>
     49  1.5    cegger 
     50  1.5    cegger #include "acpidump.h"
     51  1.5    cegger 
     52  1.5    cegger #define BEGIN_COMMENT	"/*\n"
     53  1.5    cegger #define END_COMMENT	" */\n"
     54  1.5    cegger 
     55  1.5    cegger static void	acpi_print_string(char *s, size_t length);
     56  1.5    cegger static void	acpi_print_gas(ACPI_GENERIC_ADDRESS *gas);
     57  1.5    cegger static void	acpi_print_pci(uint16_t vendorid, uint16_t deviceid,
     58  1.5    cegger 		    uint8_t seg, uint8_t bus, uint8_t device, uint8_t func);
     59  1.5    cegger static void	acpi_print_pci_sbfd(uint8_t seg, uint8_t bus, uint8_t device,
     60  1.5    cegger 		    uint8_t func);
     61  1.5    cegger #ifdef notyet
     62  1.5    cegger static void	acpi_print_hest_generic_status(ACPI_HEST_GENERIC_STATUS *);
     63  1.5    cegger static void	acpi_print_hest_generic_data(ACPI_HEST_GENERIC_DATA *);
     64  1.5    cegger #endif
     65  1.5    cegger static void	acpi_print_whea(ACPI_WHEA_HEADER *whea,
     66  1.5    cegger 		    void (*print_action)(ACPI_WHEA_HEADER *),
     67  1.5    cegger 		    void (*print_ins)(ACPI_WHEA_HEADER *),
     68  1.5    cegger 		    void (*print_flags)(ACPI_WHEA_HEADER *));
     69  1.5    cegger static int	acpi_get_fadt_revision(ACPI_TABLE_FADT *fadt);
     70  1.5    cegger static void	acpi_handle_fadt(ACPI_TABLE_HEADER *fadt);
     71  1.5    cegger static void	acpi_print_cpu(u_char cpu_id);
     72  1.5    cegger static void	acpi_print_cpu_uid(uint32_t uid, char *uid_string);
     73  1.5    cegger static void	acpi_print_local_apic(uint32_t apic_id, uint32_t flags);
     74  1.5    cegger static void	acpi_print_io_apic(uint32_t apic_id, uint32_t int_base,
     75  1.5    cegger 		    uint64_t apic_addr);
     76  1.5    cegger static void	acpi_print_mps_flags(uint16_t flags);
     77  1.5    cegger static void	acpi_print_intr(uint32_t intr, uint16_t mps_flags);
     78  1.5    cegger static void	acpi_print_local_nmi(u_int lint, uint16_t mps_flags);
     79  1.5    cegger static void	acpi_print_madt(ACPI_SUBTABLE_HEADER *mp);
     80  1.5    cegger static void	acpi_handle_bert(ACPI_TABLE_HEADER *sdp);
     81  1.5    cegger static void	acpi_handle_boot(ACPI_TABLE_HEADER *sdp);
     82  1.5    cegger static void	acpi_handle_cpep(ACPI_TABLE_HEADER *sdp);
     83  1.5    cegger static void	acpi_handle_dbgp(ACPI_TABLE_HEADER *sdp);
     84  1.5    cegger static void	acpi_handle_einj(ACPI_TABLE_HEADER *sdp);
     85  1.5    cegger static void	acpi_handle_erst(ACPI_TABLE_HEADER *sdp);
     86  1.5    cegger static void	acpi_handle_hest(ACPI_TABLE_HEADER *sdp);
     87  1.5    cegger static void	acpi_handle_madt(ACPI_TABLE_HEADER *sdp);
     88  1.5    cegger static void	acpi_handle_msct(ACPI_TABLE_HEADER *sdp);
     89  1.5    cegger static void	acpi_handle_ecdt(ACPI_TABLE_HEADER *sdp);
     90  1.5    cegger static void	acpi_handle_hpet(ACPI_TABLE_HEADER *sdp);
     91  1.5    cegger static void	acpi_handle_mcfg(ACPI_TABLE_HEADER *sdp);
     92  1.5    cegger static void	acpi_handle_sbst(ACPI_TABLE_HEADER *sdp);
     93  1.5    cegger static void	acpi_handle_slit(ACPI_TABLE_HEADER *sdp);
     94  1.5    cegger static void	acpi_handle_spcr(ACPI_TABLE_HEADER *sdp);
     95  1.5    cegger static void	acpi_print_srat_cpu(uint32_t apic_id,
     96  1.5    cegger 		    uint32_t proximity_domain,
     97  1.5    cegger 		    uint32_t flags, uint32_t clockdomain);
     98  1.5    cegger static void	acpi_print_srat_memory(ACPI_SRAT_MEM_AFFINITY *mp);
     99  1.5    cegger static void	acpi_print_srat(ACPI_SUBTABLE_HEADER *srat);
    100  1.5    cegger static void	acpi_handle_srat(ACPI_TABLE_HEADER *sdp);
    101  1.5    cegger static void	acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp);
    102  1.5    cegger static void	acpi_handle_waet(ACPI_TABLE_HEADER *sdp);
    103  1.5    cegger static void	acpi_handle_wdat(ACPI_TABLE_HEADER *sdp);
    104  1.5    cegger static void	acpi_handle_wdrt(ACPI_TABLE_HEADER *sdp);
    105  1.5    cegger static void	acpi_print_sdt(ACPI_TABLE_HEADER *sdp);
    106  1.7  jmcneill static void	acpi_dump_bytes(ACPI_TABLE_HEADER *sdp);
    107  1.5    cegger static void	acpi_print_fadt(ACPI_TABLE_HEADER *sdp);
    108  1.5    cegger static void	acpi_print_facs(ACPI_TABLE_FACS *facs);
    109  1.5    cegger static void	acpi_print_dsdt(ACPI_TABLE_HEADER *dsdp);
    110  1.5    cegger static ACPI_TABLE_HEADER *acpi_map_sdt(vm_offset_t pa);
    111  1.5    cegger static void	acpi_print_rsd_ptr(ACPI_TABLE_RSDP *rp);
    112  1.5    cegger static void	acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp);
    113  1.5    cegger static void	acpi_walk_subtables(ACPI_TABLE_HEADER *table, void *first,
    114  1.5    cegger 		    void (*action)(ACPI_SUBTABLE_HEADER *));
    115  1.5    cegger 
    116  1.5    cegger /* Size of an address. 32-bit for ACPI 1.0, 64-bit for ACPI 2.0 and up. */
    117  1.5    cegger static int addr_size;
    118  1.5    cegger 
    119  1.5    cegger static void
    120  1.5    cegger acpi_print_string(char *s, size_t length)
    121  1.5    cegger {
    122  1.5    cegger 	int	c;
    123  1.5    cegger 
    124  1.5    cegger 	/* Trim trailing spaces and NULLs */
    125  1.5    cegger 	while (length > 0 && (s[length - 1] == ' ' || s[length - 1] == '\0'))
    126  1.5    cegger 		length--;
    127  1.5    cegger 
    128  1.5    cegger 	while (length--) {
    129  1.5    cegger 		c = *s++;
    130  1.5    cegger 		putchar(c);
    131  1.5    cegger 	}
    132  1.5    cegger }
    133  1.5    cegger 
    134  1.5    cegger static void
    135  1.5    cegger acpi_print_gas(ACPI_GENERIC_ADDRESS *gas)
    136  1.5    cegger {
    137  1.5    cegger 	switch(gas->SpaceId) {
    138  1.5    cegger 	case ACPI_GAS_MEMORY:
    139  1.5    cegger 		printf("0x%08lx:%u[%u] (Memory)", (u_long)gas->Address,
    140  1.5    cegger 		       gas->BitOffset, gas->BitWidth);
    141  1.5    cegger 		break;
    142  1.5    cegger 	case ACPI_GAS_IO:
    143  1.5    cegger 		printf("0x%02lx:%u[%u] (IO)", (u_long)gas->Address,
    144  1.5    cegger 		       gas->BitOffset, gas->BitWidth);
    145  1.5    cegger 		break;
    146  1.5    cegger 	case ACPI_GAS_PCI:
    147  1.5    cegger 		printf("%x:%x+0x%x (PCI)", (uint16_t)(gas->Address >> 32),
    148  1.5    cegger 		       (uint16_t)((gas->Address >> 16) & 0xffff),
    149  1.5    cegger 		       (uint16_t)gas->Address);
    150  1.5    cegger 		break;
    151  1.5    cegger 	/* XXX How to handle these below? */
    152  1.5    cegger 	case ACPI_GAS_EMBEDDED:
    153  1.5    cegger 		printf("0x%x:%u[%u] (EC)", (uint16_t)gas->Address,
    154  1.5    cegger 		       gas->BitOffset, gas->BitWidth);
    155  1.5    cegger 		break;
    156  1.5    cegger 	case ACPI_GAS_SMBUS:
    157  1.5    cegger 		printf("0x%x:%u[%u] (SMBus)", (uint16_t)gas->Address,
    158  1.5    cegger 		       gas->BitOffset, gas->BitWidth);
    159  1.5    cegger 		break;
    160  1.5    cegger 	case ACPI_GAS_CMOS:
    161  1.5    cegger 	case ACPI_GAS_PCIBAR:
    162  1.5    cegger 	case ACPI_GAS_DATATABLE:
    163  1.5    cegger 	case ACPI_GAS_FIXED:
    164  1.5    cegger 	default:
    165  1.5    cegger 		printf("0x%08lx (?)", (u_long)gas->Address);
    166  1.5    cegger 		break;
    167  1.5    cegger 	}
    168  1.5    cegger }
    169  1.5    cegger 
    170  1.5    cegger static void
    171  1.5    cegger acpi_print_pci(uint16_t vendorid, uint16_t deviceid,
    172  1.5    cegger     uint8_t seg, uint8_t bus, uint8_t device, uint8_t func)
    173  1.5    cegger {
    174  1.5    cegger 	if (vendorid == 0xffff && deviceid == 0xffff) {
    175  1.5    cegger 		printf("\tPCI Device=NONE\n");
    176  1.5    cegger 		return;
    177  1.5    cegger 	}
    178  1.5    cegger 
    179  1.5    cegger 	printf("\tPCI device={\n");
    180  1.5    cegger 	printf("\t\tVendor=0x%x\n", vendorid);
    181  1.5    cegger 	printf("\t\tDevice=0x%x\n", deviceid);
    182  1.5    cegger 	printf("\n");
    183  1.5    cegger 	printf("\t\tSegment Group=%d\n", seg);
    184  1.5    cegger 	printf("\t\tBus=%d\n", bus);
    185  1.5    cegger 	printf("\t\tDevice=%d\n", device);
    186  1.5    cegger 	printf("\t\tFunction=%d\n", func);
    187  1.5    cegger 	printf("\t}\n");
    188  1.5    cegger }
    189  1.5    cegger 
    190  1.5    cegger static void
    191  1.5    cegger acpi_print_pci_sbfd(uint8_t seg, uint8_t bus, uint8_t device, uint8_t func)
    192  1.5    cegger {
    193  1.5    cegger 	if (bus == 0xff && device == 0xff && func == 0xff) {
    194  1.5    cegger 		printf("\tPCI Device=NONE\n");
    195  1.5    cegger 		return;
    196  1.5    cegger 	}
    197  1.5    cegger 
    198  1.5    cegger 	printf("\tPCI device={\n");
    199  1.5    cegger 	printf("\t\tSegment Group=%d\n", seg);
    200  1.5    cegger 	printf("\t\tBus=%d\n", bus);
    201  1.5    cegger 	printf("\t\tDevice=%d\n", device);
    202  1.5    cegger 	printf("\t\tFunction=%d\n", func);
    203  1.5    cegger 	printf("\t}\n");
    204  1.5    cegger }
    205  1.5    cegger 
    206  1.5    cegger #ifdef notyet
    207  1.5    cegger static void
    208  1.5    cegger acpi_print_hest_errorseverity(uint32_t error)
    209  1.5    cegger {
    210  1.5    cegger 	printf("\tError Severity={ ");
    211  1.5    cegger 	switch (error) {
    212  1.5    cegger 	case 0:
    213  1.5    cegger 		printf("Recoverable");
    214  1.5    cegger 		break;
    215  1.5    cegger 	case 1:
    216  1.5    cegger 		printf("Fatal");
    217  1.5    cegger 		break;
    218  1.5    cegger 	case 2:
    219  1.5    cegger 		printf("Corrected");
    220  1.5    cegger 		break;
    221  1.5    cegger 	case 3:
    222  1.5    cegger 		printf("None");
    223  1.5    cegger 		break;
    224  1.5    cegger 	default:
    225  1.5    cegger 		printf("%d (reserved)", error);
    226  1.5    cegger 		break;
    227  1.5    cegger 	}
    228  1.5    cegger 	printf("}\n");
    229  1.5    cegger }
    230  1.5    cegger #endif
    231  1.5    cegger 
    232  1.5    cegger static void
    233  1.5    cegger acpi_print_hest_errorbank(ACPI_HEST_IA_ERROR_BANK *bank)
    234  1.5    cegger {
    235  1.5    cegger 	printf("\n");
    236  1.5    cegger 	printf("\tBank Number=%d\n", bank->BankNumber);
    237  1.5    cegger 	printf("\tClear Status On Init={ %s }\n",
    238  1.5    cegger 		bank->ClearStatusOnInit ? "NO" : "YES");
    239  1.5    cegger 	printf("\tStatus Data Format={ ");
    240  1.5    cegger 	switch (bank->StatusFormat) {
    241  1.5    cegger 	case 0:
    242  1.5    cegger 		printf("IA32 MCA");
    243  1.5    cegger 		break;
    244  1.5    cegger 	case 1:
    245  1.5    cegger 		printf("EMT64 MCA");
    246  1.5    cegger 		break;
    247  1.5    cegger 	case 2:
    248  1.5    cegger 		printf("AMD64 MCA");
    249  1.5    cegger 		break;
    250  1.5    cegger 	}
    251  1.5    cegger 	printf(" }\n");
    252  1.5    cegger 
    253  1.5    cegger 	if (bank->ControlRegister)
    254  1.5    cegger 		printf("\tControl Register=0x%x\n", bank->ControlRegister);
    255  1.5    cegger 	printf("\tControl Init Data=0x%"PRIx64"\n", bank->ControlData);
    256  1.5    cegger 	printf("\tStatus MSR=0x%x\n", bank->StatusRegister);
    257  1.5    cegger 	printf("\tAddress MSR=0x%x\n", bank->AddressRegister);
    258  1.5    cegger 	printf("\tMisc MSR=0x%x\n", bank->MiscRegister);
    259  1.5    cegger }
    260  1.5    cegger 
    261  1.5    cegger static void
    262  1.5    cegger acpi_print_hest_header(ACPI_HEST_HEADER *hest)
    263  1.5    cegger {
    264  1.5    cegger 	printf("\tType={ ");
    265  1.5    cegger 	switch (hest->Type) {
    266  1.5    cegger 	case ACPI_HEST_TYPE_IA32_CHECK:
    267  1.5    cegger 		printf("IA32 Machine Check Exception");
    268  1.5    cegger 		break;
    269  1.5    cegger 	case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
    270  1.5    cegger 		printf("IA32 Corrected Machine Check\n");
    271  1.5    cegger 		break;
    272  1.5    cegger 	case ACPI_HEST_TYPE_IA32_NMI:
    273  1.5    cegger 		printf("IA32 Non-Maskable Interrupt\n");
    274  1.5    cegger 		break;
    275  1.5    cegger 	case ACPI_HEST_TYPE_NOT_USED3:
    276  1.5    cegger 	case ACPI_HEST_TYPE_NOT_USED4:
    277  1.5    cegger 	case ACPI_HEST_TYPE_NOT_USED5:
    278  1.5    cegger 		printf("unused type: %d\n", hest->Type);
    279  1.5    cegger 		break;
    280  1.5    cegger 	case ACPI_HEST_TYPE_AER_ROOT_PORT:
    281  1.5    cegger 		printf("PCI Express Root Port AER\n");
    282  1.5    cegger 		break;
    283  1.5    cegger 	case ACPI_HEST_TYPE_AER_ENDPOINT:
    284  1.5    cegger 		printf("PCI Express Endpoint AER\n");
    285  1.5    cegger 		break;
    286  1.5    cegger 	case ACPI_HEST_TYPE_AER_BRIDGE:
    287  1.5    cegger 		printf("PCI Express/PCI-X Bridge AER\n");
    288  1.5    cegger 		break;
    289  1.5    cegger 	case ACPI_HEST_TYPE_GENERIC_ERROR:
    290  1.5    cegger 		printf("Generic Hardware Error Source\n");
    291  1.5    cegger 		break;
    292  1.5    cegger 	case ACPI_HEST_TYPE_RESERVED:
    293  1.5    cegger 	default:
    294  1.5    cegger 		printf("Reserved\n");
    295  1.5    cegger 		break;
    296  1.5    cegger 	}
    297  1.5    cegger 	printf(" }\n");
    298  1.5    cegger 	printf("\tSourceId=%d\n", hest->SourceId);
    299  1.5    cegger }
    300  1.5    cegger 
    301  1.5    cegger static void
    302  1.5    cegger acpi_print_hest_aer_common(ACPI_HEST_AER_COMMON *data)
    303  1.5    cegger {
    304  1.5    cegger 	printf("\tFlags={ ");
    305  1.5    cegger 	if (data->Flags & ACPI_HEST_FIRMWARE_FIRST)
    306  1.5    cegger 		printf("FIRMWARE_FIRST");
    307  1.5    cegger 	if (data->Flags & ACPI_HEST_GLOBAL)
    308  1.5    cegger 		printf("GLOBAL");
    309  1.5    cegger 	printf(" }\n");
    310  1.5    cegger 	printf("\tEnabled={ %s ", data->Flags ? "YES" : "NO");
    311  1.5    cegger 	if (data->Flags & ACPI_HEST_FIRMWARE_FIRST)
    312  1.5    cegger 		printf("(ignored) ");
    313  1.5    cegger 	printf("}\n");
    314  1.5    cegger 	printf("\tNumber of Record to pre-allocate=%d\n",
    315  1.5    cegger 		data->RecordsToPreallocate);
    316  1.5    cegger 	printf("\tMax. Sections per Record=%d\n", data->MaxSectionsPerRecord);
    317  1.5    cegger 	if (!(data->Flags & ACPI_HEST_GLOBAL))
    318  1.5    cegger 		acpi_print_pci_sbfd(0, data->Bus, data->Device, data->Function);
    319  1.5    cegger 	printf("\tDevice Control=0x%x\n", data->DeviceControl);
    320  1.5    cegger 	printf("\tUncorrectable Error Mask Register=0x%x\n",
    321  1.5    cegger 		data->UncorrectableMask);
    322  1.5    cegger 	printf("\tUncorrectable Error Severity Register=0x%x\n",
    323  1.5    cegger 		data->UncorrectableSeverity);
    324  1.5    cegger 	printf("\tCorrectable Error Mask Register=0x%x\n",
    325  1.5    cegger 		data->CorrectableMask);
    326  1.5    cegger 	printf("\tAdvanced Capabilities Register=0x%x\n",
    327  1.5    cegger 		data->AdvancedCapabilities);
    328  1.5    cegger }
    329  1.5    cegger 
    330  1.5    cegger static void
    331  1.5    cegger acpi_print_hest_notify(ACPI_HEST_NOTIFY *notify)
    332  1.5    cegger {
    333  1.5    cegger 	printf("\tHW Error Notification={\n");
    334  1.5    cegger 	printf("\t\tType={ ");
    335  1.5    cegger 	switch (notify->Type) {
    336  1.5    cegger 	case ACPI_HEST_NOTIFY_POLLED:
    337  1.5    cegger 		printf("POLLED");
    338  1.5    cegger 		break;
    339  1.5    cegger 	case ACPI_HEST_NOTIFY_EXTERNAL:
    340  1.5    cegger 		printf("EXTERN");
    341  1.5    cegger 		break;
    342  1.5    cegger 	case ACPI_HEST_NOTIFY_LOCAL:
    343  1.5    cegger 		printf("LOCAL");
    344  1.5    cegger 		break;
    345  1.5    cegger 	case ACPI_HEST_NOTIFY_SCI:
    346  1.5    cegger 		printf("SCI");
    347  1.5    cegger 		break;
    348  1.5    cegger 	case ACPI_HEST_NOTIFY_NMI:
    349  1.5    cegger 		printf("NMI");
    350  1.5    cegger 		break;
    351  1.5    cegger 	case ACPI_HEST_NOTIFY_RESERVED:
    352  1.5    cegger 		printf("RESERVED");
    353  1.5    cegger 		break;
    354  1.5    cegger 	default:
    355  1.5    cegger 		printf(" %d (reserved)", notify->Type);
    356  1.5    cegger 		break;
    357  1.5    cegger 	}
    358  1.5    cegger 	printf(" }\n");
    359  1.5    cegger 
    360  1.5    cegger 	printf("\t\tLength=%d\n", notify->Length);
    361  1.5    cegger 	printf("\t\tConfig Write Enable={\n");
    362  1.5    cegger 	if (notify->ConfigWriteEnable & ACPI_HEST_TYPE)
    363  1.5    cegger 		printf("TYPE");
    364  1.5    cegger 	if (notify->ConfigWriteEnable & ACPI_HEST_POLL_INTERVAL)
    365  1.5    cegger 		printf("POLL INTERVAL");
    366  1.5    cegger 	if (notify->ConfigWriteEnable & ACPI_HEST_POLL_THRESHOLD_VALUE)
    367  1.5    cegger 		printf("THRESHOLD VALUE");
    368  1.5    cegger 	if (notify->ConfigWriteEnable & ACPI_HEST_POLL_THRESHOLD_WINDOW)
    369  1.5    cegger 		printf("THRESHOLD WINDOW");
    370  1.5    cegger 	if (notify->ConfigWriteEnable & ACPI_HEST_ERR_THRESHOLD_VALUE)
    371  1.5    cegger 		printf("THRESHOLD VALUE");
    372  1.5    cegger 	if (notify->ConfigWriteEnable & ACPI_HEST_ERR_THRESHOLD_WINDOW)
    373  1.5    cegger 		printf("THRESHOLD WINDOW");
    374  1.5    cegger 	printf("}\n");
    375  1.5    cegger 
    376  1.5    cegger 	printf("\t\tPoll Interval=%d msec\n", notify->PollInterval);
    377  1.5    cegger 	printf("\t\tInterrupt Vector=%d\n", notify->Vector);
    378  1.5    cegger 	printf("\t\tSwitch To Polling Threshold Value=%d\n",
    379  1.5    cegger 		notify->PollingThresholdValue);
    380  1.5    cegger 	printf("\t\tSwitch To Polling Threshold Window=%d msec\n",
    381  1.5    cegger 		notify->PollingThresholdWindow);
    382  1.5    cegger 	printf("\t\tError Threshold Value=%d\n",
    383  1.5    cegger 		notify->ErrorThresholdValue);
    384  1.5    cegger 	printf("\t\tError Threshold Window=%d msec\n",
    385  1.5    cegger 		notify->ErrorThresholdWindow);
    386  1.5    cegger 	printf("\t}\n");
    387  1.5    cegger }
    388  1.5    cegger 
    389  1.5    cegger #ifdef notyet
    390  1.5    cegger static void
    391  1.5    cegger acpi_print_hest_generic_status(ACPI_HEST_GENERIC_STATUS *data)
    392  1.5    cegger {
    393  1.5    cegger 	uint32_t i, pos, entries;
    394  1.5    cegger 	ACPI_HEST_GENERIC_DATA *gen;
    395  1.5    cegger 
    396  1.5    cegger 	entries = data->BlockStatus & ACPI_HEST_ERROR_ENTRY_COUNT;
    397  1.5    cegger 
    398  1.5    cegger 	printf("\tGeneric Error Status={\n");
    399  1.5    cegger 	printf("\t\tBlock Status={ ");
    400  1.5    cegger 	if (data->BlockStatus & ACPI_HEST_UNCORRECTABLE)
    401  1.5    cegger 		printf("UNCORRECTABLE");
    402  1.5    cegger 	if (data->BlockStatus & ACPI_HEST_CORRECTABLE)
    403  1.5    cegger 		printf("CORRECTABLE");
    404  1.5    cegger 	if (data->BlockStatus & ACPI_HEST_MULTIPLE_UNCORRECTABLE)
    405  1.5    cegger 		printf("MULTIPLE UNCORRECTABLE");
    406  1.5    cegger 	if (data->BlockStatus & ACPI_HEST_MULTIPLE_CORRECTABLE)
    407  1.5    cegger 		printf("MULTIPLE CORRECTABLE");
    408  1.5    cegger 	printf(" }\n");
    409  1.5    cegger 	printf("\t\tEntry Count=%d\n", entries);
    410  1.5    cegger 	printf("\t\tRaw Data Offset=%d\n", data->RawDataOffset);
    411  1.5    cegger 	printf("\t\tRaw Data Length=%d\n", data->RawDataLength);
    412  1.5    cegger 	printf("\t\tData Length=%d\n", data->DataLength);
    413  1.5    cegger 	printf("\t");
    414  1.5    cegger 	acpi_print_hest_errorseverity(data->ErrorSeverity);
    415  1.5    cegger 	printf("\t}\n");
    416  1.5    cegger 
    417  1.5    cegger 	pos = sizeof(ACPI_HEST_GENERIC_STATUS);
    418  1.5    cegger 	for (i = 0; i < entries; i++) {
    419  1.5    cegger 		gen = (ACPI_HEST_GENERIC_DATA *)((char *)data + pos);
    420  1.5    cegger 		acpi_print_hest_generic_data(gen);
    421  1.5    cegger 		pos += sizeof(ACPI_HEST_GENERIC_DATA);
    422  1.5    cegger 	}
    423  1.5    cegger }
    424  1.5    cegger #endif
    425  1.5    cegger 
    426  1.5    cegger #ifdef notyet
    427  1.5    cegger static void
    428  1.5    cegger acpi_print_hest_generic_data(ACPI_HEST_GENERIC_DATA *data)
    429  1.5    cegger {
    430  1.5    cegger 	printf("\tGeneric Error Data={\n");
    431  1.5    cegger 	printf("\t\tSectionType=");
    432  1.5    cegger 	acpi_print_string((char *)data->SectionType, sizeof(data->SectionType));
    433  1.5    cegger 	printf("\n\t");
    434  1.5    cegger 	acpi_print_hest_errorseverity(data->ErrorSeverity);
    435  1.5    cegger 	printf("\t\tRevision=0x%x\n", data->Revision);
    436  1.5    cegger 	printf("\t\tValidation Bits=0x%x\n", data->ValidationBits);
    437  1.5    cegger 	printf("\t\tFlags=0x%x\n", data->Flags);
    438  1.5    cegger 	printf("\t\tData Length=%d\n", data->ErrorDataLength);
    439  1.5    cegger 	printf("\t\tField Replication Unit Id=");
    440  1.5    cegger 	acpi_print_string((char *)data->FruId, sizeof(data->FruId));
    441  1.5    cegger 	printf("\n");
    442  1.5    cegger 	printf("\t\tField Replication Unit=");
    443  1.5    cegger 	acpi_print_string((char *)data->FruText, sizeof(data->FruText));
    444  1.5    cegger 	printf("\n");
    445  1.5    cegger 	printf("\t}\n");
    446  1.5    cegger }
    447  1.5    cegger #endif
    448  1.5    cegger 
    449  1.5    cegger static void
    450  1.5    cegger acpi_print_whea(ACPI_WHEA_HEADER *whea,
    451  1.5    cegger     void (*print_action)(ACPI_WHEA_HEADER *),
    452  1.5    cegger     void (*print_ins)(ACPI_WHEA_HEADER *),
    453  1.5    cegger     void (*print_flags)(ACPI_WHEA_HEADER *))
    454  1.5    cegger {
    455  1.5    cegger 	printf("\n");
    456  1.5    cegger 
    457  1.5    cegger 	print_action(whea);
    458  1.5    cegger 	print_ins(whea);
    459  1.5    cegger 	if (print_flags)
    460  1.5    cegger 		print_flags(whea);
    461  1.5    cegger 	printf("\tRegisterRegion=");
    462  1.5    cegger 	acpi_print_gas(&whea->RegisterRegion);
    463  1.5    cegger 	printf("\n");
    464  1.5    cegger 	printf("\tMASK=0x%08"PRIx64"\n", whea->Mask);
    465  1.5    cegger }
    466  1.5    cegger 
    467  1.5    cegger static void
    468  1.5    cegger acpi_print_hest_ia32_check(ACPI_HEST_IA_MACHINE_CHECK *data)
    469  1.5    cegger {
    470  1.5    cegger 	uint32_t i, pos;
    471  1.5    cegger 	ACPI_HEST_IA_ERROR_BANK *bank;
    472  1.5    cegger 
    473  1.5    cegger 	acpi_print_hest_header(&data->Header);
    474  1.5    cegger 	printf("\tFlags={ ");
    475  1.5    cegger 	if (data->Flags & ACPI_HEST_FIRMWARE_FIRST)
    476  1.5    cegger 		printf("FIRMWARE_FIRST");
    477  1.5    cegger 	printf(" }\n");
    478  1.5    cegger 	printf("\tEnabled={ %s }\n", data->Enabled ? "YES" : "NO");
    479  1.5    cegger 	printf("\tNumber of Record to pre-allocate=%d\n",
    480  1.5    cegger 		data->RecordsToPreallocate);
    481  1.5    cegger 	printf("\tMax Sections per Record=%d\n",
    482  1.5    cegger 		data->MaxSectionsPerRecord);
    483  1.5    cegger 	printf("\tGlobal Capability Init Data=0x%"PRIx64"\n",
    484  1.5    cegger 		data->GlobalCapabilityData);
    485  1.5    cegger 	printf("\tGlobal Control Init Data=0x%"PRIx64"\n",
    486  1.5    cegger 		data->GlobalControlData);
    487  1.5    cegger 	printf("\tNumber of Hardware Error Reporting Banks=%d\n",
    488  1.5    cegger 		data->NumHardwareBanks);
    489  1.5    cegger 
    490  1.5    cegger 	pos = sizeof(ACPI_HEST_IA_MACHINE_CHECK);
    491  1.5    cegger 	for (i = 0; i < data->NumHardwareBanks; i++) {
    492  1.5    cegger 		bank = (ACPI_HEST_IA_ERROR_BANK *)((char *)data + pos);
    493  1.5    cegger 		acpi_print_hest_errorbank(bank);
    494  1.5    cegger 		pos += sizeof(ACPI_HEST_IA_ERROR_BANK);
    495  1.5    cegger 	}
    496  1.5    cegger }
    497  1.5    cegger 
    498  1.5    cegger static void
    499  1.5    cegger acpi_print_hest_ia32_correctedcheck(ACPI_HEST_IA_CORRECTED *data)
    500  1.5    cegger {
    501  1.5    cegger 	uint32_t i, pos;
    502  1.5    cegger 	ACPI_HEST_IA_ERROR_BANK *bank;
    503  1.5    cegger 
    504  1.5    cegger 	acpi_print_hest_header(&data->Header);
    505  1.5    cegger 	printf("\tFlags={ ");
    506  1.5    cegger 	if (data->Flags & ACPI_HEST_FIRMWARE_FIRST)
    507  1.5    cegger 		printf("FIRMWARE_FIRST");
    508  1.5    cegger 	printf(" }\n");
    509  1.5    cegger 	printf("\tEnabled={ %s }\n", data->Enabled ? "YES" : "NO");
    510  1.5    cegger 	printf("\tNumber of Record to pre-allocate=%d\n",
    511  1.5    cegger 		data->RecordsToPreallocate);
    512  1.5    cegger 	printf("\tMax Sections per Record=%d\n",
    513  1.5    cegger 		data->MaxSectionsPerRecord);
    514  1.5    cegger 	acpi_print_hest_notify(&data->Notify);
    515  1.5    cegger 
    516  1.5    cegger 	printf("\tNumber of Hardware Error Reporting Banks=%d\n",
    517  1.5    cegger 		data->NumHardwareBanks);
    518  1.5    cegger 
    519  1.5    cegger 	pos = sizeof(ACPI_HEST_IA_MACHINE_CHECK);
    520  1.5    cegger 	for (i = 0; i < data->NumHardwareBanks; i++) {
    521  1.5    cegger 		bank = (ACPI_HEST_IA_ERROR_BANK *)((char *)data + pos);
    522  1.5    cegger 		acpi_print_hest_errorbank(bank);
    523  1.5    cegger 		pos += sizeof(ACPI_HEST_IA_ERROR_BANK);
    524  1.5    cegger 	}
    525  1.5    cegger }
    526  1.5    cegger 
    527  1.5    cegger static void
    528  1.5    cegger acpi_print_hest_ia32_nmi(ACPI_HEST_IA_NMI *data)
    529  1.5    cegger {
    530  1.5    cegger 	acpi_print_hest_header(&data->Header);
    531  1.5    cegger 	printf("\tNumber of Record to pre-allocate=%d\n",
    532  1.5    cegger 		data->RecordsToPreallocate);
    533  1.5    cegger 	printf("\tMax Sections per Record=%d\n",
    534  1.5    cegger 		data->MaxSectionsPerRecord);
    535  1.5    cegger 	printf("\tMax Raw Data Length=%d\n",
    536  1.5    cegger 		data->MaxRawDataLength);
    537  1.5    cegger }
    538  1.5    cegger 
    539  1.5    cegger static void
    540  1.5    cegger acpi_print_hest_aer_root(ACPI_HEST_AER_ROOT *data)
    541  1.5    cegger {
    542  1.5    cegger 	acpi_print_hest_header(&data->Header);
    543  1.5    cegger 	acpi_print_hest_aer_common(&data->Aer);
    544  1.5    cegger 	printf("Root Error Command Register=0x%x\n", data->RootErrorCommand);
    545  1.5    cegger }
    546  1.5    cegger 
    547  1.5    cegger static void
    548  1.5    cegger acpi_print_hest_aer_endpoint(ACPI_HEST_AER *data)
    549  1.5    cegger {
    550  1.5    cegger 	acpi_print_hest_header(&data->Header);
    551  1.5    cegger 	acpi_print_hest_aer_common(&data->Aer);
    552  1.5    cegger }
    553  1.5    cegger 
    554  1.5    cegger static void
    555  1.5    cegger acpi_print_hest_aer_bridge(ACPI_HEST_AER_BRIDGE *data)
    556  1.5    cegger {
    557  1.5    cegger 	acpi_print_hest_header(&data->Header);
    558  1.5    cegger 	acpi_print_hest_aer_common(&data->Aer);
    559  1.5    cegger 
    560  1.5    cegger 	printf("\tSecondary Uncorrectable Error Mask Register=0x%x\n",
    561  1.5    cegger 		data->UncorrectableMask2);
    562  1.5    cegger 	printf("\tSecondary Uncorrectable Error Severity Register=0x%x\n",
    563  1.5    cegger 		data->UncorrectableSeverity2);
    564  1.5    cegger 	printf("\tSecondory Advanced Capabilities Register=0x%x\n",
    565  1.5    cegger 		data->AdvancedCapabilities2);
    566  1.5    cegger }
    567  1.5    cegger 
    568  1.5    cegger static void
    569  1.5    cegger acpi_print_hest_generic(ACPI_HEST_GENERIC *data)
    570  1.5    cegger {
    571  1.5    cegger 	acpi_print_hest_header(&data->Header);
    572  1.5    cegger 	if (data->RelatedSourceId != 0xffff)
    573  1.5    cegger 		printf("\tReleated SourceId=%d\n", data->RelatedSourceId);
    574  1.5    cegger 	printf("\tEnabled={ %s }\n", data->Enabled ? "YES" : "NO");
    575  1.5    cegger 	printf("\tNumber of Records to pre-allocate=%d\n",
    576  1.5    cegger 		data->RecordsToPreallocate);
    577  1.5    cegger 	printf("\tMax Sections per Record=%d\n",
    578  1.5    cegger 		data->MaxSectionsPerRecord);
    579  1.5    cegger 	printf("\tMax Raw Data Length=%d\n", data->MaxRawDataLength);
    580  1.5    cegger 	printf("\tError Status Address=");
    581  1.5    cegger 	acpi_print_gas(&data->ErrorStatusAddress);
    582  1.5    cegger 	acpi_print_hest_notify(&data->Notify);
    583  1.5    cegger 	printf("\tError Block Length=%d\n", data->ErrorBlockLength);
    584  1.5    cegger }
    585  1.5    cegger 
    586  1.5    cegger static void
    587  1.5    cegger acpi_handle_hest(ACPI_TABLE_HEADER *sdp)
    588  1.5    cegger {
    589  1.5    cegger 	ACPI_TABLE_HEST *hest;
    590  1.5    cegger 	ACPI_HEST_HEADER *subhest;
    591  1.5    cegger 	uint32_t i, pos;
    592  1.5    cegger 	void *subtable;
    593  1.5    cegger 
    594  1.5    cegger 	printf(BEGIN_COMMENT);
    595  1.5    cegger 	acpi_print_sdt(sdp);
    596  1.5    cegger 	hest = (ACPI_TABLE_HEST *)sdp;
    597  1.5    cegger 
    598  1.5    cegger 	printf("\tError Source Count=%d\n", hest->ErrorSourceCount);
    599  1.5    cegger 	pos = sizeof(ACPI_TABLE_HEST);
    600  1.5    cegger 	for (i = 0; i < hest->ErrorSourceCount; i++) {
    601  1.5    cegger 		subhest = (ACPI_HEST_HEADER *)((char *)hest + pos);
    602  1.5    cegger 		subtable = (void *)((char *)subhest + sizeof(ACPI_HEST_HEADER));
    603  1.5    cegger 		printf("\n");
    604  1.5    cegger 
    605  1.5    cegger 		printf("\tType={ ");
    606  1.5    cegger 		switch (subhest->Type) {
    607  1.5    cegger 		case ACPI_HEST_TYPE_IA32_CHECK:
    608  1.5    cegger 			acpi_print_hest_ia32_check(subtable);
    609  1.5    cegger 			pos += sizeof(ACPI_HEST_IA_MACHINE_CHECK);
    610  1.5    cegger 			break;
    611  1.5    cegger 
    612  1.5    cegger 		case ACPI_HEST_TYPE_IA32_CORRECTED_CHECK:
    613  1.5    cegger 			acpi_print_hest_ia32_correctedcheck(subtable);
    614  1.5    cegger 			pos += sizeof(ACPI_HEST_IA_CORRECTED);
    615  1.5    cegger 			break;
    616  1.5    cegger 
    617  1.5    cegger 		case ACPI_HEST_TYPE_IA32_NMI:
    618  1.5    cegger 			acpi_print_hest_ia32_nmi(subtable);
    619  1.5    cegger 			pos += sizeof(ACPI_HEST_IA_NMI);
    620  1.5    cegger 			break;
    621  1.5    cegger 
    622  1.5    cegger 		case ACPI_HEST_TYPE_NOT_USED3:
    623  1.5    cegger 		case ACPI_HEST_TYPE_NOT_USED4:
    624  1.5    cegger 		case ACPI_HEST_TYPE_NOT_USED5:
    625  1.5    cegger 			pos += sizeof(ACPI_HEST_HEADER);
    626  1.5    cegger 			break;
    627  1.5    cegger 
    628  1.5    cegger 		case ACPI_HEST_TYPE_AER_ROOT_PORT:
    629  1.5    cegger 			acpi_print_hest_aer_root(subtable);
    630  1.5    cegger 			pos += sizeof(ACPI_HEST_AER_ROOT);
    631  1.5    cegger 			break;
    632  1.5    cegger 
    633  1.5    cegger 		case ACPI_HEST_TYPE_AER_ENDPOINT:
    634  1.5    cegger 			acpi_print_hest_aer_endpoint(subtable);
    635  1.5    cegger 			pos += sizeof(ACPI_HEST_AER_ROOT);
    636  1.5    cegger 			break;
    637  1.5    cegger 
    638  1.5    cegger 		case ACPI_HEST_TYPE_AER_BRIDGE:
    639  1.5    cegger 			acpi_print_hest_aer_bridge(subtable);
    640  1.5    cegger 			pos += sizeof(ACPI_HEST_AER_BRIDGE);
    641  1.5    cegger 			break;
    642  1.5    cegger 
    643  1.5    cegger 		case ACPI_HEST_TYPE_GENERIC_ERROR:
    644  1.5    cegger 			acpi_print_hest_generic(subtable);
    645  1.5    cegger 			pos += sizeof(ACPI_HEST_GENERIC);
    646  1.5    cegger 			break;
    647  1.5    cegger 
    648  1.5    cegger 		case ACPI_HEST_TYPE_RESERVED:
    649  1.5    cegger 		default:
    650  1.5    cegger 			pos += sizeof(ACPI_HEST_HEADER);
    651  1.5    cegger 			break;
    652  1.5    cegger 		}
    653  1.5    cegger 	}
    654  1.5    cegger 
    655  1.5    cegger 	printf(END_COMMENT);
    656  1.5    cegger }
    657  1.5    cegger 
    658  1.5    cegger /* The FADT revision indicates whether we use the DSDT or X_DSDT addresses. */
    659  1.5    cegger static int
    660  1.5    cegger acpi_get_fadt_revision(ACPI_TABLE_FADT *fadt)
    661  1.5    cegger {
    662  1.5    cegger 	int fadt_revision;
    663  1.5    cegger 
    664  1.5    cegger 	/* Set the FADT revision separately from the RSDP version. */
    665  1.5    cegger 	if (addr_size == 8) {
    666  1.5    cegger 		fadt_revision = 2;
    667  1.5    cegger 
    668  1.5    cegger 		/*
    669  1.5    cegger 		 * A few systems (e.g., IBM T23) have an RSDP that claims
    670  1.5    cegger 		 * revision 2 but the 64 bit addresses are invalid.  If
    671  1.5    cegger 		 * revision 2 and the 32 bit address is non-zero but the
    672  1.5    cegger 		 * 32 and 64 bit versions don't match, prefer the 32 bit
    673  1.5    cegger 		 * version for all subsequent tables.
    674  1.5    cegger 		 */
    675  1.5    cegger 		if (fadt->Facs != 0 &&
    676  1.5    cegger 		    (fadt->XFacs & 0xffffffff) != fadt->Facs)
    677  1.5    cegger 			fadt_revision = 1;
    678  1.5    cegger 	} else
    679  1.5    cegger 		fadt_revision = 1;
    680  1.5    cegger 	return (fadt_revision);
    681  1.5    cegger }
    682  1.5    cegger 
    683  1.5    cegger static void
    684  1.5    cegger acpi_handle_fadt(ACPI_TABLE_HEADER *sdp)
    685  1.5    cegger {
    686  1.5    cegger 	ACPI_TABLE_HEADER *dsdp;
    687  1.5    cegger 	ACPI_TABLE_FACS	*facs;
    688  1.5    cegger 	ACPI_TABLE_FADT *fadt;
    689  1.5    cegger 	int		fadt_revision;
    690  1.5    cegger 
    691  1.5    cegger 	fadt = (ACPI_TABLE_FADT *)sdp;
    692  1.5    cegger 	acpi_print_fadt(sdp);
    693  1.5    cegger 
    694  1.5    cegger 	fadt_revision = acpi_get_fadt_revision(fadt);
    695  1.5    cegger 	if (fadt_revision == 1)
    696  1.5    cegger 		facs = (ACPI_TABLE_FACS *)acpi_map_sdt(fadt->Facs);
    697  1.5    cegger 	else
    698  1.5    cegger 		facs = (ACPI_TABLE_FACS *)acpi_map_sdt(fadt->XFacs);
    699  1.5    cegger 	if (memcmp(facs->Signature, ACPI_SIG_FACS, 4) != 0 || facs->Length < 64)
    700  1.5    cegger 		errx(EXIT_FAILURE, "FACS is corrupt");
    701  1.5    cegger 	acpi_print_facs(facs);
    702  1.5    cegger 
    703  1.5    cegger 	if (fadt_revision == 1)
    704  1.5    cegger 		dsdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(fadt->Dsdt);
    705  1.5    cegger 	else
    706  1.5    cegger 		dsdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(fadt->XDsdt);
    707  1.5    cegger 	if (acpi_checksum(dsdp, dsdp->Length))
    708  1.5    cegger 		errx(EXIT_FAILURE, "DSDT is corrupt");
    709  1.5    cegger 	acpi_print_dsdt(dsdp);
    710  1.5    cegger }
    711  1.5    cegger 
    712  1.5    cegger static void
    713  1.5    cegger acpi_walk_subtables(ACPI_TABLE_HEADER *table, void *first,
    714  1.5    cegger     void (*action)(ACPI_SUBTABLE_HEADER *))
    715  1.5    cegger {
    716  1.5    cegger 	ACPI_SUBTABLE_HEADER *subtable;
    717  1.5    cegger 	char *end;
    718  1.5    cegger 
    719  1.5    cegger 	subtable = first;
    720  1.5    cegger 	end = (char *)table + table->Length;
    721  1.5    cegger 	while ((char *)subtable < end) {
    722  1.5    cegger 		printf("\n");
    723  1.5    cegger 		action(subtable);
    724  1.5    cegger 		subtable = (ACPI_SUBTABLE_HEADER *)((char *)subtable +
    725  1.5    cegger 		    subtable->Length);
    726  1.5    cegger 	}
    727  1.5    cegger }
    728  1.5    cegger 
    729  1.5    cegger static void
    730  1.5    cegger acpi_print_cpu(u_char cpu_id)
    731  1.5    cegger {
    732  1.5    cegger 
    733  1.5    cegger 	printf("\tACPI CPU=");
    734  1.5    cegger 	if (cpu_id == 0xff)
    735  1.5    cegger 		printf("ALL\n");
    736  1.5    cegger 	else
    737  1.5    cegger 		printf("%d\n", (u_int)cpu_id);
    738  1.5    cegger }
    739  1.5    cegger 
    740  1.5    cegger static void
    741  1.5    cegger acpi_print_cpu_uid(uint32_t uid, char *uid_string)
    742  1.5    cegger {
    743  1.5    cegger 
    744  1.5    cegger 	printf("\tUID=%d", uid);
    745  1.5    cegger 	if (uid_string != NULL)
    746  1.5    cegger 		printf(" (%s)", uid_string);
    747  1.5    cegger 	printf("\n");
    748  1.5    cegger }
    749  1.5    cegger 
    750  1.5    cegger static void
    751  1.5    cegger acpi_print_local_apic(uint32_t apic_id, uint32_t flags)
    752  1.5    cegger {
    753  1.5    cegger 
    754  1.5    cegger 	printf("\tFlags={");
    755  1.5    cegger 	if (flags & ACPI_MADT_ENABLED)
    756  1.5    cegger 		printf("ENABLED");
    757  1.5    cegger 	else
    758  1.5    cegger 		printf("DISABLED");
    759  1.5    cegger 	printf("}\n");
    760  1.5    cegger 	printf("\tAPIC ID=%d\n", apic_id);
    761  1.5    cegger }
    762  1.5    cegger 
    763  1.5    cegger static void
    764  1.5    cegger acpi_print_io_apic(uint32_t apic_id, uint32_t int_base, uint64_t apic_addr)
    765  1.5    cegger {
    766  1.5    cegger 
    767  1.5    cegger 	printf("\tAPIC ID=%d\n", apic_id);
    768  1.5    cegger 	printf("\tINT BASE=%d\n", int_base);
    769  1.5    cegger 	printf("\tADDR=0x%016jx\n", (uintmax_t)apic_addr);
    770  1.5    cegger }
    771  1.5    cegger 
    772  1.5    cegger static void
    773  1.5    cegger acpi_print_mps_flags(uint16_t flags)
    774  1.5    cegger {
    775  1.5    cegger 
    776  1.5    cegger 	printf("\tFlags={Polarity=");
    777  1.5    cegger 	switch (flags & ACPI_MADT_POLARITY_MASK) {
    778  1.5    cegger 	case ACPI_MADT_POLARITY_CONFORMS:
    779  1.5    cegger 		printf("conforming");
    780  1.5    cegger 		break;
    781  1.5    cegger 	case ACPI_MADT_POLARITY_ACTIVE_HIGH:
    782  1.5    cegger 		printf("active-hi");
    783  1.5    cegger 		break;
    784  1.5    cegger 	case ACPI_MADT_POLARITY_ACTIVE_LOW:
    785  1.5    cegger 		printf("active-lo");
    786  1.5    cegger 		break;
    787  1.5    cegger 	default:
    788  1.5    cegger 		printf("0x%x", flags & ACPI_MADT_POLARITY_MASK);
    789  1.5    cegger 		break;
    790  1.5    cegger 	}
    791  1.5    cegger 	printf(", Trigger=");
    792  1.5    cegger 	switch (flags & ACPI_MADT_TRIGGER_MASK) {
    793  1.5    cegger 	case ACPI_MADT_TRIGGER_CONFORMS:
    794  1.5    cegger 		printf("conforming");
    795  1.5    cegger 		break;
    796  1.5    cegger 	case ACPI_MADT_TRIGGER_EDGE:
    797  1.5    cegger 		printf("edge");
    798  1.5    cegger 		break;
    799  1.5    cegger 	case ACPI_MADT_TRIGGER_LEVEL:
    800  1.5    cegger 		printf("level");
    801  1.5    cegger 		break;
    802  1.5    cegger 	default:
    803  1.5    cegger 		printf("0x%x", (flags & ACPI_MADT_TRIGGER_MASK) >> 2);
    804  1.5    cegger 	}
    805  1.5    cegger 	printf("}\n");
    806  1.5    cegger }
    807  1.5    cegger 
    808  1.5    cegger static void
    809  1.5    cegger acpi_print_intr(uint32_t intr, uint16_t mps_flags)
    810  1.5    cegger {
    811  1.5    cegger 
    812  1.5    cegger 	printf("\tINTR=%d\n", intr);
    813  1.5    cegger 	acpi_print_mps_flags(mps_flags);
    814  1.5    cegger }
    815  1.5    cegger 
    816  1.5    cegger static void
    817  1.5    cegger acpi_print_local_nmi(u_int lint, uint16_t mps_flags)
    818  1.5    cegger {
    819  1.5    cegger 
    820  1.5    cegger 	printf("\tLINT Pin=%d\n", lint);
    821  1.5    cegger 	acpi_print_mps_flags(mps_flags);
    822  1.5    cegger }
    823  1.5    cegger 
    824  1.5    cegger const char *apic_types[] = { "Local APIC", "IO APIC", "INT Override", "NMI",
    825  1.5    cegger 			     "Local APIC NMI", "Local APIC Override",
    826  1.5    cegger 			     "IO SAPIC", "Local SAPIC", "Platform Interrupt",
    827  1.5    cegger 			     "Local X2APIC", "Local X2APIC NMI" };
    828  1.5    cegger const char *platform_int_types[] = { "0 (unknown)", "PMI", "INIT",
    829  1.5    cegger 				     "Corrected Platform Error" };
    830  1.5    cegger 
    831  1.5    cegger static void
    832  1.5    cegger acpi_print_madt(ACPI_SUBTABLE_HEADER *mp)
    833  1.5    cegger {
    834  1.5    cegger 	ACPI_MADT_LOCAL_APIC *lapic;
    835  1.5    cegger 	ACPI_MADT_IO_APIC *ioapic;
    836  1.5    cegger 	ACPI_MADT_INTERRUPT_OVERRIDE *over;
    837  1.5    cegger 	ACPI_MADT_NMI_SOURCE *nmi;
    838  1.5    cegger 	ACPI_MADT_LOCAL_APIC_NMI *lapic_nmi;
    839  1.5    cegger 	ACPI_MADT_LOCAL_APIC_OVERRIDE *lapic_over;
    840  1.5    cegger 	ACPI_MADT_IO_SAPIC *iosapic;
    841  1.5    cegger 	ACPI_MADT_LOCAL_SAPIC *lsapic;
    842  1.5    cegger 	ACPI_MADT_INTERRUPT_SOURCE *isrc;
    843  1.5    cegger 	ACPI_MADT_LOCAL_X2APIC *x2apic;
    844  1.5    cegger 	ACPI_MADT_LOCAL_X2APIC_NMI *x2apic_nmi;
    845  1.5    cegger 
    846  1.5    cegger 	if (mp->Type < sizeof(apic_types) / sizeof(apic_types[0]))
    847  1.5    cegger 		printf("\tType=%s\n", apic_types[mp->Type]);
    848  1.5    cegger 	else
    849  1.5    cegger 		printf("\tType=%d (unknown)\n", mp->Type);
    850  1.5    cegger 	switch (mp->Type) {
    851  1.5    cegger 	case ACPI_MADT_TYPE_LOCAL_APIC:
    852  1.5    cegger 		lapic = (ACPI_MADT_LOCAL_APIC *)mp;
    853  1.5    cegger 		acpi_print_cpu(lapic->ProcessorId);
    854  1.5    cegger 		acpi_print_local_apic(lapic->Id, lapic->LapicFlags);
    855  1.5    cegger 		break;
    856  1.5    cegger 	case ACPI_MADT_TYPE_IO_APIC:
    857  1.5    cegger 		ioapic = (ACPI_MADT_IO_APIC *)mp;
    858  1.5    cegger 		acpi_print_io_apic(ioapic->Id, ioapic->GlobalIrqBase,
    859  1.5    cegger 		    ioapic->Address);
    860  1.5    cegger 		break;
    861  1.5    cegger 	case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
    862  1.5    cegger 		over = (ACPI_MADT_INTERRUPT_OVERRIDE *)mp;
    863  1.5    cegger 		printf("\tBUS=%d\n", (u_int)over->Bus);
    864  1.5    cegger 		printf("\tIRQ=%d\n", (u_int)over->SourceIrq);
    865  1.5    cegger 		acpi_print_intr(over->GlobalIrq, over->IntiFlags);
    866  1.5    cegger 		break;
    867  1.5    cegger 	case ACPI_MADT_TYPE_NMI_SOURCE:
    868  1.5    cegger 		nmi = (ACPI_MADT_NMI_SOURCE *)mp;
    869  1.5    cegger 		acpi_print_intr(nmi->GlobalIrq, nmi->IntiFlags);
    870  1.5    cegger 		break;
    871  1.5    cegger 	case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
    872  1.5    cegger 		lapic_nmi = (ACPI_MADT_LOCAL_APIC_NMI *)mp;
    873  1.5    cegger 		acpi_print_cpu(lapic_nmi->ProcessorId);
    874  1.5    cegger 		acpi_print_local_nmi(lapic_nmi->Lint, lapic_nmi->IntiFlags);
    875  1.5    cegger 		break;
    876  1.5    cegger 	case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
    877  1.5    cegger 		lapic_over = (ACPI_MADT_LOCAL_APIC_OVERRIDE *)mp;
    878  1.5    cegger 		printf("\tLocal APIC ADDR=0x%016jx\n",
    879  1.5    cegger 		    (uintmax_t)lapic_over->Address);
    880  1.5    cegger 		break;
    881  1.5    cegger 	case ACPI_MADT_TYPE_IO_SAPIC:
    882  1.5    cegger 		iosapic = (ACPI_MADT_IO_SAPIC *)mp;
    883  1.5    cegger 		acpi_print_io_apic(iosapic->Id, iosapic->GlobalIrqBase,
    884  1.5    cegger 		    iosapic->Address);
    885  1.5    cegger 		break;
    886  1.5    cegger 	case ACPI_MADT_TYPE_LOCAL_SAPIC:
    887  1.5    cegger 		lsapic = (ACPI_MADT_LOCAL_SAPIC *)mp;
    888  1.5    cegger 		acpi_print_cpu(lsapic->ProcessorId);
    889  1.5    cegger 		acpi_print_local_apic(lsapic->Id, lsapic->LapicFlags);
    890  1.5    cegger 		printf("\tAPIC EID=%d\n", (u_int)lsapic->Eid);
    891  1.5    cegger 		if (mp->Length > offsetof(ACPI_MADT_LOCAL_SAPIC, Uid))
    892  1.5    cegger 			acpi_print_cpu_uid(lsapic->Uid, lsapic->UidString);
    893  1.5    cegger 		break;
    894  1.5    cegger 	case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
    895  1.5    cegger 		isrc = (ACPI_MADT_INTERRUPT_SOURCE *)mp;
    896  1.5    cegger 		if (isrc->Type < sizeof(platform_int_types) /
    897  1.5    cegger 		    sizeof(platform_int_types[0]))
    898  1.5    cegger 			printf("\tType=%s\n", platform_int_types[isrc->Type]);
    899  1.5    cegger 		else
    900  1.5    cegger 			printf("\tType=%d (unknown)\n", isrc->Type);
    901  1.5    cegger 		printf("\tAPIC ID=%d\n", (u_int)isrc->Id);
    902  1.5    cegger 		printf("\tAPIC EID=%d\n", (u_int)isrc->Eid);
    903  1.5    cegger 		printf("\tSAPIC Vector=%d\n", (u_int)isrc->IoSapicVector);
    904  1.5    cegger 		acpi_print_intr(isrc->GlobalIrq, isrc->IntiFlags);
    905  1.5    cegger 		break;
    906  1.5    cegger 	case ACPI_MADT_TYPE_LOCAL_X2APIC:
    907  1.5    cegger 		x2apic = (ACPI_MADT_LOCAL_X2APIC *)mp;
    908  1.5    cegger 		acpi_print_cpu_uid(x2apic->Uid, NULL);
    909  1.5    cegger 		acpi_print_local_apic(x2apic->LocalApicId, x2apic->LapicFlags);
    910  1.5    cegger 		break;
    911  1.5    cegger 	case ACPI_MADT_TYPE_LOCAL_X2APIC_NMI:
    912  1.5    cegger 		x2apic_nmi = (ACPI_MADT_LOCAL_X2APIC_NMI *)mp;
    913  1.5    cegger 		acpi_print_cpu_uid(x2apic_nmi->Uid, NULL);
    914  1.5    cegger 		acpi_print_local_nmi(x2apic_nmi->Lint, x2apic_nmi->IntiFlags);
    915  1.5    cegger 		break;
    916  1.5    cegger 	}
    917  1.5    cegger }
    918  1.5    cegger 
    919  1.5    cegger #ifdef notyet
    920  1.5    cegger static void
    921  1.5    cegger acpi_print_bert_region(ACPI_BERT_REGION *region)
    922  1.5    cegger {
    923  1.5    cegger 	uint32_t i, pos, entries;
    924  1.5    cegger 	ACPI_HEST_GENERIC_DATA *data;
    925  1.5    cegger 
    926  1.5    cegger 	printf("\n");
    927  1.5    cegger 	printf("\tBlockStatus={ ");
    928  1.5    cegger 
    929  1.5    cegger 	if (region->BlockStatus & ACPI_BERT_UNCORRECTABLE)
    930  1.5    cegger 		printf("Uncorrectable");
    931  1.5    cegger 	if (region->BlockStatus & ACPI_BERT_CORRECTABLE)
    932  1.5    cegger 		printf("Correctable");
    933  1.5    cegger 	if (region->BlockStatus & ACPI_BERT_MULTIPLE_UNCORRECTABLE)
    934  1.5    cegger 		printf("Multiple Uncorrectable");
    935  1.5    cegger 	if (region->BlockStatus & ACPI_BERT_MULTIPLE_CORRECTABLE)
    936  1.5    cegger 		printf("Multiple Correctable");
    937  1.5    cegger 	entries = region->BlockStatus & ACPI_BERT_ERROR_ENTRY_COUNT;
    938  1.5    cegger 	printf(", Error Entry Count=%d", entries);
    939  1.5    cegger 	printf("}\n");
    940  1.5    cegger 
    941  1.5    cegger 	printf("\tRaw Data Offset=0x%x\n", region->RawDataOffset);
    942  1.5    cegger 	printf("\tRaw Data Length=0x%x\n", region->RawDataLength);
    943  1.5    cegger 	printf("\tData Length=0x%x\n", region->DataLength);
    944  1.5    cegger 
    945  1.5    cegger 	acpi_print_hest_errorseverity(region->ErrorSeverity);
    946  1.5    cegger 
    947  1.5    cegger 	pos = sizeof(ACPI_BERT_REGION);
    948  1.5    cegger 	for (i = 0; i < entries; i++) {
    949  1.5    cegger 		data = (ACPI_HEST_GENERIC_DATA *)((char *)region + pos);
    950  1.5    cegger 		acpi_print_hest_generic_data(data);
    951  1.5    cegger 		pos += sizeof(ACPI_HEST_GENERIC_DATA);
    952  1.5    cegger 	}
    953  1.5    cegger }
    954  1.5    cegger #endif
    955  1.5    cegger 
    956  1.5    cegger static void
    957  1.5    cegger acpi_handle_bert(ACPI_TABLE_HEADER *sdp)
    958  1.5    cegger {
    959  1.5    cegger 	ACPI_TABLE_BERT *bert;
    960  1.5    cegger 
    961  1.5    cegger 	printf(BEGIN_COMMENT);
    962  1.5    cegger 	acpi_print_sdt(sdp);
    963  1.5    cegger 	bert = (ACPI_TABLE_BERT *)sdp;
    964  1.5    cegger 
    965  1.5    cegger 	printf("\tLength of Boot Error Region=%d bytes\n", bert->RegionLength);
    966  1.5    cegger 	printf("\tPhysical Address of Region=0x%"PRIx64"\n", bert->Address);
    967  1.5    cegger 
    968  1.5    cegger 	printf(END_COMMENT);
    969  1.5    cegger }
    970  1.5    cegger 
    971  1.5    cegger static void
    972  1.5    cegger acpi_handle_boot(ACPI_TABLE_HEADER *sdp)
    973  1.5    cegger {
    974  1.5    cegger 	ACPI_TABLE_BOOT *boot;
    975  1.5    cegger 
    976  1.5    cegger 	printf(BEGIN_COMMENT);
    977  1.5    cegger 	acpi_print_sdt(sdp);
    978  1.5    cegger 	boot = (ACPI_TABLE_BOOT *)sdp;
    979  1.5    cegger 	printf("\tCMOS Index=0x%02x\n", boot->CmosIndex);
    980  1.5    cegger 	printf(END_COMMENT);
    981  1.5    cegger }
    982  1.5    cegger 
    983  1.5    cegger static void
    984  1.5    cegger acpi_handle_cpep(ACPI_TABLE_HEADER *sdp)
    985  1.5    cegger {
    986  1.5    cegger 	ACPI_TABLE_CPEP *cpep;
    987  1.5    cegger 	ACPI_CPEP_POLLING *poll;
    988  1.5    cegger 	uint32_t cpep_pos;
    989  1.5    cegger 
    990  1.5    cegger 	printf(BEGIN_COMMENT);
    991  1.5    cegger 	acpi_print_sdt(sdp);
    992  1.5    cegger 	cpep = (ACPI_TABLE_CPEP *)sdp;
    993  1.5    cegger 
    994  1.5    cegger 	cpep_pos = sizeof(ACPI_TABLE_CPEP);
    995  1.5    cegger 	while (cpep_pos < sdp->Length) {
    996  1.5    cegger 		poll = (ACPI_CPEP_POLLING *)((char *)cpep + cpep_pos);
    997  1.5    cegger 		acpi_print_cpu(poll->Id);
    998  1.5    cegger 		printf("\tACPI CPU EId=%d\n", poll->Eid);
    999  1.5    cegger 		printf("\tPoll Interval=%d msec\n", poll->Interval);
   1000  1.5    cegger 		cpep_pos += sizeof(ACPI_CPEP_POLLING);
   1001  1.5    cegger 	}
   1002  1.5    cegger 	printf(END_COMMENT);
   1003  1.5    cegger }
   1004  1.5    cegger 
   1005  1.5    cegger static void
   1006  1.5    cegger acpi_handle_dbgp(ACPI_TABLE_HEADER *sdp)
   1007  1.5    cegger {
   1008  1.5    cegger 	ACPI_TABLE_DBGP *dbgp;
   1009  1.5    cegger 
   1010  1.5    cegger 	printf(BEGIN_COMMENT);
   1011  1.5    cegger 	acpi_print_sdt(sdp);
   1012  1.5    cegger 	dbgp = (ACPI_TABLE_DBGP *)sdp;
   1013  1.5    cegger 	printf("\tType={");
   1014  1.5    cegger 	switch (dbgp->Type) {
   1015  1.5    cegger 	case 0:
   1016  1.5    cegger 		printf("full 16550");
   1017  1.5    cegger 		break;
   1018  1.5    cegger 	case 1:
   1019  1.5    cegger 		printf("subset of 16550");
   1020  1.5    cegger 		break;
   1021  1.5    cegger 	}
   1022  1.5    cegger 	printf("}\n");
   1023  1.5    cegger 	printf("DebugPort=");
   1024  1.5    cegger 	acpi_print_gas(&dbgp->DebugPort);
   1025  1.5    cegger 	printf(END_COMMENT);
   1026  1.5    cegger }
   1027  1.5    cegger 
   1028  1.5    cegger static void
   1029  1.5    cegger acpi_print_einj_action(ACPI_WHEA_HEADER *whea)
   1030  1.5    cegger {
   1031  1.5    cegger 	printf("\tACTION={");
   1032  1.5    cegger 	switch (whea->Action) {
   1033  1.5    cegger 	case ACPI_EINJ_BEGIN_OPERATION:
   1034  1.5    cegger 		printf("Begin Operation");
   1035  1.5    cegger 		break;
   1036  1.5    cegger 	case ACPI_EINJ_GET_TRIGGER_TABLE:
   1037  1.5    cegger 		printf("Get Trigger Table");
   1038  1.5    cegger 		break;
   1039  1.5    cegger 	case ACPI_EINJ_SET_ERROR_TYPE:
   1040  1.5    cegger 		printf("Set Error Type");
   1041  1.5    cegger 		break;
   1042  1.5    cegger 	case ACPI_EINJ_GET_ERROR_TYPE:
   1043  1.5    cegger 		printf("Get Error Type");
   1044  1.5    cegger 		break;
   1045  1.5    cegger 	case ACPI_EINJ_END_OPERATION:
   1046  1.5    cegger 		printf("End Operation");
   1047  1.5    cegger 		break;
   1048  1.5    cegger 	case ACPI_EINJ_EXECUTE_OPERATION:
   1049  1.5    cegger 		printf("Execute Operation");
   1050  1.5    cegger 		break;
   1051  1.5    cegger 	case ACPI_EINJ_CHECK_BUSY_STATUS:
   1052  1.5    cegger 		printf("Check Busy Status");
   1053  1.5    cegger 		break;
   1054  1.5    cegger 	case ACPI_EINJ_GET_COMMAND_STATUS:
   1055  1.5    cegger 		printf("Get Command Status");
   1056  1.5    cegger 		break;
   1057  1.5    cegger 	case ACPI_EINJ_ACTION_RESERVED:
   1058  1.5    cegger 		printf("Preserved");
   1059  1.5    cegger 		break;
   1060  1.5    cegger 	case ACPI_EINJ_TRIGGER_ERROR:
   1061  1.5    cegger 		printf("Trigger Error");
   1062  1.5    cegger 		break;
   1063  1.5    cegger 	default:
   1064  1.5    cegger 		printf("%d", whea->Action);
   1065  1.5    cegger 		break;
   1066  1.5    cegger 	}
   1067  1.5    cegger 	printf("}\n");
   1068  1.5    cegger }
   1069  1.5    cegger 
   1070  1.5    cegger static void
   1071  1.5    cegger acpi_print_einj_instruction(ACPI_WHEA_HEADER *whea)
   1072  1.5    cegger {
   1073  1.5    cegger 	uint32_t ins = whea->Instruction;
   1074  1.5    cegger 
   1075  1.5    cegger 	printf("\tINSTRUCTION={");
   1076  1.5    cegger 	switch (ins) {
   1077  1.5    cegger 	case ACPI_EINJ_READ_REGISTER:
   1078  1.5    cegger 		printf("Read Register");
   1079  1.5    cegger 		break;
   1080  1.5    cegger 	case ACPI_EINJ_READ_REGISTER_VALUE:
   1081  1.5    cegger 		printf("Read Register Value");
   1082  1.5    cegger 		break;
   1083  1.5    cegger 	case ACPI_EINJ_WRITE_REGISTER:
   1084  1.5    cegger 		printf("Write Register");
   1085  1.5    cegger 		break;
   1086  1.5    cegger 	case ACPI_EINJ_WRITE_REGISTER_VALUE:
   1087  1.5    cegger 		printf("Write Register Value");
   1088  1.5    cegger 		break;
   1089  1.5    cegger 	case ACPI_EINJ_NOOP:
   1090  1.5    cegger 		printf("Noop");
   1091  1.5    cegger 		break;
   1092  1.5    cegger 	case ACPI_EINJ_INSTRUCTION_RESERVED:
   1093  1.5    cegger 		printf("Reserved");
   1094  1.5    cegger 		break;
   1095  1.5    cegger 	default:
   1096  1.5    cegger 		printf("%d", ins);
   1097  1.5    cegger 		break;
   1098  1.5    cegger 	}
   1099  1.5    cegger 	printf("}\n");
   1100  1.5    cegger }
   1101  1.5    cegger 
   1102  1.5    cegger static void
   1103  1.5    cegger acpi_print_einj_flags(ACPI_WHEA_HEADER *whea)
   1104  1.5    cegger {
   1105  1.5    cegger 	uint32_t flags = whea->Flags;
   1106  1.5    cegger 
   1107  1.5    cegger 	printf("\tFLAGS={ ");
   1108  1.5    cegger 	if (flags & ACPI_EINJ_PRESERVE)
   1109  1.5    cegger 		printf("PRESERVED");
   1110  1.5    cegger 	printf("}\n");
   1111  1.5    cegger }
   1112  1.5    cegger 
   1113  1.5    cegger static void
   1114  1.5    cegger acpi_handle_einj(ACPI_TABLE_HEADER *sdp)
   1115  1.5    cegger {
   1116  1.5    cegger 	ACPI_TABLE_EINJ *einj;
   1117  1.5    cegger 	ACPI_EINJ_ENTRY *einj_entry;
   1118  1.5    cegger 	uint32_t einj_pos;
   1119  1.5    cegger 	u_int i;
   1120  1.5    cegger 
   1121  1.5    cegger 	printf(BEGIN_COMMENT);
   1122  1.5    cegger 	acpi_print_sdt(sdp);
   1123  1.5    cegger 	einj = (ACPI_TABLE_EINJ *)sdp;
   1124  1.5    cegger 
   1125  1.5    cegger 	printf("\tHeader Length=%d\n", einj->HeaderLength);
   1126  1.5    cegger 	printf("\tFlags=0x%x\n", einj->Flags);
   1127  1.5    cegger 	printf("\tEntries=%d\n", einj->Entries);
   1128  1.5    cegger 
   1129  1.5    cegger 	einj_pos = sizeof(ACPI_TABLE_EINJ);
   1130  1.5    cegger 	for (i = 0; i < einj->Entries; i++) {
   1131  1.5    cegger 		einj_entry = (ACPI_EINJ_ENTRY *)((char *)einj + einj_pos);
   1132  1.5    cegger 		acpi_print_whea(&einj_entry->WheaHeader,
   1133  1.5    cegger 		    acpi_print_einj_action, acpi_print_einj_instruction,
   1134  1.5    cegger 		    acpi_print_einj_flags);
   1135  1.5    cegger 		einj_pos += sizeof(ACPI_EINJ_ENTRY);
   1136  1.5    cegger 	}
   1137  1.5    cegger 	printf(END_COMMENT);
   1138  1.5    cegger }
   1139  1.5    cegger 
   1140  1.5    cegger static void
   1141  1.5    cegger acpi_print_erst_action(ACPI_WHEA_HEADER *whea)
   1142  1.5    cegger {
   1143  1.5    cegger 	printf("\tACTION={");
   1144  1.5    cegger 	switch (whea->Action) {
   1145  1.5    cegger 	case ACPI_ERST_BEGIN_WRITE:
   1146  1.5    cegger 		printf("Begin Write");
   1147  1.5    cegger 		break;
   1148  1.5    cegger 	case ACPI_ERST_BEGIN_READ:
   1149  1.5    cegger 		printf("Begin Read");
   1150  1.5    cegger 		break;
   1151  1.5    cegger 	case ACPI_ERST_BEGIN_CLEAR:
   1152  1.5    cegger 		printf("Begin Clear");
   1153  1.5    cegger 		break;
   1154  1.5    cegger 	case ACPI_ERST_END:
   1155  1.5    cegger 		printf("End");
   1156  1.5    cegger 		break;
   1157  1.5    cegger 	case ACPI_ERST_SET_RECORD_OFFSET:
   1158  1.5    cegger 		printf("Set Record Offset");
   1159  1.5    cegger 		break;
   1160  1.5    cegger 	case ACPI_ERST_EXECUTE_OPERATION:
   1161  1.5    cegger 		printf("Execute Operation");
   1162  1.5    cegger 		break;
   1163  1.5    cegger 	case ACPI_ERST_CHECK_BUSY_STATUS:
   1164  1.5    cegger 		printf("Check Busy Status");
   1165  1.5    cegger 		break;
   1166  1.5    cegger 	case ACPI_ERST_GET_COMMAND_STATUS:
   1167  1.5    cegger 		printf("Get Command Status");
   1168  1.5    cegger 		break;
   1169  1.5    cegger 	case ACPI_ERST_GET_RECORD_ID:
   1170  1.5    cegger 		printf("Get Record ID");
   1171  1.5    cegger 		break;
   1172  1.5    cegger 	case ACPI_ERST_SET_RECORD_ID:
   1173  1.5    cegger 		printf("Set Record ID");
   1174  1.5    cegger 		break;
   1175  1.5    cegger 	case ACPI_ERST_GET_RECORD_COUNT:
   1176  1.5    cegger 		printf("Get Record Count");
   1177  1.5    cegger 		break;
   1178  1.5    cegger 	case ACPI_ERST_BEGIN_DUMMY_WRIITE:
   1179  1.5    cegger 		printf("Begin Dummy Write");
   1180  1.5    cegger 		break;
   1181  1.5    cegger 	case ACPI_ERST_NOT_USED:
   1182  1.5    cegger 		printf("Unused");
   1183  1.5    cegger 		break;
   1184  1.5    cegger 	case ACPI_ERST_GET_ERROR_RANGE:
   1185  1.5    cegger 		printf("Get Error Range");
   1186  1.5    cegger 		break;
   1187  1.5    cegger 	case ACPI_ERST_GET_ERROR_LENGTH:
   1188  1.5    cegger 		printf("Get Error Length");
   1189  1.5    cegger 		break;
   1190  1.5    cegger 	case ACPI_ERST_GET_ERROR_ATTRIBUTES:
   1191  1.5    cegger 		printf("Get Error Attributes");
   1192  1.5    cegger 		break;
   1193  1.5    cegger 	case ACPI_ERST_ACTION_RESERVED:
   1194  1.5    cegger 		printf("Reserved");
   1195  1.5    cegger 		break;
   1196  1.5    cegger 	default:
   1197  1.5    cegger 		printf("%d", whea->Action);
   1198  1.5    cegger 		break;
   1199  1.5    cegger 	}
   1200  1.5    cegger 	printf("}\n");
   1201  1.5    cegger }
   1202  1.5    cegger 
   1203  1.5    cegger static void
   1204  1.5    cegger acpi_print_erst_instruction(ACPI_WHEA_HEADER *whea)
   1205  1.5    cegger {
   1206  1.5    cegger 	printf("\tINSTRUCTION={");
   1207  1.5    cegger 	switch (whea->Instruction) {
   1208  1.5    cegger 	case ACPI_ERST_READ_REGISTER:
   1209  1.5    cegger 		printf("Read Register");
   1210  1.5    cegger 		break;
   1211  1.5    cegger 	case ACPI_ERST_READ_REGISTER_VALUE:
   1212  1.5    cegger 		printf("Read Register Value");
   1213  1.5    cegger 		break;
   1214  1.5    cegger 	case ACPI_ERST_WRITE_REGISTER:
   1215  1.5    cegger 		printf("Write Register");
   1216  1.5    cegger 		break;
   1217  1.5    cegger 	case ACPI_ERST_WRITE_REGISTER_VALUE:
   1218  1.5    cegger 		printf("Write Register Value");
   1219  1.5    cegger 		break;
   1220  1.5    cegger 	case ACPI_ERST_NOOP:
   1221  1.5    cegger 		printf("Noop");
   1222  1.5    cegger 		break;
   1223  1.5    cegger 	case ACPI_ERST_LOAD_VAR1:
   1224  1.5    cegger 		printf("Load Var1");
   1225  1.5    cegger 		break;
   1226  1.5    cegger 	case ACPI_ERST_LOAD_VAR2:
   1227  1.5    cegger 		printf("Load Var2");
   1228  1.5    cegger 		break;
   1229  1.5    cegger 	case ACPI_ERST_STORE_VAR1:
   1230  1.5    cegger 		printf("Store Var1");
   1231  1.5    cegger 		break;
   1232  1.5    cegger 	case ACPI_ERST_ADD:
   1233  1.5    cegger 		printf("Add");
   1234  1.5    cegger 		break;
   1235  1.5    cegger 	case ACPI_ERST_SUBTRACT:
   1236  1.5    cegger 		printf("Subtract");
   1237  1.5    cegger 		break;
   1238  1.5    cegger 	case ACPI_ERST_ADD_VALUE:
   1239  1.5    cegger 		printf("Add Value");
   1240  1.5    cegger 		break;
   1241  1.5    cegger 	case ACPI_ERST_SUBTRACT_VALUE:
   1242  1.5    cegger 		printf("Subtract Value");
   1243  1.5    cegger 		break;
   1244  1.5    cegger 	case ACPI_ERST_STALL:
   1245  1.5    cegger 		printf("Stall");
   1246  1.5    cegger 		break;
   1247  1.5    cegger 	case ACPI_ERST_STALL_WHILE_TRUE:
   1248  1.5    cegger 		printf("Stall While True");
   1249  1.5    cegger 		break;
   1250  1.5    cegger 	case ACPI_ERST_SKIP_NEXT_IF_TRUE:
   1251  1.5    cegger 		printf("Skip Next If True");
   1252  1.5    cegger 		break;
   1253  1.5    cegger 	case ACPI_ERST_GOTO:
   1254  1.5    cegger 		printf("Goto");
   1255  1.5    cegger 		break;
   1256  1.5    cegger 	case ACPI_ERST_SET_SRC_ADDRESS_BASE:
   1257  1.5    cegger 		printf("Set Src Address Base");
   1258  1.5    cegger 		break;
   1259  1.5    cegger 	case ACPI_ERST_SET_DST_ADDRESS_BASE:
   1260  1.5    cegger 		printf("Set Dst Address Base");
   1261  1.5    cegger 		break;
   1262  1.5    cegger 	case ACPI_ERST_MOVE_DATA:
   1263  1.5    cegger 		printf("Move Data");
   1264  1.5    cegger 		break;
   1265  1.5    cegger 	case ACPI_ERST_INSTRUCTION_RESERVED:
   1266  1.5    cegger 		printf("Reserved");
   1267  1.5    cegger 		break;
   1268  1.5    cegger 	default:
   1269  1.5    cegger 		printf("%d (reserved)", whea->Instruction);
   1270  1.5    cegger 		break;
   1271  1.5    cegger 	}
   1272  1.5    cegger 	printf("}\n");
   1273  1.5    cegger }
   1274  1.5    cegger 
   1275  1.5    cegger static void
   1276  1.5    cegger acpi_print_erst_flags(ACPI_WHEA_HEADER *whea)
   1277  1.5    cegger {
   1278  1.5    cegger 	uint32_t flags = whea->Flags;
   1279  1.5    cegger 
   1280  1.5    cegger 	printf("\tFLAGS={ ");
   1281  1.5    cegger 	if (flags & ACPI_ERST_PRESERVE)
   1282  1.5    cegger 		printf("PRESERVED");
   1283  1.5    cegger 	printf("}\n");
   1284  1.5    cegger }
   1285  1.5    cegger 
   1286  1.5    cegger static void
   1287  1.5    cegger acpi_handle_erst(ACPI_TABLE_HEADER *sdp)
   1288  1.5    cegger {
   1289  1.5    cegger 	ACPI_TABLE_ERST *erst;
   1290  1.5    cegger 	ACPI_ERST_ENTRY *erst_entry;
   1291  1.5    cegger 	uint32_t erst_pos;
   1292  1.5    cegger 	u_int i;
   1293  1.5    cegger 
   1294  1.5    cegger 	printf(BEGIN_COMMENT);
   1295  1.5    cegger 	acpi_print_sdt(sdp);
   1296  1.5    cegger 	erst = (ACPI_TABLE_ERST *)sdp;
   1297  1.5    cegger 
   1298  1.5    cegger 	printf("\tHeader Length=%d\n", erst->HeaderLength);
   1299  1.5    cegger 	printf("\tEntries=%d\n", erst->Entries);
   1300  1.5    cegger 
   1301  1.5    cegger 	erst_pos = sizeof(ACPI_TABLE_ERST);
   1302  1.5    cegger 	for (i = 0; i < erst->Entries; i++) {
   1303  1.5    cegger 		erst_entry = (ACPI_ERST_ENTRY *)((char *)erst + erst_pos);
   1304  1.5    cegger 		acpi_print_whea(&erst_entry->WheaHeader,
   1305  1.5    cegger 		    acpi_print_erst_action, acpi_print_erst_instruction,
   1306  1.5    cegger 		    acpi_print_erst_flags);
   1307  1.5    cegger 		erst_pos += sizeof(ACPI_ERST_ENTRY);
   1308  1.5    cegger 	}
   1309  1.5    cegger 	printf(END_COMMENT);
   1310  1.5    cegger }
   1311  1.5    cegger 
   1312  1.5    cegger static void
   1313  1.5    cegger acpi_handle_madt(ACPI_TABLE_HEADER *sdp)
   1314  1.5    cegger {
   1315  1.5    cegger 	ACPI_TABLE_MADT *madt;
   1316  1.5    cegger 
   1317  1.5    cegger 	printf(BEGIN_COMMENT);
   1318  1.5    cegger 	acpi_print_sdt(sdp);
   1319  1.5    cegger 	madt = (ACPI_TABLE_MADT *)sdp;
   1320  1.5    cegger 	printf("\tLocal APIC ADDR=0x%08x\n", madt->Address);
   1321  1.5    cegger 	printf("\tFlags={");
   1322  1.5    cegger 	if (madt->Flags & ACPI_MADT_PCAT_COMPAT)
   1323  1.5    cegger 		printf("PC-AT");
   1324  1.5    cegger 	printf("}\n");
   1325  1.5    cegger 	acpi_walk_subtables(sdp, (madt + 1), acpi_print_madt);
   1326  1.5    cegger 	printf(END_COMMENT);
   1327  1.5    cegger }
   1328  1.5    cegger 
   1329  1.5    cegger static void
   1330  1.5    cegger acpi_handle_hpet(ACPI_TABLE_HEADER *sdp)
   1331  1.5    cegger {
   1332  1.5    cegger 	ACPI_TABLE_HPET *hpet;
   1333  1.5    cegger 
   1334  1.5    cegger 	printf(BEGIN_COMMENT);
   1335  1.5    cegger 	acpi_print_sdt(sdp);
   1336  1.5    cegger 	hpet = (ACPI_TABLE_HPET *)sdp;
   1337  1.5    cegger 	printf("\tHPET Number=%d\n", hpet->Sequence);
   1338  1.5    cegger 	printf("\tADDR=");
   1339  1.5    cegger 	acpi_print_gas(&hpet->Address);
   1340  1.5    cegger 	printf("\tHW Rev=0x%x\n", hpet->Id & ACPI_HPET_ID_HARDWARE_REV_ID);
   1341  1.5    cegger 	printf("\tComparators=%d\n", (hpet->Id & ACPI_HPET_ID_COMPARATORS) >>
   1342  1.5    cegger 	    8);
   1343  1.5    cegger 	printf("\tCounter Size=%d\n", hpet->Id & ACPI_HPET_ID_COUNT_SIZE_CAP ?
   1344  1.5    cegger 	    1 : 0);
   1345  1.5    cegger 	printf("\tLegacy IRQ routing capable={");
   1346  1.5    cegger 	if (hpet->Id & ACPI_HPET_ID_LEGACY_CAPABLE)
   1347  1.5    cegger 		printf("TRUE}\n");
   1348  1.5    cegger 	else
   1349  1.5    cegger 		printf("FALSE}\n");
   1350  1.5    cegger 	printf("\tPCI Vendor ID=0x%04x\n", hpet->Id >> 16);
   1351  1.5    cegger 	printf("\tMinimal Tick=%d\n", hpet->MinimumTick);
   1352  1.5    cegger 	printf(END_COMMENT);
   1353  1.5    cegger }
   1354  1.5    cegger 
   1355  1.5    cegger static void
   1356  1.5    cegger acpi_handle_msct(ACPI_TABLE_HEADER *sdp)
   1357  1.5    cegger {
   1358  1.5    cegger 	ACPI_TABLE_MSCT *msct;
   1359  1.5    cegger 	ACPI_MSCT_PROXIMITY *msctentry;
   1360  1.5    cegger 	uint32_t pos;
   1361  1.5    cegger 
   1362  1.5    cegger 	printf(BEGIN_COMMENT);
   1363  1.5    cegger 	acpi_print_sdt(sdp);
   1364  1.5    cegger 	msct = (ACPI_TABLE_MSCT *)sdp;
   1365  1.5    cegger 
   1366  1.5    cegger 	printf("\tProximity Offset=0x%x\n", msct->ProximityOffset);
   1367  1.5    cegger 	printf("\tMax Proximity Domains=%d\n", msct->MaxProximityDomains);
   1368  1.5    cegger 	printf("\tMax Clock Domains=%d\n", msct->MaxClockDomains);
   1369  1.5    cegger 	printf("\tMax Physical Address=0x%"PRIx64"\n", msct->MaxAddress);
   1370  1.5    cegger 
   1371  1.5    cegger 	pos = msct->ProximityOffset;
   1372  1.5    cegger 	while (pos < msct->Header.Length) {
   1373  1.5    cegger 		msctentry = (ACPI_MSCT_PROXIMITY *)((char *)msct + pos);
   1374  1.5    cegger 		pos += msctentry->Length;
   1375  1.5    cegger 
   1376  1.5    cegger 		printf("\n");
   1377  1.5    cegger 		printf("\tRevision=%d\n", msctentry->Revision);
   1378  1.5    cegger 		printf("\tLength=%d\n", msctentry->Length);
   1379  1.5    cegger 		printf("\tRange Start=%d\n", msctentry->RangeStart);
   1380  1.5    cegger 		printf("\tRange End=%d\n", msctentry->RangeEnd);
   1381  1.5    cegger 		printf("\tProcessor Capacity=%d\n",
   1382  1.5    cegger 		    msctentry->ProcessorCapacity);
   1383  1.5    cegger 		printf("\tMemory Capacity=0x%"PRIx64" byte\n",
   1384  1.5    cegger 		    msctentry->MemoryCapacity);
   1385  1.5    cegger 	}
   1386  1.1  christos 
   1387  1.5    cegger 	printf(END_COMMENT);
   1388  1.5    cegger }
   1389  1.1  christos 
   1390  1.5    cegger static void
   1391  1.5    cegger acpi_handle_ecdt(ACPI_TABLE_HEADER *sdp)
   1392  1.5    cegger {
   1393  1.5    cegger 	ACPI_TABLE_ECDT *ecdt;
   1394  1.1  christos 
   1395  1.5    cegger 	printf(BEGIN_COMMENT);
   1396  1.5    cegger 	acpi_print_sdt(sdp);
   1397  1.5    cegger 	ecdt = (ACPI_TABLE_ECDT *)sdp;
   1398  1.5    cegger 	printf("\tEC_CONTROL=");
   1399  1.5    cegger 	acpi_print_gas(&ecdt->Control);
   1400  1.5    cegger 	printf("\n\tEC_DATA=");
   1401  1.5    cegger 	acpi_print_gas(&ecdt->Data);
   1402  1.5    cegger 	printf("\n\tUID=%#x, ", ecdt->Uid);
   1403  1.5    cegger 	printf("GPE_BIT=%#x\n", ecdt->Gpe);
   1404  1.5    cegger 	printf("\tEC_ID=%s\n", ecdt->Id);
   1405  1.5    cegger 	printf(END_COMMENT);
   1406  1.5    cegger }
   1407  1.1  christos 
   1408  1.5    cegger static void
   1409  1.5    cegger acpi_handle_mcfg(ACPI_TABLE_HEADER *sdp)
   1410  1.5    cegger {
   1411  1.5    cegger 	ACPI_TABLE_MCFG *mcfg;
   1412  1.5    cegger 	ACPI_MCFG_ALLOCATION *alloc;
   1413  1.5    cegger 	u_int i, entries;
   1414  1.1  christos 
   1415  1.5    cegger 	printf(BEGIN_COMMENT);
   1416  1.5    cegger 	acpi_print_sdt(sdp);
   1417  1.5    cegger 	mcfg = (ACPI_TABLE_MCFG *)sdp;
   1418  1.5    cegger 	entries = (sdp->Length - sizeof(ACPI_TABLE_MCFG)) /
   1419  1.5    cegger 	    sizeof(ACPI_MCFG_ALLOCATION);
   1420  1.5    cegger 	alloc = (ACPI_MCFG_ALLOCATION *)(mcfg + 1);
   1421  1.5    cegger 	for (i = 0; i < entries; i++, alloc++) {
   1422  1.5    cegger 		printf("\n");
   1423  1.5    cegger 		printf("\tBase Address=0x%016jx\n", alloc->Address);
   1424  1.5    cegger 		printf("\tSegment Group=0x%04x\n", alloc->PciSegment);
   1425  1.5    cegger 		printf("\tStart Bus=%d\n", alloc->StartBusNumber);
   1426  1.5    cegger 		printf("\tEnd Bus=%d\n", alloc->EndBusNumber);
   1427  1.5    cegger 	}
   1428  1.5    cegger 	printf(END_COMMENT);
   1429  1.5    cegger }
   1430  1.1  christos 
   1431  1.1  christos static void
   1432  1.5    cegger acpi_handle_sbst(ACPI_TABLE_HEADER *sdp)
   1433  1.1  christos {
   1434  1.5    cegger 	ACPI_TABLE_SBST *sbst;
   1435  1.5    cegger 
   1436  1.5    cegger 	printf(BEGIN_COMMENT);
   1437  1.5    cegger 	acpi_print_sdt(sdp);
   1438  1.5    cegger 	sbst = (ACPI_TABLE_SBST *)sdp;
   1439  1.5    cegger 
   1440  1.5    cegger 	printf("\tWarning Level=%d mWh\n", sbst->WarningLevel);
   1441  1.5    cegger 	printf("\tLow Level=%d mWh\n", sbst->LowLevel);
   1442  1.5    cegger 	printf("\tCritical Level=%d mWh\n", sbst->CriticalLevel);
   1443  1.1  christos 
   1444  1.5    cegger 	printf(END_COMMENT);
   1445  1.1  christos }
   1446  1.1  christos 
   1447  1.1  christos static void
   1448  1.5    cegger acpi_handle_slit(ACPI_TABLE_HEADER *sdp)
   1449  1.1  christos {
   1450  1.5    cegger 	ACPI_TABLE_SLIT *slit;
   1451  1.5    cegger 	u_int idx;
   1452  1.5    cegger 	uint64_t cnt;
   1453  1.5    cegger 
   1454  1.5    cegger 	printf(BEGIN_COMMENT);
   1455  1.5    cegger 	acpi_print_sdt(sdp);
   1456  1.5    cegger 	slit = (ACPI_TABLE_SLIT *)sdp;
   1457  1.1  christos 
   1458  1.5    cegger 	cnt = slit->LocalityCount * slit->LocalityCount;
   1459  1.5    cegger 	printf("\tLocalityCount=%"PRIu64"\n", slit->LocalityCount);
   1460  1.5    cegger 	printf("\tEntry=\n\t");
   1461  1.5    cegger 	for (idx = 0; idx < cnt; idx++) {
   1462  1.5    cegger 		printf("%u ", slit->Entry[idx]);
   1463  1.5    cegger 		if ((idx % slit->LocalityCount) == (slit->LocalityCount - 1)) {
   1464  1.5    cegger 			printf("\n");
   1465  1.5    cegger 			if (idx < cnt - 1)
   1466  1.5    cegger 				printf("\t");
   1467  1.5    cegger 		}
   1468  1.5    cegger 	}
   1469  1.1  christos 
   1470  1.5    cegger 	printf(END_COMMENT);
   1471  1.1  christos }
   1472  1.1  christos 
   1473  1.1  christos static void
   1474  1.5    cegger acpi_handle_spcr(ACPI_TABLE_HEADER *sdp)
   1475  1.1  christos {
   1476  1.5    cegger 	ACPI_TABLE_SPCR *spcr;
   1477  1.5    cegger 
   1478  1.5    cegger 	printf(BEGIN_COMMENT);
   1479  1.5    cegger 	acpi_print_sdt(sdp);
   1480  1.5    cegger 	spcr = (ACPI_TABLE_SPCR *)sdp;
   1481  1.5    cegger 
   1482  1.5    cegger 	printf("\tSerial Port=");
   1483  1.5    cegger 	acpi_print_gas(&spcr->SerialPort);
   1484  1.5    cegger 	printf("\n\tInterrupt Type={");
   1485  1.5    cegger 	if (spcr->InterruptType & 0x1) {
   1486  1.5    cegger 		printf("\n\t\tdual-8259 IRQ=");
   1487  1.5    cegger 		switch (spcr->PcInterrupt) {
   1488  1.5    cegger 		case 2 ... 7:
   1489  1.5    cegger 		case 9 ... 12:
   1490  1.5    cegger 		case 14 ... 15:
   1491  1.5    cegger 			printf("%d", spcr->PcInterrupt);
   1492  1.5    cegger 			break;
   1493  1.5    cegger 		default:
   1494  1.5    cegger 			printf("%d (invalid entry)", spcr->PcInterrupt);
   1495  1.5    cegger 			break;
   1496  1.5    cegger 		}
   1497  1.5    cegger 	}
   1498  1.5    cegger 	if (spcr->InterruptType & 0x2) {
   1499  1.5    cegger 		printf("\n\t\tIO APIC={ GSI=%d }", spcr->Interrupt);
   1500  1.5    cegger 	}
   1501  1.5    cegger 	if (spcr->InterruptType & 0x4) {
   1502  1.5    cegger 		printf("\n\t\tIO SAPIC={ GSI=%d }", spcr->Interrupt);
   1503  1.5    cegger 	}
   1504  1.5    cegger 	printf("\n\t}\n");
   1505  1.5    cegger 
   1506  1.5    cegger 	printf("\tBaud Rate=");
   1507  1.5    cegger 	switch (spcr->BaudRate) {
   1508  1.5    cegger 	case 3:
   1509  1.5    cegger 		printf("9600");
   1510  1.5    cegger 		break;
   1511  1.5    cegger 	case 4:
   1512  1.5    cegger 		printf("19200");
   1513  1.5    cegger 		break;
   1514  1.5    cegger 	case 6:
   1515  1.5    cegger 		printf("57600");
   1516  1.5    cegger 		break;
   1517  1.5    cegger 	case 7:
   1518  1.5    cegger 		printf("115200");
   1519  1.5    cegger 		break;
   1520  1.5    cegger 	default:
   1521  1.5    cegger 		printf("unknown speed index %d", spcr->BaudRate);
   1522  1.5    cegger 		break;
   1523  1.5    cegger 	}
   1524  1.5    cegger 	printf("\n\tParity={");
   1525  1.5    cegger 	switch (spcr->Parity) {
   1526  1.5    cegger 	case 0:
   1527  1.5    cegger 		printf("OFF");
   1528  1.5    cegger 		break;
   1529  1.5    cegger 	default:
   1530  1.5    cegger 		printf("ON");
   1531  1.5    cegger 		break;
   1532  1.5    cegger 	}
   1533  1.5    cegger 	printf("}\n");
   1534  1.5    cegger 
   1535  1.5    cegger 	printf("\tStop Bits={");
   1536  1.5    cegger 	switch (spcr->StopBits) {
   1537  1.5    cegger 	case 1:
   1538  1.5    cegger 		printf("ON");
   1539  1.5    cegger 		break;
   1540  1.5    cegger 	default:
   1541  1.5    cegger 		printf("OFF");
   1542  1.5    cegger 		break;
   1543  1.5    cegger 	}
   1544  1.5    cegger 	printf("}\n");
   1545  1.1  christos 
   1546  1.5    cegger 	printf("\tFlow Control={");
   1547  1.5    cegger 	if (spcr->FlowControl & 0x1)
   1548  1.5    cegger 		printf("DCD, ");
   1549  1.5    cegger 	if (spcr->FlowControl & 0x2)
   1550  1.5    cegger 		printf("RTS/CTS hardware, ");
   1551  1.5    cegger 	if (spcr->FlowControl & 0x4)
   1552  1.5    cegger 		printf("XON/XOFF software");
   1553  1.5    cegger 	printf("}\n");
   1554  1.1  christos 
   1555  1.5    cegger 	printf("\tTerminal=");
   1556  1.5    cegger 	switch (spcr->TerminalType) {
   1557  1.5    cegger 	case 0:
   1558  1.5    cegger 		printf("VT100");
   1559  1.5    cegger 		break;
   1560  1.5    cegger 	case 1:
   1561  1.5    cegger 		printf("VT100+");
   1562  1.5    cegger 		break;
   1563  1.5    cegger 	case 2:
   1564  1.5    cegger 		printf("VT-UTF8");
   1565  1.5    cegger 		break;
   1566  1.5    cegger 	case 3:
   1567  1.5    cegger 		printf("ANSI");
   1568  1.5    cegger 		break;
   1569  1.5    cegger 	default:
   1570  1.5    cegger 		printf("unknown type %d", spcr->TerminalType);
   1571  1.5    cegger 		break;
   1572  1.1  christos 	}
   1573  1.5    cegger 	printf("\n");
   1574  1.5    cegger 
   1575  1.5    cegger 	acpi_print_pci(spcr->PciVendorId, spcr->PciDeviceId,
   1576  1.5    cegger 	    spcr->PciSegment, spcr->PciBus, spcr->PciDevice, spcr->PciFunction);
   1577  1.5    cegger 
   1578  1.5    cegger 	printf("\tPCI Flags={");
   1579  1.5    cegger 	if (spcr->PciFlags & ACPI_SPCR_DO_NOT_DISABLE)
   1580  1.5    cegger 		printf("DONOT_DISABLE");
   1581  1.5    cegger 	printf("}\n");
   1582  1.5    cegger 
   1583  1.5    cegger 	printf(END_COMMENT);
   1584  1.5    cegger }
   1585  1.5    cegger 
   1586  1.5    cegger static void
   1587  1.5    cegger acpi_print_srat_cpu(uint32_t apic_id, uint32_t proximity_domain,
   1588  1.5    cegger     uint32_t flags, uint32_t clockdomain)
   1589  1.5    cegger {
   1590  1.5    cegger 
   1591  1.5    cegger 	printf("\tFlags={");
   1592  1.5    cegger 	if (flags & ACPI_SRAT_CPU_ENABLED)
   1593  1.5    cegger 		printf("ENABLED");
   1594  1.5    cegger 	else
   1595  1.5    cegger 		printf("DISABLED");
   1596  1.5    cegger 	printf("}\n");
   1597  1.5    cegger 	printf("\tAPIC ID=%d\n", apic_id);
   1598  1.5    cegger 	printf("\tProximity Domain=%d\n", proximity_domain);
   1599  1.5    cegger 	printf("\tClock Domain=%d\n", clockdomain);
   1600  1.5    cegger }
   1601  1.5    cegger 
   1602  1.5    cegger static void
   1603  1.5    cegger acpi_print_srat_memory(ACPI_SRAT_MEM_AFFINITY *mp)
   1604  1.5    cegger {
   1605  1.5    cegger 
   1606  1.5    cegger 	printf("\tFlags={");
   1607  1.5    cegger 	if (mp->Flags & ACPI_SRAT_MEM_ENABLED)
   1608  1.5    cegger 		printf("ENABLED");
   1609  1.5    cegger 	else
   1610  1.5    cegger 		printf("DISABLED");
   1611  1.5    cegger 	if (mp->Flags & ACPI_SRAT_MEM_HOT_PLUGGABLE)
   1612  1.5    cegger 		printf(",HOT_PLUGGABLE");
   1613  1.5    cegger 	if (mp->Flags & ACPI_SRAT_MEM_NON_VOLATILE)
   1614  1.5    cegger 		printf(",NON_VOLATILE");
   1615  1.5    cegger 	printf("}\n");
   1616  1.5    cegger 	printf("\tBase Address=0x%016jx\n", (uintmax_t)mp->BaseAddress);
   1617  1.5    cegger 	printf("\tLength=0x%016jx\n", (uintmax_t)mp->Length);
   1618  1.5    cegger 	printf("\tProximity Domain=%d\n", mp->ProximityDomain);
   1619  1.1  christos }
   1620  1.1  christos 
   1621  1.5    cegger const char *srat_types[] = { "CPU", "Memory", "X2APIC" };
   1622  1.5    cegger 
   1623  1.1  christos static void
   1624  1.5    cegger acpi_print_srat(ACPI_SUBTABLE_HEADER *srat)
   1625  1.1  christos {
   1626  1.5    cegger 	ACPI_SRAT_CPU_AFFINITY *cpu;
   1627  1.5    cegger 	ACPI_SRAT_X2APIC_CPU_AFFINITY *x2apic;
   1628  1.5    cegger 
   1629  1.5    cegger 	if (srat->Type < sizeof(srat_types) / sizeof(srat_types[0]))
   1630  1.5    cegger 		printf("\tType=%s\n", srat_types[srat->Type]);
   1631  1.5    cegger 	else
   1632  1.5    cegger 		printf("\tType=%d (unknown)\n", srat->Type);
   1633  1.5    cegger 	switch (srat->Type) {
   1634  1.5    cegger 	case ACPI_SRAT_TYPE_CPU_AFFINITY:
   1635  1.5    cegger 		cpu = (ACPI_SRAT_CPU_AFFINITY *)srat;
   1636  1.5    cegger 		acpi_print_srat_cpu(cpu->ApicId,
   1637  1.5    cegger 		    cpu->ProximityDomainHi[2] << 24 |
   1638  1.5    cegger 		    cpu->ProximityDomainHi[1] << 16 |
   1639  1.5    cegger 		    cpu->ProximityDomainHi[0] << 0 |
   1640  1.5    cegger 		    cpu->ProximityDomainLo,
   1641  1.5    cegger 		    cpu->Flags, cpu->ClockDomain);
   1642  1.5    cegger 		break;
   1643  1.5    cegger 	case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
   1644  1.5    cegger 		acpi_print_srat_memory((ACPI_SRAT_MEM_AFFINITY *)srat);
   1645  1.5    cegger 		break;
   1646  1.5    cegger 	case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
   1647  1.5    cegger 		x2apic = (ACPI_SRAT_X2APIC_CPU_AFFINITY *)srat;
   1648  1.5    cegger 		acpi_print_srat_cpu(x2apic->ApicId, x2apic->ProximityDomain,
   1649  1.5    cegger 		    x2apic->Flags, x2apic->ClockDomain);
   1650  1.5    cegger 		break;
   1651  1.5    cegger 	}
   1652  1.5    cegger }
   1653  1.1  christos 
   1654  1.5    cegger static void
   1655  1.5    cegger acpi_handle_srat(ACPI_TABLE_HEADER *sdp)
   1656  1.5    cegger {
   1657  1.5    cegger 	ACPI_TABLE_SRAT *srat;
   1658  1.1  christos 
   1659  1.5    cegger 	printf(BEGIN_COMMENT);
   1660  1.5    cegger 	acpi_print_sdt(sdp);
   1661  1.5    cegger 	srat = (ACPI_TABLE_SRAT *)sdp;
   1662  1.5    cegger 	printf("\tTable Revision=%d\n", srat->TableRevision);
   1663  1.5    cegger 	acpi_walk_subtables(sdp, (srat + 1), acpi_print_srat);
   1664  1.5    cegger 	printf(END_COMMENT);
   1665  1.1  christos }
   1666  1.1  christos 
   1667  1.1  christos static void
   1668  1.5    cegger acpi_handle_tcpa(ACPI_TABLE_HEADER *sdp)
   1669  1.1  christos {
   1670  1.5    cegger 	ACPI_TABLE_TCPA *tcpa;
   1671  1.5    cegger 
   1672  1.5    cegger 	printf(BEGIN_COMMENT);
   1673  1.5    cegger 	acpi_print_sdt(sdp);
   1674  1.5    cegger 	tcpa = (ACPI_TABLE_TCPA *)sdp;
   1675  1.1  christos 
   1676  1.5    cegger 	printf("\tMaximum Length of Event Log Area=%d\n", tcpa->MaxLogLength);
   1677  1.5    cegger 	printf("\tPhysical Address of Log Area=0x%08"PRIx64"\n",
   1678  1.5    cegger 	    tcpa->LogAddress);
   1679  1.5    cegger 
   1680  1.5    cegger 	printf(END_COMMENT);
   1681  1.1  christos }
   1682  1.1  christos 
   1683  1.1  christos static void
   1684  1.5    cegger acpi_handle_waet(ACPI_TABLE_HEADER *sdp)
   1685  1.1  christos {
   1686  1.5    cegger 	ACPI_TABLE_WAET *waet;
   1687  1.5    cegger 
   1688  1.5    cegger 	printf(BEGIN_COMMENT);
   1689  1.5    cegger 	acpi_print_sdt(sdp);
   1690  1.5    cegger 	waet = (ACPI_TABLE_WAET *)sdp;
   1691  1.1  christos 
   1692  1.5    cegger 	printf("\tRTC Timer={");
   1693  1.5    cegger 	if (waet->Flags & ACPI_WAET_RTC_NO_ACK)
   1694  1.5    cegger 		printf("No ACK required");
   1695  1.5    cegger 	else
   1696  1.5    cegger 		printf("default behaviour");
   1697  1.5    cegger 	printf("}\n");
   1698  1.5    cegger 	printf("\t ACPI PM Timer={");
   1699  1.5    cegger 	if (waet->Flags & ACPI_WAET_TIMER_ONE_READ)
   1700  1.5    cegger 		printf("One Read sufficient");
   1701  1.5    cegger 	else
   1702  1.5    cegger 		printf("default behaviour");
   1703  1.5    cegger 	printf("}\n");
   1704  1.3     joerg 
   1705  1.5    cegger 	printf(END_COMMENT);
   1706  1.1  christos }
   1707  1.1  christos 
   1708  1.5    cegger static void
   1709  1.5    cegger acpi_print_wdat_action(ACPI_WHEA_HEADER *whea)
   1710  1.5    cegger {
   1711  1.5    cegger 	printf("\tACTION={");
   1712  1.5    cegger 	switch (whea->Action) {
   1713  1.5    cegger 	case ACPI_WDAT_RESET:
   1714  1.5    cegger 		printf("RESET");
   1715  1.5    cegger 		break;
   1716  1.5    cegger 	case ACPI_WDAT_GET_CURRENT_COUNTDOWN:
   1717  1.5    cegger 		printf("GET_CURRENT_COUNTDOWN");
   1718  1.5    cegger 		break;
   1719  1.5    cegger 	case ACPI_WDAT_GET_COUNTDOWN:
   1720  1.5    cegger 		printf("GET_COUNTDOWN");
   1721  1.5    cegger 		break;
   1722  1.5    cegger 	case ACPI_WDAT_SET_COUNTDOWN:
   1723  1.5    cegger 		printf("SET_COUNTDOWN");
   1724  1.5    cegger 		break;
   1725  1.5    cegger 	case ACPI_WDAT_GET_RUNNING_STATE:
   1726  1.5    cegger 		printf("GET_RUNNING_STATE");
   1727  1.5    cegger 		break;
   1728  1.5    cegger 	case ACPI_WDAT_SET_RUNNING_STATE:
   1729  1.5    cegger 		printf("SET_RUNNING_STATE");
   1730  1.5    cegger 		break;
   1731  1.5    cegger 	case ACPI_WDAT_GET_STOPPED_STATE:
   1732  1.5    cegger 		printf("GET_STOPPED_STATE");
   1733  1.5    cegger 		break;
   1734  1.5    cegger 	case ACPI_WDAT_SET_STOPPED_STATE:
   1735  1.5    cegger 		printf("SET_STOPPED_STATE");
   1736  1.5    cegger 		break;
   1737  1.5    cegger 	case ACPI_WDAT_GET_REBOOT:
   1738  1.5    cegger 		printf("GET_REBOOT");
   1739  1.5    cegger 		break;
   1740  1.5    cegger 	case ACPI_WDAT_SET_REBOOT:
   1741  1.5    cegger 		printf("SET_REBOOT");
   1742  1.5    cegger 		break;
   1743  1.5    cegger 	case ACPI_WDAT_GET_SHUTDOWN:
   1744  1.5    cegger 		printf("GET_SHUTDOWN");
   1745  1.5    cegger 		break;
   1746  1.5    cegger 	case ACPI_WDAT_SET_SHUTDOWN:
   1747  1.5    cegger 		printf("SET_SHUTDOWN");
   1748  1.5    cegger 		break;
   1749  1.5    cegger 	case ACPI_WDAT_GET_STATUS:
   1750  1.5    cegger 		printf("GET_STATUS");
   1751  1.5    cegger 		break;
   1752  1.5    cegger 	case ACPI_WDAT_SET_STATUS:
   1753  1.5    cegger 		printf("SET_STATUS");
   1754  1.5    cegger 		break;
   1755  1.5    cegger 	case ACPI_WDAT_ACTION_RESERVED:
   1756  1.5    cegger 		printf("ACTION_RESERVED");
   1757  1.5    cegger 		break;
   1758  1.5    cegger 	default:
   1759  1.5    cegger 		printf("%d", whea->Action);
   1760  1.5    cegger 		break;
   1761  1.5    cegger 	}
   1762  1.5    cegger 	printf("}\n");
   1763  1.5    cegger }
   1764  1.1  christos 
   1765  1.5    cegger static void
   1766  1.5    cegger acpi_print_wdat_instruction(ACPI_WHEA_HEADER *whea)
   1767  1.1  christos {
   1768  1.5    cegger 	uint32_t ins;
   1769  1.5    cegger 
   1770  1.5    cegger 	ins = whea->Instruction & ~ACPI_WDAT_PRESERVE_REGISTER;
   1771  1.5    cegger 
   1772  1.5    cegger 	printf("\tINSTRUCTION={");
   1773  1.5    cegger 	switch (ins) {
   1774  1.5    cegger 	case ACPI_WDAT_READ_VALUE:
   1775  1.5    cegger 		printf("READ_VALUE");
   1776  1.5    cegger 		break;
   1777  1.5    cegger 	case ACPI_WDAT_READ_COUNTDOWN:
   1778  1.5    cegger 		printf("READ_COUNTDOWN");
   1779  1.5    cegger 		break;
   1780  1.5    cegger 	case ACPI_WDAT_WRITE_VALUE:
   1781  1.5    cegger 		printf("WRITE_VALUE");
   1782  1.5    cegger 		break;
   1783  1.5    cegger 	case ACPI_WDAT_WRITE_COUNTDOWN:
   1784  1.5    cegger 		printf("WRITE_COUNTDOWN");
   1785  1.5    cegger 		break;
   1786  1.5    cegger 	case ACPI_WDAT_INSTRUCTION_RESERVED:
   1787  1.5    cegger 		printf("INSTRUCTION_RESERVED");
   1788  1.5    cegger 		break;
   1789  1.5    cegger 	default:
   1790  1.5    cegger 		printf("%d", ins);
   1791  1.5    cegger 		break;
   1792  1.5    cegger 	}
   1793  1.5    cegger 
   1794  1.5    cegger 	if (whea->Instruction & ACPI_WDAT_PRESERVE_REGISTER)
   1795  1.5    cegger 		printf(", Preserve Register ");
   1796  1.5    cegger 
   1797  1.5    cegger 	printf("}\n");
   1798  1.5    cegger }
   1799  1.1  christos 
   1800  1.5    cegger static void
   1801  1.5    cegger acpi_handle_wdat(ACPI_TABLE_HEADER *sdp)
   1802  1.5    cegger {
   1803  1.5    cegger 	ACPI_TABLE_WDAT *wdat;
   1804  1.5    cegger 	ACPI_WHEA_HEADER *whea;
   1805  1.5    cegger 	char *wdat_pos;
   1806  1.5    cegger 	u_int i;
   1807  1.1  christos 
   1808  1.5    cegger 	printf(BEGIN_COMMENT);
   1809  1.5    cegger 	acpi_print_sdt(sdp);
   1810  1.5    cegger 	wdat = (ACPI_TABLE_WDAT *)sdp;
   1811  1.1  christos 
   1812  1.5    cegger 	printf("\tHeader Length=%d\n", wdat->HeaderLength);
   1813  1.1  christos 
   1814  1.5    cegger 	acpi_print_pci_sbfd(wdat->PciSegment, wdat->PciBus, wdat->PciDevice,
   1815  1.5    cegger 	    wdat->PciFunction);
   1816  1.5    cegger 	printf("\n\tTimer Counter Period=%d msec\n", wdat->TimerPeriod);
   1817  1.5    cegger 	printf("\tTimer Maximum Counter Value=%d\n", wdat->MaxCount);
   1818  1.5    cegger 	printf("\tTimer Minimum Counter Value=%d\n", wdat->MinCount);
   1819  1.5    cegger 
   1820  1.5    cegger 	printf("\tFlags={");
   1821  1.5    cegger 	if (wdat->Flags & ACPI_WDAT_ENABLED)
   1822  1.5    cegger 		printf("ENABLED");
   1823  1.5    cegger 	if (wdat->Flags & ACPI_WDAT_STOPPED)
   1824  1.5    cegger 		printf(", STOPPED");
   1825  1.5    cegger 	printf("}\n");
   1826  1.1  christos 
   1827  1.5    cegger 	wdat_pos = ((char *)wdat + sizeof(ACPI_TABLE_HEADER)
   1828  1.5    cegger 	    + wdat->HeaderLength);
   1829  1.1  christos 
   1830  1.5    cegger 	for (i = 0; i < wdat->Entries; i++) {
   1831  1.5    cegger 		whea = (ACPI_WHEA_HEADER *)wdat_pos;
   1832  1.5    cegger 		acpi_print_whea(whea,
   1833  1.5    cegger 		    acpi_print_wdat_action, acpi_print_wdat_instruction,
   1834  1.5    cegger 		    NULL);
   1835  1.5    cegger 		wdat_pos += sizeof(ACPI_WDAT_ENTRY);
   1836  1.5    cegger 	}
   1837  1.5    cegger 	printf(END_COMMENT);
   1838  1.1  christos }
   1839  1.5    cegger 
   1840  1.5    cegger static void
   1841  1.5    cegger acpi_handle_wdrt(ACPI_TABLE_HEADER *sdp)
   1842  1.1  christos {
   1843  1.5    cegger 	ACPI_TABLE_WDRT *wdrt;
   1844  1.1  christos 
   1845  1.1  christos 	printf(BEGIN_COMMENT);
   1846  1.5    cegger 	acpi_print_sdt(sdp);
   1847  1.5    cegger 	wdrt = (ACPI_TABLE_WDRT *)sdp;
   1848  1.5    cegger 
   1849  1.5    cegger 	printf("\tControl Register=");
   1850  1.5    cegger 	acpi_print_gas(&wdrt->ControlRegister);
   1851  1.5    cegger 	printf("\tCount Register=");
   1852  1.5    cegger 	acpi_print_gas(&wdrt->CountRegister);
   1853  1.5    cegger 	acpi_print_pci(wdrt->PciVendorId, wdrt->PciDeviceId,
   1854  1.5    cegger 	    wdrt->PciSegment, wdrt->PciBus, wdrt->PciDevice, wdrt->PciFunction);
   1855  1.5    cegger 
   1856  1.5    cegger 	/* Value must be >= 511 and < 65535 */
   1857  1.5    cegger 	printf("\tMaxCount=%d", wdrt->MaxCount);
   1858  1.5    cegger 	if (wdrt->MaxCount < 511)
   1859  1.5    cegger 		printf(" (Out of Range. Valid range: 511 <= maxcount < 65535)");
   1860  1.5    cegger 	printf("\n");
   1861  1.5    cegger 
   1862  1.5    cegger 	printf("\tUnit={");
   1863  1.5    cegger 	switch (wdrt->Units) {
   1864  1.5    cegger 	case 0:
   1865  1.5    cegger 		printf("1 seconds/count");
   1866  1.5    cegger 		break;
   1867  1.5    cegger 	case 1:
   1868  1.5    cegger 		printf("100 milliseconds/count");
   1869  1.5    cegger 		break;
   1870  1.5    cegger 	case 2:
   1871  1.5    cegger 		printf("10 milliseconds/count");
   1872  1.5    cegger 		break;
   1873  1.5    cegger 	default:
   1874  1.5    cegger 		printf("%d", wdrt->Units);
   1875  1.5    cegger 		break;
   1876  1.5    cegger 	}
   1877  1.5    cegger 	printf("}\n");
   1878  1.5    cegger 
   1879  1.5    cegger 	printf(END_COMMENT);
   1880  1.5    cegger }
   1881  1.5    cegger 
   1882  1.5    cegger static void
   1883  1.5    cegger acpi_print_sdt(ACPI_TABLE_HEADER *sdp)
   1884  1.5    cegger {
   1885  1.5    cegger 	printf("  ");
   1886  1.5    cegger 	acpi_print_string(sdp->Signature, ACPI_NAME_SIZE);
   1887  1.8  jmcneill 	printf(": Length=%d, Revision=%d, Checksum=%d",
   1888  1.5    cegger 	       sdp->Length, sdp->Revision, sdp->Checksum);
   1889  1.8  jmcneill 	if (acpi_checksum(sdp, sdp->Length))
   1890  1.8  jmcneill 		printf(" (Incorrect)");
   1891  1.8  jmcneill 	printf(",\n\tOEMID=");
   1892  1.5    cegger 	acpi_print_string(sdp->OemId, ACPI_OEM_ID_SIZE);
   1893  1.1  christos 	printf(", OEM Table ID=");
   1894  1.5    cegger 	acpi_print_string(sdp->OemTableId, ACPI_OEM_TABLE_ID_SIZE);
   1895  1.5    cegger 	printf(", OEM Revision=0x%x,\n", sdp->OemRevision);
   1896  1.1  christos 	printf("\tCreator ID=");
   1897  1.5    cegger 	acpi_print_string(sdp->AslCompilerId, ACPI_NAME_SIZE);
   1898  1.5    cegger 	printf(", Creator Revision=0x%x\n", sdp->AslCompilerRevision);
   1899  1.1  christos }
   1900  1.1  christos 
   1901  1.5    cegger static void
   1902  1.7  jmcneill acpi_dump_bytes(ACPI_TABLE_HEADER *sdp)
   1903  1.7  jmcneill {
   1904  1.7  jmcneill 	unsigned int i;
   1905  1.7  jmcneill 	uint8_t *p;
   1906  1.7  jmcneill 
   1907  1.8  jmcneill 	p = (uint8_t *)sdp;
   1908  1.7  jmcneill 	printf("\n\tData={");
   1909  1.7  jmcneill 	for (i = 0; i < sdp->Length; i++) {
   1910  1.7  jmcneill 		if (cflag) {
   1911  1.7  jmcneill 			if (i % 64 == 0)
   1912  1.7  jmcneill 				printf("\n\t ");
   1913  1.7  jmcneill 			else if (i % 16 == 0)
   1914  1.7  jmcneill 				printf(" ");
   1915  1.7  jmcneill 			printf("%c", (p[i] >= ' ' && p[i] <= '~') ? p[i] : '.');
   1916  1.7  jmcneill 		} else {
   1917  1.7  jmcneill 			if (i % 16 == 0)
   1918  1.7  jmcneill 				printf("\n\t\t");
   1919  1.7  jmcneill 			else if (i % 8 == 0)
   1920  1.7  jmcneill 				printf("   ");
   1921  1.7  jmcneill 			printf(" %02x", p[i]);
   1922  1.7  jmcneill 		}
   1923  1.7  jmcneill 	}
   1924  1.7  jmcneill 	printf("\n\t}\n");
   1925  1.7  jmcneill }
   1926  1.7  jmcneill 
   1927  1.7  jmcneill static void
   1928  1.5    cegger acpi_print_rsdt(ACPI_TABLE_HEADER *rsdp)
   1929  1.1  christos {
   1930  1.5    cegger 	ACPI_TABLE_RSDT *rsdt;
   1931  1.5    cegger 	ACPI_TABLE_XSDT *xsdt;
   1932  1.1  christos 	int	i, entries;
   1933  1.5    cegger 	u_long	addr;
   1934  1.1  christos 
   1935  1.5    cegger 	rsdt = (ACPI_TABLE_RSDT *)rsdp;
   1936  1.5    cegger 	xsdt = (ACPI_TABLE_XSDT *)rsdp;
   1937  1.5    cegger 	printf(BEGIN_COMMENT);
   1938  1.1  christos 	acpi_print_sdt(rsdp);
   1939  1.5    cegger 	entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
   1940  1.1  christos 	printf("\tEntries={ ");
   1941  1.1  christos 	for (i = 0; i < entries; i++) {
   1942  1.1  christos 		if (i > 0)
   1943  1.1  christos 			printf(", ");
   1944  1.5    cegger 		switch (addr_size) {
   1945  1.5    cegger 		case 4:
   1946  1.5    cegger 			addr = le32toh(rsdt->TableOffsetEntry[i]);
   1947  1.5    cegger 			break;
   1948  1.5    cegger 		case 8:
   1949  1.5    cegger 			addr = le64toh(xsdt->TableOffsetEntry[i]);
   1950  1.5    cegger 			break;
   1951  1.5    cegger 		default:
   1952  1.5    cegger 			addr = 0;
   1953  1.5    cegger 		}
   1954  1.5    cegger 		assert(addr != 0);
   1955  1.5    cegger 		printf("0x%08lx", addr);
   1956  1.1  christos 	}
   1957  1.1  christos 	printf(" }\n");
   1958  1.1  christos 	printf(END_COMMENT);
   1959  1.1  christos }
   1960  1.1  christos 
   1961  1.5    cegger static const char *acpi_pm_profiles[] = {
   1962  1.5    cegger 	"Unspecified", "Desktop", "Mobile", "Workstation",
   1963  1.5    cegger 	"Enterprise Server", "SOHO Server", "Appliance PC"
   1964  1.5    cegger };
   1965  1.5    cegger 
   1966  1.5    cegger static void
   1967  1.5    cegger acpi_print_fadt(ACPI_TABLE_HEADER *sdp)
   1968  1.1  christos {
   1969  1.5    cegger 	ACPI_TABLE_FADT *fadt;
   1970  1.5    cegger 	const char *pm;
   1971  1.5    cegger 	char	    sep;
   1972  1.1  christos 
   1973  1.5    cegger 	fadt = (ACPI_TABLE_FADT *)sdp;
   1974  1.1  christos 	printf(BEGIN_COMMENT);
   1975  1.5    cegger 	acpi_print_sdt(sdp);
   1976  1.5    cegger 	printf(" \tFACS=0x%x, DSDT=0x%x\n", fadt->Facs,
   1977  1.5    cegger 	       fadt->Dsdt);
   1978  1.5    cegger 	printf("\tINT_MODEL=%s\n", fadt->Model ? "APIC" : "PIC");
   1979  1.5    cegger 	if (fadt->PreferredProfile >= sizeof(acpi_pm_profiles) / sizeof(char *))
   1980  1.5    cegger 		pm = "Reserved";
   1981  1.5    cegger 	else
   1982  1.5    cegger 		pm = acpi_pm_profiles[fadt->PreferredProfile];
   1983  1.5    cegger 	printf("\tPreferred_PM_Profile=%s (%d)\n", pm, fadt->PreferredProfile);
   1984  1.5    cegger 	printf("\tSCI_INT=%d\n", fadt->SciInterrupt);
   1985  1.5    cegger 	printf("\tSMI_CMD=0x%x, ", fadt->SmiCommand);
   1986  1.5    cegger 	printf("ACPI_ENABLE=0x%x, ", fadt->AcpiEnable);
   1987  1.5    cegger 	printf("ACPI_DISABLE=0x%x, ", fadt->AcpiDisable);
   1988  1.5    cegger 	printf("S4BIOS_REQ=0x%x\n", fadt->S4BiosRequest);
   1989  1.5    cegger 	printf("\tPSTATE_CNT=0x%x\n", fadt->PstateControl);
   1990  1.5    cegger 	printf("\tPM1a_EVT_BLK=0x%x-0x%x\n",
   1991  1.5    cegger 	       fadt->Pm1aEventBlock,
   1992  1.5    cegger 	       fadt->Pm1aEventBlock + fadt->Pm1EventLength - 1);
   1993  1.5    cegger 	if (fadt->Pm1bEventBlock != 0)
   1994  1.1  christos 		printf("\tPM1b_EVT_BLK=0x%x-0x%x\n",
   1995  1.5    cegger 		       fadt->Pm1bEventBlock,
   1996  1.5    cegger 		       fadt->Pm1bEventBlock + fadt->Pm1EventLength - 1);
   1997  1.5    cegger 	printf("\tPM1a_CNT_BLK=0x%x-0x%x\n",
   1998  1.5    cegger 	       fadt->Pm1aControlBlock,
   1999  1.5    cegger 	       fadt->Pm1aControlBlock + fadt->Pm1ControlLength - 1);
   2000  1.5    cegger 	if (fadt->Pm1bControlBlock != 0)
   2001  1.1  christos 		printf("\tPM1b_CNT_BLK=0x%x-0x%x\n",
   2002  1.5    cegger 		       fadt->Pm1bControlBlock,
   2003  1.5    cegger 		       fadt->Pm1bControlBlock + fadt->Pm1ControlLength - 1);
   2004  1.5    cegger 	if (fadt->Pm2ControlBlock != 0)
   2005  1.1  christos 		printf("\tPM2_CNT_BLK=0x%x-0x%x\n",
   2006  1.5    cegger 		       fadt->Pm2ControlBlock,
   2007  1.5    cegger 		       fadt->Pm2ControlBlock + fadt->Pm2ControlLength - 1);
   2008  1.5    cegger 	printf("\tPM_TMR_BLK=0x%x-0x%x\n",
   2009  1.5    cegger 	       fadt->PmTimerBlock,
   2010  1.5    cegger 	       fadt->PmTimerBlock + fadt->PmTimerLength - 1);
   2011  1.5    cegger 	if (fadt->Gpe0Block != 0)
   2012  1.5    cegger 		printf("\tGPE0_BLK=0x%x-0x%x\n",
   2013  1.5    cegger 		       fadt->Gpe0Block,
   2014  1.5    cegger 		       fadt->Gpe0Block + fadt->Gpe0BlockLength - 1);
   2015  1.5    cegger 	if (fadt->Gpe1Block != 0)
   2016  1.5    cegger 		printf("\tGPE1_BLK=0x%x-0x%x, GPE1_BASE=%d\n",
   2017  1.5    cegger 		       fadt->Gpe1Block,
   2018  1.5    cegger 		       fadt->Gpe1Block + fadt->Gpe1BlockLength - 1,
   2019  1.5    cegger 		       fadt->Gpe1Base);
   2020  1.5    cegger 	if (fadt->CstControl != 0)
   2021  1.5    cegger 		printf("\tCST_CNT=0x%x\n", fadt->CstControl);
   2022  1.5    cegger 	printf("\tP_LVL2_LAT=%d us, P_LVL3_LAT=%d us\n",
   2023  1.5    cegger 	       fadt->C2Latency, fadt->C3Latency);
   2024  1.1  christos 	printf("\tFLUSH_SIZE=%d, FLUSH_STRIDE=%d\n",
   2025  1.5    cegger 	       fadt->FlushSize, fadt->FlushStride);
   2026  1.1  christos 	printf("\tDUTY_OFFSET=%d, DUTY_WIDTH=%d\n",
   2027  1.5    cegger 	       fadt->DutyOffset, fadt->DutyWidth);
   2028  1.1  christos 	printf("\tDAY_ALRM=%d, MON_ALRM=%d, CENTURY=%d\n",
   2029  1.5    cegger 	       fadt->DayAlarm, fadt->MonthAlarm, fadt->Century);
   2030  1.1  christos 
   2031  1.5    cegger #define PRINTFLAG(var, flag) do {			\
   2032  1.5    cegger 	if ((var) & ACPI_FADT_## flag) {		\
   2033  1.5    cegger 		printf("%c%s", sep, #flag); sep = ',';	\
   2034  1.5    cegger 	}						\
   2035  1.1  christos } while (0)
   2036  1.1  christos 
   2037  1.5    cegger 	printf("\tIAPC_BOOT_ARCH=");
   2038  1.5    cegger 	sep = '{';
   2039  1.5    cegger 	PRINTFLAG(fadt->BootFlags, LEGACY_DEVICES);
   2040  1.5    cegger 	PRINTFLAG(fadt->BootFlags, 8042);
   2041  1.5    cegger 	PRINTFLAG(fadt->BootFlags, NO_VGA);
   2042  1.5    cegger 	PRINTFLAG(fadt->BootFlags, NO_MSI);
   2043  1.5    cegger 	PRINTFLAG(fadt->BootFlags, NO_ASPM);
   2044  1.5    cegger 	if (fadt->BootFlags != 0)
   2045  1.5    cegger 		printf("}");
   2046  1.5    cegger 	printf("\n");
   2047  1.5    cegger 
   2048  1.5    cegger 	printf("\tFlags=");
   2049  1.5    cegger 	sep = '{';
   2050  1.5    cegger 	PRINTFLAG(fadt->Flags, WBINVD);
   2051  1.5    cegger 	PRINTFLAG(fadt->Flags, WBINVD_FLUSH);
   2052  1.5    cegger 	PRINTFLAG(fadt->Flags, C1_SUPPORTED);
   2053  1.5    cegger 	PRINTFLAG(fadt->Flags, C2_MP_SUPPORTED);
   2054  1.5    cegger 	PRINTFLAG(fadt->Flags, POWER_BUTTON);
   2055  1.5    cegger 	PRINTFLAG(fadt->Flags, SLEEP_BUTTON);
   2056  1.5    cegger 	PRINTFLAG(fadt->Flags, FIXED_RTC);
   2057  1.5    cegger 	PRINTFLAG(fadt->Flags, S4_RTC_WAKE);
   2058  1.5    cegger 	PRINTFLAG(fadt->Flags, 32BIT_TIMER);
   2059  1.5    cegger 	PRINTFLAG(fadt->Flags, DOCKING_SUPPORTED);
   2060  1.5    cegger 	PRINTFLAG(fadt->Flags, RESET_REGISTER);
   2061  1.5    cegger 	PRINTFLAG(fadt->Flags, SEALED_CASE);
   2062  1.5    cegger 	PRINTFLAG(fadt->Flags, HEADLESS);
   2063  1.5    cegger 	PRINTFLAG(fadt->Flags, SLEEP_TYPE);
   2064  1.5    cegger 	PRINTFLAG(fadt->Flags, PCI_EXPRESS_WAKE);
   2065  1.5    cegger 	PRINTFLAG(fadt->Flags, PLATFORM_CLOCK);
   2066  1.5    cegger 	PRINTFLAG(fadt->Flags, S4_RTC_VALID);
   2067  1.5    cegger 	PRINTFLAG(fadt->Flags, REMOTE_POWER_ON);
   2068  1.5    cegger 	PRINTFLAG(fadt->Flags, APIC_CLUSTER);
   2069  1.5    cegger 	PRINTFLAG(fadt->Flags, APIC_PHYSICAL);
   2070  1.5    cegger 	if (fadt->Flags != 0)
   2071  1.5    cegger 		printf("}\n");
   2072  1.1  christos 
   2073  1.1  christos #undef PRINTFLAG
   2074  1.1  christos 
   2075  1.5    cegger 	if (fadt->Flags & ACPI_FADT_RESET_REGISTER) {
   2076  1.5    cegger 		printf("\tRESET_REG=");
   2077  1.5    cegger 		acpi_print_gas(&fadt->ResetRegister);
   2078  1.5    cegger 		printf(", RESET_VALUE=%#x\n", fadt->ResetValue);
   2079  1.5    cegger 	}
   2080  1.5    cegger 	if (acpi_get_fadt_revision(fadt) > 1) {
   2081  1.5    cegger 		printf("\tX_FACS=0x%08lx, ", (u_long)fadt->XFacs);
   2082  1.5    cegger 		printf("X_DSDT=0x%08lx\n", (u_long)fadt->XDsdt);
   2083  1.5    cegger 		printf("\tX_PM1a_EVT_BLK=");
   2084  1.5    cegger 		acpi_print_gas(&fadt->XPm1aEventBlock);
   2085  1.5    cegger 		if (fadt->XPm1bEventBlock.Address != 0) {
   2086  1.5    cegger 			printf("\n\tX_PM1b_EVT_BLK=");
   2087  1.5    cegger 			acpi_print_gas(&fadt->XPm1bEventBlock);
   2088  1.5    cegger 		}
   2089  1.5    cegger 		printf("\n\tX_PM1a_CNT_BLK=");
   2090  1.5    cegger 		acpi_print_gas(&fadt->XPm1aControlBlock);
   2091  1.5    cegger 		if (fadt->XPm1bControlBlock.Address != 0) {
   2092  1.5    cegger 			printf("\n\tX_PM1b_CNT_BLK=");
   2093  1.5    cegger 			acpi_print_gas(&fadt->XPm1bControlBlock);
   2094  1.5    cegger 		}
   2095  1.5    cegger 		if (fadt->XPm2ControlBlock.Address != 0) {
   2096  1.5    cegger 			printf("\n\tX_PM2_CNT_BLK=");
   2097  1.5    cegger 			acpi_print_gas(&fadt->XPm2ControlBlock);
   2098  1.5    cegger 		}
   2099  1.5    cegger 		printf("\n\tX_PM_TMR_BLK=");
   2100  1.5    cegger 		acpi_print_gas(&fadt->XPmTimerBlock);
   2101  1.5    cegger 		if (fadt->XGpe0Block.Address != 0) {
   2102  1.5    cegger 			printf("\n\tX_GPE0_BLK=");
   2103  1.5    cegger 			acpi_print_gas(&fadt->XGpe0Block);
   2104  1.5    cegger 		}
   2105  1.5    cegger 		if (fadt->XGpe1Block.Address != 0) {
   2106  1.5    cegger 			printf("\n\tX_GPE1_BLK=");
   2107  1.5    cegger 			acpi_print_gas(&fadt->XGpe1Block);
   2108  1.5    cegger 		}
   2109  1.5    cegger 		printf("\n");
   2110  1.5    cegger 	}
   2111  1.5    cegger 
   2112  1.1  christos 	printf(END_COMMENT);
   2113  1.1  christos }
   2114  1.1  christos 
   2115  1.5    cegger static void
   2116  1.5    cegger acpi_print_facs(ACPI_TABLE_FACS *facs)
   2117  1.1  christos {
   2118  1.5    cegger 	printf(BEGIN_COMMENT);
   2119  1.5    cegger 	printf("  FACS:\tLength=%u, ", facs->Length);
   2120  1.5    cegger 	printf("HwSig=0x%08x, ", facs->HardwareSignature);
   2121  1.5    cegger 	printf("Firm_Wake_Vec=0x%08x\n", facs->FirmwareWakingVector);
   2122  1.5    cegger 
   2123  1.5    cegger 	printf("\tGlobal_Lock=");
   2124  1.5    cegger 	if (facs->GlobalLock != 0) {
   2125  1.5    cegger 		if (facs->GlobalLock & ACPI_GLOCK_PENDING)
   2126  1.5    cegger 			printf("PENDING,");
   2127  1.5    cegger 		if (facs->GlobalLock & ACPI_GLOCK_OWNED)
   2128  1.5    cegger 			printf("OWNED");
   2129  1.5    cegger 	}
   2130  1.5    cegger 	printf("\n");
   2131  1.5    cegger 
   2132  1.5    cegger 	printf("\tFlags=");
   2133  1.5    cegger 	if (facs->Flags & ACPI_FACS_S4_BIOS_PRESENT)
   2134  1.5    cegger 		printf("S4BIOS");
   2135  1.5    cegger 	printf("\n");
   2136  1.5    cegger 
   2137  1.5    cegger 	if (facs->XFirmwareWakingVector != 0) {
   2138  1.5    cegger 		printf("\tX_Firm_Wake_Vec=%08lx\n",
   2139  1.5    cegger 		       (u_long)facs->XFirmwareWakingVector);
   2140  1.5    cegger 	}
   2141  1.5    cegger 	printf("\tVersion=%u\n", facs->Version);
   2142  1.5    cegger 
   2143  1.5    cegger 	printf(END_COMMENT);
   2144  1.5    cegger }
   2145  1.1  christos 
   2146  1.5    cegger static void
   2147  1.5    cegger acpi_print_dsdt(ACPI_TABLE_HEADER *dsdp)
   2148  1.5    cegger {
   2149  1.5    cegger 	printf(BEGIN_COMMENT);
   2150  1.1  christos 	acpi_print_sdt(dsdp);
   2151  1.5    cegger 	printf(END_COMMENT);
   2152  1.1  christos }
   2153  1.1  christos 
   2154  1.1  christos int
   2155  1.1  christos acpi_checksum(void *p, size_t length)
   2156  1.1  christos {
   2157  1.5    cegger 	uint8_t *bp;
   2158  1.5    cegger 	uint8_t sum;
   2159  1.1  christos 
   2160  1.1  christos 	bp = p;
   2161  1.1  christos 	sum = 0;
   2162  1.1  christos 	while (length--)
   2163  1.1  christos 		sum += *bp++;
   2164  1.1  christos 
   2165  1.1  christos 	return (sum);
   2166  1.1  christos }
   2167  1.1  christos 
   2168  1.5    cegger static ACPI_TABLE_HEADER *
   2169  1.1  christos acpi_map_sdt(vm_offset_t pa)
   2170  1.1  christos {
   2171  1.5    cegger 	ACPI_TABLE_HEADER *sp;
   2172  1.1  christos 
   2173  1.5    cegger 	sp = acpi_map_physical(pa, sizeof(ACPI_TABLE_HEADER));
   2174  1.5    cegger 	sp = acpi_map_physical(pa, sp->Length);
   2175  1.1  christos 	return (sp);
   2176  1.1  christos }
   2177  1.1  christos 
   2178  1.5    cegger static void
   2179  1.5    cegger acpi_print_rsd_ptr(ACPI_TABLE_RSDP *rp)
   2180  1.1  christos {
   2181  1.1  christos 	printf(BEGIN_COMMENT);
   2182  1.5    cegger 	printf("  RSD PTR: OEM=");
   2183  1.5    cegger 	acpi_print_string(rp->OemId, ACPI_OEM_ID_SIZE);
   2184  1.5    cegger 	printf(", ACPI_Rev=%s (%d)\n", rp->Revision < 2 ? "1.0x" : "2.0x",
   2185  1.5    cegger 	       rp->Revision);
   2186  1.5    cegger 	if (rp->Revision < 2) {
   2187  1.5    cegger 		printf("\tRSDT=0x%08x, cksum=%u\n", rp->RsdtPhysicalAddress,
   2188  1.5    cegger 		    rp->Checksum);
   2189  1.5    cegger 	} else {
   2190  1.5    cegger 		printf("\tXSDT=0x%08lx, length=%u, cksum=%u\n",
   2191  1.5    cegger 		    (u_long)rp->XsdtPhysicalAddress, rp->Length,
   2192  1.5    cegger 		    rp->ExtendedChecksum);
   2193  1.5    cegger 	}
   2194  1.1  christos 	printf(END_COMMENT);
   2195  1.1  christos }
   2196  1.1  christos 
   2197  1.5    cegger static void
   2198  1.5    cegger acpi_handle_rsdt(ACPI_TABLE_HEADER *rsdp)
   2199  1.1  christos {
   2200  1.5    cegger 	ACPI_TABLE_HEADER *sdp;
   2201  1.5    cegger 	ACPI_TABLE_RSDT *rsdt;
   2202  1.5    cegger 	ACPI_TABLE_XSDT *xsdt;
   2203  1.5    cegger 	vm_offset_t addr;
   2204  1.5    cegger 	int entries, i;
   2205  1.1  christos 
   2206  1.1  christos 	acpi_print_rsdt(rsdp);
   2207  1.5    cegger 	rsdt = (ACPI_TABLE_RSDT *)rsdp;
   2208  1.5    cegger 	xsdt = (ACPI_TABLE_XSDT *)rsdp;
   2209  1.5    cegger 	entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
   2210  1.1  christos 	for (i = 0; i < entries; i++) {
   2211  1.5    cegger 		switch (addr_size) {
   2212  1.5    cegger 		case 4:
   2213  1.5    cegger 			addr = le32toh(rsdt->TableOffsetEntry[i]);
   2214  1.5    cegger 			break;
   2215  1.5    cegger 		case 8:
   2216  1.5    cegger 			addr = le64toh(xsdt->TableOffsetEntry[i]);
   2217  1.5    cegger 			break;
   2218  1.5    cegger 		default:
   2219  1.5    cegger 			assert((addr = 0));
   2220  1.5    cegger 		}
   2221  1.5    cegger 
   2222  1.5    cegger 		sdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(addr);
   2223  1.5    cegger 		if (acpi_checksum(sdp, sdp->Length)) {
   2224  1.5    cegger 			warnx("RSDT entry %d (sig %.4s) is corrupt", i,
   2225  1.5    cegger 			    sdp->Signature);
   2226  1.8  jmcneill 			if (sflag)
   2227  1.8  jmcneill 				continue;
   2228  1.4  drochner 		}
   2229  1.5    cegger 		if (!memcmp(sdp->Signature, ACPI_SIG_FADT, 4))
   2230  1.5    cegger 			acpi_handle_fadt(sdp);
   2231  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_BERT, 4))
   2232  1.5    cegger 			acpi_handle_bert(sdp);
   2233  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_BOOT, 4))
   2234  1.5    cegger 			acpi_handle_boot(sdp);
   2235  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_CPEP, 4))
   2236  1.5    cegger 			acpi_handle_cpep(sdp);
   2237  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_DBGP, 4))
   2238  1.5    cegger 			acpi_handle_dbgp(sdp);
   2239  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_EINJ, 4))
   2240  1.5    cegger 			acpi_handle_einj(sdp);
   2241  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_ERST, 4))
   2242  1.5    cegger 			acpi_handle_erst(sdp);
   2243  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_MADT, 4))
   2244  1.5    cegger 			acpi_handle_madt(sdp);
   2245  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_MSCT, 4))
   2246  1.5    cegger 			acpi_handle_msct(sdp);
   2247  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_HEST, 4))
   2248  1.5    cegger 			acpi_handle_hest(sdp);
   2249  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_HPET, 4))
   2250  1.5    cegger 			acpi_handle_hpet(sdp);
   2251  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_ECDT, 4))
   2252  1.5    cegger 			acpi_handle_ecdt(sdp);
   2253  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_MCFG, 4))
   2254  1.5    cegger 			acpi_handle_mcfg(sdp);
   2255  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_SBST, 4))
   2256  1.5    cegger 			acpi_handle_sbst(sdp);
   2257  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_SLIT, 4))
   2258  1.5    cegger 			acpi_handle_slit(sdp);
   2259  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_SPCR, 4))
   2260  1.5    cegger 			acpi_handle_spcr(sdp);
   2261  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_SRAT, 4))
   2262  1.5    cegger 			acpi_handle_srat(sdp);
   2263  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_TCPA, 4))
   2264  1.5    cegger 			acpi_handle_tcpa(sdp);
   2265  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_WAET, 4))
   2266  1.5    cegger 			acpi_handle_waet(sdp);
   2267  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_WDAT, 4))
   2268  1.5    cegger 			acpi_handle_wdat(sdp);
   2269  1.5    cegger 		else if (!memcmp(sdp->Signature, ACPI_SIG_WDRT, 4))
   2270  1.5    cegger 			acpi_handle_wdrt(sdp);
   2271  1.5    cegger 		else {
   2272  1.5    cegger 			printf(BEGIN_COMMENT);
   2273  1.1  christos 			acpi_print_sdt(sdp);
   2274  1.7  jmcneill 			acpi_dump_bytes(sdp);
   2275  1.5    cegger 			printf(END_COMMENT);
   2276  1.1  christos 		}
   2277  1.1  christos 	}
   2278  1.1  christos }
   2279  1.1  christos 
   2280  1.5    cegger ACPI_TABLE_HEADER *
   2281  1.5    cegger sdt_load_devmem(void)
   2282  1.5    cegger {
   2283  1.5    cegger 	ACPI_TABLE_RSDP *rp;
   2284  1.5    cegger 	ACPI_TABLE_HEADER *rsdp;
   2285  1.1  christos 
   2286  1.5    cegger 	rp = acpi_find_rsd_ptr();
   2287  1.5    cegger 	if (!rp)
   2288  1.5    cegger 		errx(EXIT_FAILURE, "Can't find ACPI information");
   2289  1.5    cegger 
   2290  1.5    cegger 	if (tflag)
   2291  1.5    cegger 		acpi_print_rsd_ptr(rp);
   2292  1.5    cegger 	if (rp->Revision < 2) {
   2293  1.5    cegger 		rsdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(rp->RsdtPhysicalAddress);
   2294  1.5    cegger 		if (memcmp(rsdp->Signature, "RSDT", 4) != 0 ||
   2295  1.5    cegger 		    acpi_checksum(rsdp, rsdp->Length) != 0)
   2296  1.5    cegger 			errx(EXIT_FAILURE, "RSDT is corrupted");
   2297  1.5    cegger 		addr_size = sizeof(uint32_t);
   2298  1.5    cegger 	} else {
   2299  1.5    cegger 		rsdp = (ACPI_TABLE_HEADER *)acpi_map_sdt(rp->XsdtPhysicalAddress);
   2300  1.5    cegger 		if (memcmp(rsdp->Signature, "XSDT", 4) != 0 ||
   2301  1.5    cegger 		    acpi_checksum(rsdp, rsdp->Length) != 0)
   2302  1.5    cegger 			errx(EXIT_FAILURE, "XSDT is corrupted");
   2303  1.5    cegger 		addr_size = sizeof(uint64_t);
   2304  1.5    cegger 	}
   2305  1.5    cegger 	return (rsdp);
   2306  1.1  christos }
   2307  1.1  christos 
   2308  1.5    cegger /* Write the DSDT to a file, concatenating any SSDTs (if present). */
   2309  1.5    cegger static int
   2310  1.5    cegger write_dsdt(int fd, ACPI_TABLE_HEADER *rsdt, ACPI_TABLE_HEADER *dsdt)
   2311  1.5    cegger {
   2312  1.5    cegger 	ACPI_TABLE_HEADER sdt;
   2313  1.5    cegger 	ACPI_TABLE_HEADER *ssdt;
   2314  1.5    cegger 	uint8_t sum;
   2315  1.5    cegger 
   2316  1.5    cegger 	/* Create a new checksum to account for the DSDT and any SSDTs. */
   2317  1.5    cegger 	sdt = *dsdt;
   2318  1.5    cegger 	if (rsdt != NULL) {
   2319  1.5    cegger 		sdt.Checksum = 0;
   2320  1.5    cegger 		sum = acpi_checksum(dsdt + 1, dsdt->Length -
   2321  1.5    cegger 		    sizeof(ACPI_TABLE_HEADER));
   2322  1.5    cegger 		ssdt = sdt_from_rsdt(rsdt, ACPI_SIG_SSDT, NULL);
   2323  1.5    cegger 		while (ssdt != NULL) {
   2324  1.5    cegger 			sdt.Length += ssdt->Length - sizeof(ACPI_TABLE_HEADER);
   2325  1.5    cegger 			sum += acpi_checksum(ssdt + 1,
   2326  1.5    cegger 			    ssdt->Length - sizeof(ACPI_TABLE_HEADER));
   2327  1.5    cegger 			ssdt = sdt_from_rsdt(rsdt, ACPI_SIG_SSDT, ssdt);
   2328  1.5    cegger 		}
   2329  1.5    cegger 		sum += acpi_checksum(&sdt, sizeof(ACPI_TABLE_HEADER));
   2330  1.5    cegger 		sdt.Checksum -= sum;
   2331  1.5    cegger 	}
   2332  1.5    cegger 
   2333  1.5    cegger 	/* Write out the DSDT header and body. */
   2334  1.5    cegger 	write(fd, &sdt, sizeof(ACPI_TABLE_HEADER));
   2335  1.5    cegger 	write(fd, dsdt + 1, dsdt->Length - sizeof(ACPI_TABLE_HEADER));
   2336  1.5    cegger 
   2337  1.5    cegger 	/* Write out any SSDTs (if present.) */
   2338  1.5    cegger 	if (rsdt != NULL) {
   2339  1.5    cegger 		ssdt = sdt_from_rsdt(rsdt, "SSDT", NULL);
   2340  1.5    cegger 		while (ssdt != NULL) {
   2341  1.5    cegger 			write(fd, ssdt + 1, ssdt->Length -
   2342  1.5    cegger 			    sizeof(ACPI_TABLE_HEADER));
   2343  1.5    cegger 			ssdt = sdt_from_rsdt(rsdt, "SSDT", ssdt);
   2344  1.5    cegger 		}
   2345  1.5    cegger 	}
   2346  1.1  christos 	return (0);
   2347  1.1  christos }
   2348  1.1  christos 
   2349  1.5    cegger void
   2350  1.5    cegger dsdt_save_file(char *outfile, ACPI_TABLE_HEADER *rsdt, ACPI_TABLE_HEADER *dsdp)
   2351  1.1  christos {
   2352  1.5    cegger 	int	fd;
   2353  1.5    cegger 	mode_t	mode;
   2354  1.5    cegger 
   2355  1.5    cegger 	assert(outfile != NULL);
   2356  1.5    cegger 	mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
   2357  1.5    cegger 	fd = open(outfile, O_WRONLY | O_CREAT | O_TRUNC, mode);
   2358  1.5    cegger 	if (fd == -1) {
   2359  1.5    cegger 		perror("dsdt_save_file");
   2360  1.5    cegger 		return;
   2361  1.5    cegger 	}
   2362  1.5    cegger 	write_dsdt(fd, rsdt, dsdp);
   2363  1.5    cegger 	close(fd);
   2364  1.1  christos }
   2365  1.1  christos 
   2366  1.5    cegger void
   2367  1.5    cegger aml_disassemble(ACPI_TABLE_HEADER *rsdt, ACPI_TABLE_HEADER *dsdp)
   2368  1.1  christos {
   2369  1.6    jruoho 	char buf[MAXPATHLEN], tmpstr[MAXPATHLEN];
   2370  1.5    cegger 	const char *tmpdir;
   2371  1.5    cegger 	char *tmpext;
   2372  1.5    cegger 	FILE *fp;
   2373  1.5    cegger 	size_t len;
   2374  1.5    cegger 	int fd;
   2375  1.5    cegger 
   2376  1.5    cegger 	if (rsdt == NULL)
   2377  1.5    cegger 		errx(EXIT_FAILURE, "aml_disassemble: invalid rsdt");
   2378  1.5    cegger 	if (dsdp == NULL)
   2379  1.5    cegger 		errx(EXIT_FAILURE, "aml_disassemble: invalid dsdp");
   2380  1.5    cegger 
   2381  1.5    cegger 	tmpdir = getenv("TMPDIR");
   2382  1.5    cegger 	if (tmpdir == NULL)
   2383  1.5    cegger 		tmpdir = _PATH_TMP;
   2384  1.5    cegger 	strlcpy(tmpstr, tmpdir, sizeof(tmpstr));
   2385  1.5    cegger 	if (realpath(tmpstr, buf) == NULL) {
   2386  1.5    cegger 		perror("realpath tmp file");
   2387  1.5    cegger 		return;
   2388  1.5    cegger 	}
   2389  1.5    cegger 	strlcpy(tmpstr, buf, sizeof(tmpstr));
   2390  1.5    cegger 	strlcat(tmpstr, "/acpidump.", sizeof(tmpstr));
   2391  1.5    cegger 	len = strlen(tmpstr);
   2392  1.5    cegger 	tmpext = tmpstr + len;
   2393  1.5    cegger 	strlcpy(tmpext, "XXXXXX", sizeof(tmpstr) - len);
   2394  1.5    cegger 	fd = mkstemp(tmpstr);
   2395  1.5    cegger 	if (fd < 0) {
   2396  1.5    cegger 		perror("iasl tmp file");
   2397  1.5    cegger 		return;
   2398  1.5    cegger 	}
   2399  1.5    cegger 	write_dsdt(fd, rsdt, dsdp);
   2400  1.5    cegger 	close(fd);
   2401  1.5    cegger 
   2402  1.5    cegger 	/* Run iasl -d on the temp file */
   2403  1.5    cegger 	if (fork() == 0) {
   2404  1.5    cegger 		close(STDOUT_FILENO);
   2405  1.5    cegger 		if (vflag == 0)
   2406  1.5    cegger 			close(STDERR_FILENO);
   2407  1.5    cegger 		execl("/usr/bin/iasl", "iasl", "-d", tmpstr, NULL);
   2408  1.5    cegger 		err(EXIT_FAILURE, "exec");
   2409  1.5    cegger 	}
   2410  1.5    cegger 
   2411  1.5    cegger 	wait(NULL);
   2412  1.5    cegger 	unlink(tmpstr);
   2413  1.1  christos 
   2414  1.5    cegger 	/* Dump iasl's output to stdout */
   2415  1.5    cegger 	strlcpy(tmpext, "dsl", sizeof(tmpstr) - len);
   2416  1.5    cegger 	fp = fopen(tmpstr, "r");
   2417  1.5    cegger 	unlink(tmpstr);
   2418  1.5    cegger 	if (fp == NULL) {
   2419  1.5    cegger 		perror("iasl tmp file (read)");
   2420  1.5    cegger 		return;
   2421  1.5    cegger 	}
   2422  1.5    cegger 	while ((len = fread(buf, 1, sizeof(buf), fp)) > 0)
   2423  1.5    cegger 		fwrite(buf, 1, len, stdout);
   2424  1.5    cegger 	fclose(fp);
   2425  1.1  christos }
   2426  1.1  christos 
   2427  1.5    cegger void
   2428  1.5    cegger sdt_print_all(ACPI_TABLE_HEADER *rsdp)
   2429  1.1  christos {
   2430  1.5    cegger 	acpi_handle_rsdt(rsdp);
   2431  1.1  christos }
   2432  1.1  christos 
   2433  1.5    cegger /* Fetch a table matching the given signature via the RSDT. */
   2434  1.5    cegger ACPI_TABLE_HEADER *
   2435  1.5    cegger sdt_from_rsdt(ACPI_TABLE_HEADER *rsdp, const char *sig, ACPI_TABLE_HEADER *last)
   2436  1.1  christos {
   2437  1.5    cegger 	ACPI_TABLE_HEADER *sdt;
   2438  1.5    cegger 	ACPI_TABLE_RSDT *rsdt;
   2439  1.5    cegger 	ACPI_TABLE_XSDT *xsdt;
   2440  1.5    cegger 	vm_offset_t addr;
   2441  1.5    cegger 	int entries, i;
   2442  1.1  christos 
   2443  1.5    cegger 	rsdt = (ACPI_TABLE_RSDT *)rsdp;
   2444  1.5    cegger 	xsdt = (ACPI_TABLE_XSDT *)rsdp;
   2445  1.5    cegger 	entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
   2446  1.5    cegger 	for (i = 0; i < entries; i++) {
   2447  1.5    cegger 		switch (addr_size) {
   2448  1.5    cegger 		case 4:
   2449  1.5    cegger 			addr = le32toh(rsdt->TableOffsetEntry[i]);
   2450  1.5    cegger 			break;
   2451  1.5    cegger 		case 8:
   2452  1.5    cegger 			addr = le64toh(xsdt->TableOffsetEntry[i]);
   2453  1.5    cegger 			break;
   2454  1.5    cegger 		default:
   2455  1.5    cegger 			assert((addr = 0));
   2456  1.5    cegger 		}
   2457  1.5    cegger 		sdt = (ACPI_TABLE_HEADER *)acpi_map_sdt(addr);
   2458  1.5    cegger 		if (last != NULL) {
   2459  1.5    cegger 			if (sdt == last)
   2460  1.5    cegger 				last = NULL;
   2461  1.5    cegger 			continue;
   2462  1.5    cegger 		}
   2463  1.5    cegger 		if (memcmp(sdt->Signature, sig, strlen(sig)))
   2464  1.5    cegger 			continue;
   2465  1.5    cegger 		if (acpi_checksum(sdt, sdt->Length))
   2466  1.5    cegger 			errx(EXIT_FAILURE, "RSDT entry %d is corrupt", i);
   2467  1.5    cegger 		return (sdt);
   2468  1.5    cegger 	}
   2469  1.1  christos 
   2470  1.5    cegger 	return (NULL);
   2471  1.1  christos }
   2472  1.1  christos 
   2473  1.5    cegger ACPI_TABLE_HEADER *
   2474  1.5    cegger dsdt_from_fadt(ACPI_TABLE_FADT *fadt)
   2475  1.1  christos {
   2476  1.5    cegger 	ACPI_TABLE_HEADER	*sdt;
   2477  1.1  christos 
   2478  1.5    cegger 	/* Use the DSDT address if it is version 1, otherwise use XDSDT. */
   2479  1.5    cegger 	if (acpi_get_fadt_revision(fadt) == 1)
   2480  1.5    cegger 		sdt = (ACPI_TABLE_HEADER *)acpi_map_sdt(fadt->Dsdt);
   2481  1.5    cegger 	else
   2482  1.5    cegger 		sdt = (ACPI_TABLE_HEADER *)acpi_map_sdt(fadt->XDsdt);
   2483  1.5    cegger 	if (acpi_checksum(sdt, sdt->Length))
   2484  1.5    cegger 		errx(EXIT_FAILURE, "DSDT is corrupt\n");
   2485  1.5    cegger 	return (sdt);
   2486  1.1  christos }
   2487