void acpi_db_method_thread ( void *context) { acpi_status status; db_method_info *info = context; u32 i; acpi_buffer return_obj; for (i = 0; i < info->num_loops; i++) { status = acpi_db_execute_method (info, &return_obj); if (ACPI_SUCCESS (status)) { if (return_obj.length) { acpi_os_printf ("Execution of %s returned object %p Buflen %X\n", info->pathname, return_obj.pointer, return_obj.length); acpi_db_dump_object (return_obj.pointer, 1); } } } /* Signal our completion */ acpi_os_signal_semaphore (info->thread_gate, 1); }
void acpi_db_dump_object ( acpi_object *obj_desc, u32 level) { u32 i; if (!obj_desc) { acpi_os_printf ("[Null Object]\n"); return; } for (i = 0; i < level; i++) { acpi_os_printf (" "); } switch (obj_desc->type) { case ACPI_TYPE_ANY: acpi_os_printf ("[Object Reference] = %p\n", obj_desc->reference.handle); break; case ACPI_TYPE_INTEGER: acpi_os_printf ("[Integer] = %8.8X%8.8X\n", HIDWORD (obj_desc->integer.value), LODWORD (obj_desc->integer.value)); break; case ACPI_TYPE_STRING: acpi_os_printf ("[String] Value: "); for (i = 0; i < obj_desc->string.length; i++) { acpi_os_printf ("%c", obj_desc->string.pointer[i]); } acpi_os_printf ("\n"); break; case ACPI_TYPE_BUFFER: acpi_os_printf ("[Buffer] = "); acpi_ut_dump_buffer ((u8 *) obj_desc->buffer.pointer, obj_desc->buffer.length, DB_DWORD_DISPLAY, _COMPONENT); break; case ACPI_TYPE_PACKAGE: acpi_os_printf ("[Package] Contains %d Elements: \n", obj_desc->package.count); for (i = 0; i < obj_desc->package.count; i++) { acpi_db_dump_object (&obj_desc->package.elements[i], level+1); } break; case INTERNAL_TYPE_REFERENCE: acpi_os_printf ("[Object Reference] = %p\n", obj_desc->reference.handle); break; case ACPI_TYPE_PROCESSOR: acpi_os_printf ("[Processor]\n"); break; case ACPI_TYPE_POWER: acpi_os_printf ("[Power Resource]\n"); break; default: acpi_os_printf ("[Unknown Type] %X \n", obj_desc->type); break; } }
void acpi_db_execute ( NATIVE_CHAR *name, NATIVE_CHAR **args, u32 flags) { acpi_status status; acpi_buffer return_obj; #ifdef ACPI_DEBUG u32 previous_allocations; u32 allocations; /* Memory allocation tracking */ previous_allocations = acpi_db_get_outstanding_allocations (); #endif acpi_gbl_db_method_info.name = name; acpi_gbl_db_method_info.args = args; acpi_gbl_db_method_info.flags = flags; acpi_db_execute_setup (&acpi_gbl_db_method_info); status = acpi_db_execute_method (&acpi_gbl_db_method_info, &return_obj); /* * Allow any handlers in separate threads to complete. * (Such as Notify handlers invoked from AML executed above). */ acpi_os_sleep (0, 10); #ifdef ACPI_DEBUG /* Memory allocation tracking */ allocations = acpi_db_get_outstanding_allocations () - previous_allocations; acpi_db_set_output_destination (DB_DUPLICATE_OUTPUT); if (allocations > 0) { acpi_os_printf ("Outstanding: %ld allocations after execution\n", allocations); } #endif if (ACPI_FAILURE (status)) { acpi_os_printf ("Execution of %s failed with status %s\n", acpi_gbl_db_method_info.pathname, acpi_format_exception (status)); } else { /* Display a return object, if any */ if (return_obj.length) { acpi_os_printf ("Execution of %s returned object %p Buflen %X\n", acpi_gbl_db_method_info.pathname, return_obj.pointer, return_obj.length); acpi_db_dump_object (return_obj.pointer, 1); } } acpi_db_set_output_destination (DB_CONSOLE_OUTPUT); }