1*4882a593Smuzhiyun // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2*4882a593Smuzhiyun /*******************************************************************************
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Module Name: dbutils - AML debugger utilities
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun ******************************************************************************/
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <acpi/acpi.h>
9*4882a593Smuzhiyun #include "accommon.h"
10*4882a593Smuzhiyun #include "acnamesp.h"
11*4882a593Smuzhiyun #include "acdebug.h"
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #define _COMPONENT ACPI_CA_DEBUGGER
14*4882a593Smuzhiyun ACPI_MODULE_NAME("dbutils")
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun /* Local prototypes */
17*4882a593Smuzhiyun #ifdef ACPI_OBSOLETE_FUNCTIONS
18*4882a593Smuzhiyun acpi_status acpi_db_second_pass_parse(union acpi_parse_object *root);
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun void acpi_db_dump_buffer(u32 address);
21*4882a593Smuzhiyun #endif
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun /*******************************************************************************
24*4882a593Smuzhiyun *
25*4882a593Smuzhiyun * FUNCTION: acpi_db_match_argument
26*4882a593Smuzhiyun *
27*4882a593Smuzhiyun * PARAMETERS: user_argument - User command line
28*4882a593Smuzhiyun * arguments - Array of commands to match against
29*4882a593Smuzhiyun *
30*4882a593Smuzhiyun * RETURN: Index into command array or ACPI_TYPE_NOT_FOUND if not found
31*4882a593Smuzhiyun *
32*4882a593Smuzhiyun * DESCRIPTION: Search command array for a command match
33*4882a593Smuzhiyun *
34*4882a593Smuzhiyun ******************************************************************************/
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun acpi_object_type
acpi_db_match_argument(char * user_argument,struct acpi_db_argument_info * arguments)37*4882a593Smuzhiyun acpi_db_match_argument(char *user_argument,
38*4882a593Smuzhiyun struct acpi_db_argument_info *arguments)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun u32 i;
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun if (!user_argument || user_argument[0] == 0) {
43*4882a593Smuzhiyun return (ACPI_TYPE_NOT_FOUND);
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun for (i = 0; arguments[i].name; i++) {
47*4882a593Smuzhiyun if (strstr(ACPI_CAST_PTR(char, arguments[i].name),
48*4882a593Smuzhiyun ACPI_CAST_PTR(char,
49*4882a593Smuzhiyun user_argument)) == arguments[i].name) {
50*4882a593Smuzhiyun return (i);
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun /* Argument not recognized */
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun return (ACPI_TYPE_NOT_FOUND);
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun /*******************************************************************************
60*4882a593Smuzhiyun *
61*4882a593Smuzhiyun * FUNCTION: acpi_db_set_output_destination
62*4882a593Smuzhiyun *
63*4882a593Smuzhiyun * PARAMETERS: output_flags - Current flags word
64*4882a593Smuzhiyun *
65*4882a593Smuzhiyun * RETURN: None
66*4882a593Smuzhiyun *
67*4882a593Smuzhiyun * DESCRIPTION: Set the current destination for debugger output. Also sets
68*4882a593Smuzhiyun * the debug output level accordingly.
69*4882a593Smuzhiyun *
70*4882a593Smuzhiyun ******************************************************************************/
71*4882a593Smuzhiyun
acpi_db_set_output_destination(u32 output_flags)72*4882a593Smuzhiyun void acpi_db_set_output_destination(u32 output_flags)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun acpi_gbl_db_output_flags = (u8)output_flags;
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun if ((output_flags & ACPI_DB_REDIRECTABLE_OUTPUT) &&
78*4882a593Smuzhiyun acpi_gbl_db_output_to_file) {
79*4882a593Smuzhiyun acpi_dbg_level = acpi_gbl_db_debug_level;
80*4882a593Smuzhiyun } else {
81*4882a593Smuzhiyun acpi_dbg_level = acpi_gbl_db_console_debug_level;
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun /*******************************************************************************
86*4882a593Smuzhiyun *
87*4882a593Smuzhiyun * FUNCTION: acpi_db_dump_external_object
88*4882a593Smuzhiyun *
89*4882a593Smuzhiyun * PARAMETERS: obj_desc - External ACPI object to dump
90*4882a593Smuzhiyun * level - Nesting level.
91*4882a593Smuzhiyun *
92*4882a593Smuzhiyun * RETURN: None
93*4882a593Smuzhiyun *
94*4882a593Smuzhiyun * DESCRIPTION: Dump the contents of an ACPI external object
95*4882a593Smuzhiyun *
96*4882a593Smuzhiyun ******************************************************************************/
97*4882a593Smuzhiyun
acpi_db_dump_external_object(union acpi_object * obj_desc,u32 level)98*4882a593Smuzhiyun void acpi_db_dump_external_object(union acpi_object *obj_desc, u32 level)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun u32 i;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun if (!obj_desc) {
103*4882a593Smuzhiyun acpi_os_printf("[Null Object]\n");
104*4882a593Smuzhiyun return;
105*4882a593Smuzhiyun }
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun for (i = 0; i < level; i++) {
108*4882a593Smuzhiyun acpi_os_printf(" ");
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun switch (obj_desc->type) {
112*4882a593Smuzhiyun case ACPI_TYPE_ANY:
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun acpi_os_printf("[Null Object] (Type=0)\n");
115*4882a593Smuzhiyun break;
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun case ACPI_TYPE_INTEGER:
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun acpi_os_printf("[Integer] = %8.8X%8.8X\n",
120*4882a593Smuzhiyun ACPI_FORMAT_UINT64(obj_desc->integer.value));
121*4882a593Smuzhiyun break;
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun case ACPI_TYPE_STRING:
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun acpi_os_printf("[String] Length %.2X = ",
126*4882a593Smuzhiyun obj_desc->string.length);
127*4882a593Smuzhiyun acpi_ut_print_string(obj_desc->string.pointer, ACPI_UINT8_MAX);
128*4882a593Smuzhiyun acpi_os_printf("\n");
129*4882a593Smuzhiyun break;
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun case ACPI_TYPE_BUFFER:
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun acpi_os_printf("[Buffer] Length %.2X = ",
134*4882a593Smuzhiyun obj_desc->buffer.length);
135*4882a593Smuzhiyun if (obj_desc->buffer.length) {
136*4882a593Smuzhiyun if (obj_desc->buffer.length > 16) {
137*4882a593Smuzhiyun acpi_os_printf("\n");
138*4882a593Smuzhiyun }
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun acpi_ut_debug_dump_buffer(ACPI_CAST_PTR
141*4882a593Smuzhiyun (u8,
142*4882a593Smuzhiyun obj_desc->buffer.pointer),
143*4882a593Smuzhiyun obj_desc->buffer.length,
144*4882a593Smuzhiyun DB_BYTE_DISPLAY, _COMPONENT);
145*4882a593Smuzhiyun } else {
146*4882a593Smuzhiyun acpi_os_printf("\n");
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun break;
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun case ACPI_TYPE_PACKAGE:
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun acpi_os_printf("[Package] Contains %u Elements:\n",
153*4882a593Smuzhiyun obj_desc->package.count);
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun for (i = 0; i < obj_desc->package.count; i++) {
156*4882a593Smuzhiyun acpi_db_dump_external_object(&obj_desc->package.
157*4882a593Smuzhiyun elements[i], level + 1);
158*4882a593Smuzhiyun }
159*4882a593Smuzhiyun break;
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun case ACPI_TYPE_LOCAL_REFERENCE:
162*4882a593Smuzhiyun
163*4882a593Smuzhiyun acpi_os_printf("[Object Reference] = ");
164*4882a593Smuzhiyun acpi_db_display_internal_object(obj_desc->reference.handle,
165*4882a593Smuzhiyun NULL);
166*4882a593Smuzhiyun break;
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun case ACPI_TYPE_PROCESSOR:
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun acpi_os_printf("[Processor]\n");
171*4882a593Smuzhiyun break;
172*4882a593Smuzhiyun
173*4882a593Smuzhiyun case ACPI_TYPE_POWER:
174*4882a593Smuzhiyun
175*4882a593Smuzhiyun acpi_os_printf("[Power Resource]\n");
176*4882a593Smuzhiyun break;
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun default:
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun acpi_os_printf("[Unknown Type] %X\n", obj_desc->type);
181*4882a593Smuzhiyun break;
182*4882a593Smuzhiyun }
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun /*******************************************************************************
186*4882a593Smuzhiyun *
187*4882a593Smuzhiyun * FUNCTION: acpi_db_prep_namestring
188*4882a593Smuzhiyun *
189*4882a593Smuzhiyun * PARAMETERS: name - String to prepare
190*4882a593Smuzhiyun *
191*4882a593Smuzhiyun * RETURN: None
192*4882a593Smuzhiyun *
193*4882a593Smuzhiyun * DESCRIPTION: Translate all forward slashes and dots to backslashes.
194*4882a593Smuzhiyun *
195*4882a593Smuzhiyun ******************************************************************************/
196*4882a593Smuzhiyun
acpi_db_prep_namestring(char * name)197*4882a593Smuzhiyun void acpi_db_prep_namestring(char *name)
198*4882a593Smuzhiyun {
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun if (!name) {
201*4882a593Smuzhiyun return;
202*4882a593Smuzhiyun }
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun acpi_ut_strupr(name);
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun /* Convert a leading forward slash to a backslash */
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun if (*name == '/') {
209*4882a593Smuzhiyun *name = '\\';
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun /* Ignore a leading backslash, this is the root prefix */
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun if (ACPI_IS_ROOT_PREFIX(*name)) {
215*4882a593Smuzhiyun name++;
216*4882a593Smuzhiyun }
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun /* Convert all slash path separators to dots */
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun while (*name) {
221*4882a593Smuzhiyun if ((*name == '/') || (*name == '\\')) {
222*4882a593Smuzhiyun *name = '.';
223*4882a593Smuzhiyun }
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun name++;
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun /*******************************************************************************
230*4882a593Smuzhiyun *
231*4882a593Smuzhiyun * FUNCTION: acpi_db_local_ns_lookup
232*4882a593Smuzhiyun *
233*4882a593Smuzhiyun * PARAMETERS: name - Name to lookup
234*4882a593Smuzhiyun *
235*4882a593Smuzhiyun * RETURN: Pointer to a namespace node, null on failure
236*4882a593Smuzhiyun *
237*4882a593Smuzhiyun * DESCRIPTION: Lookup a name in the ACPI namespace
238*4882a593Smuzhiyun *
239*4882a593Smuzhiyun * Note: Currently begins search from the root. Could be enhanced to use
240*4882a593Smuzhiyun * the current prefix (scope) node as the search beginning point.
241*4882a593Smuzhiyun *
242*4882a593Smuzhiyun ******************************************************************************/
243*4882a593Smuzhiyun
acpi_db_local_ns_lookup(char * name)244*4882a593Smuzhiyun struct acpi_namespace_node *acpi_db_local_ns_lookup(char *name)
245*4882a593Smuzhiyun {
246*4882a593Smuzhiyun char *internal_path;
247*4882a593Smuzhiyun acpi_status status;
248*4882a593Smuzhiyun struct acpi_namespace_node *node = NULL;
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun acpi_db_prep_namestring(name);
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun /* Build an internal namestring */
253*4882a593Smuzhiyun
254*4882a593Smuzhiyun status = acpi_ns_internalize_name(name, &internal_path);
255*4882a593Smuzhiyun if (ACPI_FAILURE(status)) {
256*4882a593Smuzhiyun acpi_os_printf("Invalid namestring: %s\n", name);
257*4882a593Smuzhiyun return (NULL);
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun /*
261*4882a593Smuzhiyun * Lookup the name.
262*4882a593Smuzhiyun * (Uses root node as the search starting point)
263*4882a593Smuzhiyun */
264*4882a593Smuzhiyun status = acpi_ns_lookup(NULL, internal_path, ACPI_TYPE_ANY,
265*4882a593Smuzhiyun ACPI_IMODE_EXECUTE,
266*4882a593Smuzhiyun ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE,
267*4882a593Smuzhiyun NULL, &node);
268*4882a593Smuzhiyun if (ACPI_FAILURE(status)) {
269*4882a593Smuzhiyun acpi_os_printf("Could not locate name: %s, %s\n",
270*4882a593Smuzhiyun name, acpi_format_exception(status));
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun ACPI_FREE(internal_path);
274*4882a593Smuzhiyun return (node);
275*4882a593Smuzhiyun }
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun /*******************************************************************************
278*4882a593Smuzhiyun *
279*4882a593Smuzhiyun * FUNCTION: acpi_db_uint32_to_hex_string
280*4882a593Smuzhiyun *
281*4882a593Smuzhiyun * PARAMETERS: value - The value to be converted to string
282*4882a593Smuzhiyun * buffer - Buffer for result (not less than 11 bytes)
283*4882a593Smuzhiyun *
284*4882a593Smuzhiyun * RETURN: None
285*4882a593Smuzhiyun *
286*4882a593Smuzhiyun * DESCRIPTION: Convert the unsigned 32-bit value to the hexadecimal image
287*4882a593Smuzhiyun *
288*4882a593Smuzhiyun * NOTE: It is the caller's responsibility to ensure that the length of buffer
289*4882a593Smuzhiyun * is sufficient.
290*4882a593Smuzhiyun *
291*4882a593Smuzhiyun ******************************************************************************/
292*4882a593Smuzhiyun
acpi_db_uint32_to_hex_string(u32 value,char * buffer)293*4882a593Smuzhiyun void acpi_db_uint32_to_hex_string(u32 value, char *buffer)
294*4882a593Smuzhiyun {
295*4882a593Smuzhiyun int i;
296*4882a593Smuzhiyun
297*4882a593Smuzhiyun if (value == 0) {
298*4882a593Smuzhiyun strcpy(buffer, "0");
299*4882a593Smuzhiyun return;
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun buffer[8] = '\0';
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun for (i = 7; i >= 0; i--) {
305*4882a593Smuzhiyun buffer[i] = acpi_gbl_upper_hex_digits[value & 0x0F];
306*4882a593Smuzhiyun value = value >> 4;
307*4882a593Smuzhiyun }
308*4882a593Smuzhiyun }
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun #ifdef ACPI_OBSOLETE_FUNCTIONS
311*4882a593Smuzhiyun /*******************************************************************************
312*4882a593Smuzhiyun *
313*4882a593Smuzhiyun * FUNCTION: acpi_db_second_pass_parse
314*4882a593Smuzhiyun *
315*4882a593Smuzhiyun * PARAMETERS: root - Root of the parse tree
316*4882a593Smuzhiyun *
317*4882a593Smuzhiyun * RETURN: Status
318*4882a593Smuzhiyun *
319*4882a593Smuzhiyun * DESCRIPTION: Second pass parse of the ACPI tables. We need to wait until
320*4882a593Smuzhiyun * second pass to parse the control methods
321*4882a593Smuzhiyun *
322*4882a593Smuzhiyun ******************************************************************************/
323*4882a593Smuzhiyun
acpi_db_second_pass_parse(union acpi_parse_object * root)324*4882a593Smuzhiyun acpi_status acpi_db_second_pass_parse(union acpi_parse_object *root)
325*4882a593Smuzhiyun {
326*4882a593Smuzhiyun union acpi_parse_object *op = root;
327*4882a593Smuzhiyun union acpi_parse_object *method;
328*4882a593Smuzhiyun union acpi_parse_object *search_op;
329*4882a593Smuzhiyun union acpi_parse_object *start_op;
330*4882a593Smuzhiyun acpi_status status = AE_OK;
331*4882a593Smuzhiyun u32 base_aml_offset;
332*4882a593Smuzhiyun struct acpi_walk_state *walk_state;
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun ACPI_FUNCTION_ENTRY();
335*4882a593Smuzhiyun
336*4882a593Smuzhiyun acpi_os_printf("Pass two parse ....\n");
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun while (op) {
339*4882a593Smuzhiyun if (op->common.aml_opcode == AML_METHOD_OP) {
340*4882a593Smuzhiyun method = op;
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun /* Create a new walk state for the parse */
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun walk_state =
345*4882a593Smuzhiyun acpi_ds_create_walk_state(0, NULL, NULL, NULL);
346*4882a593Smuzhiyun if (!walk_state) {
347*4882a593Smuzhiyun return (AE_NO_MEMORY);
348*4882a593Smuzhiyun }
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun /* Init the Walk State */
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun walk_state->parser_state.aml =
353*4882a593Smuzhiyun walk_state->parser_state.aml_start =
354*4882a593Smuzhiyun method->named.data;
355*4882a593Smuzhiyun walk_state->parser_state.aml_end =
356*4882a593Smuzhiyun walk_state->parser_state.pkg_end =
357*4882a593Smuzhiyun method->named.data + method->named.length;
358*4882a593Smuzhiyun walk_state->parser_state.start_scope = op;
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun walk_state->descending_callback =
361*4882a593Smuzhiyun acpi_ds_load1_begin_op;
362*4882a593Smuzhiyun walk_state->ascending_callback = acpi_ds_load1_end_op;
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun /* Perform the AML parse */
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun status = acpi_ps_parse_aml(walk_state);
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun base_aml_offset =
369*4882a593Smuzhiyun (method->common.value.arg)->common.aml_offset + 1;
370*4882a593Smuzhiyun start_op = (method->common.value.arg)->common.next;
371*4882a593Smuzhiyun search_op = start_op;
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun while (search_op) {
374*4882a593Smuzhiyun search_op->common.aml_offset += base_aml_offset;
375*4882a593Smuzhiyun search_op =
376*4882a593Smuzhiyun acpi_ps_get_depth_next(start_op, search_op);
377*4882a593Smuzhiyun }
378*4882a593Smuzhiyun }
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun if (op->common.aml_opcode == AML_REGION_OP) {
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun /* TBD: [Investigate] this isn't quite the right thing to do! */
383*4882a593Smuzhiyun /*
384*4882a593Smuzhiyun *
385*4882a593Smuzhiyun * Method = (ACPI_DEFERRED_OP *) Op;
386*4882a593Smuzhiyun * Status = acpi_ps_parse_aml (Op, Method->Body, Method->body_length);
387*4882a593Smuzhiyun */
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun if (ACPI_FAILURE(status)) {
391*4882a593Smuzhiyun break;
392*4882a593Smuzhiyun }
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun op = acpi_ps_get_depth_next(root, op);
395*4882a593Smuzhiyun }
396*4882a593Smuzhiyun
397*4882a593Smuzhiyun return (status);
398*4882a593Smuzhiyun }
399*4882a593Smuzhiyun
400*4882a593Smuzhiyun /*******************************************************************************
401*4882a593Smuzhiyun *
402*4882a593Smuzhiyun * FUNCTION: acpi_db_dump_buffer
403*4882a593Smuzhiyun *
404*4882a593Smuzhiyun * PARAMETERS: address - Pointer to the buffer
405*4882a593Smuzhiyun *
406*4882a593Smuzhiyun * RETURN: None
407*4882a593Smuzhiyun *
408*4882a593Smuzhiyun * DESCRIPTION: Print a portion of a buffer
409*4882a593Smuzhiyun *
410*4882a593Smuzhiyun ******************************************************************************/
411*4882a593Smuzhiyun
acpi_db_dump_buffer(u32 address)412*4882a593Smuzhiyun void acpi_db_dump_buffer(u32 address)
413*4882a593Smuzhiyun {
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun acpi_os_printf("\nLocation %X:\n", address);
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun acpi_dbg_level |= ACPI_LV_TABLES;
418*4882a593Smuzhiyun acpi_ut_debug_dump_buffer(ACPI_TO_POINTER(address), 64, DB_BYTE_DISPLAY,
419*4882a593Smuzhiyun ACPI_UINT32_MAX);
420*4882a593Smuzhiyun }
421*4882a593Smuzhiyun #endif
422