acpi.c revision 1.11 1 1.11 christos /* $NetBSD: acpi.c,v 1.11 2015/08/18 17:46:09 christos 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.11 christos __RCSID("$NetBSD: acpi.c,v 1.11 2015/08/18 17:46:09 christos 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.11 christos #if 0
1671 1.5 cegger ACPI_TABLE_TCPA *tcpa;
1672 1.5 cegger
1673 1.5 cegger printf(BEGIN_COMMENT);
1674 1.5 cegger acpi_print_sdt(sdp);
1675 1.5 cegger tcpa = (ACPI_TABLE_TCPA *)sdp;
1676 1.1 christos
1677 1.5 cegger printf("\tMaximum Length of Event Log Area=%d\n", tcpa->MaxLogLength);
1678 1.5 cegger printf("\tPhysical Address of Log Area=0x%08"PRIx64"\n",
1679 1.5 cegger tcpa->LogAddress);
1680 1.11 christos #endif
1681 1.5 cegger printf(END_COMMENT);
1682 1.1 christos }
1683 1.1 christos
1684 1.1 christos static void
1685 1.5 cegger acpi_handle_waet(ACPI_TABLE_HEADER *sdp)
1686 1.1 christos {
1687 1.5 cegger ACPI_TABLE_WAET *waet;
1688 1.5 cegger
1689 1.5 cegger printf(BEGIN_COMMENT);
1690 1.5 cegger acpi_print_sdt(sdp);
1691 1.5 cegger waet = (ACPI_TABLE_WAET *)sdp;
1692 1.1 christos
1693 1.5 cegger printf("\tRTC Timer={");
1694 1.5 cegger if (waet->Flags & ACPI_WAET_RTC_NO_ACK)
1695 1.5 cegger printf("No ACK required");
1696 1.5 cegger else
1697 1.5 cegger printf("default behaviour");
1698 1.5 cegger printf("}\n");
1699 1.5 cegger printf("\t ACPI PM Timer={");
1700 1.5 cegger if (waet->Flags & ACPI_WAET_TIMER_ONE_READ)
1701 1.5 cegger printf("One Read sufficient");
1702 1.5 cegger else
1703 1.5 cegger printf("default behaviour");
1704 1.5 cegger printf("}\n");
1705 1.3 joerg
1706 1.5 cegger printf(END_COMMENT);
1707 1.1 christos }
1708 1.1 christos
1709 1.5 cegger static void
1710 1.5 cegger acpi_print_wdat_action(ACPI_WHEA_HEADER *whea)
1711 1.5 cegger {
1712 1.5 cegger printf("\tACTION={");
1713 1.5 cegger switch (whea->Action) {
1714 1.5 cegger case ACPI_WDAT_RESET:
1715 1.5 cegger printf("RESET");
1716 1.5 cegger break;
1717 1.5 cegger case ACPI_WDAT_GET_CURRENT_COUNTDOWN:
1718 1.5 cegger printf("GET_CURRENT_COUNTDOWN");
1719 1.5 cegger break;
1720 1.5 cegger case ACPI_WDAT_GET_COUNTDOWN:
1721 1.5 cegger printf("GET_COUNTDOWN");
1722 1.5 cegger break;
1723 1.5 cegger case ACPI_WDAT_SET_COUNTDOWN:
1724 1.5 cegger printf("SET_COUNTDOWN");
1725 1.5 cegger break;
1726 1.5 cegger case ACPI_WDAT_GET_RUNNING_STATE:
1727 1.5 cegger printf("GET_RUNNING_STATE");
1728 1.5 cegger break;
1729 1.5 cegger case ACPI_WDAT_SET_RUNNING_STATE:
1730 1.5 cegger printf("SET_RUNNING_STATE");
1731 1.5 cegger break;
1732 1.5 cegger case ACPI_WDAT_GET_STOPPED_STATE:
1733 1.5 cegger printf("GET_STOPPED_STATE");
1734 1.5 cegger break;
1735 1.5 cegger case ACPI_WDAT_SET_STOPPED_STATE:
1736 1.5 cegger printf("SET_STOPPED_STATE");
1737 1.5 cegger break;
1738 1.5 cegger case ACPI_WDAT_GET_REBOOT:
1739 1.5 cegger printf("GET_REBOOT");
1740 1.5 cegger break;
1741 1.5 cegger case ACPI_WDAT_SET_REBOOT:
1742 1.5 cegger printf("SET_REBOOT");
1743 1.5 cegger break;
1744 1.5 cegger case ACPI_WDAT_GET_SHUTDOWN:
1745 1.5 cegger printf("GET_SHUTDOWN");
1746 1.5 cegger break;
1747 1.5 cegger case ACPI_WDAT_SET_SHUTDOWN:
1748 1.5 cegger printf("SET_SHUTDOWN");
1749 1.5 cegger break;
1750 1.5 cegger case ACPI_WDAT_GET_STATUS:
1751 1.5 cegger printf("GET_STATUS");
1752 1.5 cegger break;
1753 1.5 cegger case ACPI_WDAT_SET_STATUS:
1754 1.5 cegger printf("SET_STATUS");
1755 1.5 cegger break;
1756 1.5 cegger case ACPI_WDAT_ACTION_RESERVED:
1757 1.5 cegger printf("ACTION_RESERVED");
1758 1.5 cegger break;
1759 1.5 cegger default:
1760 1.5 cegger printf("%d", whea->Action);
1761 1.5 cegger break;
1762 1.5 cegger }
1763 1.5 cegger printf("}\n");
1764 1.5 cegger }
1765 1.1 christos
1766 1.5 cegger static void
1767 1.5 cegger acpi_print_wdat_instruction(ACPI_WHEA_HEADER *whea)
1768 1.1 christos {
1769 1.5 cegger uint32_t ins;
1770 1.5 cegger
1771 1.5 cegger ins = whea->Instruction & ~ACPI_WDAT_PRESERVE_REGISTER;
1772 1.5 cegger
1773 1.5 cegger printf("\tINSTRUCTION={");
1774 1.5 cegger switch (ins) {
1775 1.5 cegger case ACPI_WDAT_READ_VALUE:
1776 1.5 cegger printf("READ_VALUE");
1777 1.5 cegger break;
1778 1.5 cegger case ACPI_WDAT_READ_COUNTDOWN:
1779 1.5 cegger printf("READ_COUNTDOWN");
1780 1.5 cegger break;
1781 1.5 cegger case ACPI_WDAT_WRITE_VALUE:
1782 1.5 cegger printf("WRITE_VALUE");
1783 1.5 cegger break;
1784 1.5 cegger case ACPI_WDAT_WRITE_COUNTDOWN:
1785 1.5 cegger printf("WRITE_COUNTDOWN");
1786 1.5 cegger break;
1787 1.5 cegger case ACPI_WDAT_INSTRUCTION_RESERVED:
1788 1.5 cegger printf("INSTRUCTION_RESERVED");
1789 1.5 cegger break;
1790 1.5 cegger default:
1791 1.5 cegger printf("%d", ins);
1792 1.5 cegger break;
1793 1.5 cegger }
1794 1.5 cegger
1795 1.5 cegger if (whea->Instruction & ACPI_WDAT_PRESERVE_REGISTER)
1796 1.5 cegger printf(", Preserve Register ");
1797 1.5 cegger
1798 1.5 cegger printf("}\n");
1799 1.5 cegger }
1800 1.1 christos
1801 1.5 cegger static void
1802 1.5 cegger acpi_handle_wdat(ACPI_TABLE_HEADER *sdp)
1803 1.5 cegger {
1804 1.5 cegger ACPI_TABLE_WDAT *wdat;
1805 1.5 cegger ACPI_WHEA_HEADER *whea;
1806 1.5 cegger char *wdat_pos;
1807 1.5 cegger u_int i;
1808 1.1 christos
1809 1.5 cegger printf(BEGIN_COMMENT);
1810 1.5 cegger acpi_print_sdt(sdp);
1811 1.5 cegger wdat = (ACPI_TABLE_WDAT *)sdp;
1812 1.1 christos
1813 1.5 cegger printf("\tHeader Length=%d\n", wdat->HeaderLength);
1814 1.1 christos
1815 1.5 cegger acpi_print_pci_sbfd(wdat->PciSegment, wdat->PciBus, wdat->PciDevice,
1816 1.5 cegger wdat->PciFunction);
1817 1.5 cegger printf("\n\tTimer Counter Period=%d msec\n", wdat->TimerPeriod);
1818 1.5 cegger printf("\tTimer Maximum Counter Value=%d\n", wdat->MaxCount);
1819 1.5 cegger printf("\tTimer Minimum Counter Value=%d\n", wdat->MinCount);
1820 1.5 cegger
1821 1.5 cegger printf("\tFlags={");
1822 1.5 cegger if (wdat->Flags & ACPI_WDAT_ENABLED)
1823 1.5 cegger printf("ENABLED");
1824 1.5 cegger if (wdat->Flags & ACPI_WDAT_STOPPED)
1825 1.5 cegger printf(", STOPPED");
1826 1.5 cegger printf("}\n");
1827 1.1 christos
1828 1.5 cegger wdat_pos = ((char *)wdat + sizeof(ACPI_TABLE_HEADER)
1829 1.5 cegger + wdat->HeaderLength);
1830 1.1 christos
1831 1.5 cegger for (i = 0; i < wdat->Entries; i++) {
1832 1.5 cegger whea = (ACPI_WHEA_HEADER *)wdat_pos;
1833 1.5 cegger acpi_print_whea(whea,
1834 1.5 cegger acpi_print_wdat_action, acpi_print_wdat_instruction,
1835 1.5 cegger NULL);
1836 1.5 cegger wdat_pos += sizeof(ACPI_WDAT_ENTRY);
1837 1.5 cegger }
1838 1.5 cegger printf(END_COMMENT);
1839 1.1 christos }
1840 1.5 cegger
1841 1.5 cegger static void
1842 1.5 cegger acpi_handle_wdrt(ACPI_TABLE_HEADER *sdp)
1843 1.1 christos {
1844 1.5 cegger ACPI_TABLE_WDRT *wdrt;
1845 1.1 christos
1846 1.1 christos printf(BEGIN_COMMENT);
1847 1.5 cegger acpi_print_sdt(sdp);
1848 1.5 cegger wdrt = (ACPI_TABLE_WDRT *)sdp;
1849 1.5 cegger
1850 1.5 cegger printf("\tControl Register=");
1851 1.5 cegger acpi_print_gas(&wdrt->ControlRegister);
1852 1.5 cegger printf("\tCount Register=");
1853 1.5 cegger acpi_print_gas(&wdrt->CountRegister);
1854 1.5 cegger acpi_print_pci(wdrt->PciVendorId, wdrt->PciDeviceId,
1855 1.5 cegger wdrt->PciSegment, wdrt->PciBus, wdrt->PciDevice, wdrt->PciFunction);
1856 1.5 cegger
1857 1.5 cegger /* Value must be >= 511 and < 65535 */
1858 1.5 cegger printf("\tMaxCount=%d", wdrt->MaxCount);
1859 1.5 cegger if (wdrt->MaxCount < 511)
1860 1.5 cegger printf(" (Out of Range. Valid range: 511 <= maxcount < 65535)");
1861 1.5 cegger printf("\n");
1862 1.5 cegger
1863 1.5 cegger printf("\tUnit={");
1864 1.5 cegger switch (wdrt->Units) {
1865 1.5 cegger case 0:
1866 1.5 cegger printf("1 seconds/count");
1867 1.5 cegger break;
1868 1.5 cegger case 1:
1869 1.5 cegger printf("100 milliseconds/count");
1870 1.5 cegger break;
1871 1.5 cegger case 2:
1872 1.5 cegger printf("10 milliseconds/count");
1873 1.5 cegger break;
1874 1.5 cegger default:
1875 1.5 cegger printf("%d", wdrt->Units);
1876 1.5 cegger break;
1877 1.5 cegger }
1878 1.5 cegger printf("}\n");
1879 1.5 cegger
1880 1.5 cegger printf(END_COMMENT);
1881 1.5 cegger }
1882 1.5 cegger
1883 1.5 cegger static void
1884 1.5 cegger acpi_print_sdt(ACPI_TABLE_HEADER *sdp)
1885 1.5 cegger {
1886 1.5 cegger printf(" ");
1887 1.5 cegger acpi_print_string(sdp->Signature, ACPI_NAME_SIZE);
1888 1.8 jmcneill printf(": Length=%d, Revision=%d, Checksum=%d",
1889 1.5 cegger sdp->Length, sdp->Revision, sdp->Checksum);
1890 1.8 jmcneill if (acpi_checksum(sdp, sdp->Length))
1891 1.8 jmcneill printf(" (Incorrect)");
1892 1.8 jmcneill printf(",\n\tOEMID=");
1893 1.5 cegger acpi_print_string(sdp->OemId, ACPI_OEM_ID_SIZE);
1894 1.1 christos printf(", OEM Table ID=");
1895 1.5 cegger acpi_print_string(sdp->OemTableId, ACPI_OEM_TABLE_ID_SIZE);
1896 1.5 cegger printf(", OEM Revision=0x%x,\n", sdp->OemRevision);
1897 1.1 christos printf("\tCreator ID=");
1898 1.5 cegger acpi_print_string(sdp->AslCompilerId, ACPI_NAME_SIZE);
1899 1.5 cegger printf(", Creator Revision=0x%x\n", sdp->AslCompilerRevision);
1900 1.1 christos }
1901 1.1 christos
1902 1.5 cegger static void
1903 1.7 jmcneill acpi_dump_bytes(ACPI_TABLE_HEADER *sdp)
1904 1.7 jmcneill {
1905 1.7 jmcneill unsigned int i;
1906 1.7 jmcneill uint8_t *p;
1907 1.7 jmcneill
1908 1.8 jmcneill p = (uint8_t *)sdp;
1909 1.7 jmcneill printf("\n\tData={");
1910 1.7 jmcneill for (i = 0; i < sdp->Length; i++) {
1911 1.7 jmcneill if (cflag) {
1912 1.7 jmcneill if (i % 64 == 0)
1913 1.7 jmcneill printf("\n\t ");
1914 1.7 jmcneill else if (i % 16 == 0)
1915 1.7 jmcneill printf(" ");
1916 1.7 jmcneill printf("%c", (p[i] >= ' ' && p[i] <= '~') ? p[i] : '.');
1917 1.7 jmcneill } else {
1918 1.7 jmcneill if (i % 16 == 0)
1919 1.7 jmcneill printf("\n\t\t");
1920 1.7 jmcneill else if (i % 8 == 0)
1921 1.7 jmcneill printf(" ");
1922 1.7 jmcneill printf(" %02x", p[i]);
1923 1.7 jmcneill }
1924 1.7 jmcneill }
1925 1.7 jmcneill printf("\n\t}\n");
1926 1.7 jmcneill }
1927 1.7 jmcneill
1928 1.7 jmcneill static void
1929 1.5 cegger acpi_print_rsdt(ACPI_TABLE_HEADER *rsdp)
1930 1.1 christos {
1931 1.5 cegger ACPI_TABLE_RSDT *rsdt;
1932 1.5 cegger ACPI_TABLE_XSDT *xsdt;
1933 1.1 christos int i, entries;
1934 1.5 cegger u_long addr;
1935 1.1 christos
1936 1.5 cegger rsdt = (ACPI_TABLE_RSDT *)rsdp;
1937 1.5 cegger xsdt = (ACPI_TABLE_XSDT *)rsdp;
1938 1.5 cegger printf(BEGIN_COMMENT);
1939 1.1 christos acpi_print_sdt(rsdp);
1940 1.5 cegger entries = (rsdp->Length - sizeof(ACPI_TABLE_HEADER)) / addr_size;
1941 1.1 christos printf("\tEntries={ ");
1942 1.1 christos for (i = 0; i < entries; i++) {
1943 1.1 christos if (i > 0)
1944 1.1 christos printf(", ");
1945 1.5 cegger switch (addr_size) {
1946 1.5 cegger case 4:
1947 1.5 cegger addr = le32toh(rsdt->TableOffsetEntry[i]);
1948 1.5 cegger break;
1949 1.5 cegger case 8:
1950 1.5 cegger addr = le64toh(xsdt->TableOffsetEntry[i]);
1951 1.5 cegger break;
1952 1.5 cegger default:
1953 1.9 riastrad assert((addr = 0));
1954 1.5 cegger }
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.10 christos errx(EXIT_FAILURE, "DSDT is corrupt");
2485 1.5 cegger return (sdt);
2486 1.1 christos }
2487