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.
This commit is contained in:
commit
255a60fcfc
@ -165,7 +165,7 @@ ACPI_GLOBAL(u8, acpi_gbl_next_owner_id_offset);
|
||||
|
||||
/* Initialization sequencing */
|
||||
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_reg_methods_enabled, FALSE);
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_namespace_initialized, FALSE);
|
||||
|
||||
/* Misc */
|
||||
|
||||
|
@ -85,7 +85,7 @@ union acpi_parse_object;
|
||||
#define ACPI_MTX_MEMORY 5 /* Debug memory tracking lists */
|
||||
|
||||
#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 */
|
||||
|
||||
@ -103,11 +103,11 @@ struct acpi_rw_lock {
|
||||
#define ACPI_LOCK_HARDWARE 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) */
|
||||
|
||||
#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 */
|
||||
|
||||
|
@ -88,7 +88,7 @@
|
||||
*/
|
||||
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
|
||||
|
@ -1125,7 +1125,7 @@ const union acpi_predefined_info acpi_gbl_resource_names[] = {
|
||||
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}},
|
||||
{{"_PR_", 0, 0}},
|
||||
{{"_SB_", 0, 0}},
|
||||
|
@ -348,7 +348,7 @@ void acpi_db_display_table_info(char *table_arg)
|
||||
} else {
|
||||
/* 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));
|
||||
}
|
||||
}
|
||||
|
@ -408,7 +408,7 @@ void acpi_db_dump_pld_buffer(union acpi_object *obj_desc)
|
||||
|
||||
new_buffer = acpi_db_encode_pld_buffer(pld_info);
|
||||
if (!new_buffer) {
|
||||
return;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* The two bit-packed buffers should match */
|
||||
@ -479,6 +479,7 @@ void acpi_db_dump_pld_buffer(union acpi_object *obj_desc)
|
||||
pld_info->horizontal_offset);
|
||||
}
|
||||
|
||||
ACPI_FREE(pld_info);
|
||||
ACPI_FREE(new_buffer);
|
||||
exit:
|
||||
ACPI_FREE(pld_info);
|
||||
}
|
||||
|
@ -809,8 +809,7 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
|
||||
if (method_desc->method.
|
||||
info_flags & ACPI_METHOD_SERIALIZED_PENDING) {
|
||||
if (walk_state) {
|
||||
ACPI_INFO((AE_INFO,
|
||||
"Marking method %4.4s as Serialized "
|
||||
ACPI_INFO(("Marking method %4.4s as Serialized "
|
||||
"because of AE_ALREADY_EXISTS error",
|
||||
walk_state->method_node->name.
|
||||
ascii));
|
||||
|
@ -524,8 +524,7 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
|
||||
arg = arg->common.next;
|
||||
}
|
||||
|
||||
ACPI_INFO((AE_INFO,
|
||||
"Actual Package length (%u) is larger than "
|
||||
ACPI_INFO(("Actual Package length (%u) is larger than "
|
||||
"NumElements field (%u), truncated",
|
||||
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,
|
||||
}
|
||||
|
||||
if (gpe_enabled_count) {
|
||||
ACPI_INFO((AE_INFO,
|
||||
"Enabled %u GPEs in block %02X to %02X",
|
||||
ACPI_INFO(("Enabled %u GPEs in block %02X to %02X",
|
||||
gpe_enabled_count, (u32)gpe_block->block_base_number,
|
||||
(u32)(gpe_block->block_base_number +
|
||||
(gpe_block->gpe_count - 1))));
|
||||
|
@ -281,7 +281,7 @@ void acpi_ev_update_gpes(acpi_owner_id table_owner_id)
|
||||
}
|
||||
|
||||
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);
|
||||
|
@ -600,7 +600,7 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
|
||||
|
||||
if (region_obj2->extra.method_REG == NULL ||
|
||||
region_obj->region.handler == NULL ||
|
||||
!acpi_gbl_reg_methods_enabled) {
|
||||
!acpi_gbl_namespace_initialized) {
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
|
@ -252,7 +252,7 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
|
||||
|
||||
status = acpi_get_table_by_index(table_index, &table);
|
||||
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);
|
||||
}
|
||||
|
||||
@ -472,7 +472,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
||||
|
||||
/* 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);
|
||||
|
||||
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)
|
||||
* op is intended for use by disassemblers in order to properly
|
||||
* disassemble control method invocations. The opcode or group of
|
||||
* 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;
|
||||
goto cleanup;
|
||||
|
||||
|
@ -378,8 +378,7 @@ void acpi_ns_exec_module_code_list(void)
|
||||
acpi_ut_remove_reference(prev);
|
||||
}
|
||||
|
||||
ACPI_INFO((AE_INFO,
|
||||
"Executed %u blocks of module-level executable AML code",
|
||||
ACPI_INFO(("Executed %u blocks of module-level executable AML code",
|
||||
method_count));
|
||||
|
||||
ACPI_FREE(info);
|
||||
|
@ -46,6 +46,7 @@
|
||||
#include "acnamesp.h"
|
||||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "acevents.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsinit")
|
||||
@ -83,6 +84,8 @@ acpi_status acpi_ns_initialize_objects(void)
|
||||
|
||||
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,
|
||||
"**** Starting initialization of namespace objects ****\n"));
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
@ -133,83 +136,109 @@ 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;
|
||||
|
||||
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;
|
||||
info.num_STA = 0;
|
||||
info.num_INI = 0;
|
||||
/* Init counters */
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
"Initializing Device/Processor/Thermal objects "
|
||||
"and executing _INI/_STA methods:\n"));
|
||||
info.device_count = 0;
|
||||
info.num_STA = 0;
|
||||
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,
|
||||
ACPI_UINT32_MAX, FALSE,
|
||||
acpi_ns_find_ini_methods, NULL, &info,
|
||||
NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto error_exit;
|
||||
}
|
||||
/* Tree analysis: find all subtrees that contain _INI methods */
|
||||
|
||||
/* Allocate the evaluation information block */
|
||||
status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX, FALSE,
|
||||
acpi_ns_find_ini_methods, NULL,
|
||||
&info, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
info.evaluate_info =
|
||||
ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
|
||||
if (!info.evaluate_info) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto error_exit;
|
||||
/* 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;
|
||||
}
|
||||
|
||||
/*
|
||||
* Execute the "global" _INI method that may appear at the root.
|
||||
* This support is provided for Windows compatibility (Vista+) and
|
||||
* is not part of the ACPI specification.
|
||||
*/
|
||||
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
|
||||
* support is provided for Windows compatibility (Vista+) and is not
|
||||
* part of the ACPI specification.
|
||||
* 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).
|
||||
*/
|
||||
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;
|
||||
if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Executing _REG OpRegion methods\n"));
|
||||
|
||||
status = acpi_ns_evaluate(info.evaluate_info);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
info.num_INI++;
|
||||
status = acpi_ev_initialize_op_regions();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
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,
|
||||
ACPI_UINT32_MAX, FALSE,
|
||||
acpi_ns_init_one_device, NULL, &info,
|
||||
NULL);
|
||||
/* Walk namespace to execute all _INIs on present devices */
|
||||
|
||||
/*
|
||||
* Any _OSI requests should be completed by now. If the BIOS has
|
||||
* 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;
|
||||
status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
|
||||
ACPI_UINT32_MAX, FALSE,
|
||||
acpi_ns_init_one_device, NULL,
|
||||
&info, NULL);
|
||||
|
||||
/*
|
||||
* Any _OSI requests should be completed by now. If the BIOS has
|
||||
* 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_FREE(info.evaluate_info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
ACPI_FREE(info.evaluate_info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
error_exit:
|
||||
|
@ -267,8 +267,7 @@ acpi_tb_install_standard_table(acpi_physical_address address,
|
||||
if (!reload &&
|
||||
acpi_gbl_disable_ssdt_table_install &&
|
||||
ACPI_COMPARE_NAME(&new_table_desc.signature, ACPI_SIG_SSDT)) {
|
||||
ACPI_INFO((AE_INFO,
|
||||
"Ignoring installation of %4.4s at %8.8X%8.8X",
|
||||
ACPI_INFO(("Ignoring installation of %4.4s at %8.8X%8.8X",
|
||||
new_table_desc.signature.ascii,
|
||||
ACPI_FORMAT_UINT64(address)));
|
||||
goto release_and_exit;
|
||||
@ -432,7 +431,7 @@ finish_override:
|
||||
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",
|
||||
old_table_desc->signature.ascii,
|
||||
ACPI_FORMAT_UINT64(old_table_desc->address),
|
||||
|
@ -132,7 +132,7 @@ acpi_tb_print_table_header(acpi_physical_address address,
|
||||
|
||||
/* 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->length));
|
||||
} else if (ACPI_VALIDATE_RSDP_SIG(header->signature)) {
|
||||
@ -144,7 +144,7 @@ acpi_tb_print_table_header(acpi_physical_address address,
|
||||
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_CAST_PTR(struct acpi_table_rsdp, header)->
|
||||
revision >
|
||||
@ -158,8 +158,7 @@ acpi_tb_print_table_header(acpi_physical_address address,
|
||||
|
||||
acpi_tb_cleanup_table_header(&local_header, header);
|
||||
|
||||
ACPI_INFO((AE_INFO,
|
||||
"%-4.4s 0x%8.8X%8.8X"
|
||||
ACPI_INFO(("%-4.4s 0x%8.8X%8.8X"
|
||||
" %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)",
|
||||
local_header.signature, ACPI_FORMAT_UINT64(address),
|
||||
local_header.length, local_header.revision,
|
||||
|
@ -174,9 +174,7 @@ struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index)
|
||||
ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL,
|
||||
new_table);
|
||||
|
||||
ACPI_INFO((AE_INFO,
|
||||
"Forced DSDT copy: length 0x%05X copied locally, original unmapped",
|
||||
new_table->length));
|
||||
ACPI_INFO(("Forced DSDT copy: length 0x%05X copied locally, original unmapped", new_table->length));
|
||||
|
||||
return (new_table);
|
||||
}
|
||||
|
@ -47,6 +47,7 @@
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "actables.h"
|
||||
#include "acevents.h"
|
||||
|
||||
#define _COMPONENT ACPI_TABLES
|
||||
ACPI_MODULE_NAME("tbxfload")
|
||||
@ -68,6 +69,25 @@ acpi_status __init acpi_load_tables(void)
|
||||
|
||||
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 */
|
||||
|
||||
status = acpi_tb_load_namespace();
|
||||
@ -83,6 +103,20 @@ acpi_status __init acpi_load_tables(void)
|
||||
"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);
|
||||
}
|
||||
|
||||
@ -206,9 +240,7 @@ acpi_status acpi_tb_load_namespace(void)
|
||||
}
|
||||
|
||||
if (!tables_failed) {
|
||||
ACPI_INFO((AE_INFO,
|
||||
"%u ACPI AML tables successfully acquired and loaded\n",
|
||||
tables_loaded));
|
||||
ACPI_INFO(("%u ACPI AML tables successfully acquired and loaded\n", tables_loaded));
|
||||
} else {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"%u table load failures, %u successful",
|
||||
@ -301,7 +333,7 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
|
||||
|
||||
/* 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);
|
||||
|
||||
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)
|
||||
acpi_status status;
|
||||
void *object;
|
||||
|
||||
ACPI_FUNCTION_NAME(os_acquire_object);
|
||||
ACPI_FUNCTION_TRACE(os_acquire_object);
|
||||
|
||||
if (!cache) {
|
||||
return_PTR(NULL);
|
||||
|
@ -140,6 +140,67 @@ int acpi_ut_stricmp(char *string1, char *string2)
|
||||
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
|
||||
@ -155,7 +216,15 @@ int acpi_ut_stricmp(char *string1, char *string2)
|
||||
* 32-bit or 64-bit conversion, depending on the current mode
|
||||
* 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)
|
||||
u8 sign_of0x = 0;
|
||||
u8 term = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE_STR(ut_stroul64, string);
|
||||
ACPI_FUNCTION_TRACE_STR(ut_strtoul64, string);
|
||||
|
||||
switch (base) {
|
||||
case ACPI_ANY_BASE:
|
||||
@ -318,63 +387,162 @@ error_exit:
|
||||
}
|
||||
}
|
||||
|
||||
#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
|
||||
* functions. This is the size of the Destination buffer.
|
||||
* PARAMETERS: string - Null terminated string
|
||||
* 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
|
||||
* 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.
|
||||
* DESCRIPTION: Convert a string into an unsigned value.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
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) {
|
||||
return (TRUE);
|
||||
*ret_integer = 0;
|
||||
|
||||
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);
|
||||
return (FALSE);
|
||||
}
|
||||
/* Skip over any white space in the buffer: */
|
||||
|
||||
u8 acpi_ut_safe_strcat(char *dest, acpi_size dest_size, char *source)
|
||||
{
|
||||
|
||||
if ((strlen(dest) + strlen(source)) >= dest_size) {
|
||||
return (TRUE);
|
||||
while (isspace((int)*string) || *string == '\t') {
|
||||
++string;
|
||||
}
|
||||
|
||||
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);
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
strncat(dest, source, max_transfer_length);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* For octal and hexadecimal bases, skip over the leading
|
||||
* 0 or 0x, if they are present.
|
||||
*/
|
||||
if (base == 8 && *string == '0') {
|
||||
string++;
|
||||
}
|
||||
|
||||
if (base == 16 && *string == '0' && tolower((int)*(++string)) == 'x') {
|
||||
string++;
|
||||
}
|
||||
|
||||
/* Main loop: convert the string to an unsigned long */
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
/* If a minus sign was present, then "the conversion is negated": */
|
||||
|
||||
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
|
||||
|
@ -712,7 +712,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module)
|
||||
/* Print summary */
|
||||
|
||||
if (!num_outstanding) {
|
||||
ACPI_INFO((AE_INFO, "No outstanding allocations"));
|
||||
ACPI_INFO(("No outstanding allocations"));
|
||||
} else {
|
||||
ACPI_ERROR((AE_INFO, "%u(0x%X) Outstanding allocations",
|
||||
num_outstanding, num_outstanding));
|
||||
|
@ -175,8 +175,7 @@ ACPI_EXPORT_SYMBOL(acpi_warning)
|
||||
* TBD: module_name and line_number args are not needed, should be removed.
|
||||
*
|
||||
******************************************************************************/
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_info(const char *module_name, u32 line_number, const char *format, ...)
|
||||
void ACPI_INTERNAL_VAR_XFACE acpi_info(const char *format, ...)
|
||||
{
|
||||
va_list arg_list;
|
||||
|
||||
|
@ -154,21 +154,6 @@ acpi_status __init acpi_enable_subsystem(u32 flags)
|
||||
*/
|
||||
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)
|
||||
|
||||
/* Enable ACPI mode */
|
||||
@ -260,23 +245,6 @@ acpi_status __init acpi_initialize_objects(u32 flags)
|
||||
|
||||
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
|
||||
/*
|
||||
* This call implements the "initialization file" option for acpi_exec.
|
||||
@ -299,32 +267,27 @@ acpi_status __init acpi_initialize_objects(u32 flags)
|
||||
*/
|
||||
if (acpi_gbl_group_module_level_code) {
|
||||
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)) {
|
||||
return_ACPI_STATUS(status);
|
||||
/*
|
||||
* 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)) {
|
||||
status = acpi_ns_initialize_objects();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize all device objects in the namespace. This runs the device
|
||||
* _STA and _INI methods.
|
||||
* Initialize all device/region objects in the namespace. This runs
|
||||
* the device _STA and _INI methods and region _REG methods.
|
||||
*/
|
||||
if (!(flags & ACPI_NO_DEVICE_INIT)) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"[Init] Initializing ACPI Devices\n"));
|
||||
|
||||
status = acpi_ns_initialize_devices();
|
||||
if (!(flags & (ACPI_NO_DEVICE_INIT | ACPI_NO_ADDRESS_SPACE_INIT))) {
|
||||
status = acpi_ns_initialize_devices(flags);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -262,7 +262,7 @@
|
||||
#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.
|
||||
* Note: (const char) is used to be compatible with the debug interfaces
|
||||
* and macros such as __func__.
|
||||
|
@ -897,11 +897,9 @@ ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(3)
|
||||
acpi_warning(const char *module_name,
|
||||
u32 line_number,
|
||||
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
|
||||
acpi_info(const char *module_name,
|
||||
u32 line_number,
|
||||
const char *format, ...))
|
||||
acpi_info(const char *format, ...))
|
||||
ACPI_MSG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(3)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_bios_error(const char *module_name,
|
||||
|
Loading…
Reference in New Issue
Block a user