Merge branch 'acpica'
* acpica: ACPICA: Utilities: Add new decode function for parser values ACPICA: Tables: Add an error message complaining driver bugs ACPICA: Tables: Add acpi_tb_unload_table() ACPICA: Tables: Cleanup acpi_tb_install_and_load_table() ACPICA: Events: Fix acpi_ev_initialize_region() return value ACPICA: Back port of "ACPICA: Dispatcher: Tune interpreter lock around AcpiEvInitializeRegion()" ACPICA: Namespace: Add acpi_ns_handle_to_name() ACPICA: Update version to 20160930 ACPICA: Move acpi_gbl_max_loop_iterations to the public globals file ACPICA: Disassembler: Fix for Divide() support, new support for test suite ACPICA: Increase loop limit for AE_AML_INFINITE_LOOP exception ACPICA: MacOSX: Fix wrong sem_destroy definition ACPICA: MacOSX: Fix anonymous semaphore implementation ACPICA: Update an info message during table load phase
This commit is contained in:
Коммит
496c9a9293
|
@ -243,9 +243,7 @@ acpi_ev_default_region_setup(acpi_handle handle,
|
|||
u32 function,
|
||||
void *handler_context, void **region_context);
|
||||
|
||||
acpi_status
|
||||
acpi_ev_initialize_region(union acpi_operand_object *region_obj,
|
||||
u8 acpi_ns_locked);
|
||||
acpi_status acpi_ev_initialize_region(union acpi_operand_object *region_obj);
|
||||
|
||||
/*
|
||||
* evsci - SCI (System Control Interrupt) handling/dispatch
|
||||
|
|
|
@ -240,10 +240,6 @@ ACPI_INIT_GLOBAL(u32, acpi_gbl_nesting_level, 0);
|
|||
|
||||
ACPI_GLOBAL(struct acpi_thread_state *, acpi_gbl_current_walk_list);
|
||||
|
||||
/* Maximum number of While() loop iterations before forced abort */
|
||||
|
||||
ACPI_GLOBAL(u16, acpi_gbl_max_loop_iterations);
|
||||
|
||||
/* Control method single step flag */
|
||||
|
||||
ACPI_GLOBAL(u8, acpi_gbl_cm_single_step);
|
||||
|
@ -318,6 +314,7 @@ ACPI_INIT_GLOBAL(u8, acpi_gbl_cstyle_disassembly, TRUE);
|
|||
ACPI_INIT_GLOBAL(u8, acpi_gbl_force_aml_disassembly, FALSE);
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_dm_opt_verbose, TRUE);
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_dm_emit_external_opcodes, FALSE);
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_do_disassembler_optimizations, TRUE);
|
||||
|
||||
ACPI_GLOBAL(u8, acpi_gbl_dm_opt_disasm);
|
||||
ACPI_GLOBAL(u8, acpi_gbl_dm_opt_listing);
|
||||
|
|
|
@ -765,7 +765,7 @@ union acpi_parse_value {
|
|||
union acpi_parse_value value; /* Value or args associated with the opcode */\
|
||||
u8 arg_list_length; /* Number of elements in the arg list */\
|
||||
ACPI_DISASM_ONLY_MEMBERS (\
|
||||
u8 disasm_flags; /* Used during AML disassembly */\
|
||||
u16 disasm_flags; /* Used during AML disassembly */\
|
||||
u8 disasm_opcode; /* Subtype used for disassembly */\
|
||||
char *operator_symbol;/* Used for C-style operator name strings */\
|
||||
char aml_op_name[16]) /* Op name (debug only) */
|
||||
|
@ -868,14 +868,15 @@ struct acpi_parse_state {
|
|||
|
||||
/* Parse object disasm_flags */
|
||||
|
||||
#define ACPI_PARSEOP_IGNORE 0x01
|
||||
#define ACPI_PARSEOP_PARAMETER_LIST 0x02
|
||||
#define ACPI_PARSEOP_EMPTY_TERMLIST 0x04
|
||||
#define ACPI_PARSEOP_PREDEFINED_CHECKED 0x08
|
||||
#define ACPI_PARSEOP_CLOSING_PAREN 0x10
|
||||
#define ACPI_PARSEOP_COMPOUND_ASSIGNMENT 0x20
|
||||
#define ACPI_PARSEOP_ASSIGNMENT 0x40
|
||||
#define ACPI_PARSEOP_ELSEIF 0x80
|
||||
#define ACPI_PARSEOP_IGNORE 0x0001
|
||||
#define ACPI_PARSEOP_PARAMETER_LIST 0x0002
|
||||
#define ACPI_PARSEOP_EMPTY_TERMLIST 0x0004
|
||||
#define ACPI_PARSEOP_PREDEFINED_CHECKED 0x0008
|
||||
#define ACPI_PARSEOP_CLOSING_PAREN 0x0010
|
||||
#define ACPI_PARSEOP_COMPOUND_ASSIGNMENT 0x0020
|
||||
#define ACPI_PARSEOP_ASSIGNMENT 0x0040
|
||||
#define ACPI_PARSEOP_ELSEIF 0x0080
|
||||
#define ACPI_PARSEOP_LEGACY_ASL_ONLY 0x0100
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
|
|
|
@ -291,6 +291,9 @@ char *acpi_ns_get_normalized_pathname(struct acpi_namespace_node *node,
|
|||
|
||||
char *acpi_ns_name_of_current_scope(struct acpi_walk_state *walk_state);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_handle_to_name(acpi_handle target_handle, struct acpi_buffer *buffer);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_handle_to_pathname(acpi_handle target_handle,
|
||||
struct acpi_buffer *buffer, u8 no_trailing);
|
||||
|
|
|
@ -127,10 +127,11 @@ acpi_status
|
|||
acpi_tb_load_table(u32 table_index, struct acpi_namespace_node *parent_node);
|
||||
|
||||
acpi_status
|
||||
acpi_tb_install_and_load_table(struct acpi_table_header *table,
|
||||
acpi_physical_address address,
|
||||
acpi_tb_install_and_load_table(acpi_physical_address address,
|
||||
u8 flags, u8 override, u32 *table_index);
|
||||
|
||||
acpi_status acpi_tb_unload_table(u32 table_index);
|
||||
|
||||
void acpi_tb_terminate(void);
|
||||
|
||||
acpi_status acpi_tb_delete_namespace_by_owner(u32 table_index);
|
||||
|
|
|
@ -232,6 +232,8 @@ const char *acpi_ut_get_region_name(u8 space_id);
|
|||
|
||||
const char *acpi_ut_get_event_name(u32 event_id);
|
||||
|
||||
const char *acpi_ut_get_argument_type_name(u32 arg_type);
|
||||
|
||||
char acpi_ut_hex_to_ascii_char(u64 integer, u32 position);
|
||||
|
||||
acpi_status acpi_ut_ascii_to_hex_byte(char *two_ascii_chars, u8 *return_byte);
|
||||
|
|
|
@ -240,6 +240,7 @@
|
|||
#define ARGP_QWORDDATA 0x11
|
||||
#define ARGP_SIMPLENAME 0x12 /* name_string | local_term | arg_term */
|
||||
#define ARGP_NAME_OR_REF 0x13 /* For object_type only */
|
||||
#define ARGP_MAX 0x13
|
||||
|
||||
/*
|
||||
* Resolved argument types for the AML Interpreter
|
||||
|
|
|
@ -221,8 +221,8 @@ acpi_ds_initialize_objects(u32 table_index,
|
|||
*/
|
||||
status =
|
||||
acpi_ns_walk_namespace(ACPI_TYPE_ANY, start_node, ACPI_UINT32_MAX,
|
||||
0, acpi_ds_init_one_object, NULL, &info,
|
||||
NULL);
|
||||
ACPI_NS_WALK_NO_UNLOCK,
|
||||
acpi_ds_init_one_object, NULL, &info, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status, "During WalkNamespace"));
|
||||
}
|
||||
|
|
|
@ -84,7 +84,7 @@ acpi_status acpi_ds_initialize_region(acpi_handle obj_handle)
|
|||
|
||||
/* Namespace is NOT locked */
|
||||
|
||||
status = acpi_ev_initialize_region(obj_desc, FALSE);
|
||||
status = acpi_ev_initialize_region(obj_desc);
|
||||
return (status);
|
||||
}
|
||||
|
||||
|
|
|
@ -609,18 +609,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
|
|||
|
||||
status =
|
||||
acpi_ev_initialize_region
|
||||
(acpi_ns_get_attached_object(node), FALSE);
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
/*
|
||||
* If AE_NOT_EXIST is returned, it is not fatal
|
||||
* because many regions get created before a handler
|
||||
* is installed for said region.
|
||||
*/
|
||||
if (AE_NOT_EXIST == status) {
|
||||
status = AE_OK;
|
||||
}
|
||||
}
|
||||
(acpi_ns_get_attached_object(node));
|
||||
break;
|
||||
|
||||
case AML_NAME_OP:
|
||||
|
|
|
@ -479,7 +479,6 @@ acpi_ev_default_region_setup(acpi_handle handle,
|
|||
* FUNCTION: acpi_ev_initialize_region
|
||||
*
|
||||
* PARAMETERS: region_obj - Region we are initializing
|
||||
* acpi_ns_locked - Is namespace locked?
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
|
@ -497,19 +496,28 @@ acpi_ev_default_region_setup(acpi_handle handle,
|
|||
* MUTEX: Interpreter should be unlocked, because we may run the _REG
|
||||
* method for this region.
|
||||
*
|
||||
* NOTE: Possible incompliance:
|
||||
* There is a behavior conflict in automatic _REG execution:
|
||||
* 1. When the interpreter is evaluating a method, we can only
|
||||
* automatically run _REG for the following case:
|
||||
* operation_region (OPR1, 0x80, 0x1000010, 0x4)
|
||||
* 2. When the interpreter is loading a table, we can also
|
||||
* automatically run _REG for the following case:
|
||||
* operation_region (OPR1, 0x80, 0x1000010, 0x4)
|
||||
* Though this may not be compliant to the de-facto standard, the
|
||||
* logic is kept in order not to trigger regressions. And keeping
|
||||
* this logic should be taken care by the caller of this function.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ev_initialize_region(union acpi_operand_object *region_obj,
|
||||
u8 acpi_ns_locked)
|
||||
acpi_status acpi_ev_initialize_region(union acpi_operand_object *region_obj)
|
||||
{
|
||||
union acpi_operand_object *handler_obj;
|
||||
union acpi_operand_object *obj_desc;
|
||||
acpi_adr_space_type space_id;
|
||||
struct acpi_namespace_node *node;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE_U32(ev_initialize_region, acpi_ns_locked);
|
||||
ACPI_FUNCTION_TRACE(ev_initialize_region);
|
||||
|
||||
if (!region_obj) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
|
@ -580,39 +588,17 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
|
|||
handler_obj, region_obj,
|
||||
obj_desc));
|
||||
|
||||
status =
|
||||
acpi_ev_attach_region(handler_obj,
|
||||
region_obj,
|
||||
acpi_ns_locked);
|
||||
(void)acpi_ev_attach_region(handler_obj,
|
||||
region_obj, FALSE);
|
||||
|
||||
/*
|
||||
* Tell all users that this region is usable by
|
||||
* running the _REG method
|
||||
*/
|
||||
if (acpi_ns_locked) {
|
||||
status =
|
||||
acpi_ut_release_mutex
|
||||
(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
acpi_ex_exit_interpreter();
|
||||
status =
|
||||
acpi_ev_execute_reg_method(region_obj,
|
||||
ACPI_REG_CONNECT);
|
||||
(void)acpi_ev_execute_reg_method(region_obj,
|
||||
ACPI_REG_CONNECT);
|
||||
acpi_ex_enter_interpreter();
|
||||
|
||||
if (acpi_ns_locked) {
|
||||
status =
|
||||
acpi_ut_acquire_mutex
|
||||
(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
}
|
||||
|
@ -622,12 +608,15 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
|
|||
node = node->parent;
|
||||
}
|
||||
|
||||
/* If we get here, there is no handler for this region */
|
||||
|
||||
/*
|
||||
* If we get here, there is no handler for this region. This is not
|
||||
* fatal because many regions get created before a handler is installed
|
||||
* for said region.
|
||||
*/
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
|
||||
"No handler for RegionType %s(%X) (RegionObj %p)\n",
|
||||
acpi_ut_get_region_name(space_id), space_id,
|
||||
region_obj));
|
||||
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
|
|
@ -437,10 +437,9 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
|||
|
||||
ACPI_INFO(("Dynamic OEM Table Load:"));
|
||||
acpi_ex_exit_interpreter();
|
||||
status =
|
||||
acpi_tb_install_and_load_table(table, ACPI_PTR_TO_PHYSADDR(table),
|
||||
ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL,
|
||||
TRUE, &table_index);
|
||||
status = acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
|
||||
ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL,
|
||||
TRUE, &table_index);
|
||||
acpi_ex_enter_interpreter();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
||||
|
@ -500,7 +499,6 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
|
|||
acpi_status status = AE_OK;
|
||||
union acpi_operand_object *table_desc = ddb_handle;
|
||||
u32 table_index;
|
||||
struct acpi_table_header *table;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ex_unload_table);
|
||||
|
||||
|
@ -537,39 +535,7 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
|
|||
* strict order requirement against it.
|
||||
*/
|
||||
acpi_ex_exit_interpreter();
|
||||
|
||||
/* Ensure the table is still loaded */
|
||||
|
||||
if (!acpi_tb_is_table_loaded(table_index)) {
|
||||
status = AE_NOT_EXIST;
|
||||
goto lock_and_exit;
|
||||
}
|
||||
|
||||
/* Invoke table handler if present */
|
||||
|
||||
if (acpi_gbl_table_handler) {
|
||||
status = acpi_get_table_by_index(table_index, &table);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
(void)acpi_gbl_table_handler(ACPI_TABLE_EVENT_UNLOAD,
|
||||
table,
|
||||
acpi_gbl_table_handler_context);
|
||||
}
|
||||
}
|
||||
|
||||
/* Delete the portion of the namespace owned by this table */
|
||||
|
||||
status = acpi_tb_delete_namespace_by_owner(table_index);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto lock_and_exit;
|
||||
}
|
||||
|
||||
(void)acpi_tb_release_owner_id(table_index);
|
||||
acpi_tb_set_table_loaded_flag(table_index, FALSE);
|
||||
|
||||
lock_and_exit:
|
||||
|
||||
/* Re-acquire the interpreter lock */
|
||||
|
||||
status = acpi_tb_unload_table(table_index);
|
||||
acpi_ex_enter_interpreter();
|
||||
|
||||
/*
|
||||
|
|
|
@ -95,6 +95,51 @@ acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node)
|
|||
return (size);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_handle_to_name
|
||||
*
|
||||
* PARAMETERS: target_handle - Handle of named object whose name is
|
||||
* to be found
|
||||
* buffer - Where the name is returned
|
||||
*
|
||||
* RETURN: Status, Buffer is filled with name if status is AE_OK
|
||||
*
|
||||
* DESCRIPTION: Build and return a full namespace name
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_handle_to_name(acpi_handle target_handle, struct acpi_buffer *buffer)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *node;
|
||||
const char *node_name;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ns_handle_to_name, target_handle);
|
||||
|
||||
node = acpi_ns_validate_handle(target_handle);
|
||||
if (!node) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Validate/Allocate/Clear caller buffer */
|
||||
|
||||
status = acpi_ut_initialize_buffer(buffer, ACPI_PATH_SEGMENT_LENGTH);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Just copy the ACPI name from the Node and zero terminate it */
|
||||
|
||||
node_name = acpi_ut_get_node_name(node);
|
||||
ACPI_MOVE_NAME(buffer->pointer, node_name);
|
||||
((char *)buffer->pointer)[ACPI_NAME_SIZE] = 0;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "%4.4s\n", (char *)buffer->pointer));
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_handle_to_pathname
|
||||
|
|
|
@ -158,8 +158,6 @@ acpi_status
|
|||
acpi_get_name(acpi_handle handle, u32 name_type, struct acpi_buffer *buffer)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *node;
|
||||
const char *node_name;
|
||||
|
||||
/* Parameter validation */
|
||||
|
||||
|
@ -172,6 +170,15 @@ acpi_get_name(acpi_handle handle, u32 name_type, struct acpi_buffer *buffer)
|
|||
return (status);
|
||||
}
|
||||
|
||||
/*
|
||||
* Wants the single segment ACPI name.
|
||||
* Validate handle and convert to a namespace Node
|
||||
*/
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
if (name_type == ACPI_FULL_PATHNAME ||
|
||||
name_type == ACPI_FULL_PATHNAME_NO_TRAILING) {
|
||||
|
||||
|
@ -181,40 +188,12 @@ acpi_get_name(acpi_handle handle, u32 name_type, struct acpi_buffer *buffer)
|
|||
name_type ==
|
||||
ACPI_FULL_PATHNAME ? FALSE :
|
||||
TRUE);
|
||||
return (status);
|
||||
} else {
|
||||
/* Get the single name */
|
||||
|
||||
status = acpi_ns_handle_to_name(handle, buffer);
|
||||
}
|
||||
|
||||
/*
|
||||
* Wants the single segment ACPI name.
|
||||
* Validate handle and convert to a namespace Node
|
||||
*/
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
node = acpi_ns_validate_handle(handle);
|
||||
if (!node) {
|
||||
status = AE_BAD_PARAMETER;
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/* Validate/Allocate/Clear caller buffer */
|
||||
|
||||
status = acpi_ut_initialize_buffer(buffer, ACPI_PATH_SEGMENT_LENGTH);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/* Just copy the ACPI name from the Node and zero terminate it */
|
||||
|
||||
node_name = acpi_ut_get_node_name(node);
|
||||
ACPI_MOVE_NAME(buffer->pointer, node_name);
|
||||
((char *)buffer->pointer)[ACPI_NAME_SIZE] = 0;
|
||||
status = AE_OK;
|
||||
|
||||
unlock_and_exit:
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
return (status);
|
||||
}
|
||||
|
|
|
@ -832,9 +832,9 @@ acpi_tb_load_table(u32 table_index, struct acpi_namespace_node *parent_node)
|
|||
*
|
||||
* FUNCTION: acpi_tb_install_and_load_table
|
||||
*
|
||||
* PARAMETERS: table - Pointer to the table
|
||||
* address - Physical address of the table
|
||||
* PARAMETERS: address - Physical address of the table
|
||||
* flags - Allocation flags of the table
|
||||
* override - Whether override should be performed
|
||||
* table_index - Where table index is returned
|
||||
*
|
||||
* RETURN: Status
|
||||
|
@ -844,15 +844,13 @@ acpi_tb_load_table(u32 table_index, struct acpi_namespace_node *parent_node)
|
|||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_tb_install_and_load_table(struct acpi_table_header *table,
|
||||
acpi_physical_address address,
|
||||
acpi_tb_install_and_load_table(acpi_physical_address address,
|
||||
u8 flags, u8 override, u32 *table_index)
|
||||
{
|
||||
acpi_status status;
|
||||
u32 i;
|
||||
acpi_owner_id owner_id;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_load_table);
|
||||
ACPI_FUNCTION_TRACE(tb_install_and_load_table);
|
||||
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
|
||||
|
@ -864,41 +862,8 @@ acpi_tb_install_and_load_table(struct acpi_table_header *table,
|
|||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
/*
|
||||
* Note: Now table is "INSTALLED", it must be validated before
|
||||
* using.
|
||||
*/
|
||||
status = acpi_tb_validate_table(&acpi_gbl_root_table_list.tables[i]);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
status = acpi_ns_load_table(i, acpi_gbl_root_node);
|
||||
|
||||
/* Execute any module-level code that was found in the table */
|
||||
|
||||
if (!acpi_gbl_parse_table_as_term_list
|
||||
&& acpi_gbl_group_module_level_code) {
|
||||
acpi_ns_exec_module_code_list();
|
||||
}
|
||||
|
||||
/*
|
||||
* Update GPEs for any new _Lxx/_Exx methods. Ignore errors. The host is
|
||||
* responsible for discovering any new wake GPEs by running _PRW methods
|
||||
* that may have been loaded by this table.
|
||||
*/
|
||||
status = acpi_tb_get_owner_id(i, &owner_id);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
acpi_ev_update_gpes(owner_id);
|
||||
}
|
||||
|
||||
/* Invoke table handler if present */
|
||||
|
||||
if (acpi_gbl_table_handler) {
|
||||
(void)acpi_gbl_table_handler(ACPI_TABLE_EVENT_LOAD, table,
|
||||
acpi_gbl_table_handler_context);
|
||||
}
|
||||
status = acpi_tb_load_table(i, acpi_gbl_root_node);
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
|
||||
unlock_and_exit:
|
||||
|
@ -906,3 +871,51 @@ unlock_and_exit:
|
|||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_unload_table
|
||||
*
|
||||
* PARAMETERS: table_index - Table index
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Unload an ACPI table
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_tb_unload_table(u32 table_index)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_table_header *table;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_unload_table);
|
||||
|
||||
/* Ensure the table is still loaded */
|
||||
|
||||
if (!acpi_tb_is_table_loaded(table_index)) {
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
}
|
||||
|
||||
/* Invoke table handler if present */
|
||||
|
||||
if (acpi_gbl_table_handler) {
|
||||
status = acpi_get_table_by_index(table_index, &table);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
(void)acpi_gbl_table_handler(ACPI_TABLE_EVENT_UNLOAD,
|
||||
table,
|
||||
acpi_gbl_table_handler_context);
|
||||
}
|
||||
}
|
||||
|
||||
/* Delete the portion of the namespace owned by this table */
|
||||
|
||||
status = acpi_tb_delete_namespace_by_owner(table_index);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
(void)acpi_tb_release_owner_id(table_index);
|
||||
acpi_tb_set_table_loaded_flag(table_index, FALSE);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
|
|
@ -167,6 +167,7 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_initialize_tables)
|
|||
acpi_status ACPI_INIT_FUNCTION acpi_reallocate_root_table(void)
|
||||
{
|
||||
acpi_status status;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_TRACE(acpi_reallocate_root_table);
|
||||
|
||||
|
@ -178,6 +179,21 @@ acpi_status ACPI_INIT_FUNCTION acpi_reallocate_root_table(void)
|
|||
return_ACPI_STATUS(AE_SUPPORT);
|
||||
}
|
||||
|
||||
/*
|
||||
* Ensure OS early boot logic, which is required by some hosts. If the
|
||||
* table state is reported to be wrong, developers should fix the
|
||||
* issue by invoking acpi_put_table() for the reported table during the
|
||||
* early stage.
|
||||
*/
|
||||
for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) {
|
||||
if (acpi_gbl_root_table_list.tables[i].pointer) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Table [%4.4s] is not invalidated during early boot stage",
|
||||
acpi_gbl_root_table_list.tables[i].
|
||||
signature.ascii));
|
||||
}
|
||||
}
|
||||
|
||||
acpi_gbl_root_table_list.flags |= ACPI_ROOT_ALLOW_RESIZE;
|
||||
|
||||
status = acpi_tb_resize_root_table_list();
|
||||
|
|
|
@ -239,7 +239,7 @@ acpi_status acpi_tb_load_namespace(void)
|
|||
}
|
||||
|
||||
if (!tables_failed) {
|
||||
ACPI_INFO(("%u ACPI AML tables successfully acquired and loaded\n", tables_loaded));
|
||||
ACPI_INFO(("%u ACPI AML tables successfully acquired and loaded", tables_loaded));
|
||||
} else {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"%u table load failures, %u successful",
|
||||
|
@ -250,6 +250,10 @@ acpi_status acpi_tb_load_namespace(void)
|
|||
status = AE_CTRL_TERMINATE;
|
||||
}
|
||||
|
||||
#ifdef ACPI_APPLICATION
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, "\n"));
|
||||
#endif
|
||||
|
||||
unlock_and_exit:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
return_ACPI_STATUS(status);
|
||||
|
@ -326,10 +330,9 @@ acpi_status acpi_load_table(struct acpi_table_header *table)
|
|||
/* Install the table and load it into the namespace */
|
||||
|
||||
ACPI_INFO(("Host-directed Dynamic ACPI Table Load:"));
|
||||
status =
|
||||
acpi_tb_install_and_load_table(table, ACPI_PTR_TO_PHYSADDR(table),
|
||||
ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
|
||||
FALSE, &table_index);
|
||||
status = acpi_tb_install_and_load_table(ACPI_PTR_TO_PHYSADDR(table),
|
||||
ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL,
|
||||
FALSE, &table_index);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -405,37 +408,8 @@ acpi_status acpi_unload_parent_table(acpi_handle object)
|
|||
break;
|
||||
}
|
||||
|
||||
/* Ensure the table is actually loaded */
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
if (!acpi_tb_is_table_loaded(i)) {
|
||||
status = AE_NOT_EXIST;
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
break;
|
||||
}
|
||||
|
||||
/* Invoke table handler if present */
|
||||
|
||||
if (acpi_gbl_table_handler) {
|
||||
(void)acpi_gbl_table_handler(ACPI_TABLE_EVENT_UNLOAD,
|
||||
acpi_gbl_root_table_list.
|
||||
tables[i].pointer,
|
||||
acpi_gbl_table_handler_context);
|
||||
}
|
||||
|
||||
/*
|
||||
* Delete all namespace objects owned by this table. Note that
|
||||
* these objects can appear anywhere in the namespace by virtue
|
||||
* of the AML "Scope" operator. Thus, we need to track ownership
|
||||
* by an ID, not simply a position within the hierarchy.
|
||||
*/
|
||||
status = acpi_tb_delete_namespace_by_owner(i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
break;
|
||||
}
|
||||
|
||||
status = acpi_tb_release_owner_id(i);
|
||||
acpi_tb_set_table_loaded_flag(i, FALSE);
|
||||
status = acpi_tb_unload_table(i);
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "amlcode.h"
|
||||
|
||||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utdecode")
|
||||
|
@ -532,6 +533,54 @@ const char *acpi_ut_get_notify_name(u32 notify_value, acpi_object_type type)
|
|||
|
||||
return ("Hardware-Specific");
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_get_argument_type_name
|
||||
*
|
||||
* PARAMETERS: arg_type - an ARGP_* parser argument type
|
||||
*
|
||||
* RETURN: Decoded ARGP_* type
|
||||
*
|
||||
* DESCRIPTION: Decode an ARGP_* parser type, as defined in the amlcode.h file,
|
||||
* and used in the acopcode.h file. For example, ARGP_TERMARG.
|
||||
* Used for debug only.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static const char *acpi_gbl_argument_type[20] = {
|
||||
/* 00 */ "Unknown ARGP",
|
||||
/* 01 */ "ByteData",
|
||||
/* 02 */ "ByteList",
|
||||
/* 03 */ "CharList",
|
||||
/* 04 */ "DataObject",
|
||||
/* 05 */ "DataObjectList",
|
||||
/* 06 */ "DWordData",
|
||||
/* 07 */ "FieldList",
|
||||
/* 08 */ "Name",
|
||||
/* 09 */ "NameString",
|
||||
/* 0A */ "ObjectList",
|
||||
/* 0B */ "PackageLength",
|
||||
/* 0C */ "SuperName",
|
||||
/* 0D */ "Target",
|
||||
/* 0E */ "TermArg",
|
||||
/* 0F */ "TermList",
|
||||
/* 10 */ "WordData",
|
||||
/* 11 */ "QWordData",
|
||||
/* 12 */ "SimpleName",
|
||||
/* 13 */ "NameOrRef"
|
||||
};
|
||||
|
||||
const char *acpi_ut_get_argument_type_name(u32 arg_type)
|
||||
{
|
||||
|
||||
if (arg_type > ARGP_MAX) {
|
||||
return ("Unknown ARGP");
|
||||
}
|
||||
|
||||
return (acpi_gbl_argument_type[arg_type]);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
|
|
|
@ -146,7 +146,7 @@
|
|||
|
||||
/* Maximum number of While() loops before abort */
|
||||
|
||||
#define ACPI_MAX_LOOP_COUNT 0xFFFF
|
||||
#define ACPI_MAX_LOOP_COUNT 0x000FFFFF
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
|
||||
/* Current ACPICA subsystem version in YYYYMMDD format */
|
||||
|
||||
#define ACPI_CA_VERSION 0x20160831
|
||||
#define ACPI_CA_VERSION 0x20160930
|
||||
|
||||
#include <acpi/acconfig.h>
|
||||
#include <acpi/actypes.h>
|
||||
|
@ -258,6 +258,13 @@ ACPI_INIT_GLOBAL(u8, acpi_gbl_osi_data, 0);
|
|||
*/
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_reduced_hardware, FALSE);
|
||||
|
||||
/*
|
||||
* Maximum number of While() loop iterations before forced method abort.
|
||||
* This mechanism is intended to prevent infinite loops during interpreter
|
||||
* execution within a host kernel.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u32, acpi_gbl_max_loop_iterations, ACPI_MAX_LOOP_COUNT);
|
||||
|
||||
/*
|
||||
* This mechanism is used to trace a specified AML method. The method is
|
||||
* traced each time it is executed.
|
||||
|
|
|
@ -646,8 +646,12 @@ acpi_os_create_semaphore(u32 max_units,
|
|||
}
|
||||
#ifdef __APPLE__
|
||||
{
|
||||
char *semaphore_name = tmpnam(NULL);
|
||||
static int semaphore_count = 0;
|
||||
char semaphore_name[32];
|
||||
|
||||
snprintf(semaphore_name, sizeof(semaphore_name), "acpi_sem_%d",
|
||||
semaphore_count++);
|
||||
printf("%s\n", semaphore_name);
|
||||
sem =
|
||||
sem_open(semaphore_name, O_EXCL | O_CREAT, 0755,
|
||||
initial_units);
|
||||
|
@ -692,10 +696,15 @@ acpi_status acpi_os_delete_semaphore(acpi_handle handle)
|
|||
if (!sem) {
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
#ifdef __APPLE__
|
||||
if (sem_close(sem) == -1) {
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
#else
|
||||
if (sem_destroy(sem) == -1) {
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
#endif
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче