Commit 255a60fc authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

Merge branch 'acpica'

* acpica:
  ACPICA / Interpreter: Fix a regression triggered because of wrong Linux ECDT support
  ACPICA: Utilities: Update trace mechinism for acquire_object
  ACPICA: Namespace: Rename acpi_gbl_reg_methods_enabled to acpi_gbl_namespace_initialized
  ACPICA: Namespace: Ensure \_SB._INI executed before any _REG
  ACPICA: ACPICA: Tune _REG evaluations order in the initialization steps
  ACPICA: Tables: make default region accessible during the table load
  ACPICA: ACPI 6.0/iASL: Add support for the External AML opcode
  ACPICA: Remove unnecessary arguments to ACPI_INFO
  ACPICA: debugger: dbconvert: free pld_info on error return path
  ACPICA: iASL: Update to use internal acpi_ut_strtoul64 function
  ACPICA: iASL: Fix some typos with the name strtoul64
  ACPICA: Remove incorrect "static" from a global structure
  ACPICA: aclocal: Put parens around some definitions.
parents b562e44f 5508df89
...@@ -165,7 +165,7 @@ ACPI_GLOBAL(u8, acpi_gbl_next_owner_id_offset); ...@@ -165,7 +165,7 @@ ACPI_GLOBAL(u8, acpi_gbl_next_owner_id_offset);
/* Initialization sequencing */ /* Initialization sequencing */
ACPI_INIT_GLOBAL(u8, acpi_gbl_reg_methods_enabled, FALSE); ACPI_INIT_GLOBAL(u8, acpi_gbl_namespace_initialized, FALSE);
/* Misc */ /* Misc */
......
...@@ -85,7 +85,7 @@ union acpi_parse_object; ...@@ -85,7 +85,7 @@ union acpi_parse_object;
#define ACPI_MTX_MEMORY 5 /* Debug memory tracking lists */ #define ACPI_MTX_MEMORY 5 /* Debug memory tracking lists */
#define ACPI_MAX_MUTEX 5 #define ACPI_MAX_MUTEX 5
#define ACPI_NUM_MUTEX ACPI_MAX_MUTEX+1 #define ACPI_NUM_MUTEX (ACPI_MAX_MUTEX+1)
/* Lock structure for reader/writer interfaces */ /* Lock structure for reader/writer interfaces */
...@@ -103,11 +103,11 @@ struct acpi_rw_lock { ...@@ -103,11 +103,11 @@ struct acpi_rw_lock {
#define ACPI_LOCK_HARDWARE 1 #define ACPI_LOCK_HARDWARE 1
#define ACPI_MAX_LOCK 1 #define ACPI_MAX_LOCK 1
#define ACPI_NUM_LOCK ACPI_MAX_LOCK+1 #define ACPI_NUM_LOCK (ACPI_MAX_LOCK+1)
/* This Thread ID means that the mutex is not in use (unlocked) */ /* This Thread ID means that the mutex is not in use (unlocked) */
#define ACPI_MUTEX_NOT_ACQUIRED (acpi_thread_id) 0 #define ACPI_MUTEX_NOT_ACQUIRED ((acpi_thread_id) 0)
/* This Thread ID means an invalid thread ID */ /* This Thread ID means an invalid thread ID */
......
...@@ -88,7 +88,7 @@ ...@@ -88,7 +88,7 @@
*/ */
acpi_status acpi_ns_initialize_objects(void); acpi_status acpi_ns_initialize_objects(void);
acpi_status acpi_ns_initialize_devices(void); acpi_status acpi_ns_initialize_devices(u32 flags);
/* /*
* nsload - Namespace loading * nsload - Namespace loading
......
...@@ -1125,7 +1125,7 @@ const union acpi_predefined_info acpi_gbl_resource_names[] = { ...@@ -1125,7 +1125,7 @@ const union acpi_predefined_info acpi_gbl_resource_names[] = {
PACKAGE_INFO(0, 0, 0, 0, 0, 0) /* Table terminator */ PACKAGE_INFO(0, 0, 0, 0, 0, 0) /* Table terminator */
}; };
static const union acpi_predefined_info acpi_gbl_scope_names[] = { const union acpi_predefined_info acpi_gbl_scope_names[] = {
{{"_GPE", 0, 0}}, {{"_GPE", 0, 0}},
{{"_PR_", 0, 0}}, {{"_PR_", 0, 0}},
{{"_SB_", 0, 0}}, {{"_SB_", 0, 0}},
......
...@@ -348,7 +348,7 @@ void acpi_db_display_table_info(char *table_arg) ...@@ -348,7 +348,7 @@ void acpi_db_display_table_info(char *table_arg)
} else { } else {
/* If the pointer is null, the table has been unloaded */ /* If the pointer is null, the table has been unloaded */
ACPI_INFO((AE_INFO, "%4.4s - Table has been unloaded", ACPI_INFO(("%4.4s - Table has been unloaded",
table_desc->signature.ascii)); table_desc->signature.ascii));
} }
} }
......
...@@ -408,7 +408,7 @@ void acpi_db_dump_pld_buffer(union acpi_object *obj_desc) ...@@ -408,7 +408,7 @@ void acpi_db_dump_pld_buffer(union acpi_object *obj_desc)
new_buffer = acpi_db_encode_pld_buffer(pld_info); new_buffer = acpi_db_encode_pld_buffer(pld_info);
if (!new_buffer) { if (!new_buffer) {
return; goto exit;
} }
/* The two bit-packed buffers should match */ /* The two bit-packed buffers should match */
...@@ -479,6 +479,7 @@ void acpi_db_dump_pld_buffer(union acpi_object *obj_desc) ...@@ -479,6 +479,7 @@ void acpi_db_dump_pld_buffer(union acpi_object *obj_desc)
pld_info->horizontal_offset); pld_info->horizontal_offset);
} }
ACPI_FREE(pld_info);
ACPI_FREE(new_buffer); ACPI_FREE(new_buffer);
exit:
ACPI_FREE(pld_info);
} }
...@@ -809,8 +809,7 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc, ...@@ -809,8 +809,7 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
if (method_desc->method. if (method_desc->method.
info_flags & ACPI_METHOD_SERIALIZED_PENDING) { info_flags & ACPI_METHOD_SERIALIZED_PENDING) {
if (walk_state) { if (walk_state) {
ACPI_INFO((AE_INFO, ACPI_INFO(("Marking method %4.4s as Serialized "
"Marking method %4.4s as Serialized "
"because of AE_ALREADY_EXISTS error", "because of AE_ALREADY_EXISTS error",
walk_state->method_node->name. walk_state->method_node->name.
ascii)); ascii));
......
...@@ -524,8 +524,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state, ...@@ -524,8 +524,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
arg = arg->common.next; arg = arg->common.next;
} }
ACPI_INFO((AE_INFO, ACPI_INFO(("Actual Package length (%u) is larger than "
"Actual Package length (%u) is larger than "
"NumElements field (%u), truncated", "NumElements field (%u), truncated",
i, element_count)); i, element_count));
} else if (i < element_count) { } else if (i < element_count) {
......
...@@ -499,8 +499,7 @@ acpi_ev_initialize_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, ...@@ -499,8 +499,7 @@ acpi_ev_initialize_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
} }
if (gpe_enabled_count) { if (gpe_enabled_count) {
ACPI_INFO((AE_INFO, ACPI_INFO(("Enabled %u GPEs in block %02X to %02X",
"Enabled %u GPEs in block %02X to %02X",
gpe_enabled_count, (u32)gpe_block->block_base_number, gpe_enabled_count, (u32)gpe_block->block_base_number,
(u32)(gpe_block->block_base_number + (u32)(gpe_block->block_base_number +
(gpe_block->gpe_count - 1)))); (gpe_block->gpe_count - 1))));
......
...@@ -281,7 +281,7 @@ void acpi_ev_update_gpes(acpi_owner_id table_owner_id) ...@@ -281,7 +281,7 @@ void acpi_ev_update_gpes(acpi_owner_id table_owner_id)
} }
if (walk_info.count) { if (walk_info.count) {
ACPI_INFO((AE_INFO, "Enabled %u new GPEs", walk_info.count)); ACPI_INFO(("Enabled %u new GPEs", walk_info.count));
} }
(void)acpi_ut_release_mutex(ACPI_MTX_EVENTS); (void)acpi_ut_release_mutex(ACPI_MTX_EVENTS);
......
...@@ -600,7 +600,7 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function) ...@@ -600,7 +600,7 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
if (region_obj2->extra.method_REG == NULL || if (region_obj2->extra.method_REG == NULL ||
region_obj->region.handler == NULL || region_obj->region.handler == NULL ||
!acpi_gbl_reg_methods_enabled) { !acpi_gbl_namespace_initialized) {
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
......
...@@ -252,7 +252,7 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state, ...@@ -252,7 +252,7 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
status = acpi_get_table_by_index(table_index, &table); status = acpi_get_table_by_index(table_index, &table);
if (ACPI_SUCCESS(status)) { if (ACPI_SUCCESS(status)) {
ACPI_INFO((AE_INFO, "Dynamic OEM Table Load:")); ACPI_INFO(("Dynamic OEM Table Load:"));
acpi_tb_print_table_header(0, table); acpi_tb_print_table_header(0, table);
} }
...@@ -472,7 +472,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc, ...@@ -472,7 +472,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
/* Install the new table into the local data structures */ /* Install the new table into the local data structures */
ACPI_INFO((AE_INFO, "Dynamic OEM Table Load:")); ACPI_INFO(("Dynamic OEM Table Load:"));
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
status = acpi_tb_install_standard_table(ACPI_PTR_TO_PHYSADDR(table), status = acpi_tb_install_standard_table(ACPI_PTR_TO_PHYSADDR(table),
......
...@@ -123,8 +123,10 @@ acpi_status acpi_ex_opcode_3A_0T_0R(struct acpi_walk_state *walk_state) ...@@ -123,8 +123,10 @@ acpi_status acpi_ex_opcode_3A_0T_0R(struct acpi_walk_state *walk_state)
* op is intended for use by disassemblers in order to properly * op is intended for use by disassemblers in order to properly
* disassemble control method invocations. The opcode or group of * disassemble control method invocations. The opcode or group of
* opcodes should be surrounded by an "if (0)" clause to ensure that * opcodes should be surrounded by an "if (0)" clause to ensure that
* AML interpreters never see the opcode. * AML interpreters never see the opcode. Thus, something is
* wrong if an external opcode ever gets here.
*/ */
ACPI_ERROR((AE_INFO, "Executed External Op"));
status = AE_OK; status = AE_OK;
goto cleanup; goto cleanup;
......
...@@ -378,8 +378,7 @@ void acpi_ns_exec_module_code_list(void) ...@@ -378,8 +378,7 @@ void acpi_ns_exec_module_code_list(void)
acpi_ut_remove_reference(prev); acpi_ut_remove_reference(prev);
} }
ACPI_INFO((AE_INFO, ACPI_INFO(("Executed %u blocks of module-level executable AML code",
"Executed %u blocks of module-level executable AML code",
method_count)); method_count));
ACPI_FREE(info); ACPI_FREE(info);
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#include "acnamesp.h" #include "acnamesp.h"
#include "acdispat.h" #include "acdispat.h"
#include "acinterp.h" #include "acinterp.h"
#include "acevents.h"
#define _COMPONENT ACPI_NAMESPACE #define _COMPONENT ACPI_NAMESPACE
ACPI_MODULE_NAME("nsinit") ACPI_MODULE_NAME("nsinit")
...@@ -83,6 +84,8 @@ acpi_status acpi_ns_initialize_objects(void) ...@@ -83,6 +84,8 @@ acpi_status acpi_ns_initialize_objects(void)
ACPI_FUNCTION_TRACE(ns_initialize_objects); ACPI_FUNCTION_TRACE(ns_initialize_objects);
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"[Init] Completing Initialization of ACPI Objects\n"));
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"**** Starting initialization of namespace objects ****\n")); "**** Starting initialization of namespace objects ****\n"));
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
...@@ -133,82 +136,108 @@ acpi_status acpi_ns_initialize_objects(void) ...@@ -133,82 +136,108 @@ acpi_status acpi_ns_initialize_objects(void)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_ns_initialize_devices(void) acpi_status acpi_ns_initialize_devices(u32 flags)
{ {
acpi_status status; acpi_status status = AE_OK;
struct acpi_device_walk_info info; struct acpi_device_walk_info info;
ACPI_FUNCTION_TRACE(ns_initialize_devices); ACPI_FUNCTION_TRACE(ns_initialize_devices);
/* Init counters */ if (!(flags & ACPI_NO_DEVICE_INIT)) {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"[Init] Initializing ACPI Devices\n"));
info.device_count = 0; /* Init counters */
info.num_STA = 0;
info.num_INI = 0;
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, info.device_count = 0;
"Initializing Device/Processor/Thermal objects " info.num_STA = 0;
"and executing _INI/_STA methods:\n")); info.num_INI = 0;
/* Tree analysis: find all subtrees that contain _INI methods */ ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
"Initializing Device/Processor/Thermal objects "
"and executing _INI/_STA methods:\n"));
status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, /* Tree analysis: find all subtrees that contain _INI methods */
ACPI_UINT32_MAX, FALSE,
acpi_ns_find_ini_methods, NULL, &info, status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
NULL); ACPI_UINT32_MAX, FALSE,
if (ACPI_FAILURE(status)) { acpi_ns_find_ini_methods, NULL,
goto error_exit; &info, NULL);
} if (ACPI_FAILURE(status)) {
goto error_exit;
}
/* Allocate the evaluation information block */
/* Allocate the evaluation information block */ info.evaluate_info =
ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
if (!info.evaluate_info) {
status = AE_NO_MEMORY;
goto error_exit;
}
info.evaluate_info = /*
ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info)); * Execute the "global" _INI method that may appear at the root.
if (!info.evaluate_info) { * This support is provided for Windows compatibility (Vista+) and
status = AE_NO_MEMORY; * is not part of the ACPI specification.
goto error_exit; */
info.evaluate_info->prefix_node = acpi_gbl_root_node;
info.evaluate_info->relative_pathname = METHOD_NAME__INI;
info.evaluate_info->parameters = NULL;
info.evaluate_info->flags = ACPI_IGNORE_RETURN_VALUE;
status = acpi_ns_evaluate(info.evaluate_info);
if (ACPI_SUCCESS(status)) {
info.num_INI++;
}
} }
/* /*
* Execute the "global" _INI method that may appear at the root. This * Run all _REG methods
* support is provided for Windows compatibility (Vista+) and is not *
* part of the ACPI specification. * Note: Any objects accessed by the _REG methods will be automatically
* initialized, even if they contain executable AML (see the call to
* acpi_ns_initialize_objects below).
*/ */
info.evaluate_info->prefix_node = acpi_gbl_root_node; if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
info.evaluate_info->relative_pathname = METHOD_NAME__INI; ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
info.evaluate_info->parameters = NULL; "[Init] Executing _REG OpRegion methods\n"));
info.evaluate_info->flags = ACPI_IGNORE_RETURN_VALUE;
status = acpi_ns_evaluate(info.evaluate_info); status = acpi_ev_initialize_op_regions();
if (ACPI_SUCCESS(status)) { if (ACPI_FAILURE(status)) {
info.num_INI++; goto error_exit;
}
} }
/* Walk namespace to execute all _INIs on present devices */ if (!(flags & ACPI_NO_DEVICE_INIT)) {
status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, /* Walk namespace to execute all _INIs on present devices */
ACPI_UINT32_MAX, FALSE,
acpi_ns_init_one_device, NULL, &info,
NULL);
/* status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
* Any _OSI requests should be completed by now. If the BIOS has ACPI_UINT32_MAX, FALSE,
* requested any Windows OSI strings, we will always truncate acpi_ns_init_one_device, NULL,
* I/O addresses to 16 bits -- for Windows compatibility. &info, NULL);
*/
if (acpi_gbl_osi_data >= ACPI_OSI_WIN_2000) {
acpi_gbl_truncate_io_addresses = TRUE;
}
ACPI_FREE(info.evaluate_info); /*
if (ACPI_FAILURE(status)) { * Any _OSI requests should be completed by now. If the BIOS has
goto error_exit; * requested any Windows OSI strings, we will always truncate
} * I/O addresses to 16 bits -- for Windows compatibility.
*/
if (acpi_gbl_osi_data >= ACPI_OSI_WIN_2000) {
acpi_gbl_truncate_io_addresses = TRUE;
}
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, ACPI_FREE(info.evaluate_info);
" Executed %u _INI methods requiring %u _STA executions " if (ACPI_FAILURE(status)) {
"(examined %u objects)\n", goto error_exit;
info.num_INI, info.num_STA, info.device_count)); }
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
" Executed %u _INI methods requiring %u _STA executions "
"(examined %u objects)\n",
info.num_INI, info.num_STA,
info.device_count));
}
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
......
...@@ -267,8 +267,7 @@ acpi_tb_install_standard_table(acpi_physical_address address, ...@@ -267,8 +267,7 @@ acpi_tb_install_standard_table(acpi_physical_address address,
if (!reload && if (!reload &&
acpi_gbl_disable_ssdt_table_install && acpi_gbl_disable_ssdt_table_install &&
ACPI_COMPARE_NAME(&new_table_desc.signature, ACPI_SIG_SSDT)) { ACPI_COMPARE_NAME(&new_table_desc.signature, ACPI_SIG_SSDT)) {
ACPI_INFO((AE_INFO, ACPI_INFO(("Ignoring installation of %4.4s at %8.8X%8.8X",
"Ignoring installation of %4.4s at %8.8X%8.8X",
new_table_desc.signature.ascii, new_table_desc.signature.ascii,
ACPI_FORMAT_UINT64(address))); ACPI_FORMAT_UINT64(address)));
goto release_and_exit; goto release_and_exit;
...@@ -432,7 +431,7 @@ void acpi_tb_override_table(struct acpi_table_desc *old_table_desc) ...@@ -432,7 +431,7 @@ void acpi_tb_override_table(struct acpi_table_desc *old_table_desc)
return; return;
} }
ACPI_INFO((AE_INFO, "%4.4s 0x%8.8X%8.8X" ACPI_INFO(("%4.4s 0x%8.8X%8.8X"
" %s table override, new table: 0x%8.8X%8.8X", " %s table override, new table: 0x%8.8X%8.8X",
old_table_desc->signature.ascii, old_table_desc->signature.ascii,
ACPI_FORMAT_UINT64(old_table_desc->address), ACPI_FORMAT_UINT64(old_table_desc->address),
......
...@@ -132,7 +132,7 @@ acpi_tb_print_table_header(acpi_physical_address address, ...@@ -132,7 +132,7 @@ acpi_tb_print_table_header(acpi_physical_address address,
/* FACS only has signature and length fields */ /* FACS only has signature and length fields */
ACPI_INFO((AE_INFO, "%-4.4s 0x%8.8X%8.8X %06X", ACPI_INFO(("%-4.4s 0x%8.8X%8.8X %06X",
header->signature, ACPI_FORMAT_UINT64(address), header->signature, ACPI_FORMAT_UINT64(address),
header->length)); header->length));
} else if (ACPI_VALIDATE_RSDP_SIG(header->signature)) { } else if (ACPI_VALIDATE_RSDP_SIG(header->signature)) {
...@@ -144,7 +144,7 @@ acpi_tb_print_table_header(acpi_physical_address address, ...@@ -144,7 +144,7 @@ acpi_tb_print_table_header(acpi_physical_address address,
ACPI_OEM_ID_SIZE); ACPI_OEM_ID_SIZE);
acpi_tb_fix_string(local_header.oem_id, ACPI_OEM_ID_SIZE); acpi_tb_fix_string(local_header.oem_id, ACPI_OEM_ID_SIZE);
ACPI_INFO((AE_INFO, "RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)", ACPI_INFO(("RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)",
ACPI_FORMAT_UINT64(address), ACPI_FORMAT_UINT64(address),
(ACPI_CAST_PTR(struct acpi_table_rsdp, header)-> (ACPI_CAST_PTR(struct acpi_table_rsdp, header)->
revision > revision >
...@@ -158,8 +158,7 @@ acpi_tb_print_table_header(acpi_physical_address address, ...@@ -158,8 +158,7 @@ acpi_tb_print_table_header(acpi_physical_address address,
acpi_tb_cleanup_table_header(&local_header, header); acpi_tb_cleanup_table_header(&local_header, header);
ACPI_INFO((AE_INFO, ACPI_INFO(("%-4.4s 0x%8.8X%8.8X"
"%-4.4s 0x%8.8X%8.8X"
" %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)", " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)",
local_header.signature, ACPI_FORMAT_UINT64(address), local_header.signature, ACPI_FORMAT_UINT64(address),
local_header.length, local_header.revision, local_header.length, local_header.revision,
......
...@@ -174,9 +174,7 @@ struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index) ...@@ -174,9 +174,7 @@ struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index)
ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL, ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL,
new_table); new_table);
ACPI_INFO((AE_INFO, ACPI_INFO(("Forced DSDT copy: length 0x%05X copied locally, original unmapped", new_table->length));
"Forced DSDT copy: length 0x%05X copied locally, original unmapped",
new_table->length));
return (new_table); return (new_table);
} }
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#include "accommon.h" #include "accommon.h"
#include "acnamesp.h" #include "acnamesp.h"
#include "actables.h" #include "actables.h"
#include "acevents.h"
#define _COMPONENT ACPI_TABLES #define _COMPONENT ACPI_TABLES
ACPI_MODULE_NAME("tbxfload") ACPI_MODULE_NAME("tbxfload")
...@@ -68,6 +69,25 @@ acpi_status __init acpi_load_tables(void) ...@@ -68,6 +69,25 @@ acpi_status __init acpi_load_tables(void)
ACPI_FUNCTION_TRACE(acpi_load_tables); ACPI_FUNCTION_TRACE(acpi_load_tables);
/*
* Install the default operation region handlers. These are the
* handlers that are defined by the ACPI specification to be
* "always accessible" -- namely, system_memory, system_IO, and
* PCI_Config. This also means that no _REG methods need to be
* run for these address spaces. We need to have these handlers
* installed before any AML code can be executed, especially any
* module-level code (11/2015).
* Note that we allow OSPMs to install their own region handlers
* between acpi_initialize_subsystem() and acpi_load_tables() to use
* their customized default region handlers.
*/
status = acpi_ev_install_region_handlers();
if (ACPI_FAILURE(status) && status != AE_ALREADY_EXISTS) {
ACPI_EXCEPTION((AE_INFO, status,
"During Region initialization"));
return_ACPI_STATUS(status);
}
/* Load the namespace from the tables */ /* Load the namespace from the tables */
status = acpi_tb_load_namespace(); status = acpi_tb_load_namespace();
...@@ -83,6 +103,20 @@ acpi_status __init acpi_load_tables(void) ...@@ -83,6 +103,20 @@ acpi_status __init acpi_load_tables(void)
"While loading namespace from ACPI tables")); "While loading namespace from ACPI tables"));
} }
if (!acpi_gbl_group_module_level_code) {
/*
* Initialize the objects that remain uninitialized. This
* runs the executable AML that may be part of the
* declaration of these objects:
* operation_regions, buffer_fields, Buffers, and Packages.
*/
status = acpi_ns_initialize_objects();
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
}
acpi_gbl_namespace_initialized = TRUE;
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
...@@ -206,9 +240,7 @@ acpi_status acpi_tb_load_namespace(void) ...@@ -206,9 +240,7 @@ acpi_status acpi_tb_load_namespace(void)
} }
if (!tables_failed) { if (!tables_failed) {
ACPI_INFO((AE_INFO, ACPI_INFO(("%u ACPI AML tables successfully acquired and loaded\n", tables_loaded));
"%u ACPI AML tables successfully acquired and loaded\n",
tables_loaded));
} else { } else {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"%u table load failures, %u successful", "%u table load failures, %u successful",
...@@ -301,7 +333,7 @@ acpi_status acpi_load_table(struct acpi_table_header *table) ...@@ -301,7 +333,7 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
/* Install the table and load it into the namespace */ /* Install the table and load it into the namespace */
ACPI_INFO((AE_INFO, "Host-directed Dynamic ACPI Table Load:")); ACPI_INFO(("Host-directed Dynamic ACPI Table Load:"));
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES); (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
status = acpi_tb_install_standard_table(ACPI_PTR_TO_PHYSADDR(table), status = acpi_tb_install_standard_table(ACPI_PTR_TO_PHYSADDR(table),
......
...@@ -245,7 +245,7 @@ void *acpi_os_acquire_object(struct acpi_memory_list *cache) ...@@ -245,7 +245,7 @@ void *acpi_os_acquire_object(struct acpi_memory_list *cache)
acpi_status status; acpi_status status;
void *object; void *object;
ACPI_FUNCTION_NAME(os_acquire_object); ACPI_FUNCTION_TRACE(os_acquire_object);
if (!cache) { if (!cache) {
return_PTR(NULL); return_PTR(NULL);
......
...@@ -140,6 +140,67 @@ int acpi_ut_stricmp(char *string1, char *string2) ...@@ -140,6 +140,67 @@ int acpi_ut_stricmp(char *string1, char *string2)
return (c1 - c2); return (c1 - c2);
} }
#if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION)
/*******************************************************************************
*
* FUNCTION: acpi_ut_safe_strcpy, acpi_ut_safe_strcat, acpi_ut_safe_strncat
*
* PARAMETERS: Adds a "DestSize" parameter to each of the standard string
* functions. This is the size of the Destination buffer.
*
* RETURN: TRUE if the operation would overflow the destination buffer.
*
* DESCRIPTION: Safe versions of standard Clib string functions. Ensure that
* the result of the operation will not overflow the output string
* buffer.
*
* NOTE: These functions are typically only helpful for processing
* user input and command lines. For most ACPICA code, the
* required buffer length is precisely calculated before buffer
* allocation, so the use of these functions is unnecessary.
*
******************************************************************************/
u8 acpi_ut_safe_strcpy(char *dest, acpi_size dest_size, char *source)
{
if (strlen(source) >= dest_size) {
return (TRUE);
}
strcpy(dest, source);
return (FALSE);
}
u8 acpi_ut_safe_strcat(char *dest, acpi_size dest_size, char *source)
{
if ((strlen(dest) + strlen(source)) >= dest_size) {
return (TRUE);
}
strcat(dest, source);
return (FALSE);
}
u8
acpi_ut_safe_strncat(char *dest,
acpi_size dest_size,
char *source, acpi_size max_transfer_length)
{
acpi_size actual_transfer_length;
actual_transfer_length = ACPI_MIN(max_transfer_length, strlen(source));
if ((strlen(dest) + actual_transfer_length) >= dest_size) {
return (TRUE);
}
strncat(dest, source, max_transfer_length);
return (FALSE);
}
#endif
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ut_strtoul64 * FUNCTION: acpi_ut_strtoul64
...@@ -155,7 +216,15 @@ int acpi_ut_stricmp(char *string1, char *string2) ...@@ -155,7 +216,15 @@ int acpi_ut_stricmp(char *string1, char *string2)
* 32-bit or 64-bit conversion, depending on the current mode * 32-bit or 64-bit conversion, depending on the current mode
* of the interpreter. * of the interpreter.
* *
* NOTE: Does not support Octal strings, not needed. * NOTES: acpi_gbl_integer_byte_width should be set to the proper width.
* For the core ACPICA code, this width depends on the DSDT
* version. For iASL, the default byte width is always 8.
*
* Does not support Octal strings, not needed at this time.
*
* There is an earlier version of the function after this one,
* below. It is slightly different than this one, and the two
* may eventually may need to be merged. (01/2016).
* *
******************************************************************************/ ******************************************************************************/
...@@ -171,7 +240,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer) ...@@ -171,7 +240,7 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
u8 sign_of0x = 0; u8 sign_of0x = 0;
u8 term = 0; u8 term = 0;
ACPI_FUNCTION_TRACE_STR(ut_stroul64, string); ACPI_FUNCTION_TRACE_STR(ut_strtoul64, string);
switch (base) { switch (base) {
case ACPI_ANY_BASE: case ACPI_ANY_BASE:
...@@ -318,63 +387,162 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer) ...@@ -318,63 +387,162 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
} }
} }
#if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION) #ifdef _OBSOLETE_FUNCTIONS
/* TBD: use version in ACPICA main code base? */
/* DONE: 01/2016 */
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ut_safe_strcpy, acpi_ut_safe_strcat, acpi_ut_safe_strncat * FUNCTION: strtoul64
* *
* PARAMETERS: Adds a "DestSize" parameter to each of the standard string * PARAMETERS: string - Null terminated string
* functions. This is the size of the Destination buffer. * terminater - Where a pointer to the terminating byte
* is returned
* base - Radix of the string
* *
* RETURN: TRUE if the operation would overflow the destination buffer. * RETURN: Converted value
* *
* DESCRIPTION: Safe versions of standard Clib string functions. Ensure that * DESCRIPTION: Convert a string into an unsigned value.
* the result of the operation will not overflow the output string
* buffer.
*
* NOTE: These functions are typically only helpful for processing
* user input and command lines. For most ACPICA code, the
* required buffer length is precisely calculated before buffer
* allocation, so the use of these functions is unnecessary.
* *
******************************************************************************/ ******************************************************************************/
u8 acpi_ut_safe_strcpy(char *dest, acpi_size dest_size, char *source) acpi_status strtoul64(char *string, u32 base, u64 *ret_integer)
{ {
u32 index;
u32 sign;
u64 return_value = 0;
acpi_status status = AE_OK;
if (strlen(source) >= dest_size) { *ret_integer = 0;
return (TRUE);
switch (base) {
case 0:
case 8:
case 10:
case 16:
break;
default:
/*
* The specified Base parameter is not in the domain of
* this function:
*/
return (AE_BAD_PARAMETER);
} }
strcpy(dest, source); /* Skip over any white space in the buffer: */
return (FALSE);
}
u8 acpi_ut_safe_strcat(char *dest, acpi_size dest_size, char *source) while (isspace((int)*string) || *string == '\t') {
{ ++string;
}
if ((strlen(dest) + strlen(source)) >= dest_size) { /*
return (TRUE); * The buffer may contain an optional plus or minus sign.
* If it does, then skip over it but remember what is was:
*/
if (*string == '-') {
sign = ACPI_SIGN_NEGATIVE;
++string;
} else if (*string == '+') {
++string;
sign = ACPI_SIGN_POSITIVE;
} else {
sign = ACPI_SIGN_POSITIVE;
} }
strcat(dest, source); /*
return (FALSE); * If the input parameter Base is zero, then we need to
} * determine if it is octal, decimal, or hexadecimal:
*/
if (base == 0) {
if (*string == '0') {
if (tolower((int)*(++string)) == 'x') {
base = 16;
++string;
} else {
base = 8;
}
} else {
base = 10;
}
}
u8 /*
acpi_ut_safe_strncat(char *dest, * For octal and hexadecimal bases, skip over the leading
acpi_size dest_size, * 0 or 0x, if they are present.
char *source, acpi_size max_transfer_length) */
{ if (base == 8 && *string == '0') {
acpi_size actual_transfer_length; string++;
}
actual_transfer_length = ACPI_MIN(max_transfer_length, strlen(source)); if (base == 16 && *string == '0' && tolower((int)*(++string)) == 'x') {
string++;
}
if ((strlen(dest) + actual_transfer_length) >= dest_size) { /* Main loop: convert the string to an unsigned long */
return (TRUE);
while (*string) {
if (isdigit((int)*string)) {
index = ((u8)*string) - '0';
} else {
index = (u8)toupper((int)*string);
if (isupper((int)index)) {
index = index - 'A' + 10;
} else {
goto error_exit;
}
}
if (index >= base) {
goto error_exit;
}
/* Check to see if value is out of range: */
if (return_value > ((ACPI_UINT64_MAX - (u64)index) / (u64)base)) {
goto error_exit;
} else {
return_value *= base;
return_value += index;
}
++string;
} }
strncat(dest, source, max_transfer_length); /* If a minus sign was present, then "the conversion is negated": */
return (FALSE);
if (sign == ACPI_SIGN_NEGATIVE) {
return_value = (ACPI_UINT32_MAX - return_value) + 1;
}
*ret_integer = return_value;
return (status);
error_exit:
switch (base) {
case 8:
status = AE_BAD_OCTAL_CONSTANT;
break;
case 10:
status = AE_BAD_DECIMAL_CONSTANT;
break;
case 16:
status = AE_BAD_HEX_CONSTANT;
break;
default:
/* Base validated above */
break;
}
return (status);
} }
#endif #endif
...@@ -712,7 +712,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module) ...@@ -712,7 +712,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module)
/* Print summary */ /* Print summary */
if (!num_outstanding) { if (!num_outstanding) {
ACPI_INFO((AE_INFO, "No outstanding allocations")); ACPI_INFO(("No outstanding allocations"));
} else { } else {
ACPI_ERROR((AE_INFO, "%u(0x%X) Outstanding allocations", ACPI_ERROR((AE_INFO, "%u(0x%X) Outstanding allocations",
num_outstanding, num_outstanding)); num_outstanding, num_outstanding));
......
...@@ -175,8 +175,7 @@ ACPI_EXPORT_SYMBOL(acpi_warning) ...@@ -175,8 +175,7 @@ ACPI_EXPORT_SYMBOL(acpi_warning)
* TBD: module_name and line_number args are not needed, should be removed. * TBD: module_name and line_number args are not needed, should be removed.
* *
******************************************************************************/ ******************************************************************************/
void ACPI_INTERNAL_VAR_XFACE void ACPI_INTERNAL_VAR_XFACE acpi_info(const char *format, ...)
acpi_info(const char *module_name, u32 line_number, const char *format, ...)
{ {
va_list arg_list; va_list arg_list;
......
...@@ -154,21 +154,6 @@ acpi_status __init acpi_enable_subsystem(u32 flags) ...@@ -154,21 +154,6 @@ acpi_status __init acpi_enable_subsystem(u32 flags)
*/ */
acpi_gbl_early_initialization = FALSE; acpi_gbl_early_initialization = FALSE;
/*
* Install the default operation region handlers. These are the
* handlers that are defined by the ACPI specification to be
* "always accessible" -- namely, system_memory, system_IO, and
* PCI_Config. This also means that no _REG methods need to be
* run for these address spaces. We need to have these handlers
* installed before any AML code can be executed, especially any
* module-level code (11/2015).
*/
status = acpi_ev_install_region_handlers();
if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status,
"During Region initialization"));
return_ACPI_STATUS(status);
}
#if (!ACPI_REDUCED_HARDWARE) #if (!ACPI_REDUCED_HARDWARE)
/* Enable ACPI mode */ /* Enable ACPI mode */
...@@ -260,23 +245,6 @@ acpi_status __init acpi_initialize_objects(u32 flags) ...@@ -260,23 +245,6 @@ acpi_status __init acpi_initialize_objects(u32 flags)
ACPI_FUNCTION_TRACE(acpi_initialize_objects); ACPI_FUNCTION_TRACE(acpi_initialize_objects);
/*
* Run all _REG methods
*
* Note: Any objects accessed by the _REG methods will be automatically
* initialized, even if they contain executable AML (see the call to
* acpi_ns_initialize_objects below).
*/
acpi_gbl_reg_methods_enabled = TRUE;
if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"[Init] Executing _REG OpRegion methods\n"));
status = acpi_ev_initialize_op_regions();
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
}
#ifdef ACPI_EXEC_APP #ifdef ACPI_EXEC_APP
/* /*
* This call implements the "initialization file" option for acpi_exec. * This call implements the "initialization file" option for acpi_exec.
...@@ -299,32 +267,27 @@ acpi_status __init acpi_initialize_objects(u32 flags) ...@@ -299,32 +267,27 @@ acpi_status __init acpi_initialize_objects(u32 flags)
*/ */
if (acpi_gbl_group_module_level_code) { if (acpi_gbl_group_module_level_code) {
acpi_ns_exec_module_code_list(); acpi_ns_exec_module_code_list();
}
/*
* Initialize the objects that remain uninitialized. This runs the
* executable AML that may be part of the declaration of these objects:
* operation_regions, buffer_fields, Buffers, and Packages.
*/
if (!(flags & ACPI_NO_OBJECT_INIT)) {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"[Init] Completing Initialization of ACPI Objects\n"));
status = acpi_ns_initialize_objects(); /*
if (ACPI_FAILURE(status)) { * Initialize the objects that remain uninitialized. This
return_ACPI_STATUS(status); * runs the executable AML that may be part of the
* declaration of these objects:
* operation_regions, buffer_fields, Buffers, and Packages.
*/
if (!(flags & ACPI_NO_OBJECT_INIT)) {
status = acpi_ns_initialize_objects();
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
} }
} }
/* /*
* Initialize all device objects in the namespace. This runs the device * Initialize all device/region objects in the namespace. This runs
* _STA and _INI methods. * the device _STA and _INI methods and region _REG methods.
*/ */
if (!(flags & ACPI_NO_DEVICE_INIT)) { if (!(flags & (ACPI_NO_DEVICE_INIT | ACPI_NO_ADDRESS_SPACE_INIT))) {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, status = acpi_ns_initialize_devices(flags);
"[Init] Initializing ACPI Devices\n"));
status = acpi_ns_initialize_devices();
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
......
...@@ -262,7 +262,7 @@ ...@@ -262,7 +262,7 @@
#define ACPI_GET_FUNCTION_NAME _acpi_function_name #define ACPI_GET_FUNCTION_NAME _acpi_function_name
/* /*
* The Name parameter should be the procedure name as a quoted string. * The Name parameter should be the procedure name as a non-quoted string.
* The function name is also used by the function exit macros below. * The function name is also used by the function exit macros below.
* Note: (const char) is used to be compatible with the debug interfaces * Note: (const char) is used to be compatible with the debug interfaces
* and macros such as __func__. * and macros such as __func__.
......
...@@ -897,11 +897,9 @@ ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(3) ...@@ -897,11 +897,9 @@ ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(3)
acpi_warning(const char *module_name, acpi_warning(const char *module_name,
u32 line_number, u32 line_number,
const char *format, ...)) const char *format, ...))
ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(3) ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(1)
void ACPI_INTERNAL_VAR_XFACE void ACPI_INTERNAL_VAR_XFACE
acpi_info(const char *module_name, acpi_info(const char *format, ...))
u32 line_number,
const char *format, ...))
ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(3) ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(3)
void ACPI_INTERNAL_VAR_XFACE void ACPI_INTERNAL_VAR_XFACE
acpi_bios_error(const char *module_name, acpi_bios_error(const char *module_name,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment