Merge branch 'acpica'

* acpica: (43 commits)
  ACPICA: Drop Linux-specific waking vector functions
  ACPICA: Update version to 20151218
  ACPICA: Add per-table execution of module-level code
  ACPICA: Add "root node" case to the ACPI name repair code
  ACPICA: Events: Introduce ACPI_REG_DISCONNECT invocation to acpi_ev_execute_reg_methods()
  ACPICA: Events: Enhance acpi_ev_execute_reg_method() to ensure no _REG evaluations can happen during OS early boot stages
  ACPICA: Events: Split acpi_ev_associate_reg_method() from region initialization code
  ACPICA: Events: Fix an issue that region object is re-attached to another scope when it is already attached
  ACPICA: Utilities: Reorder initialization code
  ACPICA: Events: Uses common_notify for address space handlers
  ACPICA: Events: Deploys acpi_ev_find_region_handler()
  ACPICA: Cleanup code related to the per-table module level improvement
  ACPICA: Update for CondRefOf and RefOf operators
  ACPICA: Update internal #defines for ObjectType operator. No functional change
  ACPICA: Update parameter type for ObjectType operator
  ACPICA: Parser: Fix for SuperName method invocation
  ACPICA: Parser: Add constants for internal namepath function
  ACPICA: iasl/Disassembler: Support ASL ElseIf operator
  ACPICA: Add new exception code, AE_IO_ERROR
  ACPICA: Tools: Add spacing and missing options in acpibin tool
  ...
This commit is contained in:
Rafael J. Wysocki
2016-01-12 01:09:14 +01:00
140 changed files with 2144 additions and 2231 deletions

View File

@@ -50,6 +50,7 @@ acpi-y += \
exdump.o \ exdump.o \
exfield.o \ exfield.o \
exfldio.o \ exfldio.o \
exmisc.o \
exmutex.o \ exmutex.o \
exnames.o \ exnames.o \
exoparg1.o \ exoparg1.o \
@@ -57,7 +58,6 @@ acpi-y += \
exoparg3.o \ exoparg3.o \
exoparg6.o \ exoparg6.o \
exprep.o \ exprep.o \
exmisc.o \
exregion.o \ exregion.o \
exresnte.o \ exresnte.o \
exresolv.o \ exresolv.o \
@@ -66,6 +66,7 @@ acpi-y += \
exstoren.o \ exstoren.o \
exstorob.o \ exstorob.o \
exsystem.o \ exsystem.o \
extrace.o \
exutils.o exutils.o
acpi-y += \ acpi-y += \
@@ -196,7 +197,6 @@ acpi-$(ACPI_FUTURE_USAGE) += \
dbfileio.o \ dbfileio.o \
dbtest.o \ dbtest.o \
utcache.o \ utcache.o \
utfileio.o \
utprint.o \ utprint.o \
uttrack.o \ uttrack.o \
utuuid.o utuuid.o

View File

@@ -44,6 +44,8 @@
#ifndef _ACAPPS #ifndef _ACAPPS
#define _ACAPPS #define _ACAPPS
#include <stdio.h>
/* Common info for tool signons */ /* Common info for tool signons */
#define ACPICA_NAME "Intel ACPI Component Architecture" #define ACPICA_NAME "Intel ACPI Component Architecture"
@@ -85,11 +87,40 @@
acpi_os_printf (description); acpi_os_printf (description);
#define ACPI_OPTION(name, description) \ #define ACPI_OPTION(name, description) \
acpi_os_printf (" %-18s%s\n", name, description); acpi_os_printf (" %-20s%s\n", name, description);
/* Check for unexpected exceptions */
#define ACPI_CHECK_STATUS(name, status, expected) \
if (status != expected) \
{ \
acpi_os_printf ("Unexpected %s from %s (%s-%d)\n", \
acpi_format_exception (status), #name, _acpi_module_name, __LINE__); \
}
/* Check for unexpected non-AE_OK errors */
#define ACPI_CHECK_OK(name, status) ACPI_CHECK_STATUS (name, status, AE_OK);
#define FILE_SUFFIX_DISASSEMBLY "dsl" #define FILE_SUFFIX_DISASSEMBLY "dsl"
#define FILE_SUFFIX_BINARY_TABLE ".dat" /* Needs the dot */ #define FILE_SUFFIX_BINARY_TABLE ".dat" /* Needs the dot */
/* acfileio */
acpi_status
ac_get_all_tables_from_file(char *filename,
u8 get_only_aml_tables,
struct acpi_new_table_desc **return_list_head);
u8 ac_is_file_binary(FILE * file);
acpi_status ac_validate_table_header(FILE * file, long table_offset);
/* Values for get_only_aml_tables */
#define ACPI_GET_ONLY_AML_TABLES TRUE
#define ACPI_GET_ALL_TABLES FALSE
/* /*
* getopt * getopt
*/ */
@@ -107,30 +138,6 @@ extern char *acpi_gbl_optarg;
*/ */
u32 cm_get_file_size(ACPI_FILE file); u32 cm_get_file_size(ACPI_FILE file);
#ifndef ACPI_DUMP_APP
/*
* adisasm
*/
acpi_status
ad_aml_disassemble(u8 out_to_file,
char *filename, char *prefix, char **out_filename);
void ad_print_statistics(void);
acpi_status ad_find_dsdt(u8 **dsdt_ptr, u32 *dsdt_length);
void ad_dump_tables(void);
acpi_status ad_get_local_tables(void);
acpi_status
ad_parse_table(struct acpi_table_header *table,
acpi_owner_id * owner_id, u8 load_table, u8 external);
acpi_status ad_display_tables(char *filename, struct acpi_table_header *table);
acpi_status ad_display_statistics(void);
/* /*
* adwalk * adwalk
*/ */
@@ -168,6 +175,5 @@ char *ad_generate_filename(char *prefix, char *table_id);
void void
ad_write_table(struct acpi_table_header *table, ad_write_table(struct acpi_table_header *table,
u32 length, char *table_name, char *oem_table_id); u32 length, char *table_name, char *oem_table_id);
#endif
#endif /* _ACAPPS */ #endif /* _ACAPPS */

View File

@@ -245,10 +245,7 @@ void acpi_db_open_debug_file(char *name);
acpi_status acpi_db_load_acpi_table(char *filename); acpi_status acpi_db_load_acpi_table(char *filename);
acpi_status acpi_status acpi_db_load_tables(struct acpi_new_table_desc *list_head);
acpi_db_get_table_from_file(char *filename,
struct acpi_table_header **table,
u8 must_be_aml_table);
/* /*
* dbhistry - debugger HISTORY command * dbhistry - debugger HISTORY command

View File

@@ -161,6 +161,11 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
/* /*
* evhandler - Address space handling * evhandler - Address space handling
*/ */
union acpi_operand_object *acpi_ev_find_region_handler(acpi_adr_space_type
space_id,
union acpi_operand_object
*handler_obj);
u8 u8
acpi_ev_has_default_handler(struct acpi_namespace_node *node, acpi_ev_has_default_handler(struct acpi_namespace_node *node,
acpi_adr_space_type space_id); acpi_adr_space_type space_id);
@@ -193,9 +198,11 @@ void
acpi_ev_detach_region(union acpi_operand_object *region_obj, acpi_ev_detach_region(union acpi_operand_object *region_obj,
u8 acpi_ns_is_locked); u8 acpi_ns_is_locked);
acpi_status void acpi_ev_associate_reg_method(union acpi_operand_object *region_obj);
void
acpi_ev_execute_reg_methods(struct acpi_namespace_node *node, acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
acpi_adr_space_type space_id); acpi_adr_space_type space_id, u32 function);
acpi_status acpi_status
acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function); acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function);

View File

@@ -145,6 +145,7 @@ ACPI_GLOBAL(acpi_cache_t *, acpi_gbl_operand_cache);
ACPI_INIT_GLOBAL(u32, acpi_gbl_startup_flags, 0); ACPI_INIT_GLOBAL(u32, acpi_gbl_startup_flags, 0);
ACPI_INIT_GLOBAL(u8, acpi_gbl_shutdown, TRUE); ACPI_INIT_GLOBAL(u8, acpi_gbl_shutdown, TRUE);
ACPI_INIT_GLOBAL(u8, acpi_gbl_early_initialization, TRUE);
/* Global handlers */ /* Global handlers */
@@ -164,7 +165,7 @@ ACPI_GLOBAL(u8, acpi_gbl_next_owner_id_offset);
/* Initialization sequencing */ /* Initialization sequencing */
ACPI_GLOBAL(u8, acpi_gbl_reg_methods_executed); ACPI_INIT_GLOBAL(u8, acpi_gbl_reg_methods_enabled, FALSE);
/* Misc */ /* Misc */

View File

@@ -219,6 +219,13 @@ struct acpi_table_list {
#define ACPI_ROOT_ORIGIN_ALLOCATED (1) #define ACPI_ROOT_ORIGIN_ALLOCATED (1)
#define ACPI_ROOT_ALLOW_RESIZE (2) #define ACPI_ROOT_ALLOW_RESIZE (2)
/* List to manage incoming ACPI tables */
struct acpi_new_table_desc {
struct acpi_table_header *table;
struct acpi_new_table_desc *next;
};
/* Predefined table indexes */ /* Predefined table indexes */
#define ACPI_INVALID_TABLE_INDEX (0xFFFFFFFF) #define ACPI_INVALID_TABLE_INDEX (0xFFFFFFFF)
@@ -388,7 +395,8 @@ union acpi_predefined_info {
/* Return object auto-repair info */ /* Return object auto-repair info */
typedef acpi_status(*acpi_object_converter) (union acpi_operand_object typedef acpi_status(*acpi_object_converter) (struct acpi_namespace_node * scope,
union acpi_operand_object
*original_object, *original_object,
union acpi_operand_object union acpi_operand_object
**converted_object); **converted_object);
@@ -420,6 +428,7 @@ struct acpi_simple_repair_info {
struct acpi_reg_walk_info { struct acpi_reg_walk_info {
acpi_adr_space_type space_id; acpi_adr_space_type space_id;
u32 function;
u32 reg_run_count; u32 reg_run_count;
}; };
@@ -861,6 +870,7 @@ struct acpi_parse_state {
#define ACPI_PARSEOP_CLOSING_PAREN 0x10 #define ACPI_PARSEOP_CLOSING_PAREN 0x10
#define ACPI_PARSEOP_COMPOUND 0x20 #define ACPI_PARSEOP_COMPOUND 0x20
#define ACPI_PARSEOP_ASSIGNMENT 0x40 #define ACPI_PARSEOP_ASSIGNMENT 0x40
#define ACPI_PARSEOP_ELSEIF 0x80
/***************************************************************************** /*****************************************************************************
* *

View File

@@ -77,6 +77,7 @@
/* Object is not a package element */ /* Object is not a package element */
#define ACPI_NOT_PACKAGE_ELEMENT ACPI_UINT32_MAX #define ACPI_NOT_PACKAGE_ELEMENT ACPI_UINT32_MAX
#define ACPI_ALL_PACKAGE_ELEMENTS (ACPI_UINT32_MAX-1)
/* Always emit warning message, not dependent on node flags */ /* Always emit warning message, not dependent on node flags */
@@ -183,11 +184,18 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
union acpi_operand_object **return_object); union acpi_operand_object **return_object);
acpi_status acpi_status
acpi_ns_convert_to_unicode(union acpi_operand_object *original_object, acpi_ns_convert_to_unicode(struct acpi_namespace_node *scope,
union acpi_operand_object *original_object,
union acpi_operand_object **return_object); union acpi_operand_object **return_object);
acpi_status acpi_status
acpi_ns_convert_to_resource(union acpi_operand_object *original_object, acpi_ns_convert_to_resource(struct acpi_namespace_node *scope,
union acpi_operand_object *original_object,
union acpi_operand_object **return_object);
acpi_status
acpi_ns_convert_to_reference(struct acpi_namespace_node *scope,
union acpi_operand_object *original_object,
union acpi_operand_object **return_object); union acpi_operand_object **return_object);
/* /*

View File

@@ -93,9 +93,10 @@
#define AOPOBJ_AML_CONSTANT 0x01 /* Integer is an AML constant */ #define AOPOBJ_AML_CONSTANT 0x01 /* Integer is an AML constant */
#define AOPOBJ_STATIC_POINTER 0x02 /* Data is part of an ACPI table, don't delete */ #define AOPOBJ_STATIC_POINTER 0x02 /* Data is part of an ACPI table, don't delete */
#define AOPOBJ_DATA_VALID 0x04 /* Object is initialized and data is valid */ #define AOPOBJ_DATA_VALID 0x04 /* Object is initialized and data is valid */
#define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized, _REG was run */ #define AOPOBJ_OBJECT_INITIALIZED 0x08 /* Region is initialized */
#define AOPOBJ_SETUP_COMPLETE 0x10 /* Region setup is complete */ #define AOPOBJ_REG_CONNECTED 0x10 /* _REG was run */
#define AOPOBJ_INVALID 0x20 /* Host OS won't allow a Region address */ #define AOPOBJ_SETUP_COMPLETE 0x20 /* Region setup is complete */
#define AOPOBJ_INVALID 0x40 /* Host OS won't allow a Region address */
/****************************************************************************** /******************************************************************************
* *

View File

@@ -92,7 +92,7 @@
#define ARGP_BYTELIST_OP ARGP_LIST1 (ARGP_NAMESTRING) #define ARGP_BYTELIST_OP ARGP_LIST1 (ARGP_NAMESTRING)
#define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
#define ARGP_CONCAT_RES_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_CONCAT_RES_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
#define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SUPERNAME) #define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_NAME_OR_REF,ARGP_TARGET)
#define ARGP_CONNECTFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) #define ARGP_CONNECTFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING)
#define ARGP_CONTINUE_OP ARG_NONE #define ARGP_CONTINUE_OP ARG_NONE
#define ARGP_COPY_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SIMPLENAME) #define ARGP_COPY_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SIMPLENAME)
@@ -152,13 +152,14 @@
#define ARGP_NAMEPATH_OP ARGP_LIST1 (ARGP_NAMESTRING) #define ARGP_NAMEPATH_OP ARGP_LIST1 (ARGP_NAMESTRING)
#define ARGP_NOOP_OP ARG_NONE #define ARGP_NOOP_OP ARG_NONE
#define ARGP_NOTIFY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) #define ARGP_NOTIFY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG)
#define ARGP_OBJECT_TYPE_OP ARGP_LIST1 (ARGP_NAME_OR_REF)
#define ARGP_ONE_OP ARG_NONE #define ARGP_ONE_OP ARG_NONE
#define ARGP_ONES_OP ARG_NONE #define ARGP_ONES_OP ARG_NONE
#define ARGP_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST) #define ARGP_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST)
#define ARGP_POWER_RES_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_WORDDATA, ARGP_OBJLIST) #define ARGP_POWER_RES_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_WORDDATA, ARGP_OBJLIST)
#define ARGP_PROCESSOR_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_BYTEDATA, ARGP_OBJLIST) #define ARGP_PROCESSOR_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_BYTEDATA, ARGP_OBJLIST)
#define ARGP_QWORD_OP ARGP_LIST1 (ARGP_QWORDDATA) #define ARGP_QWORD_OP ARGP_LIST1 (ARGP_QWORDDATA)
#define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_SUPERNAME) #define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_NAME_OR_REF)
#define ARGP_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG) #define ARGP_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG)
#define ARGP_RELEASE_OP ARGP_LIST1 (ARGP_SUPERNAME) #define ARGP_RELEASE_OP ARGP_LIST1 (ARGP_SUPERNAME)
#define ARGP_RESERVEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING) #define ARGP_RESERVEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING)
@@ -185,7 +186,6 @@
#define ARGP_TO_HEX_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) #define ARGP_TO_HEX_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
#define ARGP_TO_INTEGER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET) #define ARGP_TO_INTEGER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
#define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET) #define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
#define ARGP_TYPE_OP ARGP_LIST1 (ARGP_SUPERNAME)
#define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME) #define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME)
#define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_DATAOBJLIST) #define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_DATAOBJLIST)
#define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG) #define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG)
@@ -223,7 +223,7 @@
#define ARGI_BUFFER_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_BUFFER_OP ARGI_LIST1 (ARGI_INTEGER)
#define ARGI_BYTE_OP ARGI_INVALID_OPCODE #define ARGI_BYTE_OP ARGI_INVALID_OPCODE
#define ARGI_BYTELIST_OP ARGI_INVALID_OPCODE #define ARGI_BYTELIST_OP ARGI_INVALID_OPCODE
#define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA, ARGI_TARGETREF) #define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_ANYTYPE, ARGI_ANYTYPE, ARGI_TARGETREF)
#define ARGI_CONCAT_RES_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_BUFFER, ARGI_TARGETREF) #define ARGI_CONCAT_RES_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_BUFFER, ARGI_TARGETREF)
#define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF) #define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF)
#define ARGI_CONNECTFIELD_OP ARGI_INVALID_OPCODE #define ARGI_CONNECTFIELD_OP ARGI_INVALID_OPCODE
@@ -285,6 +285,7 @@
#define ARGI_NAMEPATH_OP ARGI_INVALID_OPCODE #define ARGI_NAMEPATH_OP ARGI_INVALID_OPCODE
#define ARGI_NOOP_OP ARG_NONE #define ARGI_NOOP_OP ARG_NONE
#define ARGI_NOTIFY_OP ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER) #define ARGI_NOTIFY_OP ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER)
#define ARGI_OBJECT_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE)
#define ARGI_ONE_OP ARG_NONE #define ARGI_ONE_OP ARG_NONE
#define ARGI_ONES_OP ARG_NONE #define ARGI_ONES_OP ARG_NONE
#define ARGI_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER)
@@ -318,7 +319,6 @@
#define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) #define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
#define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET) #define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
#define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET) #define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET)
#define ARGI_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE)
#define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE) #define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE)
#define ARGI_VAR_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER) #define ARGI_VAR_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER)
#define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER) #define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER)

View File

@@ -92,7 +92,13 @@ acpi_ps_get_next_simple_arg(struct acpi_parse_state *parser_state,
acpi_status acpi_status
acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state, acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state,
struct acpi_parse_state *parser_state, struct acpi_parse_state *parser_state,
union acpi_parse_object *arg, u8 method_call); union acpi_parse_object *arg,
u8 possible_method_call);
/* Values for u8 above */
#define ACPI_NOT_METHOD_CALL FALSE
#define ACPI_POSSIBLE_METHOD_CALL TRUE
acpi_status acpi_status
acpi_ps_get_next_arg(struct acpi_walk_state *walk_state, acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,

View File

@@ -184,24 +184,24 @@ acpi_status acpi_ut_init_globals(void);
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER) #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
char *acpi_ut_get_mutex_name(u32 mutex_id); const char *acpi_ut_get_mutex_name(u32 mutex_id);
const char *acpi_ut_get_notify_name(u32 notify_value, acpi_object_type type); const char *acpi_ut_get_notify_name(u32 notify_value, acpi_object_type type);
#endif #endif
char *acpi_ut_get_type_name(acpi_object_type type); const char *acpi_ut_get_type_name(acpi_object_type type);
char *acpi_ut_get_node_name(void *object); const char *acpi_ut_get_node_name(void *object);
char *acpi_ut_get_descriptor_name(void *object); const char *acpi_ut_get_descriptor_name(void *object);
const char *acpi_ut_get_reference_name(union acpi_operand_object *object); const char *acpi_ut_get_reference_name(union acpi_operand_object *object);
char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc); const char *acpi_ut_get_object_type_name(union acpi_operand_object *obj_desc);
char *acpi_ut_get_region_name(u8 space_id); const char *acpi_ut_get_region_name(u8 space_id);
char *acpi_ut_get_event_name(u32 event_id); const char *acpi_ut_get_event_name(u32 event_id);
char acpi_ut_hex_to_ascii_char(u64 integer, u32 position); char acpi_ut_hex_to_ascii_char(u64 integer, u32 position);
@@ -352,14 +352,6 @@ acpi_ut_execute_power_methods(struct acpi_namespace_node *device_node,
const char **method_names, const char **method_names,
u8 method_count, u8 *out_values); u8 method_count, u8 *out_values);
/*
* utfileio - file operations
*/
#ifdef ACPI_APPLICATION
acpi_status
acpi_ut_read_table_from_file(char *filename, struct acpi_table_header **table);
#endif
/* /*
* utids - device ID support * utids - device ID support
*/ */
@@ -371,10 +363,6 @@ acpi_status
acpi_ut_execute_UID(struct acpi_namespace_node *device_node, acpi_ut_execute_UID(struct acpi_namespace_node *device_node,
struct acpi_pnp_device_id ** return_id); struct acpi_pnp_device_id ** return_id);
acpi_status
acpi_ut_execute_SUB(struct acpi_namespace_node *device_node,
struct acpi_pnp_device_id **return_id);
acpi_status acpi_status
acpi_ut_execute_CID(struct acpi_namespace_node *device_node, acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
struct acpi_pnp_device_id_list ** return_cid_list); struct acpi_pnp_device_id_list ** return_cid_list);

View File

@@ -120,7 +120,7 @@
#define AML_CREATE_WORD_FIELD_OP (u16) 0x8b #define AML_CREATE_WORD_FIELD_OP (u16) 0x8b
#define AML_CREATE_BYTE_FIELD_OP (u16) 0x8c #define AML_CREATE_BYTE_FIELD_OP (u16) 0x8c
#define AML_CREATE_BIT_FIELD_OP (u16) 0x8d #define AML_CREATE_BIT_FIELD_OP (u16) 0x8d
#define AML_TYPE_OP (u16) 0x8e #define AML_OBJECT_TYPE_OP (u16) 0x8e
#define AML_CREATE_QWORD_FIELD_OP (u16) 0x8f /* ACPI 2.0 */ #define AML_CREATE_QWORD_FIELD_OP (u16) 0x8f /* ACPI 2.0 */
#define AML_LAND_OP (u16) 0x90 #define AML_LAND_OP (u16) 0x90
#define AML_LOR_OP (u16) 0x91 #define AML_LOR_OP (u16) 0x91
@@ -238,7 +238,8 @@
#define ARGP_TERMLIST 0x0F #define ARGP_TERMLIST 0x0F
#define ARGP_WORDDATA 0x10 #define ARGP_WORDDATA 0x10
#define ARGP_QWORDDATA 0x11 #define ARGP_QWORDDATA 0x11
#define ARGP_SIMPLENAME 0x12 #define ARGP_SIMPLENAME 0x12 /* name_string | local_term | arg_term */
#define ARGP_NAME_OR_REF 0x13 /* For object_type only */
/* /*
* Resolved argument types for the AML Interpreter * Resolved argument types for the AML Interpreter

View File

@@ -798,7 +798,7 @@ acpi_db_device_resources(acpi_handle obj_handle,
acpi_status status; acpi_status status;
node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_handle); node = ACPI_CAST_PTR(struct acpi_namespace_node, obj_handle);
parent_path = acpi_ns_get_external_pathname(node); parent_path = acpi_ns_get_normalized_pathname(node, TRUE);
if (!parent_path) { if (!parent_path) {
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
} }
@@ -1131,13 +1131,8 @@ void acpi_db_trace(char *enable_arg, char *method_arg, char *once_arg)
u32 debug_layer = 0; u32 debug_layer = 0;
u32 flags = 0; u32 flags = 0;
if (enable_arg) {
acpi_ut_strupr(enable_arg); acpi_ut_strupr(enable_arg);
}
if (once_arg) {
acpi_ut_strupr(once_arg); acpi_ut_strupr(once_arg);
}
if (method_arg) { if (method_arg) {
if (acpi_db_trace_method_name) { if (acpi_db_trace_method_name) {

View File

@@ -48,6 +48,7 @@
#include "acnamesp.h" #include "acnamesp.h"
#include "acparser.h" #include "acparser.h"
#include "acinterp.h" #include "acinterp.h"
#include "acevents.h"
#include "acdebug.h" #include "acdebug.h"
#define _COMPONENT ACPI_CA_DEBUGGER #define _COMPONENT ACPI_CA_DEBUGGER
@@ -588,7 +589,7 @@ void acpi_db_display_calling_tree(void)
* *
* FUNCTION: acpi_db_display_object_type * FUNCTION: acpi_db_display_object_type
* *
* PARAMETERS: name - User entered NS node handle or name * PARAMETERS: object_arg - User entered NS node handle
* *
* RETURN: None * RETURN: None
* *
@@ -596,44 +597,34 @@ void acpi_db_display_calling_tree(void)
* *
******************************************************************************/ ******************************************************************************/
void acpi_db_display_object_type(char *name) void acpi_db_display_object_type(char *object_arg)
{ {
struct acpi_namespace_node *node; acpi_handle handle;
struct acpi_device_info *info; struct acpi_device_info *info;
acpi_status status; acpi_status status;
u32 i; u32 i;
node = acpi_db_convert_to_node(name); handle = ACPI_TO_POINTER(strtoul(object_arg, NULL, 16));
if (!node) {
return;
}
status = acpi_get_object_info(ACPI_CAST_PTR(acpi_handle, node), &info); status = acpi_get_object_info(handle, &info);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
acpi_os_printf("Could not get object info, %s\n", acpi_os_printf("Could not get object info, %s\n",
acpi_format_exception(status)); acpi_format_exception(status));
return; return;
} }
if (info->valid & ACPI_VALID_ADR) {
acpi_os_printf("ADR: %8.8X%8.8X, STA: %8.8X, Flags: %X\n", acpi_os_printf("ADR: %8.8X%8.8X, STA: %8.8X, Flags: %X\n",
ACPI_FORMAT_UINT64(info->address), ACPI_FORMAT_UINT64(info->address),
info->current_status, info->flags); info->current_status, info->flags);
}
if (info->valid & ACPI_VALID_SXDS) {
acpi_os_printf("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n", acpi_os_printf("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n",
info->highest_dstates[0], info->highest_dstates[0], info->highest_dstates[1],
info->highest_dstates[1], info->highest_dstates[2], info->highest_dstates[3]);
info->highest_dstates[2],
info->highest_dstates[3]); acpi_os_printf("S0W-%2.2X S1W-%2.2X S2W-%2.2X S3W-%2.2X S4W-%2.2X\n",
}
if (info->valid & ACPI_VALID_SXWS) {
acpi_os_printf
("S0W-%2.2X S1W-%2.2X S2W-%2.2X S3W-%2.2X S4W-%2.2X\n",
info->lowest_dstates[0], info->lowest_dstates[1], info->lowest_dstates[0], info->lowest_dstates[1],
info->lowest_dstates[2], info->lowest_dstates[3], info->lowest_dstates[2], info->lowest_dstates[3],
info->lowest_dstates[4]); info->lowest_dstates[4]);
}
if (info->valid & ACPI_VALID_HID) { if (info->valid & ACPI_VALID_HID) {
acpi_os_printf("HID: %s\n", info->hardware_id.string); acpi_os_printf("HID: %s\n", info->hardware_id.string);
@@ -643,10 +634,6 @@ void acpi_db_display_object_type(char *name)
acpi_os_printf("UID: %s\n", info->unique_id.string); acpi_os_printf("UID: %s\n", info->unique_id.string);
} }
if (info->valid & ACPI_VALID_SUB) {
acpi_os_printf("SUB: %s\n", info->subsystem_id.string);
}
if (info->valid & ACPI_VALID_CID) { if (info->valid & ACPI_VALID_CID) {
for (i = 0; i < info->compatible_id_list.count; i++) { for (i = 0; i < info->compatible_id_list.count; i++) {
acpi_os_printf("CID %u: %s\n", i, acpi_os_printf("CID %u: %s\n", i,
@@ -963,17 +950,17 @@ void acpi_db_display_handlers(void)
if (obj_desc) { if (obj_desc) {
for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_gbl_space_id_list); i++) { for (i = 0; i < ACPI_ARRAY_LENGTH(acpi_gbl_space_id_list); i++) {
space_id = acpi_gbl_space_id_list[i]; space_id = acpi_gbl_space_id_list[i];
handler_obj = obj_desc->device.handler;
acpi_os_printf(ACPI_PREDEFINED_PREFIX, acpi_os_printf(ACPI_PREDEFINED_PREFIX,
acpi_ut_get_region_name((u8)space_id), acpi_ut_get_region_name((u8)space_id),
space_id); space_id);
while (handler_obj) { handler_obj =
if (acpi_gbl_space_id_list[i] == acpi_ev_find_region_handler(space_id,
handler_obj->address_space.space_id) { obj_desc->common_notify.
acpi_os_printf handler);
(ACPI_HANDLER_PRESENT_STRING, if (handler_obj) {
acpi_os_printf(ACPI_HANDLER_PRESENT_STRING,
(handler_obj->address_space. (handler_obj->address_space.
handler_flags & handler_flags &
ACPI_ADDR_HANDLER_DEFAULT_INSTALLED) ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)
@@ -984,9 +971,6 @@ void acpi_db_display_handlers(void)
goto found_handler; goto found_handler;
} }
handler_obj = handler_obj->address_space.next;
}
/* There is no handler for this space_id */ /* There is no handler for this space_id */
acpi_os_printf("None\n"); acpi_os_printf("None\n");
@@ -996,7 +980,7 @@ found_handler: ;
/* Find all handlers for user-defined space_IDs */ /* Find all handlers for user-defined space_IDs */
handler_obj = obj_desc->device.handler; handler_obj = obj_desc->common_notify.handler;
while (handler_obj) { while (handler_obj) {
if (handler_obj->address_space.space_id >= if (handler_obj->address_space.space_id >=
ACPI_USER_REGION_BEGIN) { ACPI_USER_REGION_BEGIN) {
@@ -1091,14 +1075,14 @@ acpi_db_display_non_root_handlers(acpi_handle obj_handle,
return (AE_OK); return (AE_OK);
} }
pathname = acpi_ns_get_external_pathname(node); pathname = acpi_ns_get_normalized_pathname(node, TRUE);
if (!pathname) { if (!pathname) {
return (AE_OK); return (AE_OK);
} }
/* Display all handlers associated with this device */ /* Display all handlers associated with this device */
handler_obj = obj_desc->device.handler; handler_obj = obj_desc->common_notify.handler;
while (handler_obj) { while (handler_obj) {
acpi_os_printf(ACPI_PREDEFINED_PREFIX, acpi_os_printf(ACPI_PREDEFINED_PREFIX,
acpi_ut_get_region_name((u8)handler_obj-> acpi_ut_get_region_name((u8)handler_obj->

View File

@@ -46,6 +46,10 @@
#include "accommon.h" #include "accommon.h"
#include "acdebug.h" #include "acdebug.h"
#include "actables.h" #include "actables.h"
#include <stdio.h>
#ifdef ACPI_APPLICATION
#include "acapps.h"
#endif
#define _COMPONENT ACPI_CA_DEBUGGER #define _COMPONENT ACPI_CA_DEBUGGER
ACPI_MODULE_NAME("dbfileio") ACPI_MODULE_NAME("dbfileio")
@@ -110,122 +114,31 @@ void acpi_db_open_debug_file(char *name)
} }
#endif #endif
#ifdef ACPI_APPLICATION
#include "acapps.h"
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: ae_local_load_table * FUNCTION: acpi_db_load_tables
* *
* PARAMETERS: table - pointer to a buffer containing the entire * PARAMETERS: list_head - List of ACPI tables to load
* table to be loaded
* *
* RETURN: Status * RETURN: Status
* *
* DESCRIPTION: This function is called to load a table from the caller's * DESCRIPTION: Load ACPI tables from a previously constructed table list.
* buffer. The buffer must contain an entire ACPI Table including
* a valid header. The header fields will be verified, and if it
* is determined that the table is invalid, the call will fail.
* *
******************************************************************************/ ******************************************************************************/
static acpi_status ae_local_load_table(struct acpi_table_header *table) acpi_status acpi_db_load_tables(struct acpi_new_table_desc *list_head)
{ {
acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE(ae_local_load_table);
#if 0
/* struct acpi_table_desc table_info; */
if (!table) {
return_ACPI_STATUS(AE_BAD_PARAMETER);
}
table_info.pointer = table;
status = acpi_tb_recognize_table(&table_info, ACPI_TABLE_ALL);
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
/* Install the new table into the local data structures */
status = acpi_tb_init_table_descriptor(&table_info);
if (ACPI_FAILURE(status)) {
if (status == AE_ALREADY_EXISTS) {
/* Table already exists, no error */
status = AE_OK;
}
/* Free table allocated by acpi_tb_get_table */
acpi_tb_delete_single_table(&table_info);
return_ACPI_STATUS(status);
}
#if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))
status =
acpi_ns_load_table(table_info.installed_desc, acpi_gbl_root_node);
if (ACPI_FAILURE(status)) {
/* Uninstall table and free the buffer */
acpi_tb_delete_tables_by_type(ACPI_TABLE_ID_DSDT);
return_ACPI_STATUS(status);
}
#endif
#endif
return_ACPI_STATUS(status);
}
#endif
/*******************************************************************************
*
* FUNCTION: acpi_db_get_table_from_file
*
* PARAMETERS: filename - File where table is located
* return_table - Where a pointer to the table is returned
*
* RETURN: Status
*
* DESCRIPTION: Load an ACPI table from a file
*
******************************************************************************/
acpi_status
acpi_db_get_table_from_file(char *filename,
struct acpi_table_header **return_table,
u8 must_be_aml_file)
{
#ifdef ACPI_APPLICATION
acpi_status status; acpi_status status;
struct acpi_new_table_desc *table_list_head;
struct acpi_table_header *table; struct acpi_table_header *table;
u8 is_aml_table = TRUE;
status = acpi_ut_read_table_from_file(filename, &table); /* Load all ACPI tables in the list */
if (ACPI_FAILURE(status)) {
return (status);
}
if (must_be_aml_file) { table_list_head = list_head;
is_aml_table = acpi_ut_is_aml_table(table); while (table_list_head) {
if (!is_aml_table) { table = table_list_head->table;
ACPI_EXCEPTION((AE_INFO, AE_OK,
"Input for -e is not an AML table: "
"\"%4.4s\" (must be DSDT/SSDT)",
table->signature));
return (AE_TYPE);
}
}
if (is_aml_table) { status = acpi_load_table(table);
/* Attempt to recognize and install the table */
status = ae_local_load_table(table);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
if (status == AE_ALREADY_EXISTS) { if (status == AE_ALREADY_EXISTS) {
acpi_os_printf acpi_os_printf
@@ -239,18 +152,12 @@ acpi_db_get_table_from_file(char *filename,
return (status); return (status);
} }
acpi_tb_print_table_header(0, table);
fprintf(stderr, fprintf(stderr,
"Acpi table [%4.4s] successfully installed and loaded\n", "Acpi table [%4.4s] successfully installed and loaded\n",
table->signature); table->signature);
table_list_head = table_list_head->next;
} }
acpi_gbl_acpi_hardware_present = FALSE;
if (return_table) {
*return_table = table;
}
#endif /* ACPI_APPLICATION */
return (AE_OK); return (AE_OK);
} }

View File

@@ -45,6 +45,10 @@
#include "accommon.h" #include "accommon.h"
#include "acdebug.h" #include "acdebug.h"
#ifdef ACPI_APPLICATION
#include "acapps.h"
#endif
#define _COMPONENT ACPI_CA_DEBUGGER #define _COMPONENT ACPI_CA_DEBUGGER
ACPI_MODULE_NAME("dbinput") ACPI_MODULE_NAME("dbinput")
@@ -621,9 +625,7 @@ static u32 acpi_db_get_line(char *input_buffer)
/* Uppercase the actual command */ /* Uppercase the actual command */
if (acpi_gbl_db_args[0]) {
acpi_ut_strupr(acpi_gbl_db_args[0]); acpi_ut_strupr(acpi_gbl_db_args[0]);
}
count = i; count = i;
if (count) { if (count) {
@@ -1048,11 +1050,17 @@ acpi_db_command_dispatch(char *input_buffer,
acpi_db_close_debug_file(); acpi_db_close_debug_file();
break; break;
case CMD_LOAD: case CMD_LOAD:{
struct acpi_new_table_desc *list_head = NULL;
status = status =
acpi_db_get_table_from_file(acpi_gbl_db_args[1], NULL, ac_get_all_tables_from_file(acpi_gbl_db_args[1],
FALSE); ACPI_GET_ALL_TABLES,
&list_head);
if (ACPI_SUCCESS(status)) {
acpi_db_load_tables(list_head);
}
}
break; break;
case CMD_OPEN: case CMD_OPEN:

View File

@@ -438,7 +438,7 @@ acpi_db_walk_for_predefined_names(acpi_handle obj_handle,
return (AE_OK); return (AE_OK);
} }
pathname = acpi_ns_get_external_pathname(node); pathname = acpi_ns_get_normalized_pathname(node, TRUE);
if (!pathname) { if (!pathname) {
return (AE_OK); return (AE_OK);
} }

View File

@@ -382,6 +382,7 @@ acpi_status acpi_db_display_statistics(char *type_arg)
acpi_gbl_node_type_count[i], acpi_gbl_node_type_count[i],
acpi_gbl_obj_type_count[i]); acpi_gbl_obj_type_count[i]);
} }
acpi_os_printf("%16.16s % 10ld% 10ld\n", "Misc/Unknown", acpi_os_printf("%16.16s % 10ld% 10ld\n", "Misc/Unknown",
acpi_gbl_node_type_count_misc, acpi_gbl_node_type_count_misc,
acpi_gbl_obj_type_count_misc); acpi_gbl_obj_type_count_misc);

View File

@@ -953,7 +953,7 @@ acpi_db_evaluate_one_predefined_name(acpi_handle obj_handle,
return (AE_OK); return (AE_OK);
} }
pathname = acpi_ns_get_external_pathname(node); pathname = acpi_ns_get_normalized_pathname(node, TRUE);
if (!pathname) { if (!pathname) {
return (AE_OK); return (AE_OK);
} }

View File

@@ -173,6 +173,7 @@ void acpi_db_dump_external_object(union acpi_object *obj_desc, u32 level)
if (obj_desc->buffer.length > 16) { if (obj_desc->buffer.length > 16) {
acpi_os_printf("\n"); acpi_os_printf("\n");
} }
acpi_ut_debug_dump_buffer(ACPI_CAST_PTR acpi_ut_debug_dump_buffer(ACPI_CAST_PTR
(u8, (u8,
obj_desc->buffer.pointer), obj_desc->buffer.pointer),

View File

@@ -194,8 +194,8 @@ acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc)
extra_desc = acpi_ns_get_secondary_object(obj_desc); extra_desc = acpi_ns_get_secondary_object(obj_desc);
node = obj_desc->buffer_field.node; node = obj_desc->buffer_field.node;
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname(ACPI_TYPE_BUFFER_FIELD, ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
node, NULL)); (ACPI_TYPE_BUFFER_FIELD, node, NULL));
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n", ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n",
acpi_ut_get_node_name(node))); acpi_ut_get_node_name(node)));
@@ -385,7 +385,8 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc)
ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
(ACPI_TYPE_REGION, node, NULL)); (ACPI_TYPE_REGION, node, NULL));
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] OpRegion Arg Init at AML %p\n", ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"[%4.4s] OpRegion Arg Init at AML %p\n",
acpi_ut_get_node_name(node), acpi_ut_get_node_name(node),
extra_desc->extra.aml_start)); extra_desc->extra.aml_start));

View File

@@ -161,6 +161,7 @@ acpi_ds_dump_method_stack(acpi_status status,
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"\n**** Exception %s during execution of method ", "\n**** Exception %s during execution of method ",
acpi_format_exception(status))); acpi_format_exception(status)));
acpi_ds_print_node_pathname(walk_state->method_node, NULL); acpi_ds_print_node_pathname(walk_state->method_node, NULL);
/* Display stack of executing methods */ /* Display stack of executing methods */
@@ -203,8 +204,8 @@ acpi_ds_dump_method_stack(acpi_status status,
} else { } else {
/* /*
* This method has called another method * This method has called another method
* NOTE: the method call parse subtree is already deleted at this * NOTE: the method call parse subtree is already deleted at
* point, so we cannot disassemble the method invocation. * this point, so we cannot disassemble the method invocation.
*/ */
ACPI_DEBUG_PRINT_RAW((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT_RAW((ACPI_DB_DISPATCH,
"Call to method ")); "Call to method "));

View File

@@ -106,6 +106,7 @@ acpi_ds_create_external_region(acpi_status lookup_status,
* insert the name into the namespace. * insert the name into the namespace.
*/ */
acpi_dm_add_op_to_external_list(op, path, ACPI_TYPE_REGION, 0, 0); acpi_dm_add_op_to_external_list(op, path, ACPI_TYPE_REGION, 0, 0);
status = acpi_ns_lookup(walk_state->scope_info, path, ACPI_TYPE_REGION, status = acpi_ns_lookup(walk_state->scope_info, path, ACPI_TYPE_REGION,
ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT, ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT,
walk_state, node); walk_state, node);
@@ -202,11 +203,10 @@ acpi_ds_create_buffer_field(union acpi_parse_object *op,
/* Enter the name_string into the namespace */ /* Enter the name_string into the namespace */
status = status = acpi_ns_lookup(walk_state->scope_info,
acpi_ns_lookup(walk_state->scope_info,
arg->common.value.string, ACPI_TYPE_ANY, arg->common.value.string, ACPI_TYPE_ANY,
ACPI_IMODE_LOAD_PASS1, flags, walk_state, ACPI_IMODE_LOAD_PASS1, flags,
&node); walk_state, &node);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_ERROR_NAMESPACE(arg->common.value.string, status); ACPI_ERROR_NAMESPACE(arg->common.value.string, status);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
@@ -244,8 +244,8 @@ acpi_ds_create_buffer_field(union acpi_parse_object *op,
} }
/* /*
* Remember location in AML stream of the field unit opcode and operands -- * Remember location in AML stream of the field unit opcode and operands
* since the buffer and index operands must be evaluated. * -- since the buffer and index operands must be evaluated.
*/ */
second_desc = obj_desc->common.next_object; second_desc = obj_desc->common.next_object;
second_desc->extra.aml_start = op->named.data; second_desc->extra.aml_start = op->named.data;
@@ -310,8 +310,8 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
switch (arg->common.aml_opcode) { switch (arg->common.aml_opcode) {
case AML_INT_RESERVEDFIELD_OP: case AML_INT_RESERVEDFIELD_OP:
position = (u64) info->field_bit_position position = (u64)info->field_bit_position +
+ (u64) arg->common.value.size; (u64)arg->common.value.size;
if (position > ACPI_UINT32_MAX) { if (position > ACPI_UINT32_MAX) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
@@ -344,13 +344,13 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
/* access_attribute (attrib_quick, attrib_byte, etc.) */ /* access_attribute (attrib_quick, attrib_byte, etc.) */
info->attribute = info->attribute = (u8)
(u8)((arg->common.value.integer >> 8) & 0xFF); ((arg->common.value.integer >> 8) & 0xFF);
/* access_length (for serial/buffer protocols) */ /* access_length (for serial/buffer protocols) */
info->access_length = info->access_length = (u8)
(u8)((arg->common.value.integer >> 16) & 0xFF); ((arg->common.value.integer >> 16) & 0xFF);
break; break;
case AML_INT_CONNECTION_OP: case AML_INT_CONNECTION_OP:
@@ -425,8 +425,8 @@ acpi_ds_get_field_names(struct acpi_create_field_info *info,
/* Keep track of bit position for the next field */ /* Keep track of bit position for the next field */
position = (u64) info->field_bit_position position = (u64)info->field_bit_position +
+ (u64) arg->common.value.size; (u64)arg->common.value.size;
if (position > ACPI_UINT32_MAX) { if (position > ACPI_UINT32_MAX) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
@@ -716,11 +716,12 @@ acpi_ds_create_bank_field(union acpi_parse_object *op,
/* /*
* Use Info.data_register_node to store bank_field Op * Use Info.data_register_node to store bank_field Op
* It's safe because data_register_node will never be used when create bank field * It's safe because data_register_node will never be used when create
* We store aml_start and aml_length in the bank_field Op for late evaluation * bank field \we store aml_start and aml_length in the bank_field Op for
* Used in acpi_ex_prep_field_value(Info) * late evaluation. Used in acpi_ex_prep_field_value(Info)
* *
* TBD: Or, should we add a field in struct acpi_create_field_info, like "void *ParentOp"? * TBD: Or, should we add a field in struct acpi_create_field_info, like
* "void *ParentOp"?
*/ */
info.data_register_node = (struct acpi_namespace_node *)op; info.data_register_node = (struct acpi_namespace_node *)op;

View File

@@ -247,7 +247,7 @@ acpi_ds_initialize_objects(u32 table_index,
/* Summary of objects initialized */ /* Summary of objects initialized */
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT, ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
"Table [%4.4s:%8.8s] (id %.2X) - %4u Objects with %3u Devices, " "Table [%4.4s: %-8.8s] (id %.2X) - %4u Objects with %3u Devices, "
"%3u Regions, %4u Methods (%u/%u/%u Serial/Non/Cvt)\n", "%3u Regions, %4u Methods (%u/%u/%u Serial/Non/Cvt)\n",
table->signature, table->oem_table_id, owner_id, table->signature, table->oem_table_id, owner_id,
info.object_count, info.device_count, info.object_count, info.device_count,

View File

@@ -118,8 +118,7 @@ acpi_ds_auto_serialize_method(struct acpi_namespace_node *node,
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }
status = status = acpi_ds_init_aml_walk(walk_state, op, node,
acpi_ds_init_aml_walk(walk_state, op, node,
obj_desc->method.aml_start, obj_desc->method.aml_start,
obj_desc->method.aml_length, NULL, 0); obj_desc->method.aml_length, NULL, 0);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
@@ -375,7 +374,8 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
&& (walk_state->thread->current_sync_level > && (walk_state->thread->current_sync_level >
obj_desc->method.mutex->mutex.sync_level)) { obj_desc->method.mutex->mutex.sync_level)) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Cannot acquire Mutex for method [%4.4s], current SyncLevel is too large (%u)", "Cannot acquire Mutex for method [%4.4s]"
", current SyncLevel is too large (%u)",
acpi_ut_get_node_name(method_node), acpi_ut_get_node_name(method_node),
walk_state->thread->current_sync_level)); walk_state->thread->current_sync_level));
@@ -411,8 +411,19 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
obj_desc->method.mutex->mutex.thread_id = obj_desc->method.mutex->mutex.thread_id =
walk_state->thread->thread_id; walk_state->thread->thread_id;
/*
* Update the current sync_level only if this is not an auto-
* serialized method. In the auto case, we have to ignore
* the sync level for the method mutex (created for the
* auto-serialization) because we have no idea of what the
* sync level should be. Therefore, just ignore it.
*/
if (!(obj_desc->method.info_flags &
ACPI_METHOD_IGNORE_SYNC_LEVEL)) {
walk_state->thread->current_sync_level = walk_state->thread->current_sync_level =
obj_desc->method.sync_level; obj_desc->method.sync_level;
}
} else { } else {
obj_desc->method.mutex->mutex. obj_desc->method.mutex->mutex.
original_sync_level = original_sync_level =
@@ -501,7 +512,8 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
/* Init for new method, possibly wait on method mutex */ /* Init for new method, possibly wait on method mutex */
status = acpi_ds_begin_method_execution(method_node, obj_desc, status =
acpi_ds_begin_method_execution(method_node, obj_desc,
this_walk_state); this_walk_state);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
@@ -509,8 +521,9 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
/* Begin method parse/execution. Create a new walk state */ /* Begin method parse/execution. Create a new walk state */
next_walk_state = acpi_ds_create_walk_state(obj_desc->method.owner_id, next_walk_state =
NULL, obj_desc, thread); acpi_ds_create_walk_state(obj_desc->method.owner_id, NULL, obj_desc,
thread);
if (!next_walk_state) { if (!next_walk_state) {
status = AE_NO_MEMORY; status = AE_NO_MEMORY;
goto cleanup; goto cleanup;
@@ -797,7 +810,8 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
info_flags & ACPI_METHOD_SERIALIZED_PENDING) { info_flags & ACPI_METHOD_SERIALIZED_PENDING) {
if (walk_state) { if (walk_state) {
ACPI_INFO((AE_INFO, ACPI_INFO((AE_INFO,
"Marking method %4.4s as Serialized because of AE_ALREADY_EXISTS error", "Marking method %4.4s as Serialized "
"because of AE_ALREADY_EXISTS error",
walk_state->method_node->name. walk_state->method_node->name.
ascii)); ascii));
} }
@@ -815,6 +829,7 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
*/ */
method_desc->method.info_flags &= method_desc->method.info_flags &=
~ACPI_METHOD_SERIALIZED_PENDING; ~ACPI_METHOD_SERIALIZED_PENDING;
method_desc->method.info_flags |= method_desc->method.info_flags |=
(ACPI_METHOD_SERIALIZED | (ACPI_METHOD_SERIALIZED |
ACPI_METHOD_IGNORE_SYNC_LEVEL); ACPI_METHOD_IGNORE_SYNC_LEVEL);

View File

@@ -99,6 +99,7 @@ void acpi_ds_method_data_init(struct acpi_walk_state *walk_state)
for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) { for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++) {
ACPI_MOVE_32_TO_32(&walk_state->arguments[i].name, ACPI_MOVE_32_TO_32(&walk_state->arguments[i].name,
NAMEOF_ARG_NTE); NAMEOF_ARG_NTE);
walk_state->arguments[i].name.integer |= (i << 24); walk_state->arguments[i].name.integer |= (i << 24);
walk_state->arguments[i].descriptor_type = ACPI_DESC_TYPE_NAMED; walk_state->arguments[i].descriptor_type = ACPI_DESC_TYPE_NAMED;
walk_state->arguments[i].type = ACPI_TYPE_ANY; walk_state->arguments[i].type = ACPI_TYPE_ANY;
@@ -201,7 +202,7 @@ acpi_ds_method_data_init_args(union acpi_operand_object **params,
if (!params) { if (!params) {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"No param list passed to method\n")); "No parameter list passed to method\n"));
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
@@ -214,9 +215,9 @@ acpi_ds_method_data_init_args(union acpi_operand_object **params,
* Store the argument in the method/walk descriptor. * Store the argument in the method/walk descriptor.
* Do not copy the arg in order to implement call by reference * Do not copy the arg in order to implement call by reference
*/ */
status = acpi_ds_method_data_set_value(ACPI_REFCLASS_ARG, index, status =
params[index], acpi_ds_method_data_set_value(ACPI_REFCLASS_ARG, index,
walk_state); params[index], walk_state);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -610,10 +611,10 @@ acpi_ds_store_object_to_local(u8 type,
* do the indirect store * do the indirect store
*/ */
if ((ACPI_GET_DESCRIPTOR_TYPE(current_obj_desc) == if ((ACPI_GET_DESCRIPTOR_TYPE(current_obj_desc) ==
ACPI_DESC_TYPE_OPERAND) ACPI_DESC_TYPE_OPERAND) &&
&& (current_obj_desc->common.type == (current_obj_desc->common.type ==
ACPI_TYPE_LOCAL_REFERENCE) ACPI_TYPE_LOCAL_REFERENCE) &&
&& (current_obj_desc->reference.class == (current_obj_desc->reference.class ==
ACPI_REFCLASS_REFOF)) { ACPI_REFCLASS_REFOF)) {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Arg (%p) is an ObjRef(Node), storing in node %p\n", "Arg (%p) is an ObjRef(Node), storing in node %p\n",
@@ -638,6 +639,7 @@ acpi_ds_store_object_to_local(u8 type,
if (new_obj_desc != obj_desc) { if (new_obj_desc != obj_desc) {
acpi_ut_remove_reference(new_obj_desc); acpi_ut_remove_reference(new_obj_desc);
} }
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
} }

View File

@@ -463,9 +463,9 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
arg->common.node); arg->common.node);
} }
} else { } else {
status = acpi_ds_build_internal_object(walk_state, arg, status =
&obj_desc-> acpi_ds_build_internal_object(walk_state, arg,
package. &obj_desc->package.
elements[i]); elements[i]);
} }
@@ -525,7 +525,8 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
} }
ACPI_INFO((AE_INFO, ACPI_INFO((AE_INFO,
"Actual Package length (%u) is larger than NumElements field (%u), truncated", "Actual Package length (%u) is larger than "
"NumElements field (%u), truncated",
i, element_count)); i, element_count));
} else if (i < element_count) { } else if (i < element_count) {
/* /*
@@ -533,7 +534,8 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
* Note: this is not an error, the package is padded out with NULLs. * Note: this is not an error, the package is padded out with NULLs.
*/ */
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Package List length (%u) smaller than NumElements count (%u), padded with null elements\n", "Package List length (%u) smaller than NumElements "
"count (%u), padded with null elements\n",
i, element_count)); i, element_count));
} }
@@ -584,7 +586,8 @@ acpi_ds_create_node(struct acpi_walk_state *walk_state,
/* Build an internal object for the argument(s) */ /* Build an internal object for the argument(s) */
status = acpi_ds_build_internal_object(walk_state, op->common.value.arg, status =
acpi_ds_build_internal_object(walk_state, op->common.value.arg,
&obj_desc); &obj_desc);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);

View File

@@ -243,7 +243,8 @@ acpi_ds_init_buffer_field(u16 aml_opcode,
* For field_flags, use LOCK_RULE = 0 (NO_LOCK), * For field_flags, use LOCK_RULE = 0 (NO_LOCK),
* UPDATE_RULE = 0 (UPDATE_PRESERVE) * UPDATE_RULE = 0 (UPDATE_PRESERVE)
*/ */
status = acpi_ex_prep_common_field_object(obj_desc, field_flags, 0, status =
acpi_ex_prep_common_field_object(obj_desc, field_flags, 0,
bit_offset, bit_count); bit_offset, bit_count);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto cleanup; goto cleanup;
@@ -330,8 +331,9 @@ acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state,
/* Resolve the operands */ /* Resolve the operands */
status = acpi_ex_resolve_operands(op->common.aml_opcode, status =
ACPI_WALK_OPERANDS, walk_state); acpi_ex_resolve_operands(op->common.aml_opcode, ACPI_WALK_OPERANDS,
walk_state);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_ERROR((AE_INFO, "(%s) bad operand(s), status 0x%X", ACPI_ERROR((AE_INFO, "(%s) bad operand(s), status 0x%X",
acpi_ps_get_opcode_name(op->common.aml_opcode), acpi_ps_get_opcode_name(op->common.aml_opcode),
@@ -414,8 +416,9 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state,
/* Resolve the length and address operands to numbers */ /* Resolve the length and address operands to numbers */
status = acpi_ex_resolve_operands(op->common.aml_opcode, status =
ACPI_WALK_OPERANDS, walk_state); acpi_ex_resolve_operands(op->common.aml_opcode, ACPI_WALK_OPERANDS,
walk_state);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -452,7 +455,6 @@ acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state,
/* Now the address and length are valid for this opregion */ /* Now the address and length are valid for this opregion */
obj_desc->region.flags |= AOPOBJ_DATA_VALID; obj_desc->region.flags |= AOPOBJ_DATA_VALID;
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -510,8 +512,9 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
* Resolve the Signature string, oem_id string, * Resolve the Signature string, oem_id string,
* and oem_table_id string operands * and oem_table_id string operands
*/ */
status = acpi_ex_resolve_operands(op->common.aml_opcode, status =
ACPI_WALK_OPERANDS, walk_state); acpi_ex_resolve_operands(op->common.aml_opcode, ACPI_WALK_OPERANDS,
walk_state);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto cleanup; goto cleanup;
} }

View File

@@ -245,9 +245,9 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
* we will use the return value * we will use the return value
*/ */
if ((walk_state->control_state->common.state == if ((walk_state->control_state->common.state ==
ACPI_CONTROL_PREDICATE_EXECUTING) ACPI_CONTROL_PREDICATE_EXECUTING) &&
&& (walk_state->control_state->control. (walk_state->control_state->control.predicate_op ==
predicate_op == op)) { op)) {
goto result_used; goto result_used;
} }
break; break;
@@ -481,8 +481,7 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
/* Get the entire name string from the AML stream */ /* Get the entire name string from the AML stream */
status = status = acpi_ex_get_name_string(ACPI_TYPE_ANY,
acpi_ex_get_name_string(ACPI_TYPE_ANY,
arg->common.value.buffer, arg->common.value.buffer,
&name_string, &name_length); &name_string, &name_length);
@@ -503,9 +502,8 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
*/ */
if ((walk_state->deferred_node) && if ((walk_state->deferred_node) &&
(walk_state->deferred_node->type == ACPI_TYPE_BUFFER_FIELD) (walk_state->deferred_node->type == ACPI_TYPE_BUFFER_FIELD)
&& (arg_index == && (arg_index == (u32)
(u32) ((walk_state->opcode == ((walk_state->opcode == AML_CREATE_FIELD_OP) ? 3 : 2))) {
AML_CREATE_FIELD_OP) ? 3 : 2))) {
obj_desc = obj_desc =
ACPI_CAST_PTR(union acpi_operand_object, ACPI_CAST_PTR(union acpi_operand_object,
walk_state->deferred_node); walk_state->deferred_node);
@@ -522,8 +520,9 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
op_info = op_info =
acpi_ps_get_opcode_info(parent_op->common. acpi_ps_get_opcode_info(parent_op->common.
aml_opcode); aml_opcode);
if ((op_info->flags & AML_NSNODE)
&& (parent_op->common.aml_opcode != if ((op_info->flags & AML_NSNODE) &&
(parent_op->common.aml_opcode !=
AML_INT_METHODCALL_OP) AML_INT_METHODCALL_OP)
&& (parent_op->common.aml_opcode != AML_REGION_OP) && (parent_op->common.aml_opcode != AML_REGION_OP)
&& (parent_op->common.aml_opcode != && (parent_op->common.aml_opcode !=
@@ -633,8 +632,8 @@ acpi_ds_create_operand(struct acpi_walk_state *walk_state,
return_ACPI_STATUS(AE_NOT_IMPLEMENTED); return_ACPI_STATUS(AE_NOT_IMPLEMENTED);
} }
if ((op_info->flags & AML_HAS_RETVAL) if ((op_info->flags & AML_HAS_RETVAL) ||
|| (arg->common.flags & ACPI_PARSEOP_IN_STACK)) { (arg->common.flags & ACPI_PARSEOP_IN_STACK)) {
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
"Argument previously created, already stacked\n")); "Argument previously created, already stacked\n"));

View File

@@ -172,7 +172,8 @@ acpi_ds_get_predicate_value(struct acpi_walk_state *walk_state,
cleanup: cleanup:
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n", ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Completed a predicate eval=%X Op=%p\n",
walk_state->control_state->common.value, walk_state->control_state->common.value,
walk_state->op)); walk_state->op));
@@ -263,8 +264,8 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
(walk_state->control_state->common.state == (walk_state->control_state->common.state ==
ACPI_CONTROL_CONDITIONAL_EXECUTING)) { ACPI_CONTROL_CONDITIONAL_EXECUTING)) {
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Exec predicate Op=%p State=%p\n", op, "Exec predicate Op=%p State=%p\n",
walk_state)); op, walk_state));
walk_state->control_state->common.state = walk_state->control_state->common.state =
ACPI_CONTROL_PREDICATE_EXECUTING; ACPI_CONTROL_PREDICATE_EXECUTING;
@@ -500,9 +501,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
"Method Reference in a Package, Op=%p\n", "Method Reference in a Package, Op=%p\n",
op)); op));
op->common.node = op->common.node = (struct acpi_namespace_node *)
(struct acpi_namespace_node *)op->asl.value. op->asl.value.arg->asl.node;
arg->asl.node;
acpi_ut_add_reference(op->asl.value.arg->asl. acpi_ut_add_reference(op->asl.value.arg->asl.
node->object); node->object);
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
@@ -584,8 +584,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
* Put the Node on the object stack (Contains the ACPI Name * Put the Node on the object stack (Contains the ACPI Name
* of this object) * of this object)
*/ */
walk_state->operands[0] = walk_state->operands[0] = (void *)
(void *)op->common.parent->common.node; op->common.parent->common.node;
walk_state->num_operands = 1; walk_state->num_operands = 1;
status = acpi_ds_create_node(walk_state, status = acpi_ds_create_node(walk_state,
@@ -690,7 +690,8 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
default: default:
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Unimplemented opcode, class=0x%X type=0x%X Opcode=0x%X Op=%p", "Unimplemented opcode, class=0x%X "
"type=0x%X Opcode=0x%X Op=%p",
op_class, op_type, op->common.aml_opcode, op_class, op_type, op->common.aml_opcode,
op)); op));

View File

@@ -476,13 +476,9 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
status = status =
acpi_ex_create_region(op->named.data, acpi_ex_create_region(op->named.data,
op->named.length, op->named.length,
(acpi_adr_space_type) ((op-> (acpi_adr_space_type)
common. ((op->common.value.arg)->
value. common.value.integer),
arg)->
common.
value.
integer),
walk_state); walk_state);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);

View File

@@ -598,8 +598,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
* Executing a method: initialize the region and unlock * Executing a method: initialize the region and unlock
* the interpreter * the interpreter
*/ */
status = status = acpi_ex_create_region(op->named.data,
acpi_ex_create_region(op->named.data,
op->named.length, op->named.length,
region_space, region_space,
walk_state); walk_state);
@@ -664,6 +663,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
length, length,
walk_state); walk_state);
} }
walk_state->operands[0] = NULL; walk_state->operands[0] = NULL;
walk_state->num_operands = 0; walk_state->num_operands = 0;

View File

@@ -77,6 +77,7 @@ void acpi_ds_scope_stack_clear(struct acpi_walk_state *walk_state)
"Popped object type (%s)\n", "Popped object type (%s)\n",
acpi_ut_get_type_name(scope_info->common. acpi_ut_get_type_name(scope_info->common.
value))); value)));
acpi_ut_delete_generic_state(scope_info); acpi_ut_delete_generic_state(scope_info);
} }
} }

View File

@@ -92,8 +92,8 @@ acpi_ev_update_gpe_enable_mask(struct acpi_gpe_event_info *gpe_event_info)
ACPI_SET_BIT(gpe_register_info->enable_for_run, ACPI_SET_BIT(gpe_register_info->enable_for_run,
(u8)register_bit); (u8)register_bit);
} }
gpe_register_info->enable_mask = gpe_register_info->enable_for_run;
gpe_register_info->enable_mask = gpe_register_info->enable_for_run;
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }

View File

@@ -167,6 +167,7 @@ acpi_status acpi_ev_delete_gpe_block(struct acpi_gpe_block_info *gpe_block)
if (gpe_block->next) { if (gpe_block->next) {
gpe_block->next->previous = gpe_block->previous; gpe_block->next->previous = gpe_block->previous;
} }
acpi_os_release_lock(acpi_gbl_gpe_lock, flags); acpi_os_release_lock(acpi_gbl_gpe_lock, flags);
} }

View File

@@ -346,6 +346,7 @@ acpi_ev_delete_gpe_handlers(struct acpi_gpe_xrupt_info *gpe_xrupt_info,
ACPI_FREE(notify); ACPI_FREE(notify);
notify = next; notify = next;
} }
gpe_event_info->dispatch.notify_list = NULL; gpe_event_info->dispatch.notify_list = NULL;
gpe_event_info->flags &= gpe_event_info->flags &=
~ACPI_GPE_DISPATCH_MASK; ~ACPI_GPE_DISPATCH_MASK;

View File

@@ -159,7 +159,7 @@ acpi_ev_has_default_handler(struct acpi_namespace_node *node,
obj_desc = acpi_ns_get_attached_object(node); obj_desc = acpi_ns_get_attached_object(node);
if (obj_desc) { if (obj_desc) {
handler_obj = obj_desc->device.handler; handler_obj = obj_desc->common_notify.handler;
/* Walk the linked list of handlers for this object */ /* Walk the linked list of handlers for this object */
@@ -247,37 +247,33 @@ acpi_ev_install_handler(acpi_handle obj_handle,
/* Check if this Device already has a handler for this address space */ /* Check if this Device already has a handler for this address space */
next_handler_obj = obj_desc->device.handler; next_handler_obj =
while (next_handler_obj) { acpi_ev_find_region_handler(handler_obj->address_space.
space_id,
obj_desc->common_notify.
handler);
if (next_handler_obj) {
/* Found a handler, is it for the same address space? */ /* Found a handler, is it for the same address space? */
if (next_handler_obj->address_space.space_id ==
handler_obj->address_space.space_id) {
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
"Found handler for region [%s] in device %p(%p) " "Found handler for region [%s] in device %p(%p) handler %p\n",
"handler %p\n", acpi_ut_get_region_name(handler_obj->
acpi_ut_get_region_name address_space.
(handler_obj->address_space. space_id),
space_id), obj_desc, obj_desc, next_handler_obj,
next_handler_obj,
handler_obj)); handler_obj));
/* /*
* Since the object we found it on was a device, then it * Since the object we found it on was a device, then it means
* means that someone has already installed a handler for * that someone has already installed a handler for the branch
* the branch of the namespace from this device on. Just * of the namespace from this device on. Just bail out telling
* bail out telling the walk routine to not traverse this * the walk routine to not traverse this branch. This preserves
* branch. This preserves the scoping rule for handlers. * the scoping rule for handlers.
*/ */
return (AE_CTRL_DEPTH); return (AE_CTRL_DEPTH);
} }
/* Walk the linked list of handlers attached to this device */
next_handler_obj = next_handler_obj->address_space.next;
}
/* /*
* As long as the device didn't have a handler for this space we * As long as the device didn't have a handler for this space we
* don't care about it. We just ignore it and proceed. * don't care about it. We just ignore it and proceed.
@@ -307,6 +303,44 @@ acpi_ev_install_handler(acpi_handle obj_handle,
return (status); return (status);
} }
/*******************************************************************************
*
* FUNCTION: acpi_ev_find_region_handler
*
* PARAMETERS: space_id - The address space ID
* handler_obj - Head of the handler object list
*
* RETURN: Matching handler object. NULL if space ID not matched
*
* DESCRIPTION: Search a handler object list for a match on the address
* space ID.
*
******************************************************************************/
union acpi_operand_object *acpi_ev_find_region_handler(acpi_adr_space_type
space_id,
union acpi_operand_object
*handler_obj)
{
/* Walk the handler list for this device */
while (handler_obj) {
/* Same space_id indicates a handler is installed */
if (handler_obj->address_space.space_id == space_id) {
return (handler_obj);
}
/* Next handler object */
handler_obj = handler_obj->address_space.next;
}
return (NULL);
}
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ev_install_space_handler * FUNCTION: acpi_ev_install_space_handler
@@ -332,15 +366,15 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
{ {
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
union acpi_operand_object *handler_obj; union acpi_operand_object *handler_obj;
acpi_status status; acpi_status status = AE_OK;
acpi_object_type type; acpi_object_type type;
u8 flags = 0; u8 flags = 0;
ACPI_FUNCTION_TRACE(ev_install_space_handler); ACPI_FUNCTION_TRACE(ev_install_space_handler);
/* /*
* This registration is valid for only the types below and the root. This * This registration is valid for only the types below and the root.
* is where the default handlers get placed. * The root node is where the default handlers get installed.
*/ */
if ((node->type != ACPI_TYPE_DEVICE) && if ((node->type != ACPI_TYPE_DEVICE) &&
(node->type != ACPI_TYPE_PROCESSOR) && (node->type != ACPI_TYPE_PROCESSOR) &&
@@ -407,20 +441,16 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
obj_desc = acpi_ns_get_attached_object(node); obj_desc = acpi_ns_get_attached_object(node);
if (obj_desc) { if (obj_desc) {
/* /*
* The attached device object already exists. Make sure the handler * The attached device object already exists. Now make sure
* is not already installed. * the handler is not already installed.
*/ */
handler_obj = obj_desc->device.handler; handler_obj = acpi_ev_find_region_handler(space_id,
obj_desc->
common_notify.
handler);
/* Walk the handler list for this device */ if (handler_obj) {
if (handler_obj->address_space.handler == handler) {
while (handler_obj) {
/* Same space_id indicates a handler already installed */
if (handler_obj->address_space.space_id == space_id) {
if (handler_obj->address_space.handler ==
handler) {
/* /*
* It is (relatively) OK to attempt to install the SAME * It is (relatively) OK to attempt to install the SAME
* handler twice. This can easily happen with the * handler twice. This can easily happen with the
@@ -433,13 +463,9 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
status = AE_ALREADY_EXISTS; status = AE_ALREADY_EXISTS;
} }
goto unlock_and_exit; goto unlock_and_exit;
} }
/* Walk the linked list of handlers */
handler_obj = handler_obj->address_space.next;
}
} else { } else {
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
"Creating object on Device %p while installing handler\n", "Creating object on Device %p while installing handler\n",
@@ -477,7 +503,8 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
} }
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
"Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n", "Installing address handler for region %s(%X) "
"on Device %4.4s %p(%p)\n",
acpi_ut_get_region_name(space_id), space_id, acpi_ut_get_region_name(space_id), space_id,
acpi_ut_get_node_name(node), node, obj_desc)); acpi_ut_get_node_name(node), node, obj_desc));
@@ -506,28 +533,26 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
/* Install at head of Device.address_space list */ /* Install at head of Device.address_space list */
handler_obj->address_space.next = obj_desc->device.handler; handler_obj->address_space.next = obj_desc->common_notify.handler;
/* /*
* The Device object is the first reference on the handler_obj. * The Device object is the first reference on the handler_obj.
* Each region that uses the handler adds a reference. * Each region that uses the handler adds a reference.
*/ */
obj_desc->device.handler = handler_obj; obj_desc->common_notify.handler = handler_obj;
/* /*
* Walk the namespace finding all of the regions this * Walk the namespace finding all of the regions this handler will
* handler will manage. * manage.
* *
* Start at the device and search the branch toward * Start at the device and search the branch toward the leaf nodes
* the leaf nodes until either the leaf is encountered or * until either the leaf is encountered or a device is detected that
* a device is detected that has an address handler of the * has an address handler of the same type.
* same type.
* *
* In either case, back up and search down the remainder * In either case, back up and search down the remainder of the branch
* of the branch
*/ */
status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX, status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node,
ACPI_NS_WALK_UNLOCK, ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK,
acpi_ev_install_handler, NULL, acpi_ev_install_handler, NULL,
handler_obj, NULL); handler_obj, NULL);

View File

@@ -68,6 +68,7 @@ static void ACPI_SYSTEM_XFACE acpi_ev_notify_dispatch(void *context);
u8 acpi_ev_is_notify_object(struct acpi_namespace_node *node) u8 acpi_ev_is_notify_object(struct acpi_namespace_node *node)
{ {
switch (node->type) { switch (node->type) {
case ACPI_TYPE_DEVICE: case ACPI_TYPE_DEVICE:
case ACPI_TYPE_PROCESSOR: case ACPI_TYPE_PROCESSOR:
@@ -170,8 +171,8 @@ acpi_ev_queue_notify_request(struct acpi_namespace_node * node,
acpi_ut_get_notify_name(notify_value, ACPI_TYPE_ANY), acpi_ut_get_notify_name(notify_value, ACPI_TYPE_ANY),
node)); node));
status = acpi_os_execute(OSL_NOTIFY_HANDLER, acpi_ev_notify_dispatch, status = acpi_os_execute(OSL_NOTIFY_HANDLER,
info); acpi_ev_notify_dispatch, info);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
acpi_ut_delete_generic_state(info); acpi_ut_delete_generic_state(info);
} }

View File

@@ -97,15 +97,12 @@ acpi_status acpi_ev_initialize_op_regions(void)
if (acpi_ev_has_default_handler(acpi_gbl_root_node, if (acpi_ev_has_default_handler(acpi_gbl_root_node,
acpi_gbl_default_address_spaces acpi_gbl_default_address_spaces
[i])) { [i])) {
status =
acpi_ev_execute_reg_methods(acpi_gbl_root_node, acpi_ev_execute_reg_methods(acpi_gbl_root_node,
acpi_gbl_default_address_spaces acpi_gbl_default_address_spaces
[i]); [i], ACPI_REG_CONNECT);
} }
} }
acpi_gbl_reg_methods_executed = TRUE;
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -127,6 +124,12 @@ acpi_status acpi_ev_initialize_op_regions(void)
* DESCRIPTION: Dispatch an address space or operation region access to * DESCRIPTION: Dispatch an address space or operation region access to
* a previously installed handler. * a previously installed handler.
* *
* NOTE: During early initialization, we always install the default region
* handlers for Memory, I/O and PCI_Config. This ensures that these operation
* region address spaces are always available as per the ACPI specification.
* This is especially needed in order to support the execution of
* module-level AML code during loading of the ACPI tables.
*
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
@@ -498,6 +501,12 @@ acpi_ev_attach_region(union acpi_operand_object *handler_obj,
ACPI_FUNCTION_TRACE(ev_attach_region); ACPI_FUNCTION_TRACE(ev_attach_region);
/* Install the region's handler */
if (region_obj->region.handler) {
return_ACPI_STATUS(AE_ALREADY_EXISTS);
}
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
"Adding Region [%4.4s] %p to address handler %p [%s]\n", "Adding Region [%4.4s] %p to address handler %p [%s]\n",
acpi_ut_get_node_name(region_obj->region.node), acpi_ut_get_node_name(region_obj->region.node),
@@ -509,19 +518,58 @@ acpi_ev_attach_region(union acpi_operand_object *handler_obj,
region_obj->region.next = handler_obj->address_space.region_list; region_obj->region.next = handler_obj->address_space.region_list;
handler_obj->address_space.region_list = region_obj; handler_obj->address_space.region_list = region_obj;
/* Install the region's handler */
if (region_obj->region.handler) {
return_ACPI_STATUS(AE_ALREADY_EXISTS);
}
region_obj->region.handler = handler_obj; region_obj->region.handler = handler_obj;
acpi_ut_add_reference(handler_obj); acpi_ut_add_reference(handler_obj);
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
/*******************************************************************************
*
* FUNCTION: acpi_ev_associate_reg_method
*
* PARAMETERS: region_obj - Region object
*
* RETURN: Status
*
* DESCRIPTION: Find and associate _REG method to a region
*
******************************************************************************/
void acpi_ev_associate_reg_method(union acpi_operand_object *region_obj)
{
acpi_name *reg_name_ptr = (acpi_name *) METHOD_NAME__REG;
struct acpi_namespace_node *method_node;
struct acpi_namespace_node *node;
union acpi_operand_object *region_obj2;
acpi_status status;
ACPI_FUNCTION_TRACE(ev_associate_reg_method);
region_obj2 = acpi_ns_get_secondary_object(region_obj);
if (!region_obj2) {
return_VOID;
}
node = region_obj->region.node->parent;
/* Find any "_REG" method associated with this region definition */
status =
acpi_ns_search_one_scope(*reg_name_ptr, node, ACPI_TYPE_METHOD,
&method_node);
if (ACPI_SUCCESS(status)) {
/*
* The _REG method is optional and there can be only one per region
* definition. This will be executed when the handler is attached
* or removed
*/
region_obj2->extra.method_REG = method_node;
}
return_VOID;
}
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_ev_execute_reg_method * FUNCTION: acpi_ev_execute_reg_method
@@ -550,7 +598,18 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
return_ACPI_STATUS(AE_NOT_EXIST); return_ACPI_STATUS(AE_NOT_EXIST);
} }
if (region_obj2->extra.method_REG == NULL) { if (region_obj2->extra.method_REG == NULL ||
region_obj->region.handler == NULL ||
!acpi_gbl_reg_methods_enabled) {
return_ACPI_STATUS(AE_OK);
}
/* _REG(DISCONNECT) should be paired with _REG(CONNECT) */
if ((function == ACPI_REG_CONNECT &&
region_obj->common.flags & AOPOBJ_REG_CONNECTED) ||
(function == ACPI_REG_DISCONNECT &&
!(region_obj->common.flags & AOPOBJ_REG_CONNECTED))) {
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
@@ -599,6 +658,16 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
status = acpi_ns_evaluate(info); status = acpi_ns_evaluate(info);
acpi_ut_remove_reference(args[1]); acpi_ut_remove_reference(args[1]);
if (ACPI_FAILURE(status)) {
goto cleanup2;
}
if (function == ACPI_REG_CONNECT) {
region_obj->common.flags |= AOPOBJ_REG_CONNECTED;
} else {
region_obj->common.flags &= ~AOPOBJ_REG_CONNECTED;
}
cleanup2: cleanup2:
acpi_ut_remove_reference(args[0]); acpi_ut_remove_reference(args[0]);
@@ -613,24 +682,25 @@ cleanup1:
* *
* PARAMETERS: node - Namespace node for the device * PARAMETERS: node - Namespace node for the device
* space_id - The address space ID * space_id - The address space ID
* function - Passed to _REG: On (1) or Off (0)
* *
* RETURN: Status * RETURN: None
* *
* DESCRIPTION: Run all _REG methods for the input Space ID; * DESCRIPTION: Run all _REG methods for the input Space ID;
* Note: assumes namespace is locked, or system init time. * Note: assumes namespace is locked, or system init time.
* *
******************************************************************************/ ******************************************************************************/
acpi_status void
acpi_ev_execute_reg_methods(struct acpi_namespace_node *node, acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
acpi_adr_space_type space_id) acpi_adr_space_type space_id, u32 function)
{ {
acpi_status status;
struct acpi_reg_walk_info info; struct acpi_reg_walk_info info;
ACPI_FUNCTION_TRACE(ev_execute_reg_methods); ACPI_FUNCTION_TRACE(ev_execute_reg_methods);
info.space_id = space_id; info.space_id = space_id;
info.function = function;
info.reg_run_count = 0; info.reg_run_count = 0;
ACPI_DEBUG_PRINT_RAW((ACPI_DB_NAMES, ACPI_DEBUG_PRINT_RAW((ACPI_DB_NAMES,
@@ -643,9 +713,9 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
* regions and _REG methods. (i.e. handlers must be installed for all * regions and _REG methods. (i.e. handlers must be installed for all
* regions of this Space ID before we can run any _REG methods) * regions of this Space ID before we can run any _REG methods)
*/ */
status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX, (void)acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run, ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run, NULL,
NULL, &info, NULL); &info, NULL);
/* Special case for EC: handle "orphan" _REG methods with no region */ /* Special case for EC: handle "orphan" _REG methods with no region */
@@ -658,7 +728,7 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
info.reg_run_count, info.reg_run_count,
acpi_ut_get_region_name(info.space_id))); acpi_ut_get_region_name(info.space_id)));
return_ACPI_STATUS(status); return_VOID;
} }
/******************************************************************************* /*******************************************************************************
@@ -717,7 +787,7 @@ acpi_ev_reg_run(acpi_handle obj_handle,
} }
info->reg_run_count++; info->reg_run_count++;
status = acpi_ev_execute_reg_method(obj_desc, ACPI_REG_CONNECT); status = acpi_ev_execute_reg_method(obj_desc, info->function);
return (status); return (status);
} }

View File

@@ -507,9 +507,6 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
acpi_adr_space_type space_id; acpi_adr_space_type space_id;
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
acpi_status status; acpi_status status;
struct acpi_namespace_node *method_node;
acpi_name *reg_name_ptr = (acpi_name *) METHOD_NAME__REG;
union acpi_operand_object *region_obj2;
ACPI_FUNCTION_TRACE_U32(ev_initialize_region, acpi_ns_locked); ACPI_FUNCTION_TRACE_U32(ev_initialize_region, acpi_ns_locked);
@@ -521,38 +518,15 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
region_obj2 = acpi_ns_get_secondary_object(region_obj); acpi_ev_associate_reg_method(region_obj);
if (!region_obj2) { region_obj->common.flags |= AOPOBJ_OBJECT_INITIALIZED;
return_ACPI_STATUS(AE_NOT_EXIST);
}
node = region_obj->region.node->parent; node = region_obj->region.node->parent;
space_id = region_obj->region.space_id; space_id = region_obj->region.space_id;
/* Setup defaults */
region_obj->region.handler = NULL;
region_obj2->extra.method_REG = NULL;
region_obj->common.flags &= ~(AOPOBJ_SETUP_COMPLETE);
region_obj->common.flags |= AOPOBJ_OBJECT_INITIALIZED;
/* Find any "_REG" method associated with this region definition */
status =
acpi_ns_search_one_scope(*reg_name_ptr, node, ACPI_TYPE_METHOD,
&method_node);
if (ACPI_SUCCESS(status)) {
/*
* The _REG method is optional and there can be only one per region
* definition. This will be executed when the handler is attached
* or removed
*/
region_obj2->extra.method_REG = method_node;
}
/* /*
* The following loop depends upon the root Node having no parent * The following loop depends upon the root Node having no parent
* ie: acpi_gbl_root_node->parent_entry being set to NULL * ie: acpi_gbl_root_node->Parent being set to NULL
*/ */
while (node) { while (node) {
@@ -566,18 +540,10 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
switch (node->type) { switch (node->type) {
case ACPI_TYPE_DEVICE: case ACPI_TYPE_DEVICE:
handler_obj = obj_desc->device.handler;
break;
case ACPI_TYPE_PROCESSOR: case ACPI_TYPE_PROCESSOR:
handler_obj = obj_desc->processor.handler;
break;
case ACPI_TYPE_THERMAL: case ACPI_TYPE_THERMAL:
handler_obj = obj_desc->thermal_zone.handler; handler_obj = obj_desc->common_notify.handler;
break; break;
case ACPI_TYPE_METHOD: case ACPI_TYPE_METHOD:
@@ -602,19 +568,15 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
break; break;
} }
while (handler_obj) { handler_obj =
acpi_ev_find_region_handler(space_id, handler_obj);
/* Is this handler of the correct type? */ if (handler_obj) {
if (handler_obj->address_space.space_id ==
space_id) {
/* Found correct handler */ /* Found correct handler */
ACPI_DEBUG_PRINT((ACPI_DB_OPREGION, ACPI_DEBUG_PRINT((ACPI_DB_OPREGION,
"Found handler %p for region %p in obj %p\n", "Found handler %p for region %p in obj %p\n",
handler_obj, handler_obj, region_obj,
region_obj,
obj_desc)); obj_desc));
status = status =
@@ -631,32 +593,25 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
acpi_ut_release_mutex acpi_ut_release_mutex
(ACPI_MTX_NAMESPACE); (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS return_ACPI_STATUS(status);
(status);
} }
} }
status = status =
acpi_ev_execute_reg_method acpi_ev_execute_reg_method(region_obj,
(region_obj, ACPI_REG_CONNECT); ACPI_REG_CONNECT);
if (acpi_ns_locked) { if (acpi_ns_locked) {
status = status =
acpi_ut_acquire_mutex acpi_ut_acquire_mutex
(ACPI_MTX_NAMESPACE); (ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS return_ACPI_STATUS(status);
(status);
} }
} }
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
/* Try next handler in the list */
handler_obj = handler_obj->address_space.next;
}
} }
/* This node does not have the handler we need; Pop up one level */ /* This node does not have the handler we need; Pop up one level */

View File

@@ -879,9 +879,8 @@ acpi_install_gpe_handler(acpi_handle gpe_device,
ACPI_FUNCTION_TRACE(acpi_install_gpe_handler); ACPI_FUNCTION_TRACE(acpi_install_gpe_handler);
status = status = acpi_ev_install_gpe_handler(gpe_device, gpe_number, type,
acpi_ev_install_gpe_handler(gpe_device, gpe_number, type, FALSE, FALSE, address, context);
address, context);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -914,8 +913,8 @@ acpi_install_gpe_raw_handler(acpi_handle gpe_device,
ACPI_FUNCTION_TRACE(acpi_install_gpe_raw_handler); ACPI_FUNCTION_TRACE(acpi_install_gpe_raw_handler);
status = acpi_ev_install_gpe_handler(gpe_device, gpe_number, type, TRUE, status = acpi_ev_install_gpe_handler(gpe_device, gpe_number, type,
address, context); TRUE, address, context);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }

View File

@@ -112,41 +112,9 @@ acpi_install_address_space_handler(acpi_handle device,
goto unlock_and_exit; goto unlock_and_exit;
} }
/*
* For the default space_IDs, (the IDs for which there are default region handlers
* installed) Only execute the _REG methods if the global initialization _REG
* methods have already been run (via acpi_initialize_objects). In other words,
* we will defer the execution of the _REG methods for these space_IDs until
* execution of acpi_initialize_objects. This is done because we need the handlers
* for the default spaces (mem/io/pci/table) to be installed before we can run
* any control methods (or _REG methods). There is known BIOS code that depends
* on this.
*
* For all other space_IDs, we can safely execute the _REG methods immediately.
* This means that for IDs like embedded_controller, this function should be called
* only after acpi_enable_subsystem has been called.
*/
switch (space_id) {
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
case ACPI_ADR_SPACE_SYSTEM_IO:
case ACPI_ADR_SPACE_PCI_CONFIG:
case ACPI_ADR_SPACE_DATA_TABLE:
if (!acpi_gbl_reg_methods_executed) {
/* We will defer execution of the _REG methods for this space */
goto unlock_and_exit;
}
break;
default:
break;
}
/* Run all _REG methods for this address space */ /* Run all _REG methods for this address space */
status = acpi_ev_execute_reg_methods(node, space_id); acpi_ev_execute_reg_methods(node, space_id, ACPI_REG_CONNECT);
unlock_and_exit: unlock_and_exit:
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
@@ -215,8 +183,8 @@ acpi_remove_address_space_handler(acpi_handle device,
/* Find the address handler the user requested */ /* Find the address handler the user requested */
handler_obj = obj_desc->device.handler; handler_obj = obj_desc->common_notify.handler;
last_obj_ptr = &obj_desc->device.handler; last_obj_ptr = &obj_desc->common_notify.handler;
while (handler_obj) { while (handler_obj) {
/* We have a handler, see if user requested this one */ /* We have a handler, see if user requested this one */

View File

@@ -358,8 +358,8 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
} }
/* /*
* If the Region Address and Length have not been previously evaluated, * If the Region Address and Length have not been previously
* evaluate them now and save the results. * evaluated, evaluate them now and save the results.
*/ */
if (!(obj_desc->common.flags & AOPOBJ_DATA_VALID)) { if (!(obj_desc->common.flags & AOPOBJ_DATA_VALID)) {
status = acpi_ds_get_region_arguments(obj_desc); status = acpi_ds_get_region_arguments(obj_desc);
@@ -454,8 +454,8 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
} }
/* /*
* Copy the table from the buffer because the buffer could be modified * Copy the table from the buffer because the buffer could be
* or even deleted in the future * modified or even deleted in the future
*/ */
table = ACPI_ALLOCATE(length); table = ACPI_ALLOCATE(length);
if (!table) { if (!table) {

View File

@@ -227,8 +227,8 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc,
/* Copy the integer to the buffer, LSB first */ /* Copy the integer to the buffer, LSB first */
new_buf = return_desc->buffer.pointer; new_buf = return_desc->buffer.pointer;
memcpy(new_buf, memcpy(new_buf, &obj_desc->integer.value,
&obj_desc->integer.value, acpi_gbl_integer_byte_width); acpi_gbl_integer_byte_width);
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
@@ -354,9 +354,8 @@ acpi_ex_convert_to_ascii(u64 integer, u16 base, u8 *string, u8 data_width)
/* Get one hex digit, most significant digits first */ /* Get one hex digit, most significant digits first */
string[k] = string[k] = (u8)
(u8) acpi_ut_hex_to_ascii_char(integer, acpi_ut_hex_to_ascii_char(integer, ACPI_MUL_4(j));
ACPI_MUL_4(j));
k++; k++;
} }
break; break;

View File

@@ -189,9 +189,9 @@ acpi_status acpi_ex_create_event(struct acpi_walk_state *walk_state)
/* Attach object to the Node */ /* Attach object to the Node */
status = status = acpi_ns_attach_object((struct acpi_namespace_node *)
acpi_ns_attach_object((struct acpi_namespace_node *)walk_state-> walk_state->operands[0], obj_desc,
operands[0], obj_desc, ACPI_TYPE_EVENT); ACPI_TYPE_EVENT);
cleanup: cleanup:
/* /*
@@ -326,9 +326,10 @@ acpi_ex_create_region(u8 * aml_start,
* Remember location in AML stream of address & length * Remember location in AML stream of address & length
* operands since they need to be evaluated at run time. * operands since they need to be evaluated at run time.
*/ */
region_obj2 = obj_desc->common.next_object; region_obj2 = acpi_ns_get_secondary_object(obj_desc);
region_obj2->extra.aml_start = aml_start; region_obj2->extra.aml_start = aml_start;
region_obj2->extra.aml_length = aml_length; region_obj2->extra.aml_length = aml_length;
region_obj2->extra.method_REG = NULL;
if (walk_state->scope_info) { if (walk_state->scope_info) {
region_obj2->extra.scope_node = region_obj2->extra.scope_node =
walk_state->scope_info->scope.node; walk_state->scope_info->scope.node;
@@ -342,6 +343,10 @@ acpi_ex_create_region(u8 * aml_start,
obj_desc->region.address = 0; obj_desc->region.address = 0;
obj_desc->region.length = 0; obj_desc->region.length = 0;
obj_desc->region.node = node; obj_desc->region.node = node;
obj_desc->region.handler = NULL;
obj_desc->common.flags &=
~(AOPOBJ_SETUP_COMPLETE | AOPOBJ_REG_CONNECTED |
AOPOBJ_OBJECT_INITIALIZED);
/* Install the new region object in the parent Node */ /* Install the new region object in the parent Node */
@@ -492,10 +497,9 @@ acpi_ex_create_method(u8 * aml_start,
* Disassemble the method flags. Split off the arg_count, Serialized * Disassemble the method flags. Split off the arg_count, Serialized
* flag, and sync_level for efficiency. * flag, and sync_level for efficiency.
*/ */
method_flags = (u8) operand[1]->integer.value; method_flags = (u8)operand[1]->integer.value;
obj_desc->method.param_count = (u8)
obj_desc->method.param_count = (method_flags & AML_METHOD_ARG_COUNT);
(u8) (method_flags & AML_METHOD_ARG_COUNT);
/* /*
* Get the sync_level. If method is serialized, a mutex will be * Get the sync_level. If method is serialized, a mutex will be

View File

@@ -43,21 +43,11 @@
#include <acpi/acpi.h> #include <acpi/acpi.h>
#include "accommon.h" #include "accommon.h"
#include "acnamesp.h"
#include "acinterp.h" #include "acinterp.h"
#include "acparser.h"
#define _COMPONENT ACPI_EXECUTER #define _COMPONENT ACPI_EXECUTER
ACPI_MODULE_NAME("exdebug") ACPI_MODULE_NAME("exdebug")
static union acpi_operand_object *acpi_gbl_trace_method_object = NULL;
/* Local prototypes */
#ifdef ACPI_DEBUG_OUTPUT
static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type);
#endif
#ifndef ACPI_NO_ERROR_MESSAGES #ifndef ACPI_NO_ERROR_MESSAGES
/******************************************************************************* /*******************************************************************************
* *
@@ -80,7 +70,6 @@ static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type);
* enabled if necessary. * enabled if necessary.
* *
******************************************************************************/ ******************************************************************************/
void void
acpi_ex_do_debug_object(union acpi_operand_object *source_desc, acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
u32 level, u32 index) u32 level, u32 index)
@@ -99,20 +88,40 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
return_VOID; return_VOID;
} }
/* /* Null string or newline -- don't emit the line header */
* We will emit the current timer value (in microseconds) with each
* debug output. Only need the lower 26 bits. This allows for 67 if (source_desc &&
* million microseconds or 67 seconds before rollover. (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) &&
*/ (source_desc->common.type == ACPI_TYPE_STRING)) {
timer = ((u32)acpi_os_get_timer() / 10); /* (100 nanoseconds to microseconds) */ if ((source_desc->string.length == 0) ||
timer &= 0x03FFFFFF; ((source_desc->string.length == 1) &&
(*source_desc->string.pointer == '\n'))) {
acpi_os_printf("\n");
return_VOID;
}
}
/* /*
* Print line header as long as we are not in the middle of an * Print line header as long as we are not in the middle of an
* object display * object display
*/ */
if (!((level > 0) && index == 0)) { if (!((level > 0) && index == 0)) {
acpi_os_printf("[ACPI Debug %.8u] %*s", timer, level, " "); if (acpi_gbl_display_debug_timer) {
/*
* We will emit the current timer value (in microseconds) with each
* debug output. Only need the lower 26 bits. This allows for 67
* million microseconds or 67 seconds before rollover.
*
* Convert 100 nanosecond units to microseconds
*/
timer = ((u32)acpi_os_get_timer() / 10);
timer &= 0x03FFFFFF;
acpi_os_printf("[ACPI Debug T=0x%8.8X] %*s", timer,
level, " ");
} else {
acpi_os_printf("[ACPI Debug] %*s", level, " ");
}
} }
/* Display the index for package output only */ /* Display the index for package output only */
@@ -127,8 +136,15 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
} }
if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) { if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) {
/* No object type prefix needed for integers and strings */
if ((source_desc->common.type != ACPI_TYPE_INTEGER) &&
(source_desc->common.type != ACPI_TYPE_STRING)) {
acpi_os_printf("%s ", acpi_os_printf("%s ",
acpi_ut_get_object_type_name(source_desc)); acpi_ut_get_object_type_name
(source_desc));
}
if (!acpi_ut_valid_internal_object(source_desc)) { if (!acpi_ut_valid_internal_object(source_desc)) {
acpi_os_printf("%p, Invalid Internal Object!\n", acpi_os_printf("%p, Invalid Internal Object!\n",
@@ -137,7 +153,7 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
} }
} else if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) == } else if (ACPI_GET_DESCRIPTOR_TYPE(source_desc) ==
ACPI_DESC_TYPE_NAMED) { ACPI_DESC_TYPE_NAMED) {
acpi_os_printf("%s: %p\n", acpi_os_printf("%s (Node %p)\n",
acpi_ut_get_type_name(((struct acpi_ut_get_type_name(((struct
acpi_namespace_node *) acpi_namespace_node *)
source_desc)->type), source_desc)->type),
@@ -175,14 +191,12 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
acpi_os_printf("[0x%.2X] \"%s\"\n", acpi_os_printf("\"%s\"\n", source_desc->string.pointer);
source_desc->string.length,
source_desc->string.pointer);
break; break;
case ACPI_TYPE_PACKAGE: case ACPI_TYPE_PACKAGE:
acpi_os_printf("[Contains 0x%.2X Elements]\n", acpi_os_printf("(Contains 0x%.2X Elements):\n",
source_desc->package.count); source_desc->package.count);
/* Output the entire contents of the package */ /* Output the entire contents of the package */
@@ -261,11 +275,14 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
if (ACPI_GET_DESCRIPTOR_TYPE if (ACPI_GET_DESCRIPTOR_TYPE
(source_desc->reference.object) == (source_desc->reference.object) ==
ACPI_DESC_TYPE_NAMED) { ACPI_DESC_TYPE_NAMED) {
acpi_ex_do_debug_object(((struct
acpi_namespace_node *) /* Reference object is a namespace node */
acpi_ex_do_debug_object(ACPI_CAST_PTR
(union
acpi_operand_object,
source_desc->reference. source_desc->reference.
object)->object, object), level + 4, 0);
level + 4, 0);
} else { } else {
object_desc = source_desc->reference.object; object_desc = source_desc->reference.object;
value = source_desc->reference.value; value = source_desc->reference.value;
@@ -293,9 +310,14 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
case ACPI_TYPE_PACKAGE: case ACPI_TYPE_PACKAGE:
acpi_os_printf("Package[%u] = ", value); acpi_os_printf("Package[%u] = ", value);
acpi_ex_do_debug_object(*source_desc-> if (!(*source_desc->reference.where)) {
reference.where, acpi_os_printf
level + 4, 0); ("[Uninitialized Package Element]\n");
} else {
acpi_ex_do_debug_object
(*source_desc->reference.
where, level + 4, 0);
}
break; break;
default: default:
@@ -311,7 +333,7 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
default: default:
acpi_os_printf("%p\n", source_desc); acpi_os_printf("(Descriptor %p)\n", source_desc);
break; break;
} }
@@ -319,316 +341,3 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
return_VOID; return_VOID;
} }
#endif #endif
/*******************************************************************************
*
* FUNCTION: acpi_ex_interpreter_trace_enabled
*
* PARAMETERS: name - Whether method name should be matched,
* this should be checked before starting
* the tracer
*
* RETURN: TRUE if interpreter trace is enabled.
*
* DESCRIPTION: Check whether interpreter trace is enabled
*
******************************************************************************/
static u8 acpi_ex_interpreter_trace_enabled(char *name)
{
/* Check if tracing is enabled */
if (!(acpi_gbl_trace_flags & ACPI_TRACE_ENABLED)) {
return (FALSE);
}
/*
* Check if tracing is filtered:
*
* 1. If the tracer is started, acpi_gbl_trace_method_object should have
* been filled by the trace starter
* 2. If the tracer is not started, acpi_gbl_trace_method_name should be
* matched if it is specified
* 3. If the tracer is oneshot style, acpi_gbl_trace_method_name should
* not be cleared by the trace stopper during the first match
*/
if (acpi_gbl_trace_method_object) {
return (TRUE);
}
if (name &&
(acpi_gbl_trace_method_name &&
strcmp(acpi_gbl_trace_method_name, name))) {
return (FALSE);
}
if ((acpi_gbl_trace_flags & ACPI_TRACE_ONESHOT) &&
!acpi_gbl_trace_method_name) {
return (FALSE);
}
return (TRUE);
}
/*******************************************************************************
*
* FUNCTION: acpi_ex_get_trace_event_name
*
* PARAMETERS: type - Trace event type
*
* RETURN: Trace event name.
*
* DESCRIPTION: Used to obtain the full trace event name.
*
******************************************************************************/
#ifdef ACPI_DEBUG_OUTPUT
static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type)
{
switch (type) {
case ACPI_TRACE_AML_METHOD:
return "Method";
case ACPI_TRACE_AML_OPCODE:
return "Opcode";
case ACPI_TRACE_AML_REGION:
return "Region";
default:
return "";
}
}
#endif
/*******************************************************************************
*
* FUNCTION: acpi_ex_trace_point
*
* PARAMETERS: type - Trace event type
* begin - TRUE if before execution
* aml - Executed AML address
* pathname - Object path
*
* RETURN: None
*
* DESCRIPTION: Internal interpreter execution trace.
*
******************************************************************************/
void
acpi_ex_trace_point(acpi_trace_event_type type,
u8 begin, u8 *aml, char *pathname)
{
ACPI_FUNCTION_NAME(ex_trace_point);
if (pathname) {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"%s %s [0x%p:%s] execution.\n",
acpi_ex_get_trace_event_name(type),
begin ? "Begin" : "End", aml, pathname));
} else {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"%s %s [0x%p] execution.\n",
acpi_ex_get_trace_event_name(type),
begin ? "Begin" : "End", aml));
}
}
/*******************************************************************************
*
* FUNCTION: acpi_ex_start_trace_method
*
* PARAMETERS: method_node - Node of the method
* obj_desc - The method object
* walk_state - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Start control method execution trace
*
******************************************************************************/
void
acpi_ex_start_trace_method(struct acpi_namespace_node *method_node,
union acpi_operand_object *obj_desc,
struct acpi_walk_state *walk_state)
{
acpi_status status;
char *pathname = NULL;
u8 enabled = FALSE;
ACPI_FUNCTION_NAME(ex_start_trace_method);
if (method_node) {
pathname = acpi_ns_get_normalized_pathname(method_node, TRUE);
}
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) {
goto exit;
}
enabled = acpi_ex_interpreter_trace_enabled(pathname);
if (enabled && !acpi_gbl_trace_method_object) {
acpi_gbl_trace_method_object = obj_desc;
acpi_gbl_original_dbg_level = acpi_dbg_level;
acpi_gbl_original_dbg_layer = acpi_dbg_layer;
acpi_dbg_level = ACPI_TRACE_LEVEL_ALL;
acpi_dbg_layer = ACPI_TRACE_LAYER_ALL;
if (acpi_gbl_trace_dbg_level) {
acpi_dbg_level = acpi_gbl_trace_dbg_level;
}
if (acpi_gbl_trace_dbg_layer) {
acpi_dbg_layer = acpi_gbl_trace_dbg_layer;
}
}
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
exit:
if (enabled) {
ACPI_TRACE_POINT(ACPI_TRACE_AML_METHOD, TRUE,
obj_desc ? obj_desc->method.aml_start : NULL,
pathname);
}
if (pathname) {
ACPI_FREE(pathname);
}
}
/*******************************************************************************
*
* FUNCTION: acpi_ex_stop_trace_method
*
* PARAMETERS: method_node - Node of the method
* obj_desc - The method object
* walk_state - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Stop control method execution trace
*
******************************************************************************/
void
acpi_ex_stop_trace_method(struct acpi_namespace_node *method_node,
union acpi_operand_object *obj_desc,
struct acpi_walk_state *walk_state)
{
acpi_status status;
char *pathname = NULL;
u8 enabled;
ACPI_FUNCTION_NAME(ex_stop_trace_method);
if (method_node) {
pathname = acpi_ns_get_normalized_pathname(method_node, TRUE);
}
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) {
goto exit_path;
}
enabled = acpi_ex_interpreter_trace_enabled(NULL);
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
if (enabled) {
ACPI_TRACE_POINT(ACPI_TRACE_AML_METHOD, FALSE,
obj_desc ? obj_desc->method.aml_start : NULL,
pathname);
}
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) {
goto exit_path;
}
/* Check whether the tracer should be stopped */
if (acpi_gbl_trace_method_object == obj_desc) {
/* Disable further tracing if type is one-shot */
if (acpi_gbl_trace_flags & ACPI_TRACE_ONESHOT) {
acpi_gbl_trace_method_name = NULL;
}
acpi_dbg_level = acpi_gbl_original_dbg_level;
acpi_dbg_layer = acpi_gbl_original_dbg_layer;
acpi_gbl_trace_method_object = NULL;
}
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
exit_path:
if (pathname) {
ACPI_FREE(pathname);
}
}
/*******************************************************************************
*
* FUNCTION: acpi_ex_start_trace_opcode
*
* PARAMETERS: op - The parser opcode object
* walk_state - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Start opcode execution trace
*
******************************************************************************/
void
acpi_ex_start_trace_opcode(union acpi_parse_object *op,
struct acpi_walk_state *walk_state)
{
ACPI_FUNCTION_NAME(ex_start_trace_opcode);
if (acpi_ex_interpreter_trace_enabled(NULL) &&
(acpi_gbl_trace_flags & ACPI_TRACE_OPCODE)) {
ACPI_TRACE_POINT(ACPI_TRACE_AML_OPCODE, TRUE,
op->common.aml, op->common.aml_op_name);
}
}
/*******************************************************************************
*
* FUNCTION: acpi_ex_stop_trace_opcode
*
* PARAMETERS: op - The parser opcode object
* walk_state - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Stop opcode execution trace
*
******************************************************************************/
void
acpi_ex_stop_trace_opcode(union acpi_parse_object *op,
struct acpi_walk_state *walk_state)
{
ACPI_FUNCTION_NAME(ex_stop_trace_opcode);
if (acpi_ex_interpreter_trace_enabled(NULL) &&
(acpi_gbl_trace_flags & ACPI_TRACE_OPCODE)) {
ACPI_TRACE_POINT(ACPI_TRACE_AML_OPCODE, FALSE,
op->common.aml, op->common.aml_op_name);
}
}

View File

@@ -508,7 +508,8 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
if (next) { if (next) {
acpi_os_printf("(%s %2.2X)", acpi_os_printf("(%s %2.2X)",
acpi_ut_get_object_type_name acpi_ut_get_object_type_name
(next), next->common.type); (next),
next->address_space.space_id);
while (next->address_space.next) { while (next->address_space.next) {
if ((next->common.type == if ((next->common.type ==
@@ -520,7 +521,8 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
acpi_os_printf("->%p(%s %2.2X)", next, acpi_os_printf("->%p(%s %2.2X)", next,
acpi_ut_get_object_type_name acpi_ut_get_object_type_name
(next), (next),
next->common.type); next->address_space.
space_id);
if ((next == start) || (next == data)) { if ((next == start) || (next == data)) {
acpi_os_printf acpi_os_printf

View File

@@ -167,10 +167,11 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
|| obj_desc->field.region_obj->region.space_id == || obj_desc->field.region_obj->region.space_id ==
ACPI_ADR_SPACE_IPMI)) { ACPI_ADR_SPACE_IPMI)) {
/* /*
* This is an SMBus, GSBus or IPMI read. We must create a buffer to hold * This is an SMBus, GSBus or IPMI read. We must create a buffer to
* the data and then directly access the region handler. * hold the data and then directly access the region handler.
* *
* Note: SMBus and GSBus protocol value is passed in upper 16-bits of Function * Note: SMBus and GSBus protocol value is passed in upper 16-bits
* of Function
*/ */
if (obj_desc->field.region_obj->region.space_id == if (obj_desc->field.region_obj->region.space_id ==
ACPI_ADR_SPACE_SMBUS) { ACPI_ADR_SPACE_SMBUS) {
@@ -180,9 +181,9 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
} else if (obj_desc->field.region_obj->region.space_id == } else if (obj_desc->field.region_obj->region.space_id ==
ACPI_ADR_SPACE_GSBUS) { ACPI_ADR_SPACE_GSBUS) {
accessor_type = obj_desc->field.attribute; accessor_type = obj_desc->field.attribute;
length = acpi_ex_get_serial_access_length(accessor_type, length =
obj_desc-> acpi_ex_get_serial_access_length(accessor_type,
field. obj_desc->field.
access_length); access_length);
/* /*
@@ -190,7 +191,7 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
* *
* Status; (Byte 0 of the data buffer) * Status; (Byte 0 of the data buffer)
* Length; (Byte 1 of the data buffer) * Length; (Byte 1 of the data buffer)
* Data[x-1]; (Bytes 2-x of the arbitrary length data buffer) * Data[x-1]: (Bytes 2-x of the arbitrary length data buffer)
*/ */
length += 2; length += 2;
function = ACPI_READ | (accessor_type << 16); function = ACPI_READ | (accessor_type << 16);
@@ -216,6 +217,7 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
buffer_desc-> buffer_desc->
buffer.pointer), buffer.pointer),
function); function);
acpi_ex_release_global_lock(obj_desc->common_field.field_flags); acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
goto exit; goto exit;
} }
@@ -232,6 +234,7 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
*/ */
length = length =
(acpi_size) ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->field.bit_length); (acpi_size) ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->field.bit_length);
if (length > acpi_gbl_integer_byte_width) { if (length > acpi_gbl_integer_byte_width) {
/* Field is too large for an Integer, create a Buffer instead */ /* Field is too large for an Integer, create a Buffer instead */
@@ -273,8 +276,10 @@ acpi_ex_read_data_from_field(struct acpi_walk_state * walk_state,
/* Perform the write */ /* Perform the write */
status = acpi_ex_access_region(obj_desc, 0, status =
(u64 *)buffer, ACPI_READ); acpi_ex_access_region(obj_desc, 0, (u64 *)buffer,
ACPI_READ);
acpi_ex_release_global_lock(obj_desc->common_field.field_flags); acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
acpi_ut_remove_reference(buffer_desc); acpi_ut_remove_reference(buffer_desc);
@@ -366,19 +371,22 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
|| obj_desc->field.region_obj->region.space_id == || obj_desc->field.region_obj->region.space_id ==
ACPI_ADR_SPACE_IPMI)) { ACPI_ADR_SPACE_IPMI)) {
/* /*
* This is an SMBus, GSBus or IPMI write. We will bypass the entire field * This is an SMBus, GSBus or IPMI write. We will bypass the entire
* mechanism and handoff the buffer directly to the handler. For * field mechanism and handoff the buffer directly to the handler.
* these address spaces, the buffer is bi-directional; on a write, * For these address spaces, the buffer is bi-directional; on a
* return data is returned in the same buffer. * write, return data is returned in the same buffer.
* *
* Source must be a buffer of sufficient size: * Source must be a buffer of sufficient size:
* ACPI_SMBUS_BUFFER_SIZE, ACPI_GSBUS_BUFFER_SIZE, or ACPI_IPMI_BUFFER_SIZE. * ACPI_SMBUS_BUFFER_SIZE, ACPI_GSBUS_BUFFER_SIZE, or
* ACPI_IPMI_BUFFER_SIZE.
* *
* Note: SMBus and GSBus protocol type is passed in upper 16-bits of Function * Note: SMBus and GSBus protocol type is passed in upper 16-bits
* of Function
*/ */
if (source_desc->common.type != ACPI_TYPE_BUFFER) { if (source_desc->common.type != ACPI_TYPE_BUFFER) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"SMBus/IPMI/GenericSerialBus write requires Buffer, found type %s", "SMBus/IPMI/GenericSerialBus write requires "
"Buffer, found type %s",
acpi_ut_get_object_type_name(source_desc))); acpi_ut_get_object_type_name(source_desc)));
return_ACPI_STATUS(AE_AML_OPERAND_TYPE); return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
@@ -392,9 +400,9 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
} else if (obj_desc->field.region_obj->region.space_id == } else if (obj_desc->field.region_obj->region.space_id ==
ACPI_ADR_SPACE_GSBUS) { ACPI_ADR_SPACE_GSBUS) {
accessor_type = obj_desc->field.attribute; accessor_type = obj_desc->field.attribute;
length = acpi_ex_get_serial_access_length(accessor_type, length =
obj_desc-> acpi_ex_get_serial_access_length(accessor_type,
field. obj_desc->field.
access_length); access_length);
/* /*
@@ -402,7 +410,7 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
* *
* Status; (Byte 0 of the data buffer) * Status; (Byte 0 of the data buffer)
* Length; (Byte 1 of the data buffer) * Length; (Byte 1 of the data buffer)
* Data[x-1]; (Bytes 2-x of the arbitrary length data buffer) * Data[x-1]: (Bytes 2-x of the arbitrary length data buffer)
*/ */
length += 2; length += 2;
function = ACPI_WRITE | (accessor_type << 16); function = ACPI_WRITE | (accessor_type << 16);
@@ -414,7 +422,8 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
if (source_desc->buffer.length < length) { if (source_desc->buffer.length < length) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"SMBus/IPMI/GenericSerialBus write requires Buffer of length %u, found length %u", "SMBus/IPMI/GenericSerialBus write requires "
"Buffer of length %u, found length %u",
length, source_desc->buffer.length)); length, source_desc->buffer.length));
return_ACPI_STATUS(AE_AML_BUFFER_LIMIT); return_ACPI_STATUS(AE_AML_BUFFER_LIMIT);
@@ -438,8 +447,8 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
* Perform the write (returns status and perhaps data in the * Perform the write (returns status and perhaps data in the
* same buffer) * same buffer)
*/ */
status = acpi_ex_access_region(obj_desc, 0, status =
(u64 *) buffer, function); acpi_ex_access_region(obj_desc, 0, (u64 *)buffer, function);
acpi_ex_release_global_lock(obj_desc->common_field.field_flags); acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
*result_desc = buffer_desc; *result_desc = buffer_desc;
@@ -476,8 +485,9 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
/* Perform the write */ /* Perform the write */
status = acpi_ex_access_region(obj_desc, 0, status =
(u64 *)buffer, ACPI_WRITE); acpi_ex_access_region(obj_desc, 0, (u64 *)buffer,
ACPI_WRITE);
acpi_ex_release_global_lock(obj_desc->common_field.field_flags); acpi_ex_release_global_lock(obj_desc->common_field.field_flags);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }

View File

@@ -180,7 +180,8 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,
* byte, and a field with Dword access specified. * byte, and a field with Dword access specified.
*/ */
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Field [%4.4s] access width (%u bytes) too large for region [%4.4s] (length %u)", "Field [%4.4s] access width (%u bytes) "
"too large for region [%4.4s] (length %u)",
acpi_ut_get_node_name(obj_desc-> acpi_ut_get_node_name(obj_desc->
common_field.node), common_field.node),
obj_desc->common_field.access_byte_width, obj_desc->common_field.access_byte_width,
@@ -194,7 +195,8 @@ acpi_ex_setup_region(union acpi_operand_object *obj_desc,
* exceeds region length, indicate an error * exceeds region length, indicate an error
*/ */
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Field [%4.4s] Base+Offset+Width %u+%u+%u is beyond end of region [%4.4s] (length %u)", "Field [%4.4s] Base+Offset+Width %u+%u+%u "
"is beyond end of region [%4.4s] (length %u)",
acpi_ut_get_node_name(obj_desc->common_field.node), acpi_ut_get_node_name(obj_desc->common_field.node),
obj_desc->common_field.base_byte_offset, obj_desc->common_field.base_byte_offset,
field_datum_byte_offset, field_datum_byte_offset,
@@ -638,15 +640,15 @@ acpi_ex_write_with_update_rule(union acpi_operand_object *obj_desc,
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Unknown UpdateRule value: 0x%X", "Unknown UpdateRule value: 0x%X",
(obj_desc->common_field. (obj_desc->common_field.field_flags &
field_flags &
AML_FIELD_UPDATE_RULE_MASK))); AML_FIELD_UPDATE_RULE_MASK)));
return_ACPI_STATUS(AE_AML_OPERAND_VALUE); return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
} }
} }
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
"Mask %8.8X%8.8X, DatumOffset %X, Width %X, Value %8.8X%8.8X, MergedValue %8.8X%8.8X\n", "Mask %8.8X%8.8X, DatumOffset %X, Width %X, "
"Value %8.8X%8.8X, MergedValue %8.8X%8.8X\n",
ACPI_FORMAT_UINT64(mask), ACPI_FORMAT_UINT64(mask),
field_datum_byte_offset, field_datum_byte_offset,
obj_desc->common_field.access_byte_width, obj_desc->common_field.access_byte_width,
@@ -655,7 +657,8 @@ acpi_ex_write_with_update_rule(union acpi_operand_object *obj_desc,
/* Write the merged value */ /* Write the merged value */
status = acpi_ex_field_datum_io(obj_desc, field_datum_byte_offset, status =
acpi_ex_field_datum_io(obj_desc, field_datum_byte_offset,
&merged_value, ACPI_WRITE); &merged_value, ACPI_WRITE);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
@@ -764,8 +767,9 @@ acpi_ex_extract_from_field(union acpi_operand_object *obj_desc,
/* Get next input datum from the field */ /* Get next input datum from the field */
field_offset += obj_desc->common_field.access_byte_width; field_offset += obj_desc->common_field.access_byte_width;
status = acpi_ex_field_datum_io(obj_desc, field_offset, status =
&raw_datum, ACPI_READ); acpi_ex_field_datum_io(obj_desc, field_offset, &raw_datum,
ACPI_READ);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -858,6 +862,7 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
new_buffer = NULL; new_buffer = NULL;
required_length = required_length =
ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field.bit_length); ACPI_ROUND_BITS_UP_TO_BYTES(obj_desc->common_field.bit_length);
/* /*
* We must have a buffer that is at least as long as the field * We must have a buffer that is at least as long as the field
* we are writing to. This is because individual fields are * we are writing to. This is because individual fields are
@@ -932,8 +937,8 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
/* Write merged datum to the target field */ /* Write merged datum to the target field */
merged_datum &= mask; merged_datum &= mask;
status = acpi_ex_write_with_update_rule(obj_desc, mask, status =
merged_datum, acpi_ex_write_with_update_rule(obj_desc, mask, merged_datum,
field_offset); field_offset);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto exit; goto exit;
@@ -990,8 +995,8 @@ acpi_ex_insert_into_field(union acpi_operand_object *obj_desc,
/* Write the last datum to the field */ /* Write the last datum to the field */
merged_datum &= mask; merged_datum &= mask;
status = acpi_ex_write_with_update_rule(obj_desc, status =
mask, merged_datum, acpi_ex_write_with_update_rule(obj_desc, mask, merged_datum,
field_offset); field_offset);
exit: exit:

View File

@@ -98,9 +98,9 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
default: default:
ACPI_ERROR((AE_INFO, "Unknown Reference Class 0x%2.2X", ACPI_ERROR((AE_INFO, "Invalid Reference Class 0x%2.2X",
obj_desc->reference.class)); obj_desc->reference.class));
return_ACPI_STATUS(AE_AML_INTERNAL); return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
} }
break; break;
@@ -247,6 +247,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
union acpi_operand_object *local_operand1 = operand1; union acpi_operand_object *local_operand1 = operand1;
union acpi_operand_object *return_desc; union acpi_operand_object *return_desc;
char *new_buf; char *new_buf;
const char *type_string;
acpi_status status; acpi_status status;
ACPI_FUNCTION_TRACE(ex_do_concatenate); ACPI_FUNCTION_TRACE(ex_do_concatenate);
@@ -266,11 +267,43 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
break; break;
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
/*
* Per the ACPI spec, Concatenate only supports int/str/buf.
* However, we support all objects here as an extension.
* This improves the usefulness of the Printf() macro.
* 12/2015.
*/
switch (operand1->common.type) {
case ACPI_TYPE_INTEGER:
case ACPI_TYPE_STRING:
case ACPI_TYPE_BUFFER:
status = acpi_ex_convert_to_string(operand1, &local_operand1, status =
acpi_ex_convert_to_string(operand1, &local_operand1,
ACPI_IMPLICIT_CONVERT_HEX); ACPI_IMPLICIT_CONVERT_HEX);
break; break;
default:
/*
* Just emit a string containing the object type.
*/
type_string =
acpi_ut_get_type_name(operand1->common.type);
local_operand1 = acpi_ut_create_string_object(((acpi_size) strlen(type_string) + 9)); /* 9 For "[Object]" */
if (!local_operand1) {
status = AE_NO_MEMORY;
goto cleanup;
}
strcpy(local_operand1->string.pointer, "[");
strcat(local_operand1->string.pointer, type_string);
strcat(local_operand1->string.pointer, " Object]");
status = AE_OK;
break;
}
break;
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
status = acpi_ex_convert_to_buffer(operand1, &local_operand1); status = acpi_ex_convert_to_buffer(operand1, &local_operand1);
@@ -347,8 +380,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
/* Concatenate the strings */ /* Concatenate the strings */
strcpy(new_buf, operand0->string.pointer); strcpy(new_buf, operand0->string.pointer);
strcpy(new_buf + operand0->string.length, strcat(new_buf, local_operand1->string.pointer);
local_operand1->string.pointer);
break; break;
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
@@ -591,7 +623,8 @@ acpi_ex_do_logical_op(u16 opcode,
case ACPI_TYPE_STRING: case ACPI_TYPE_STRING:
status = acpi_ex_convert_to_string(operand1, &local_operand1, status =
acpi_ex_convert_to_string(operand1, &local_operand1,
ACPI_IMPLICIT_CONVERT_HEX); ACPI_IMPLICIT_CONVERT_HEX);
break; break;

View File

@@ -185,7 +185,8 @@ acpi_ex_acquire_mutex_object(u16 timeout,
if (obj_desc == acpi_gbl_global_lock_mutex) { if (obj_desc == acpi_gbl_global_lock_mutex) {
status = acpi_ev_acquire_global_lock(timeout); status = acpi_ev_acquire_global_lock(timeout);
} else { } else {
status = acpi_ex_system_wait_mutex(obj_desc->mutex.os_mutex, status =
acpi_ex_system_wait_mutex(obj_desc->mutex.os_mutex,
timeout); timeout);
} }
@@ -243,20 +244,30 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc,
} }
/* /*
* Current sync level must be less than or equal to the sync level of the * Current sync level must be less than or equal to the sync level
* mutex. This mechanism provides some deadlock prevention * of the mutex. This mechanism provides some deadlock prevention.
*/ */
if (walk_state->thread->current_sync_level > obj_desc->mutex.sync_level) { if (walk_state->thread->current_sync_level > obj_desc->mutex.sync_level) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Cannot acquire Mutex [%4.4s], current SyncLevel is too large (%u)", "Cannot acquire Mutex [%4.4s], "
"current SyncLevel is too large (%u)",
acpi_ut_get_node_name(obj_desc->mutex.node), acpi_ut_get_node_name(obj_desc->mutex.node),
walk_state->thread->current_sync_level)); walk_state->thread->current_sync_level));
return_ACPI_STATUS(AE_AML_MUTEX_ORDER); return_ACPI_STATUS(AE_AML_MUTEX_ORDER);
} }
status = acpi_ex_acquire_mutex_object((u16) time_desc->integer.value, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Acquiring: Mutex SyncLevel %u, Thread SyncLevel %u, "
"Depth %u TID %p\n",
obj_desc->mutex.sync_level,
walk_state->thread->current_sync_level,
obj_desc->mutex.acquisition_depth,
walk_state->thread));
status = acpi_ex_acquire_mutex_object((u16)time_desc->integer.value,
obj_desc, obj_desc,
walk_state->thread->thread_id); walk_state->thread->thread_id);
if (ACPI_SUCCESS(status) && obj_desc->mutex.acquisition_depth == 1) { if (ACPI_SUCCESS(status) && obj_desc->mutex.acquisition_depth == 1) {
/* Save Thread object, original/current sync levels */ /* Save Thread object, original/current sync levels */
@@ -272,6 +283,12 @@ acpi_ex_acquire_mutex(union acpi_operand_object *time_desc,
acpi_ex_link_mutex(obj_desc, walk_state->thread); acpi_ex_link_mutex(obj_desc, walk_state->thread);
} }
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Acquired: Mutex SyncLevel %u, Thread SyncLevel %u, Depth %u\n",
obj_desc->mutex.sync_level,
walk_state->thread->current_sync_level,
obj_desc->mutex.acquisition_depth));
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -356,9 +373,9 @@ acpi_status
acpi_ex_release_mutex(union acpi_operand_object *obj_desc, acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
struct acpi_walk_state *walk_state) struct acpi_walk_state *walk_state)
{ {
acpi_status status = AE_OK;
u8 previous_sync_level; u8 previous_sync_level;
struct acpi_thread_state *owner_thread; struct acpi_thread_state *owner_thread;
acpi_status status = AE_OK;
ACPI_FUNCTION_TRACE(ex_release_mutex); ACPI_FUNCTION_TRACE(ex_release_mutex);
@@ -409,7 +426,8 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
*/ */
if (obj_desc->mutex.sync_level != owner_thread->current_sync_level) { if (obj_desc->mutex.sync_level != owner_thread->current_sync_level) {
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Cannot release Mutex [%4.4s], SyncLevel mismatch: mutex %u current %u", "Cannot release Mutex [%4.4s], SyncLevel mismatch: "
"mutex %u current %u",
acpi_ut_get_node_name(obj_desc->mutex.node), acpi_ut_get_node_name(obj_desc->mutex.node),
obj_desc->mutex.sync_level, obj_desc->mutex.sync_level,
walk_state->thread->current_sync_level)); walk_state->thread->current_sync_level));
@@ -424,6 +442,15 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
previous_sync_level = previous_sync_level =
owner_thread->acquired_mutex_list->mutex.original_sync_level; owner_thread->acquired_mutex_list->mutex.original_sync_level;
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Releasing: Object SyncLevel %u, Thread SyncLevel %u, "
"Prev SyncLevel %u, Depth %u TID %p\n",
obj_desc->mutex.sync_level,
walk_state->thread->current_sync_level,
previous_sync_level,
obj_desc->mutex.acquisition_depth,
walk_state->thread));
status = acpi_ex_release_mutex_object(obj_desc); status = acpi_ex_release_mutex_object(obj_desc);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
@@ -436,6 +463,14 @@ acpi_ex_release_mutex(union acpi_operand_object *obj_desc,
owner_thread->current_sync_level = previous_sync_level; owner_thread->current_sync_level = previous_sync_level;
} }
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Released: Object SyncLevel %u, Thread SyncLevel, %u, "
"Prev SyncLevel %u, Depth %u\n",
obj_desc->mutex.sync_level,
walk_state->thread->current_sync_level,
previous_sync_level,
obj_desc->mutex.acquisition_depth));
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -462,21 +497,17 @@ void acpi_ex_release_all_mutexes(struct acpi_thread_state *thread)
union acpi_operand_object *next = thread->acquired_mutex_list; union acpi_operand_object *next = thread->acquired_mutex_list;
union acpi_operand_object *obj_desc; union acpi_operand_object *obj_desc;
ACPI_FUNCTION_NAME(ex_release_all_mutexes); ACPI_FUNCTION_TRACE(ex_release_all_mutexes);
/* Traverse the list of owned mutexes, releasing each one */ /* Traverse the list of owned mutexes, releasing each one */
while (next) { while (next) {
obj_desc = next; obj_desc = next;
next = obj_desc->mutex.next;
obj_desc->mutex.prev = NULL;
obj_desc->mutex.next = NULL;
obj_desc->mutex.acquisition_depth = 0;
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Force-releasing held mutex: %p\n", "Mutex [%4.4s] force-release, SyncLevel %u Depth %u\n",
obj_desc)); obj_desc->mutex.node->name.ascii,
obj_desc->mutex.sync_level,
obj_desc->mutex.acquisition_depth));
/* Release the mutex, special case for Global Lock */ /* Release the mutex, special case for Global Lock */
@@ -489,14 +520,21 @@ void acpi_ex_release_all_mutexes(struct acpi_thread_state *thread)
acpi_os_release_mutex(obj_desc->mutex.os_mutex); acpi_os_release_mutex(obj_desc->mutex.os_mutex);
} }
/* Mark mutex unowned */
obj_desc->mutex.owner_thread = NULL;
obj_desc->mutex.thread_id = 0;
/* Update Thread sync_level (Last mutex is the important one) */ /* Update Thread sync_level (Last mutex is the important one) */
thread->current_sync_level = thread->current_sync_level =
obj_desc->mutex.original_sync_level; obj_desc->mutex.original_sync_level;
/* Mark mutex unowned */
next = obj_desc->mutex.next;
obj_desc->mutex.prev = NULL;
obj_desc->mutex.next = NULL;
obj_desc->mutex.acquisition_depth = 0;
obj_desc->mutex.owner_thread = NULL;
obj_desc->mutex.thread_id = 0;
} }
return_VOID;
} }

View File

@@ -164,8 +164,8 @@ static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
ACPI_FUNCTION_TRACE(ex_name_segment); ACPI_FUNCTION_TRACE(ex_name_segment);
/* /*
* If first character is a digit, then we know that we aren't looking at a * If first character is a digit, then we know that we aren't looking
* valid name segment * at a valid name segment
*/ */
char_buf[0] = *aml_address; char_buf[0] = *aml_address;

View File

@@ -484,22 +484,26 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
case AML_TO_DECSTRING_OP: /* to_decimal_string (Data, Result) */ case AML_TO_DECSTRING_OP: /* to_decimal_string (Data, Result) */
status = acpi_ex_convert_to_string(operand[0], &return_desc, status =
acpi_ex_convert_to_string(operand[0], &return_desc,
ACPI_EXPLICIT_CONVERT_DECIMAL); ACPI_EXPLICIT_CONVERT_DECIMAL);
if (return_desc == operand[0]) { if (return_desc == operand[0]) {
/* No conversion performed, add ref to handle return value */ /* No conversion performed, add ref to handle return value */
acpi_ut_add_reference(return_desc); acpi_ut_add_reference(return_desc);
} }
break; break;
case AML_TO_HEXSTRING_OP: /* to_hex_string (Data, Result) */ case AML_TO_HEXSTRING_OP: /* to_hex_string (Data, Result) */
status = acpi_ex_convert_to_string(operand[0], &return_desc, status =
acpi_ex_convert_to_string(operand[0], &return_desc,
ACPI_EXPLICIT_CONVERT_HEX); ACPI_EXPLICIT_CONVERT_HEX);
if (return_desc == operand[0]) { if (return_desc == operand[0]) {
/* No conversion performed, add ref to handle return value */ /* No conversion performed, add ref to handle return value */
acpi_ut_add_reference(return_desc); acpi_ut_add_reference(return_desc);
} }
break; break;
@@ -510,17 +514,20 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
if (return_desc == operand[0]) { if (return_desc == operand[0]) {
/* No conversion performed, add ref to handle return value */ /* No conversion performed, add ref to handle return value */
acpi_ut_add_reference(return_desc); acpi_ut_add_reference(return_desc);
} }
break; break;
case AML_TO_INTEGER_OP: /* to_integer (Data, Result) */ case AML_TO_INTEGER_OP: /* to_integer (Data, Result) */
status = acpi_ex_convert_to_integer(operand[0], &return_desc, status =
acpi_ex_convert_to_integer(operand[0], &return_desc,
ACPI_ANY_BASE); ACPI_ANY_BASE);
if (return_desc == operand[0]) { if (return_desc == operand[0]) {
/* No conversion performed, add ref to handle return value */ /* No conversion performed, add ref to handle return value */
acpi_ut_add_reference(return_desc); acpi_ut_add_reference(return_desc);
} }
break; break;
@@ -679,7 +686,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
status = acpi_ex_store(return_desc, operand[0], walk_state); status = acpi_ex_store(return_desc, operand[0], walk_state);
break; break;
case AML_TYPE_OP: /* object_type (source_object) */ case AML_OBJECT_TYPE_OP: /* object_type (source_object) */
/* /*
* Note: The operand is not resolved at this point because we want to * Note: The operand is not resolved at this point because we want to
* get the associated object, not its value. For example, we don't * get the associated object, not its value. For example, we don't
@@ -713,8 +720,8 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
/* Get the base object */ /* Get the base object */
status = acpi_ex_resolve_multiple(walk_state, status =
operand[0], &type, acpi_ex_resolve_multiple(walk_state, operand[0], &type,
&temp_desc); &temp_desc);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto cleanup; goto cleanup;
@@ -759,8 +766,10 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
default: default:
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Operand must be Buffer/Integer/String/Package - found type %s", "Operand must be Buffer/Integer/String/Package"
" - found type %s",
acpi_ut_get_type_name(type))); acpi_ut_get_type_name(type)));
status = AE_AML_OPERAND_TYPE; status = AE_AML_OPERAND_TYPE;
goto cleanup; goto cleanup;
} }
@@ -981,6 +990,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
"Unknown Index TargetType 0x%X in reference object %p", "Unknown Index TargetType 0x%X in reference object %p",
operand[0]->reference. operand[0]->reference.
target_type, operand[0])); target_type, operand[0]));
status = AE_AML_OPERAND_TYPE; status = AE_AML_OPERAND_TYPE;
goto cleanup; goto cleanup;
} }
@@ -1050,6 +1060,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X",
walk_state->opcode)); walk_state->opcode));
status = AE_AML_BAD_OPCODE; status = AE_AML_BAD_OPCODE;
goto cleanup; goto cleanup;
} }

View File

@@ -199,6 +199,7 @@ acpi_status acpi_ex_opcode_2A_2T_1R(struct acpi_walk_state *walk_state)
ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X",
walk_state->opcode)); walk_state->opcode));
status = AE_AML_BAD_OPCODE; status = AE_AML_BAD_OPCODE;
goto cleanup; goto cleanup;
} }
@@ -299,8 +300,9 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
case AML_CONCAT_OP: /* Concatenate (Data1, Data2, Result) */ case AML_CONCAT_OP: /* Concatenate (Data1, Data2, Result) */
status = acpi_ex_do_concatenate(operand[0], operand[1], status =
&return_desc, walk_state); acpi_ex_do_concatenate(operand[0], operand[1], &return_desc,
walk_state);
break; break;
case AML_TO_STRING_OP: /* to_string (Buffer, Length, Result) (ACPI 2.0) */ case AML_TO_STRING_OP: /* to_string (Buffer, Length, Result) (ACPI 2.0) */
@@ -345,7 +347,8 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
/* concatenate_res_template (Buffer, Buffer, Result) (ACPI 2.0) */ /* concatenate_res_template (Buffer, Buffer, Result) (ACPI 2.0) */
status = acpi_ex_concat_template(operand[0], operand[1], status =
acpi_ex_concat_template(operand[0], operand[1],
&return_desc, walk_state); &return_desc, walk_state);
break; break;
@@ -553,6 +556,7 @@ acpi_status acpi_ex_opcode_2A_0T_1R(struct acpi_walk_state *walk_state)
ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X",
walk_state->opcode)); walk_state->opcode));
status = AE_AML_BAD_OPCODE; status = AE_AML_BAD_OPCODE;
goto cleanup; goto cleanup;
} }

View File

@@ -95,10 +95,11 @@ acpi_status acpi_ex_opcode_3A_0T_0R(struct acpi_walk_state *walk_state)
case AML_FATAL_OP: /* Fatal (fatal_type fatal_code fatal_arg) */ case AML_FATAL_OP: /* Fatal (fatal_type fatal_code fatal_arg) */
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"FatalOp: Type %X Code %X Arg %X <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", "FatalOp: Type %X Code %X Arg %X "
(u32) operand[0]->integer.value, "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n",
(u32) operand[1]->integer.value, (u32)operand[0]->integer.value,
(u32) operand[2]->integer.value)); (u32)operand[1]->integer.value,
(u32)operand[2]->integer.value));
fatal = ACPI_ALLOCATE(sizeof(struct acpi_signal_fatal_info)); fatal = ACPI_ALLOCATE(sizeof(struct acpi_signal_fatal_info));
if (fatal) { if (fatal) {
@@ -131,6 +132,7 @@ acpi_status acpi_ex_opcode_3A_0T_0R(struct acpi_walk_state *walk_state)
ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X",
walk_state->opcode)); walk_state->opcode));
status = AE_AML_BAD_OPCODE; status = AE_AML_BAD_OPCODE;
goto cleanup; goto cleanup;
} }
@@ -193,7 +195,8 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
/* Truncate request if larger than the actual String/Buffer */ /* Truncate request if larger than the actual String/Buffer */
else if ((index + length) > operand[0]->string.length) { else if ((index + length) > operand[0]->string.length) {
length = (acpi_size) operand[0]->string.length - length =
(acpi_size) operand[0]->string.length -
(acpi_size) index; (acpi_size) index;
} }
@@ -237,8 +240,8 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
/* We have a buffer, copy the portion requested */ /* We have a buffer, copy the portion requested */
memcpy(buffer, operand[0]->string.pointer + index, memcpy(buffer,
length); operand[0]->string.pointer + index, length);
} }
/* Set the length of the new String/Buffer */ /* Set the length of the new String/Buffer */
@@ -255,6 +258,7 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X",
walk_state->opcode)); walk_state->opcode));
status = AE_AML_BAD_OPCODE; status = AE_AML_BAD_OPCODE;
goto cleanup; goto cleanup;
} }
@@ -270,12 +274,11 @@ cleanup:
if (ACPI_FAILURE(status) || walk_state->result_obj) { if (ACPI_FAILURE(status) || walk_state->result_obj) {
acpi_ut_remove_reference(return_desc); acpi_ut_remove_reference(return_desc);
walk_state->result_obj = NULL; walk_state->result_obj = NULL;
} } else {
/* Set the return object and exit */ /* Set the return object and exit */
else {
walk_state->result_obj = return_desc; walk_state->result_obj = return_desc;
} }
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }

View File

@@ -310,6 +310,7 @@ acpi_status acpi_ex_opcode_6A_0T_1R(struct acpi_walk_state * walk_state)
ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X", ACPI_ERROR((AE_INFO, "Unknown AML opcode 0x%X",
walk_state->opcode)); walk_state->opcode));
status = AE_AML_BAD_OPCODE; status = AE_AML_BAD_OPCODE;
goto cleanup; goto cleanup;
} }

View File

@@ -1,6 +1,6 @@
/****************************************************************************** /******************************************************************************
* *
* Module Name: exprep - ACPI AML (p-code) execution - field prep utilities * Module Name: exprep - ACPI AML field prep utilities
* *
*****************************************************************************/ *****************************************************************************/
@@ -103,8 +103,10 @@ acpi_ex_generate_access(u32 field_bit_offset,
/* Round Field start offset and length to "minimal" byte boundaries */ /* Round Field start offset and length to "minimal" byte boundaries */
field_byte_offset = ACPI_DIV_8(ACPI_ROUND_DOWN(field_bit_offset, 8)); field_byte_offset = ACPI_DIV_8(ACPI_ROUND_DOWN(field_bit_offset, 8));
field_byte_end_offset = ACPI_DIV_8(ACPI_ROUND_UP(field_bit_length +
field_bit_offset, 8)); field_byte_end_offset =
ACPI_DIV_8(ACPI_ROUND_UP(field_bit_length + field_bit_offset, 8));
field_byte_length = field_byte_end_offset - field_byte_offset; field_byte_length = field_byte_end_offset - field_byte_offset;
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
@@ -159,7 +161,8 @@ acpi_ex_generate_access(u32 field_bit_offset,
if (accesses <= 1) { if (accesses <= 1) {
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
"Entire field can be accessed with one operation of size %u\n", "Entire field can be accessed "
"with one operation of size %u\n",
access_byte_width)); access_byte_width));
return_VALUE(access_byte_width); return_VALUE(access_byte_width);
} }
@@ -202,6 +205,7 @@ acpi_ex_generate_access(u32 field_bit_offset,
*/ */
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
"Cannot access field in one operation, using width 8\n")); "Cannot access field in one operation, using width 8\n"));
return_VALUE(8); return_VALUE(8);
} }
#endif /* ACPI_UNDER_DEVELOPMENT */ #endif /* ACPI_UNDER_DEVELOPMENT */
@@ -281,6 +285,7 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc,
/* Invalid field access type */ /* Invalid field access type */
ACPI_ERROR((AE_INFO, "Unknown field access type 0x%X", access)); ACPI_ERROR((AE_INFO, "Unknown field access type 0x%X", access));
return_UINT32(0); return_UINT32(0);
} }
@@ -354,8 +359,8 @@ acpi_ex_prep_common_field_object(union acpi_operand_object *obj_desc,
* For all other access types (Byte, Word, Dword, Qword), the Bitwidth is * For all other access types (Byte, Word, Dword, Qword), the Bitwidth is
* the same (equivalent) as the byte_alignment. * the same (equivalent) as the byte_alignment.
*/ */
access_bit_width = acpi_ex_decode_field_access(obj_desc, field_flags, access_bit_width =
&byte_alignment); acpi_ex_decode_field_access(obj_desc, field_flags, &byte_alignment);
if (!access_bit_width) { if (!access_bit_width) {
return_ACPI_STATUS(AE_AML_OPERAND_VALUE); return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
} }
@@ -595,7 +600,8 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
access_byte_width); access_byte_width);
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,
"IndexField: BitOff %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n", "IndexField: BitOff %X, Off %X, Value %X, "
"Gran %X, Index %p, Data %p\n",
obj_desc->index_field.start_field_bit_offset, obj_desc->index_field.start_field_bit_offset,
obj_desc->index_field.base_byte_offset, obj_desc->index_field.base_byte_offset,
obj_desc->index_field.value, obj_desc->index_field.value,
@@ -615,7 +621,8 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
* Store the constructed descriptor (obj_desc) into the parent Node, * Store the constructed descriptor (obj_desc) into the parent Node,
* preserving the current type of that named_obj. * preserving the current type of that named_obj.
*/ */
status = acpi_ns_attach_object(info->field_node, obj_desc, status =
acpi_ns_attach_object(info->field_node, obj_desc,
acpi_ns_get_type(info->field_node)); acpi_ns_get_type(info->field_node));
ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, ACPI_DEBUG_PRINT((ACPI_DB_BFIELD,

View File

@@ -392,7 +392,8 @@ acpi_ex_pci_config_space_handler(u32 function,
pci_register = (u16) (u32) address; pci_register = (u16) (u32) address;
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"Pci-Config %u (%u) Seg(%04x) Bus(%04x) Dev(%04x) Func(%04x) Reg(%04x)\n", "Pci-Config %u (%u) Seg(%04x) Bus(%04x) "
"Dev(%04x) Func(%04x) Reg(%04x)\n",
function, bit_width, pci_id->segment, pci_id->bus, function, bit_width, pci_id->segment, pci_id->bus,
pci_id->device, pci_id->function, pci_register)); pci_id->device, pci_id->function, pci_register));
@@ -400,13 +401,15 @@ acpi_ex_pci_config_space_handler(u32 function,
case ACPI_READ: case ACPI_READ:
*value = 0; *value = 0;
status = acpi_os_read_pci_configuration(pci_id, pci_register, status =
value, bit_width); acpi_os_read_pci_configuration(pci_id, pci_register, value,
bit_width);
break; break;
case ACPI_WRITE: case ACPI_WRITE:
status = acpi_os_write_pci_configuration(pci_id, pci_register, status =
acpi_os_write_pci_configuration(pci_id, pci_register,
*value, bit_width); *value, bit_width);
break; break;

View File

@@ -112,7 +112,7 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
/* /*
* Several object types require no further processing: * Several object types require no further processing:
* 1) Device/Thermal objects don't have a "real" subobject, return the Node * 1) Device/Thermal objects don't have a "real" subobject, return Node
* 2) Method locals and arguments have a pseudo-Node * 2) Method locals and arguments have a pseudo-Node
* 3) 10/2007: Added method type to assist with Package construction. * 3) 10/2007: Added method type to assist with Package construction.
*/ */

View File

@@ -217,7 +217,8 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
* the package, can't dereference it * the package, can't dereference it
*/ */
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Attempt to dereference an Index to NULL package element Idx=%p", "Attempt to dereference an Index to "
"NULL package element Idx=%p",
stack_desc)); stack_desc));
status = AE_AML_UNINITIALIZED_ELEMENT; status = AE_AML_UNINITIALIZED_ELEMENT;
} }
@@ -361,10 +362,9 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
if (type == ACPI_TYPE_LOCAL_ALIAS) { if (type == ACPI_TYPE_LOCAL_ALIAS) {
type = ((struct acpi_namespace_node *)obj_desc)->type; type = ((struct acpi_namespace_node *)obj_desc)->type;
obj_desc = obj_desc = acpi_ns_get_attached_object((struct
acpi_ns_get_attached_object((struct acpi_namespace_node
acpi_namespace_node *) *)obj_desc);
obj_desc);
} }
if (!obj_desc) { if (!obj_desc) {

View File

@@ -90,8 +90,8 @@ acpi_ex_check_object_type(acpi_object_type type_needed,
* specification, a store to a constant is a noop.) * specification, a store to a constant is a noop.)
*/ */
if ((this_type == ACPI_TYPE_INTEGER) && if ((this_type == ACPI_TYPE_INTEGER) &&
(((union acpi_operand_object *)object)->common. (((union acpi_operand_object *)object)->common.flags &
flags & AOPOBJ_AML_CONSTANT)) { AOPOBJ_AML_CONSTANT)) {
return (AE_OK); return (AE_OK);
} }
} }
@@ -196,10 +196,10 @@ acpi_ex_resolve_operands(u16 opcode,
* thus, the attached object is always the aliased namespace node * thus, the attached object is always the aliased namespace node
*/ */
if (object_type == ACPI_TYPE_LOCAL_ALIAS) { if (object_type == ACPI_TYPE_LOCAL_ALIAS) {
obj_desc = obj_desc = acpi_ns_get_attached_object((struct
acpi_ns_get_attached_object((struct
acpi_namespace_node acpi_namespace_node
*)obj_desc); *)
obj_desc);
*stack_ptr = obj_desc; *stack_ptr = obj_desc;
object_type = object_type =
((struct acpi_namespace_node *)obj_desc)-> ((struct acpi_namespace_node *)obj_desc)->
@@ -285,8 +285,8 @@ acpi_ex_resolve_operands(u16 opcode,
case ARGI_REF_OR_STRING: /* Can be a String or Reference */ case ARGI_REF_OR_STRING: /* Can be a String or Reference */
if ((ACPI_GET_DESCRIPTOR_TYPE(obj_desc) == if ((ACPI_GET_DESCRIPTOR_TYPE(obj_desc) ==
ACPI_DESC_TYPE_OPERAND) ACPI_DESC_TYPE_OPERAND) &&
&& (obj_desc->common.type == ACPI_TYPE_STRING)) { (obj_desc->common.type == ACPI_TYPE_STRING)) {
/* /*
* String found - the string references a named object and * String found - the string references a named object and
* must be resolved to a node * must be resolved to a node
@@ -465,7 +465,8 @@ acpi_ex_resolve_operands(u16 opcode,
* But we can implicitly convert from a BUFFER or INTEGER * But we can implicitly convert from a BUFFER or INTEGER
* aka - "Implicit Source Operand Conversion" * aka - "Implicit Source Operand Conversion"
*/ */
status = acpi_ex_convert_to_string(obj_desc, stack_ptr, status =
acpi_ex_convert_to_string(obj_desc, stack_ptr,
ACPI_IMPLICIT_CONVERT_HEX); ACPI_IMPLICIT_CONVERT_HEX);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
if (status == AE_TYPE) { if (status == AE_TYPE) {
@@ -597,8 +598,10 @@ acpi_ex_resolve_operands(u16 opcode,
case ARGI_REGION_OR_BUFFER: /* Used by Load() only */ case ARGI_REGION_OR_BUFFER: /* Used by Load() only */
/* Need an operand of type REGION or a BUFFER (which could be a resolved region field) */ /*
* Need an operand of type REGION or a BUFFER
* (which could be a resolved region field)
*/
switch (obj_desc->common.type) { switch (obj_desc->common.type) {
case ACPI_TYPE_BUFFER: case ACPI_TYPE_BUFFER:
case ACPI_TYPE_REGION: case ACPI_TYPE_REGION:
@@ -640,9 +643,9 @@ acpi_ex_resolve_operands(u16 opcode,
if (acpi_gbl_enable_interpreter_slack) { if (acpi_gbl_enable_interpreter_slack) {
/* /*
* Enable original behavior of Store(), allowing any and all * Enable original behavior of Store(), allowing any
* objects as the source operand. The ACPI spec does not * and all objects as the source operand. The ACPI
* allow this, however. * spec does not allow this, however.
*/ */
break; break;
} }
@@ -655,7 +658,8 @@ acpi_ex_resolve_operands(u16 opcode,
} }
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p", "Needed Integer/Buffer/String/Package/Ref/Ddb]"
", found [%s] %p",
acpi_ut_get_object_type_name acpi_ut_get_object_type_name
(obj_desc), obj_desc)); (obj_desc), obj_desc));
@@ -678,7 +682,8 @@ acpi_ex_resolve_operands(u16 opcode,
* Make sure that the original object was resolved to the * Make sure that the original object was resolved to the
* required object type (Simple cases only). * required object type (Simple cases only).
*/ */
status = acpi_ex_check_object_type(type_needed, status =
acpi_ex_check_object_type(type_needed,
(*stack_ptr)->common.type, (*stack_ptr)->common.type,
*stack_ptr); *stack_ptr);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {

View File

@@ -467,7 +467,8 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
case ACPI_TYPE_THERMAL: case ACPI_TYPE_THERMAL:
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Target must be [Buffer/Integer/String/Reference], found [%s] (%4.4s)", "Target must be [Buffer/Integer/String/Reference]"
", found [%s] (%4.4s)",
acpi_ut_get_type_name(node->type), acpi_ut_get_type_name(node->type),
node->name.ascii)); node->name.ascii));
@@ -504,7 +505,8 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
* an implicit conversion, as per the ACPI specification. * an implicit conversion, as per the ACPI specification.
* A direct store is performed instead. * A direct store is performed instead.
*/ */
status = acpi_ex_store_direct_to_node(source_desc, node, status =
acpi_ex_store_direct_to_node(source_desc, node,
walk_state); walk_state);
break; break;
} }
@@ -528,7 +530,8 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
* store has been performed such that the node/object type * store has been performed such that the node/object type
* has been changed. * has been changed.
*/ */
status = acpi_ns_attach_object(node, new_desc, status =
acpi_ns_attach_object(node, new_desc,
new_desc->common.type); new_desc->common.type);
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
@@ -563,8 +566,8 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
* operator. (Note, for this default case, all normal * operator. (Note, for this default case, all normal
* Store/Target operations exited above with an error). * Store/Target operations exited above with an error).
*/ */
status = acpi_ex_store_direct_to_node(source_desc, node, status =
walk_state); acpi_ex_store_direct_to_node(source_desc, node, walk_state);
break; break;
} }

View File

@@ -1,6 +1,6 @@
/****************************************************************************** /******************************************************************************
* *
* Module Name: exstorob - AML Interpreter object store support, store to object * Module Name: exstorob - AML object store support, store to object
* *
*****************************************************************************/ *****************************************************************************/
@@ -203,8 +203,9 @@ acpi_ex_store_string_to_string(union acpi_operand_object *source_desc,
ACPI_FREE(target_desc->string.pointer); ACPI_FREE(target_desc->string.pointer);
} }
target_desc->string.pointer = ACPI_ALLOCATE_ZEROED((acpi_size) target_desc->string.pointer =
length + 1); ACPI_ALLOCATE_ZEROED((acpi_size) length + 1);
if (!target_desc->string.pointer) { if (!target_desc->string.pointer) {
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }

View File

@@ -78,7 +78,6 @@ acpi_status acpi_ex_system_wait_semaphore(acpi_semaphore semaphore, u16 timeout)
/* We must wait, so unlock the interpreter */ /* We must wait, so unlock the interpreter */
acpi_ex_exit_interpreter(); acpi_ex_exit_interpreter();
status = acpi_os_wait_semaphore(semaphore, 1, timeout); status = acpi_os_wait_semaphore(semaphore, 1, timeout);
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
@@ -124,7 +123,6 @@ acpi_status acpi_ex_system_wait_mutex(acpi_mutex mutex, u16 timeout)
/* We must wait, so unlock the interpreter */ /* We must wait, so unlock the interpreter */
acpi_ex_exit_interpreter(); acpi_ex_exit_interpreter();
status = acpi_os_acquire_mutex(mutex, timeout); status = acpi_os_acquire_mutex(mutex, timeout);
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
@@ -169,8 +167,8 @@ acpi_status acpi_ex_system_do_stall(u32 how_long)
* (ACPI specifies 100 usec as max, but this gives some slack in * (ACPI specifies 100 usec as max, but this gives some slack in
* order to support existing BIOSs) * order to support existing BIOSs)
*/ */
ACPI_ERROR((AE_INFO, "Time parameter is too large (%u)", ACPI_ERROR((AE_INFO,
how_long)); "Time parameter is too large (%u)", how_long));
status = AE_AML_OPERAND_VALUE; status = AE_AML_OPERAND_VALUE;
} else { } else {
acpi_os_stall(how_long); acpi_os_stall(how_long);

View File

@@ -0,0 +1,377 @@
/******************************************************************************
*
* Module Name: extrace - Support for interpreter execution tracing
*
*****************************************************************************/
/*
* Copyright (C) 2000 - 2015, Intel Corp.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions, and the following disclaimer,
* without modification.
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
* substantially similar to the "NO WARRANTY" disclaimer below
* ("Disclaimer") and any redistribution must be conditioned upon
* including a substantially similar Disclaimer requirement for further
* binary redistribution.
* 3. Neither the names of the above-listed copyright holders nor the names
* of any contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* Alternatively, this software may be distributed under the terms of the
* GNU General Public License ("GPL") version 2 as published by the Free
* Software Foundation.
*
* NO WARRANTY
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGES.
*/
#include <acpi/acpi.h>
#include "accommon.h"
#include "acnamesp.h"
#include "acinterp.h"
#define _COMPONENT ACPI_EXECUTER
ACPI_MODULE_NAME("extrace")
static union acpi_operand_object *acpi_gbl_trace_method_object = NULL;
/* Local prototypes */
#ifdef ACPI_DEBUG_OUTPUT
static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type);
#endif
/*******************************************************************************
*
* FUNCTION: acpi_ex_interpreter_trace_enabled
*
* PARAMETERS: name - Whether method name should be matched,
* this should be checked before starting
* the tracer
*
* RETURN: TRUE if interpreter trace is enabled.
*
* DESCRIPTION: Check whether interpreter trace is enabled
*
******************************************************************************/
static u8 acpi_ex_interpreter_trace_enabled(char *name)
{
/* Check if tracing is enabled */
if (!(acpi_gbl_trace_flags & ACPI_TRACE_ENABLED)) {
return (FALSE);
}
/*
* Check if tracing is filtered:
*
* 1. If the tracer is started, acpi_gbl_trace_method_object should have
* been filled by the trace starter
* 2. If the tracer is not started, acpi_gbl_trace_method_name should be
* matched if it is specified
* 3. If the tracer is oneshot style, acpi_gbl_trace_method_name should
* not be cleared by the trace stopper during the first match
*/
if (acpi_gbl_trace_method_object) {
return (TRUE);
}
if (name &&
(acpi_gbl_trace_method_name &&
strcmp(acpi_gbl_trace_method_name, name))) {
return (FALSE);
}
if ((acpi_gbl_trace_flags & ACPI_TRACE_ONESHOT) &&
!acpi_gbl_trace_method_name) {
return (FALSE);
}
return (TRUE);
}
/*******************************************************************************
*
* FUNCTION: acpi_ex_get_trace_event_name
*
* PARAMETERS: type - Trace event type
*
* RETURN: Trace event name.
*
* DESCRIPTION: Used to obtain the full trace event name.
*
******************************************************************************/
#ifdef ACPI_DEBUG_OUTPUT
static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type)
{
switch (type) {
case ACPI_TRACE_AML_METHOD:
return "Method";
case ACPI_TRACE_AML_OPCODE:
return "Opcode";
case ACPI_TRACE_AML_REGION:
return "Region";
default:
return "";
}
}
#endif
/*******************************************************************************
*
* FUNCTION: acpi_ex_trace_point
*
* PARAMETERS: type - Trace event type
* begin - TRUE if before execution
* aml - Executed AML address
* pathname - Object path
*
* RETURN: None
*
* DESCRIPTION: Internal interpreter execution trace.
*
******************************************************************************/
void
acpi_ex_trace_point(acpi_trace_event_type type,
u8 begin, u8 *aml, char *pathname)
{
ACPI_FUNCTION_NAME(ex_trace_point);
if (pathname) {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"%s %s [0x%p:%s] execution.\n",
acpi_ex_get_trace_event_name(type),
begin ? "Begin" : "End", aml, pathname));
} else {
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
"%s %s [0x%p] execution.\n",
acpi_ex_get_trace_event_name(type),
begin ? "Begin" : "End", aml));
}
}
/*******************************************************************************
*
* FUNCTION: acpi_ex_start_trace_method
*
* PARAMETERS: method_node - Node of the method
* obj_desc - The method object
* walk_state - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Start control method execution trace
*
******************************************************************************/
void
acpi_ex_start_trace_method(struct acpi_namespace_node *method_node,
union acpi_operand_object *obj_desc,
struct acpi_walk_state *walk_state)
{
acpi_status status;
char *pathname = NULL;
u8 enabled = FALSE;
ACPI_FUNCTION_NAME(ex_start_trace_method);
if (method_node) {
pathname = acpi_ns_get_normalized_pathname(method_node, TRUE);
}
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) {
goto exit;
}
enabled = acpi_ex_interpreter_trace_enabled(pathname);
if (enabled && !acpi_gbl_trace_method_object) {
acpi_gbl_trace_method_object = obj_desc;
acpi_gbl_original_dbg_level = acpi_dbg_level;
acpi_gbl_original_dbg_layer = acpi_dbg_layer;
acpi_dbg_level = ACPI_TRACE_LEVEL_ALL;
acpi_dbg_layer = ACPI_TRACE_LAYER_ALL;
if (acpi_gbl_trace_dbg_level) {
acpi_dbg_level = acpi_gbl_trace_dbg_level;
}
if (acpi_gbl_trace_dbg_layer) {
acpi_dbg_layer = acpi_gbl_trace_dbg_layer;
}
}
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
exit:
if (enabled) {
ACPI_TRACE_POINT(ACPI_TRACE_AML_METHOD, TRUE,
obj_desc ? obj_desc->method.aml_start : NULL,
pathname);
}
if (pathname) {
ACPI_FREE(pathname);
}
}
/*******************************************************************************
*
* FUNCTION: acpi_ex_stop_trace_method
*
* PARAMETERS: method_node - Node of the method
* obj_desc - The method object
* walk_state - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Stop control method execution trace
*
******************************************************************************/
void
acpi_ex_stop_trace_method(struct acpi_namespace_node *method_node,
union acpi_operand_object *obj_desc,
struct acpi_walk_state *walk_state)
{
acpi_status status;
char *pathname = NULL;
u8 enabled;
ACPI_FUNCTION_NAME(ex_stop_trace_method);
if (method_node) {
pathname = acpi_ns_get_normalized_pathname(method_node, TRUE);
}
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) {
goto exit_path;
}
enabled = acpi_ex_interpreter_trace_enabled(NULL);
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
if (enabled) {
ACPI_TRACE_POINT(ACPI_TRACE_AML_METHOD, FALSE,
obj_desc ? obj_desc->method.aml_start : NULL,
pathname);
}
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
if (ACPI_FAILURE(status)) {
goto exit_path;
}
/* Check whether the tracer should be stopped */
if (acpi_gbl_trace_method_object == obj_desc) {
/* Disable further tracing if type is one-shot */
if (acpi_gbl_trace_flags & ACPI_TRACE_ONESHOT) {
acpi_gbl_trace_method_name = NULL;
}
acpi_dbg_level = acpi_gbl_original_dbg_level;
acpi_dbg_layer = acpi_gbl_original_dbg_layer;
acpi_gbl_trace_method_object = NULL;
}
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
exit_path:
if (pathname) {
ACPI_FREE(pathname);
}
}
/*******************************************************************************
*
* FUNCTION: acpi_ex_start_trace_opcode
*
* PARAMETERS: op - The parser opcode object
* walk_state - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Start opcode execution trace
*
******************************************************************************/
void
acpi_ex_start_trace_opcode(union acpi_parse_object *op,
struct acpi_walk_state *walk_state)
{
ACPI_FUNCTION_NAME(ex_start_trace_opcode);
if (acpi_ex_interpreter_trace_enabled(NULL) &&
(acpi_gbl_trace_flags & ACPI_TRACE_OPCODE)) {
ACPI_TRACE_POINT(ACPI_TRACE_AML_OPCODE, TRUE,
op->common.aml, op->common.aml_op_name);
}
}
/*******************************************************************************
*
* FUNCTION: acpi_ex_stop_trace_opcode
*
* PARAMETERS: op - The parser opcode object
* walk_state - current state, NULL if not yet executing
* a method.
*
* RETURN: None
*
* DESCRIPTION: Stop opcode execution trace
*
******************************************************************************/
void
acpi_ex_stop_trace_opcode(union acpi_parse_object *op,
struct acpi_walk_state *walk_state)
{
ACPI_FUNCTION_NAME(ex_stop_trace_opcode);
if (acpi_ex_interpreter_trace_enabled(NULL) &&
(acpi_gbl_trace_flags & ACPI_TRACE_OPCODE)) {
ACPI_TRACE_POINT(ACPI_TRACE_AML_OPCODE, FALSE,
op->common.aml, op->common.aml_op_name);
}
}

View File

@@ -167,8 +167,8 @@ u8 acpi_ex_truncate_for32bit_table(union acpi_operand_object *obj_desc)
if ((acpi_gbl_integer_byte_width == 4) && if ((acpi_gbl_integer_byte_width == 4) &&
(obj_desc->integer.value > (u64)ACPI_UINT32_MAX)) { (obj_desc->integer.value > (u64)ACPI_UINT32_MAX)) {
/* /*
* We are executing in a 32-bit ACPI table. * We are executing in a 32-bit ACPI table. Truncate
* Truncate the value to 32 bits by zeroing out the upper 32-bit field * the value to 32 bits by zeroing out the upper 32-bit field
*/ */
obj_desc->integer.value &= (u64)ACPI_UINT32_MAX; obj_desc->integer.value &= (u64)ACPI_UINT32_MAX;
return (TRUE); return (TRUE);
@@ -323,7 +323,8 @@ void acpi_ex_eisa_id_to_string(char *out_string, u64 compressed_id)
if (compressed_id > ACPI_UINT32_MAX) { if (compressed_id > ACPI_UINT32_MAX) {
ACPI_WARNING((AE_INFO, ACPI_WARNING((AE_INFO,
"Expected EISAID is larger than 32 bits: 0x%8.8X%8.8X, truncating", "Expected EISAID is larger than 32 bits: "
"0x%8.8X%8.8X, truncating",
ACPI_FORMAT_UINT64(compressed_id))); ACPI_FORMAT_UINT64(compressed_id)));
} }

View File

@@ -117,8 +117,8 @@ acpi_status acpi_hw_extended_sleep(u8 sleep_state)
/* Clear wake status (WAK_STS) */ /* Clear wake status (WAK_STS) */
status = status = acpi_write((u64)ACPI_X_WAKE_STATUS,
acpi_write((u64)ACPI_X_WAKE_STATUS, &acpi_gbl_FADT.sleep_status); &acpi_gbl_FADT.sleep_status);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }

View File

@@ -187,9 +187,8 @@ acpi_status acpi_hw_clear_gpe(struct acpi_gpe_event_info * gpe_event_info)
*/ */
register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info); register_bit = acpi_hw_get_gpe_register_bit(gpe_event_info);
status = acpi_hw_write(register_bit, status =
&gpe_register_info->status_address); acpi_hw_write(register_bit, &gpe_register_info->status_address);
return (status); return (status);
} }
@@ -297,6 +296,7 @@ acpi_hw_gpe_enable_write(u8 enable_mask,
acpi_status status; acpi_status status;
gpe_register_info->enable_mask = enable_mask; gpe_register_info->enable_mask = enable_mask;
status = acpi_hw_write(enable_mask, &gpe_register_info->enable_address); status = acpi_hw_write(enable_mask, &gpe_register_info->enable_address);
return (status); return (status);
} }

View File

@@ -80,8 +80,8 @@ acpi_status acpi_hw_legacy_sleep(u8 sleep_state)
/* Clear wake status */ /* Clear wake status */
status = status = acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS,
acpi_write_bit_register(ACPI_BITREG_WAKE_STATUS, ACPI_CLEAR_STATUS); ACPI_CLEAR_STATUS);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }

View File

@@ -504,11 +504,20 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
* Evaluate the \_Sx namespace object containing the register values * Evaluate the \_Sx namespace object containing the register values
* for this state * for this state
*/ */
info->relative_pathname = info->relative_pathname = ACPI_CAST_PTR(char,
ACPI_CAST_PTR(char, acpi_gbl_sleep_state_names[sleep_state]); acpi_gbl_sleep_state_names
[sleep_state]);
status = acpi_ns_evaluate(info); status = acpi_ns_evaluate(info);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
goto cleanup; if (status == AE_NOT_FOUND) {
/* The _Sx states are optional, ignore NOT_FOUND */
goto final_cleanup;
}
goto warning_cleanup;
} }
/* Must have a return object */ /* Must have a return object */
@@ -517,7 +526,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
ACPI_ERROR((AE_INFO, "No Sleep State object returned from [%s]", ACPI_ERROR((AE_INFO, "No Sleep State object returned from [%s]",
info->relative_pathname)); info->relative_pathname));
status = AE_AML_NO_RETURN_VALUE; status = AE_AML_NO_RETURN_VALUE;
goto cleanup; goto warning_cleanup;
} }
/* Return object must be of type Package */ /* Return object must be of type Package */
@@ -526,7 +535,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
ACPI_ERROR((AE_INFO, ACPI_ERROR((AE_INFO,
"Sleep State return object is not a Package")); "Sleep State return object is not a Package"));
status = AE_AML_OPERAND_TYPE; status = AE_AML_OPERAND_TYPE;
goto cleanup1; goto return_value_cleanup;
} }
/* /*
@@ -570,16 +579,17 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
break; break;
} }
cleanup1: return_value_cleanup:
acpi_ut_remove_reference(info->return_object); acpi_ut_remove_reference(info->return_object);
cleanup: warning_cleanup:
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
ACPI_EXCEPTION((AE_INFO, status, ACPI_EXCEPTION((AE_INFO, status,
"While evaluating Sleep State [%s]", "While evaluating Sleep State [%s]",
info->relative_pathname)); info->relative_pathname));
} }
final_cleanup:
ACPI_FREE(info); ACPI_FREE(info);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }

View File

@@ -52,7 +52,7 @@ ACPI_MODULE_NAME("hwxfsleep")
/* Local prototypes */ /* Local prototypes */
#if (!ACPI_REDUCED_HARDWARE) #if (!ACPI_REDUCED_HARDWARE)
static acpi_status static acpi_status
acpi_hw_set_firmware_waking_vectors(struct acpi_table_facs *facs, acpi_hw_set_firmware_waking_vector(struct acpi_table_facs *facs,
acpi_physical_address physical_address, acpi_physical_address physical_address,
acpi_physical_address physical_address64); acpi_physical_address physical_address64);
#endif #endif
@@ -79,22 +79,20 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
/* /*
* These functions are removed for the ACPI_REDUCED_HARDWARE case: * These functions are removed for the ACPI_REDUCED_HARDWARE case:
* acpi_set_firmware_waking_vectors
* acpi_set_firmware_waking_vector * acpi_set_firmware_waking_vector
* acpi_set_firmware_waking_vector64
* acpi_enter_sleep_state_s4bios * acpi_enter_sleep_state_s4bios
*/ */
#if (!ACPI_REDUCED_HARDWARE) #if (!ACPI_REDUCED_HARDWARE)
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_hw_set_firmware_waking_vectors * FUNCTION: acpi_hw_set_firmware_waking_vector
* *
* PARAMETERS: facs - Pointer to FACS table * PARAMETERS: facs - Pointer to FACS table
* physical_address - 32-bit physical address of ACPI real mode * physical_address - 32-bit physical address of ACPI real mode
* entry point. * entry point
* physical_address64 - 64-bit physical address of ACPI protected * physical_address64 - 64-bit physical address of ACPI protected
* mode entry point. * mode entry point
* *
* RETURN: Status * RETURN: Status
* *
@@ -103,11 +101,11 @@ static struct acpi_sleep_functions acpi_sleep_dispatch[] = {
******************************************************************************/ ******************************************************************************/
static acpi_status static acpi_status
acpi_hw_set_firmware_waking_vectors(struct acpi_table_facs *facs, acpi_hw_set_firmware_waking_vector(struct acpi_table_facs *facs,
acpi_physical_address physical_address, acpi_physical_address physical_address,
acpi_physical_address physical_address64) acpi_physical_address physical_address64)
{ {
ACPI_FUNCTION_TRACE(acpi_hw_set_firmware_waking_vectors); ACPI_FUNCTION_TRACE(acpi_hw_set_firmware_waking_vector);
/* /*
@@ -140,12 +138,12 @@ acpi_hw_set_firmware_waking_vectors(struct acpi_table_facs *facs,
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_set_firmware_waking_vectors * FUNCTION: acpi_set_firmware_waking_vector
* *
* PARAMETERS: physical_address - 32-bit physical address of ACPI real mode * PARAMETERS: physical_address - 32-bit physical address of ACPI real mode
* entry point. * entry point
* physical_address64 - 64-bit physical address of ACPI protected * physical_address64 - 64-bit physical address of ACPI protected
* mode entry point. * mode entry point
* *
* RETURN: Status * RETURN: Status
* *
@@ -154,14 +152,14 @@ acpi_hw_set_firmware_waking_vectors(struct acpi_table_facs *facs,
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_set_firmware_waking_vectors(acpi_physical_address physical_address, acpi_set_firmware_waking_vector(acpi_physical_address physical_address,
acpi_physical_address physical_address64) acpi_physical_address physical_address64)
{ {
ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vectors); ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
if (acpi_gbl_FACS) { if (acpi_gbl_FACS) {
(void)acpi_hw_set_firmware_waking_vectors(acpi_gbl_FACS, (void)acpi_hw_set_firmware_waking_vector(acpi_gbl_FACS,
physical_address, physical_address,
physical_address64); physical_address64);
} }
@@ -169,64 +167,8 @@ acpi_set_firmware_waking_vectors(acpi_physical_address physical_address,
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vectors)
/*******************************************************************************
*
* FUNCTION: acpi_set_firmware_waking_vector
*
* PARAMETERS: physical_address - 32-bit physical address of ACPI real mode
* entry point.
*
* RETURN: Status
*
* DESCRIPTION: Sets the 32-bit firmware_waking_vector field of the FACS
*
******************************************************************************/
acpi_status acpi_set_firmware_waking_vector(u32 physical_address)
{
acpi_status status;
ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector);
status = acpi_set_firmware_waking_vectors((acpi_physical_address)
physical_address, 0);
return_ACPI_STATUS(status);
}
ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector) ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector)
#if ACPI_MACHINE_WIDTH == 64
/*******************************************************************************
*
* FUNCTION: acpi_set_firmware_waking_vector64
*
* PARAMETERS: physical_address - 64-bit physical address of ACPI protected
* mode entry point.
*
* RETURN: Status
*
* DESCRIPTION: Sets the 64-bit X_firmware_waking_vector field of the FACS, if
* it exists in the table. This function is intended for use with
* 64-bit host operating systems.
*
******************************************************************************/
acpi_status acpi_set_firmware_waking_vector64(u64 physical_address)
{
acpi_status status;
ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vector64);
status = acpi_set_firmware_waking_vectors(0,
(acpi_physical_address)
physical_address);
return_ACPI_STATUS(status);
}
ACPI_EXPORT_SYMBOL(acpi_set_firmware_waking_vector64)
#endif
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_enter_sleep_state_s4bios * FUNCTION: acpi_enter_sleep_state_s4bios
@@ -286,6 +228,7 @@ acpi_status acpi_enter_sleep_state_s4bios(void)
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
} while (!in_value); } while (!in_value);
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);

View File

@@ -96,9 +96,9 @@ acpi_ns_convert_to_integer(union acpi_operand_object *original_object,
/* Extract each buffer byte to create the integer */ /* Extract each buffer byte to create the integer */
for (i = 0; i < original_object->buffer.length; i++) { for (i = 0; i < original_object->buffer.length; i++) {
value |= value |= ((u64)
((u64)original_object->buffer. original_object->buffer.pointer[i] << (i *
pointer[i] << (i * 8)); 8));
} }
break; break;
@@ -153,8 +153,7 @@ acpi_ns_convert_to_string(union acpi_operand_object *original_object,
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
} }
} else { } else {
status = status = acpi_ex_convert_to_string(original_object,
acpi_ex_convert_to_string(original_object,
&new_object, &new_object,
ACPI_IMPLICIT_CONVERT_HEX); ACPI_IMPLICIT_CONVERT_HEX);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
@@ -244,9 +243,8 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
/* String-to-Buffer conversion. Simple data copy */ /* String-to-Buffer conversion. Simple data copy */
new_object = new_object = acpi_ut_create_buffer_object
acpi_ut_create_buffer_object(original_object->string. (original_object->string.length);
length);
if (!new_object) { if (!new_object) {
return (AE_NO_MEMORY); return (AE_NO_MEMORY);
} }
@@ -308,7 +306,8 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
* *
* FUNCTION: acpi_ns_convert_to_unicode * FUNCTION: acpi_ns_convert_to_unicode
* *
* PARAMETERS: original_object - ASCII String Object to be converted * PARAMETERS: scope - Namespace node for the method/object
* original_object - ASCII String Object to be converted
* return_object - Where the new converted object is returned * return_object - Where the new converted object is returned
* *
* RETURN: Status. AE_OK if conversion was successful. * RETURN: Status. AE_OK if conversion was successful.
@@ -318,7 +317,8 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_ns_convert_to_unicode(union acpi_operand_object *original_object, acpi_ns_convert_to_unicode(struct acpi_namespace_node * scope,
union acpi_operand_object *original_object,
union acpi_operand_object **return_object) union acpi_operand_object **return_object)
{ {
union acpi_operand_object *new_object; union acpi_operand_object *new_object;
@@ -372,7 +372,8 @@ acpi_ns_convert_to_unicode(union acpi_operand_object *original_object,
* *
* FUNCTION: acpi_ns_convert_to_resource * FUNCTION: acpi_ns_convert_to_resource
* *
* PARAMETERS: original_object - Object to be converted * PARAMETERS: scope - Namespace node for the method/object
* original_object - Object to be converted
* return_object - Where the new converted object is returned * return_object - Where the new converted object is returned
* *
* RETURN: Status. AE_OK if conversion was successful * RETURN: Status. AE_OK if conversion was successful
@@ -383,7 +384,8 @@ acpi_ns_convert_to_unicode(union acpi_operand_object *original_object,
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_ns_convert_to_resource(union acpi_operand_object *original_object, acpi_ns_convert_to_resource(struct acpi_namespace_node * scope,
union acpi_operand_object *original_object,
union acpi_operand_object **return_object) union acpi_operand_object **return_object)
{ {
union acpi_operand_object *new_object; union acpi_operand_object *new_object;
@@ -444,3 +446,78 @@ acpi_ns_convert_to_resource(union acpi_operand_object *original_object,
*return_object = new_object; *return_object = new_object;
return (AE_OK); return (AE_OK);
} }
/*******************************************************************************
*
* FUNCTION: acpi_ns_convert_to_reference
*
* PARAMETERS: scope - Namespace node for the method/object
* original_object - Object to be converted
* return_object - Where the new converted object is returned
*
* RETURN: Status. AE_OK if conversion was successful
*
* DESCRIPTION: Attempt to convert a Integer object to a object_reference.
* Buffer.
*
******************************************************************************/
acpi_status
acpi_ns_convert_to_reference(struct acpi_namespace_node * scope,
union acpi_operand_object *original_object,
union acpi_operand_object **return_object)
{
union acpi_operand_object *new_object = NULL;
acpi_status status;
struct acpi_namespace_node *node;
union acpi_generic_state scope_info;
char *name;
ACPI_FUNCTION_NAME(ns_convert_to_reference);
/* Convert path into internal presentation */
status =
acpi_ns_internalize_name(original_object->string.pointer, &name);
if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status);
}
/* Find the namespace node */
scope_info.scope.node =
ACPI_CAST_PTR(struct acpi_namespace_node, scope);
status =
acpi_ns_lookup(&scope_info, name, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
NULL, &node);
if (ACPI_FAILURE(status)) {
/* Check if we are resolving a named reference within a package */
ACPI_ERROR_NAMESPACE(original_object->string.pointer, status);
goto error_exit;
}
/* Create and init a new internal ACPI object */
new_object = acpi_ut_create_internal_object(ACPI_TYPE_LOCAL_REFERENCE);
if (!new_object) {
status = AE_NO_MEMORY;
goto error_exit;
}
new_object->reference.node = node;
new_object->reference.object = node->object;
new_object->reference.class = ACPI_REFCLASS_NAME;
/*
* Increase reference of the object if needed (the object is likely a
* null for device nodes).
*/
acpi_ut_add_reference(node->object);
error_exit:
ACPI_FREE(name);
*return_object = new_object;
return (AE_OK);
}

View File

@@ -539,11 +539,13 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
acpi_os_printf acpi_os_printf
("(Pointer to ACPI Object type %.2X [UNKNOWN])\n", ("(Pointer to ACPI Object type %.2X [UNKNOWN])\n",
obj_type); obj_type);
bytes_to_dump = 32; bytes_to_dump = 32;
} else { } else {
acpi_os_printf acpi_os_printf
("(Pointer to ACPI Object type %.2X [%s])\n", ("(Pointer to ACPI Object type %.2X [%s])\n",
obj_type, acpi_ut_get_type_name(obj_type)); obj_type, acpi_ut_get_type_name(obj_type));
bytes_to_dump = bytes_to_dump =
sizeof(union acpi_operand_object); sizeof(union acpi_operand_object);
} }
@@ -573,6 +575,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
*/ */
bytes_to_dump = obj_desc->string.length; bytes_to_dump = obj_desc->string.length;
obj_desc = (void *)obj_desc->string.pointer; obj_desc = (void *)obj_desc->string.pointer;
acpi_os_printf("(Buffer/String pointer %p length %X)\n", acpi_os_printf("(Buffer/String pointer %p length %X)\n",
obj_desc, bytes_to_dump); obj_desc, bytes_to_dump);
ACPI_DUMP_BUFFER(obj_desc, bytes_to_dump); ACPI_DUMP_BUFFER(obj_desc, bytes_to_dump);
@@ -717,7 +720,7 @@ acpi_ns_dump_one_object_path(acpi_handle obj_handle,
return (AE_OK); return (AE_OK);
} }
pathname = acpi_ns_get_external_pathname(node); pathname = acpi_ns_get_normalized_pathname(node, TRUE);
path_indent = 1; path_indent = 1;
if (level <= max_level) { if (level <= max_level) {

View File

@@ -135,7 +135,7 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)
/* Get the full pathname to the object, for use in warning messages */ /* Get the full pathname to the object, for use in warning messages */
info->full_pathname = acpi_ns_get_external_pathname(info->node); info->full_pathname = acpi_ns_get_normalized_pathname(info->node, TRUE);
if (!info->full_pathname) { if (!info->full_pathname) {
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }

View File

@@ -582,7 +582,8 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
/* Ignore error and move on to next device */ /* Ignore error and move on to next device */
char *scope_name = acpi_ns_get_external_pathname(info->node); char *scope_name =
acpi_ns_get_normalized_pathname(device_node, TRUE);
ACPI_EXCEPTION((AE_INFO, status, "during %s._INI execution", ACPI_EXCEPTION((AE_INFO, status, "during %s._INI execution",
scope_name)); scope_name));

View File

@@ -149,6 +149,23 @@ unlock:
ACPI_DEBUG_PRINT((ACPI_DB_INFO, ACPI_DEBUG_PRINT((ACPI_DB_INFO,
"**** Completed Table Object Initialization\n")); "**** Completed Table Object Initialization\n"));
/*
* Execute any module-level code that was detected during the table load
* phase. Although illegal since ACPI 2.0, there are many machines that
* contain this type of code. Each block of detected executable AML code
* outside of any control method is wrapped with a temporary control
* method object and placed on a global list. The methods on this list
* are executed below.
*
* This case executes the module-level code for each table immediately
* after the table has been loaded. This provides compatibility with
* other ACPI implementations. Optionally, the execution can be deferred
* until later, see acpi_initialize_objects.
*/
if (!acpi_gbl_group_module_level_code) {
acpi_ns_exec_module_code_list();
}
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -321,7 +338,6 @@ acpi_status acpi_ns_unload_namespace(acpi_handle handle)
/* This function does the real work */ /* This function does the real work */
status = acpi_ns_delete_subtree(handle); status = acpi_ns_delete_subtree(handle);
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
#endif #endif

View File

@@ -70,7 +70,6 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
ACPI_FUNCTION_TRACE_PTR(ns_get_external_pathname, node); ACPI_FUNCTION_TRACE_PTR(ns_get_external_pathname, node);
name_buffer = acpi_ns_get_normalized_pathname(node, FALSE); name_buffer = acpi_ns_get_normalized_pathname(node, FALSE);
return_PTR(name_buffer); return_PTR(name_buffer);
} }
@@ -93,7 +92,6 @@ acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node)
ACPI_FUNCTION_ENTRY(); ACPI_FUNCTION_ENTRY();
size = acpi_ns_build_normalized_path(node, NULL, 0, FALSE); size = acpi_ns_build_normalized_path(node, NULL, 0, FALSE);
return (size); return (size);
} }
@@ -217,6 +215,7 @@ acpi_ns_build_normalized_path(struct acpi_namespace_node *node,
ACPI_PATH_PUT8(full_path, path_size, ACPI_PATH_PUT8(full_path, path_size,
AML_DUAL_NAME_PREFIX, length); AML_DUAL_NAME_PREFIX, length);
} }
ACPI_MOVE_32_TO_32(name, &next_node->name); ACPI_MOVE_32_TO_32(name, &next_node->name);
do_no_trailing = no_trailing; do_no_trailing = no_trailing;
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
@@ -228,8 +227,10 @@ acpi_ns_build_normalized_path(struct acpi_namespace_node *node,
ACPI_PATH_PUT8(full_path, path_size, c, length); ACPI_PATH_PUT8(full_path, path_size, c, length);
} }
} }
next_node = next_node->parent; next_node = next_node->parent;
} }
ACPI_PATH_PUT8(full_path, path_size, AML_ROOT_PREFIX, length); ACPI_PATH_PUT8(full_path, path_size, AML_ROOT_PREFIX, length);
/* Reverse the path string */ /* Reverse the path string */
@@ -237,6 +238,7 @@ acpi_ns_build_normalized_path(struct acpi_namespace_node *node,
if (length <= path_size) { if (length <= path_size) {
left = full_path; left = full_path;
right = full_path + length - 1; right = full_path + length - 1;
while (left < right) { while (left < right) {
c = *left; c = *left;
*left++ = *right; *left++ = *right;

View File

@@ -141,8 +141,8 @@ acpi_ns_one_complete_parse(u32 pass_number,
/* Parse the AML */ /* Parse the AML */
ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "*PARSE* pass %u parse\n", ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
pass_number)); "*PARSE* pass %u parse\n", pass_number));
status = acpi_ps_parse_aml(walk_state); status = acpi_ps_parse_aml(walk_state);
cleanup: cleanup:
@@ -181,6 +181,7 @@ acpi_ns_parse_table(u32 table_index, struct acpi_namespace_node *start_node)
* performs another complete parse of the AML. * performs another complete parse of the AML.
*/ */
ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "**** Start pass 1\n")); ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "**** Start pass 1\n"));
status = acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS1, status = acpi_ns_one_complete_parse(ACPI_IMODE_LOAD_PASS1,
table_index, start_node); table_index, start_node);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {

View File

@@ -233,7 +233,8 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
/* First element is the (Integer) revision */ /* First element is the (Integer) revision */
status = acpi_ns_check_object_type(info, elements, status =
acpi_ns_check_object_type(info, elements,
ACPI_RTYPE_INTEGER, 0); ACPI_RTYPE_INTEGER, 0);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return (status); return (status);
@@ -252,7 +253,8 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
/* First element is the (Integer) count of subpackages to follow */ /* First element is the (Integer) count of subpackages to follow */
status = acpi_ns_check_object_type(info, elements, status =
acpi_ns_check_object_type(info, elements,
ACPI_RTYPE_INTEGER, 0); ACPI_RTYPE_INTEGER, 0);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return (status); return (status);

View File

@@ -116,6 +116,11 @@ static const struct acpi_simple_repair_info acpi_object_repair_info[] = {
ACPI_NOT_PACKAGE_ELEMENT, ACPI_NOT_PACKAGE_ELEMENT,
acpi_ns_convert_to_resource}, acpi_ns_convert_to_resource},
/* Object reference conversions */
{"_DEP", ACPI_RTYPE_STRING, ACPI_ALL_PACKAGE_ELEMENTS,
acpi_ns_convert_to_reference},
/* Unicode conversions */ /* Unicode conversions */
{"_MLS", ACPI_RTYPE_STRING, 1, {"_MLS", ACPI_RTYPE_STRING, 1,
@@ -172,8 +177,8 @@ acpi_ns_simple_repair(struct acpi_evaluate_info *info,
"Missing expected return value")); "Missing expected return value"));
} }
status = status = predefined->object_converter(info->node, return_object,
predefined->object_converter(return_object, &new_object); &new_object);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
/* A fatal error occurred during a conversion */ /* A fatal error occurred during a conversion */
@@ -360,12 +365,15 @@ static const struct acpi_simple_repair_info *acpi_ns_match_simple_repair(struct
/* Check if we can actually repair this name/type combination */ /* Check if we can actually repair this name/type combination */
if ((return_btype & this_name->unexpected_btypes) && if ((return_btype & this_name->unexpected_btypes) &&
(package_index == this_name->package_index)) { (this_name->package_index ==
ACPI_ALL_PACKAGE_ELEMENTS
|| package_index == this_name->package_index)) {
return (this_name); return (this_name);
} }
return (NULL); return (NULL);
} }
this_name++; this_name++;
} }
@@ -521,6 +529,7 @@ acpi_ns_remove_null_elements(struct acpi_evaluate_info *info,
*dest = *source; *dest = *source;
dest++; dest++;
} }
source++; source++;
} }
@@ -572,8 +581,8 @@ acpi_ns_wrap_with_package(struct acpi_evaluate_info *info,
ACPI_FUNCTION_NAME(ns_wrap_with_package); ACPI_FUNCTION_NAME(ns_wrap_with_package);
/* /*
* Create the new outer package and populate it. The new package will * Create the new outer package and populate it. The new
* have a single element, the lone sub-object. * package will have a single element, the lone sub-object.
*/ */
pkg_obj_desc = acpi_ut_create_package_object(1); pkg_obj_desc = acpi_ut_create_package_object(1);
if (!pkg_obj_desc) { if (!pkg_obj_desc) {

View File

@@ -225,6 +225,7 @@ static const struct acpi_repair_info *acpi_ns_match_complex_repair(struct
if (ACPI_COMPARE_NAME(node->name.ascii, this_name->name)) { if (ACPI_COMPARE_NAME(node->name.ascii, this_name->name)) {
return (this_name); return (this_name);
} }
this_name++; this_name++;
} }
@@ -301,7 +302,8 @@ acpi_ns_repair_FDE(struct acpi_evaluate_info *info,
/* We can only repair if we have exactly 5 BYTEs */ /* We can only repair if we have exactly 5 BYTEs */
if (return_object->buffer.length != ACPI_FDE_BYTE_BUFFER_SIZE) { if (return_object->buffer.length != ACPI_FDE_BYTE_BUFFER_SIZE) {
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, ACPI_WARN_PREDEFINED((AE_INFO,
info->full_pathname,
info->node_flags, info->node_flags,
"Incorrect return buffer length %u, expected %u", "Incorrect return buffer length %u, expected %u",
return_object->buffer.length, return_object->buffer.length,
@@ -321,8 +323,8 @@ acpi_ns_repair_FDE(struct acpi_evaluate_info *info,
/* Expand each byte to a DWORD */ /* Expand each byte to a DWORD */
byte_buffer = return_object->buffer.pointer; byte_buffer = return_object->buffer.pointer;
dword_buffer = dword_buffer = ACPI_CAST_PTR(u32,
ACPI_CAST_PTR(u32, buffer_object->buffer.pointer); buffer_object->buffer.pointer);
for (i = 0; i < ACPI_FDE_FIELD_COUNT; i++) { for (i = 0; i < ACPI_FDE_FIELD_COUNT; i++) {
*dword_buffer = (u32) *byte_buffer; *dword_buffer = (u32) *byte_buffer;
@@ -461,7 +463,8 @@ acpi_ns_repair_CST(struct acpi_evaluate_info *info,
removing = FALSE; removing = FALSE;
if ((*outer_elements)->package.count == 0) { if ((*outer_elements)->package.count == 0) {
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, ACPI_WARN_PREDEFINED((AE_INFO,
info->full_pathname,
info->node_flags, info->node_flags,
"SubPackage[%u] - removing entry due to zero count", "SubPackage[%u] - removing entry due to zero count",
i)); i));
@@ -471,7 +474,8 @@ acpi_ns_repair_CST(struct acpi_evaluate_info *info,
obj_desc = (*outer_elements)->package.elements[1]; /* Index1 = Type */ obj_desc = (*outer_elements)->package.elements[1]; /* Index1 = Type */
if ((u32)obj_desc->integer.value == 0) { if ((u32)obj_desc->integer.value == 0) {
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, ACPI_WARN_PREDEFINED((AE_INFO,
info->full_pathname,
info->node_flags, info->node_flags,
"SubPackage[%u] - removing entry due to invalid Type(0)", "SubPackage[%u] - removing entry due to invalid Type(0)",
i)); i));
@@ -538,8 +542,8 @@ acpi_ns_repair_HID(struct acpi_evaluate_info *info,
} }
if (return_object->string.length == 0) { if (return_object->string.length == 0) {
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, ACPI_WARN_PREDEFINED((AE_INFO,
info->node_flags, info->full_pathname, info->node_flags,
"Invalid zero-length _HID or _CID string")); "Invalid zero-length _HID or _CID string"));
/* Return AE_OK anyway, let driver handle it */ /* Return AE_OK anyway, let driver handle it */
@@ -710,8 +714,9 @@ acpi_ns_repair_PSS(struct acpi_evaluate_info *info,
elements = (*outer_elements)->package.elements; elements = (*outer_elements)->package.elements;
obj_desc = elements[1]; /* Index1 = power_dissipation */ obj_desc = elements[1]; /* Index1 = power_dissipation */
if ((u32) obj_desc->integer.value > previous_value) { if ((u32)obj_desc->integer.value > previous_value) {
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, ACPI_WARN_PREDEFINED((AE_INFO,
info->full_pathname,
info->node_flags, info->node_flags,
"SubPackage[%u,%u] - suspicious power dissipation values", "SubPackage[%u,%u] - suspicious power dissipation values",
i - 1, i)); i - 1, i));
@@ -969,6 +974,7 @@ acpi_ns_remove_element(union acpi_operand_object *obj_desc, u32 index)
*dest = *source; *dest = *source;
dest++; dest++;
} }
source++; source++;
} }

View File

@@ -105,7 +105,7 @@ acpi_ns_search_one_scope(u32 target_name,
if (ACPI_LV_NAMES & acpi_dbg_level) { if (ACPI_LV_NAMES & acpi_dbg_level) {
char *scope_name; char *scope_name;
scope_name = acpi_ns_get_external_pathname(parent_node); scope_name = acpi_ns_get_normalized_pathname(parent_node, TRUE);
if (scope_name) { if (scope_name) {
ACPI_DEBUG_PRINT((ACPI_DB_NAMES, ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
"Searching %s (%p) For [%4.4s] (%s)\n", "Searching %s (%p) For [%4.4s] (%s)\n",

View File

@@ -173,9 +173,10 @@ void acpi_ns_get_internal_name_length(struct acpi_namestring_info *info)
info->fully_qualified = FALSE; info->fully_qualified = FALSE;
/* /*
* For the internal name, the required length is 4 bytes per segment, plus * For the internal name, the required length is 4 bytes per segment,
* 1 each for root_prefix, multi_name_prefix_op, segment count, trailing null * plus 1 each for root_prefix, multi_name_prefix_op, segment count,
* (which is not really needed, but no there's harm in putting it there) * trailing null (which is not really needed, but no there's harm in
* putting it there)
* *
* strlen() + 1 covers the first name_seg, which has no path separator * strlen() + 1 covers the first name_seg, which has no path separator
*/ */
@@ -699,6 +700,7 @@ acpi_ns_get_node(struct acpi_namespace_node *prefix_node,
if (!prefix_node) { if (!prefix_node) {
*return_node = acpi_gbl_root_node; *return_node = acpi_gbl_root_node;
} }
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }

View File

@@ -750,8 +750,8 @@ acpi_ns_get_device_callback(acpi_handle obj_handle,
/* We have a valid device, invoke the user function */ /* We have a valid device, invoke the user function */
status = info->user_function(obj_handle, nesting_level, info->context, status = info->user_function(obj_handle, nesting_level,
return_value); info->context, return_value);
return (status); return (status);
} }

View File

@@ -159,7 +159,7 @@ acpi_get_name(acpi_handle handle, u32 name_type, struct acpi_buffer * buffer)
{ {
acpi_status status; acpi_status status;
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
char *node_name; const char *node_name;
/* Parameter validation */ /* Parameter validation */
@@ -238,7 +238,6 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
struct acpi_pnp_device_id *source, struct acpi_pnp_device_id *source,
char *string_area) char *string_area)
{ {
/* Create the destination PNP_DEVICE_ID */ /* Create the destination PNP_DEVICE_ID */
dest->string = string_area; dest->string = string_area;
@@ -263,11 +262,18 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
* namespace node and possibly by running several standard * namespace node and possibly by running several standard
* control methods (Such as in the case of a device.) * control methods (Such as in the case of a device.)
* *
* For Device and Processor objects, run the Device _HID, _UID, _CID, _SUB, * For Device and Processor objects, run the Device _HID, _UID, _CID, _STA,
* _CLS, _STA, _ADR, _sx_w, and _sx_d methods. * _CLS, _ADR, _sx_w, and _sx_d methods.
* *
* Note: Allocates the return buffer, must be freed by the caller. * Note: Allocates the return buffer, must be freed by the caller.
* *
* Note: This interface is intended to be used during the initial device
* discovery namespace traversal. Therefore, no complex methods can be
* executed, especially those that access operation regions. Therefore, do
* not add any additional methods that could cause problems in this area.
* this was the fate of the _SUB method which was found to cause such
* problems and was removed (11/2015).
*
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
@@ -279,7 +285,6 @@ acpi_get_object_info(acpi_handle handle,
struct acpi_pnp_device_id_list *cid_list = NULL; struct acpi_pnp_device_id_list *cid_list = NULL;
struct acpi_pnp_device_id *hid = NULL; struct acpi_pnp_device_id *hid = NULL;
struct acpi_pnp_device_id *uid = NULL; struct acpi_pnp_device_id *uid = NULL;
struct acpi_pnp_device_id *sub = NULL;
struct acpi_pnp_device_id *cls = NULL; struct acpi_pnp_device_id *cls = NULL;
char *next_id_string; char *next_id_string;
acpi_object_type type; acpi_object_type type;
@@ -325,7 +330,7 @@ acpi_get_object_info(acpi_handle handle,
if ((type == ACPI_TYPE_DEVICE) || (type == ACPI_TYPE_PROCESSOR)) { if ((type == ACPI_TYPE_DEVICE) || (type == ACPI_TYPE_PROCESSOR)) {
/* /*
* Get extra info for ACPI Device/Processor objects only: * Get extra info for ACPI Device/Processor objects only:
* Run the Device _HID, _UID, _SUB, _CID, and _CLS methods. * Run the Device _HID, _UID, _CLS, and _CID methods.
* *
* Note: none of these methods are required, so they may or may * Note: none of these methods are required, so they may or may
* not be present for this device. The Info->Valid bitfield is used * not be present for this device. The Info->Valid bitfield is used
@@ -348,14 +353,6 @@ acpi_get_object_info(acpi_handle handle,
valid |= ACPI_VALID_UID; valid |= ACPI_VALID_UID;
} }
/* Execute the Device._SUB method */
status = acpi_ut_execute_SUB(node, &sub);
if (ACPI_SUCCESS(status)) {
info_size += sub->length;
valid |= ACPI_VALID_SUB;
}
/* Execute the Device._CID method */ /* Execute the Device._CID method */
status = acpi_ut_execute_CID(node, &cid_list); status = acpi_ut_execute_CID(node, &cid_list);
@@ -456,9 +453,8 @@ acpi_get_object_info(acpi_handle handle,
} }
/* /*
* Copy the HID, UID, SUB, and CIDs to the return buffer. * Copy the HID, UID, and CIDs to the return buffer. The variable-length
* The variable-length strings are copied to the reserved area * strings are copied to the reserved area at the end of the buffer.
* at the end of the buffer.
* *
* For HID and CID, check if the ID is a PCI Root Bridge. * For HID and CID, check if the ID is a PCI Root Bridge.
*/ */
@@ -476,11 +472,6 @@ acpi_get_object_info(acpi_handle handle,
uid, next_id_string); uid, next_id_string);
} }
if (sub) {
next_id_string = acpi_ns_copy_device_id(&info->subsystem_id,
sub, next_id_string);
}
if (cid_list) { if (cid_list) {
info->compatible_id_list.count = cid_list->count; info->compatible_id_list.count = cid_list->count;
info->compatible_id_list.list_size = cid_list->list_size; info->compatible_id_list.list_size = cid_list->list_size;
@@ -522,9 +513,6 @@ cleanup:
if (uid) { if (uid) {
ACPI_FREE(uid); ACPI_FREE(uid);
} }
if (sub) {
ACPI_FREE(sub);
}
if (cid_list) { if (cid_list) {
ACPI_FREE(cid_list); ACPI_FREE(cid_list);
} }
@@ -591,6 +579,7 @@ acpi_status acpi_install_method(u8 *buffer)
parser_state.aml += acpi_ps_get_opcode_size(opcode); parser_state.aml += acpi_ps_get_opcode_size(opcode);
parser_state.pkg_end = acpi_ps_get_next_package_end(&parser_state); parser_state.pkg_end = acpi_ps_get_next_package_end(&parser_state);
path = acpi_ps_get_next_namestring(&parser_state); path = acpi_ps_get_next_namestring(&parser_state);
method_flags = *parser_state.aml++; method_flags = *parser_state.aml++;
aml_start = parser_state.aml; aml_start = parser_state.aml;
aml_length = ACPI_PTR_DIFF(parser_state.pkg_end, aml_start); aml_length = ACPI_PTR_DIFF(parser_state.pkg_end, aml_start);

View File

@@ -74,10 +74,8 @@ acpi_status acpi_get_type(acpi_handle handle, acpi_object_type * ret_type)
return (AE_BAD_PARAMETER); return (AE_BAD_PARAMETER);
} }
/* /* Special case for the predefined Root Node (return type ANY) */
* Special case for the predefined Root Node
* (return type ANY)
*/
if (handle == ACPI_ROOT_OBJECT) { if (handle == ACPI_ROOT_OBJECT) {
*ret_type = ACPI_TYPE_ANY; *ret_type = ACPI_TYPE_ANY;
return (AE_OK); return (AE_OK);

View File

@@ -269,7 +269,8 @@ acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state,
*/ */
if (ACPI_SUCCESS(status) && if (ACPI_SUCCESS(status) &&
possible_method_call && (node->type == ACPI_TYPE_METHOD)) { possible_method_call && (node->type == ACPI_TYPE_METHOD)) {
if (walk_state->opcode == AML_UNLOAD_OP) { if (GET_CURRENT_ARG_TYPE(walk_state->arg_types) ==
ARGP_SUPERNAME) {
/* /*
* acpi_ps_get_next_namestring has increased the AML pointer, * acpi_ps_get_next_namestring has increased the AML pointer,
* so we need to restore the saved AML pointer for method call. * so we need to restore the saved AML pointer for method call.
@@ -696,7 +697,7 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
* *
* PARAMETERS: walk_state - Current state * PARAMETERS: walk_state - Current state
* parser_state - Current parser state object * parser_state - Current parser state object
* arg_type - The argument type (AML_*_ARG) * arg_type - The parser argument type (ARGP_*)
* return_arg - Where the next arg is returned * return_arg - Where the next arg is returned
* *
* RETURN: Status, and an op object containing the next argument. * RETURN: Status, and an op object containing the next argument.
@@ -733,6 +734,7 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
if (!arg) { if (!arg) {
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }
acpi_ps_get_next_simple_arg(parser_state, arg_type, arg); acpi_ps_get_next_simple_arg(parser_state, arg_type, arg);
break; break;
@@ -798,6 +800,7 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
case ARGP_TARGET: case ARGP_TARGET:
case ARGP_SUPERNAME: case ARGP_SUPERNAME:
case ARGP_SIMPLENAME: case ARGP_SIMPLENAME:
case ARGP_NAME_OR_REF:
subop = acpi_ps_peek_opcode(parser_state); subop = acpi_ps_peek_opcode(parser_state);
if (subop == 0 || if (subop == 0 ||
@@ -814,17 +817,17 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
return_ACPI_STATUS(AE_NO_MEMORY); return_ACPI_STATUS(AE_NO_MEMORY);
} }
/* To support super_name arg of Unload */ /* super_name allows argument to be a method call */
if (walk_state->opcode == AML_UNLOAD_OP) { if (arg_type == ARGP_SUPERNAME) {
status = status =
acpi_ps_get_next_namepath(walk_state, acpi_ps_get_next_namepath(walk_state,
parser_state, arg, parser_state, arg,
1); ACPI_POSSIBLE_METHOD_CALL);
/* /*
* If the super_name arg of Unload is a method call, * If the super_name argument is a method call, we have
* we have restored the AML pointer, just free this Arg * already restored the AML pointer, just free this Arg
*/ */
if (arg->common.aml_opcode == if (arg->common.aml_opcode ==
AML_INT_METHODCALL_OP) { AML_INT_METHODCALL_OP) {
@@ -835,7 +838,7 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
status = status =
acpi_ps_get_next_namepath(walk_state, acpi_ps_get_next_namepath(walk_state,
parser_state, arg, parser_state, arg,
0); ACPI_NOT_METHOD_CALL);
} }
} else { } else {
/* Single complex argument, nothing returned */ /* Single complex argument, nothing returned */

View File

@@ -109,10 +109,10 @@ acpi_ps_get_arguments(struct acpi_walk_state *walk_state,
case AML_INT_NAMEPATH_OP: /* AML_NAMESTRING_ARG */ case AML_INT_NAMEPATH_OP: /* AML_NAMESTRING_ARG */
status = status = acpi_ps_get_next_namepath(walk_state,
acpi_ps_get_next_namepath(walk_state, &(walk_state->parser_state),
&(walk_state->parser_state), op, op,
1); ACPI_POSSIBLE_METHOD_CALL);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -124,8 +124,8 @@ acpi_ps_get_arguments(struct acpi_walk_state *walk_state,
/* /*
* Op is not a constant or string, append each argument to the Op * Op is not a constant or string, append each argument to the Op
*/ */
while (GET_CURRENT_ARG_TYPE(walk_state->arg_types) while (GET_CURRENT_ARG_TYPE(walk_state->arg_types) &&
&& !walk_state->arg_count) { !walk_state->arg_count) {
walk_state->aml = walk_state->parser_state.aml; walk_state->aml = walk_state->parser_state.aml;
status = status =

View File

@@ -380,7 +380,7 @@ const struct acpi_opcode_info acpi_gbl_aml_op_info[AML_NUM_OPCODES] = {
AML_TYPE_CREATE_FIELD, AML_TYPE_CREATE_FIELD,
AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE | AML_HAS_ARGS | AML_NSOBJECT | AML_NSNODE |
AML_DEFER | AML_CREATE), AML_DEFER | AML_CREATE),
/* 37 */ ACPI_OP("ObjectType", ARGP_TYPE_OP, ARGI_TYPE_OP, /* 37 */ ACPI_OP("ObjectType", ARGP_OBJECT_TYPE_OP, ARGI_OBJECT_TYPE_OP,
ACPI_TYPE_ANY, AML_CLASS_EXECUTE, ACPI_TYPE_ANY, AML_CLASS_EXECUTE,
AML_TYPE_EXEC_1A_0T_1R, AML_TYPE_EXEC_1A_0T_1R,
AML_FLAGS_EXEC_1A_0T_1R | AML_NO_OPERAND_RESOLVE), AML_FLAGS_EXEC_1A_0T_1R | AML_NO_OPERAND_RESOLVE),

View File

@@ -526,8 +526,8 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
} }
/* /*
* If the transfer to the new method method call worked, a new walk * If the transfer to the new method method call worked
* state was created -- get it *, a new walk state was created -- get it
*/ */
walk_state = acpi_ds_get_current_walk_state(thread); walk_state = acpi_ds_get_current_walk_state(thread);
continue; continue;
@@ -544,8 +544,8 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
/* Check for possible multi-thread reentrancy problem */ /* Check for possible multi-thread reentrancy problem */
if ((status == AE_ALREADY_EXISTS) && if ((status == AE_ALREADY_EXISTS) &&
(!(walk_state->method_desc->method. (!(walk_state->method_desc->method.info_flags &
info_flags & ACPI_METHOD_SERIALIZED))) { ACPI_METHOD_SERIALIZED))) {
/* /*
* Method is not serialized and tried to create an object * Method is not serialized and tried to create an object
* twice. The probable cause is that the method cannot * twice. The probable cause is that the method cannot

View File

@@ -175,8 +175,8 @@ void acpi_ps_free_op(union acpi_parse_object *op)
ACPI_FUNCTION_NAME(ps_free_op); ACPI_FUNCTION_NAME(ps_free_op);
if (op->common.aml_opcode == AML_INT_RETURN_VALUE_OP) { if (op->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS, "Free retval op: %p\n", ACPI_DEBUG_PRINT((ACPI_DB_ALLOCATIONS,
op)); "Free retval op: %p\n", op));
} }
if (op->common.flags & ACPI_PARSEOP_GENERIC) { if (op->common.flags & ACPI_PARSEOP_GENERIC) {

View File

@@ -99,6 +99,7 @@ void acpi_ps_delete_parse_tree(union acpi_parse_object *subtree_root)
if (op == subtree_root) { if (op == subtree_root) {
return_VOID; return_VOID;
} }
if (next) { if (next) {
op = next; op = next;
} else { } else {

View File

@@ -312,8 +312,8 @@ acpi_rs_get_address_common(struct acpi_resource *resource,
/* Validate the Resource Type */ /* Validate the Resource Type */
if ((aml->address.resource_type > 2) if ((aml->address.resource_type > 2) &&
&& (aml->address.resource_type < 0xC0)) { (aml->address.resource_type < 0xC0)) {
return (FALSE); return (FALSE);
} }

View File

@@ -143,16 +143,17 @@ acpi_rs_stream_option_length(u32 resource_length,
ACPI_FUNCTION_ENTRY(); ACPI_FUNCTION_ENTRY();
/* /*
* The resource_source_index and resource_source are optional elements of some * The resource_source_index and resource_source are optional elements of
* Large-type resource descriptors. * some Large-type resource descriptors.
*/ */
/* /*
* If the length of the actual resource descriptor is greater than the ACPI * If the length of the actual resource descriptor is greater than the
* spec-defined minimum length, it means that a resource_source_index exists * ACPI spec-defined minimum length, it means that a resource_source_index
* and is followed by a (required) null terminated string. The string length * exists and is followed by a (required) null terminated string. The
* (including the null terminator) is the resource length minus the minimum * string length (including the null terminator) is the resource length
* length, minus one byte for the resource_source_index itself. * minus the minimum length, minus one byte for the resource_source_index
* itself.
*/ */
if (resource_length > minimum_aml_resource_length) { if (resource_length > minimum_aml_resource_length) {
@@ -277,9 +278,9 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,
* 16-Bit Address Resource: * 16-Bit Address Resource:
* Add the size of the optional resource_source info * Add the size of the optional resource_source info
*/ */
total_size = (acpi_rs_length) total_size = (acpi_rs_length) (total_size +
(total_size + acpi_rs_struct_option_length
acpi_rs_struct_option_length(&resource->data. (&resource->data.
address16. address16.
resource_source)); resource_source));
break; break;
@@ -289,9 +290,9 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,
* 32-Bit Address Resource: * 32-Bit Address Resource:
* Add the size of the optional resource_source info * Add the size of the optional resource_source info
*/ */
total_size = (acpi_rs_length) total_size = (acpi_rs_length) (total_size +
(total_size + acpi_rs_struct_option_length
acpi_rs_struct_option_length(&resource->data. (&resource->data.
address32. address32.
resource_source)); resource_source));
break; break;
@@ -301,9 +302,9 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,
* 64-Bit Address Resource: * 64-Bit Address Resource:
* Add the size of the optional resource_source info * Add the size of the optional resource_source info
*/ */
total_size = (acpi_rs_length) total_size = (acpi_rs_length) (total_size +
(total_size + acpi_rs_struct_option_length
acpi_rs_struct_option_length(&resource->data. (&resource->data.
address64. address64.
resource_source)); resource_source));
break; break;
@@ -314,24 +315,26 @@ acpi_rs_get_aml_length(struct acpi_resource *resource,
* Add the size of each additional optional interrupt beyond the * Add the size of each additional optional interrupt beyond the
* required 1 (4 bytes for each u32 interrupt number) * required 1 (4 bytes for each u32 interrupt number)
*/ */
total_size = (acpi_rs_length) total_size = (acpi_rs_length) (total_size +
(total_size + ((resource->data.
((resource->data.extended_irq.interrupt_count - extended_irq.
interrupt_count -
1) * 4) + 1) * 4) +
/* Add the size of the optional resource_source info */ /* Add the size of the optional resource_source info */
acpi_rs_struct_option_length(&resource->data. acpi_rs_struct_option_length
(&resource->data.
extended_irq. extended_irq.
resource_source)); resource_source));
break; break;
case ACPI_RESOURCE_TYPE_GPIO: case ACPI_RESOURCE_TYPE_GPIO:
total_size = total_size = (acpi_rs_length) (total_size +
(acpi_rs_length) (total_size +
(resource->data.gpio. (resource->data.gpio.
pin_table_length * 2) + pin_table_length * 2) +
resource->data.gpio. resource->data.gpio.
resource_source.string_length + resource_source.
string_length +
resource->data.gpio. resource->data.gpio.
vendor_length); vendor_length);
@@ -566,8 +569,8 @@ acpi_rs_get_list_length(u8 * aml_buffer,
acpi_gbl_resource_struct_sizes[resource_index] + acpi_gbl_resource_struct_sizes[resource_index] +
extra_struct_bytes; extra_struct_bytes;
} }
buffer_size = (u32)ACPI_ROUND_UP_TO_NATIVE_WORD(buffer_size);
buffer_size = (u32)ACPI_ROUND_UP_TO_NATIVE_WORD(buffer_size);
*size_needed += buffer_size; *size_needed += buffer_size;
ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES, ACPI_DEBUG_PRINT((ACPI_DB_RESOURCES,

View File

@@ -81,7 +81,8 @@ acpi_buffer_to_resource(u8 *aml_buffer,
/* Get the required length for the converted resource */ /* Get the required length for the converted resource */
status = acpi_rs_get_list_length(aml_buffer, aml_buffer_length, status =
acpi_rs_get_list_length(aml_buffer, aml_buffer_length,
&list_size_needed); &list_size_needed);
if (status == AE_AML_NO_RESOURCE_END_TAG) { if (status == AE_AML_NO_RESOURCE_END_TAG) {
status = AE_OK; status = AE_OK;
@@ -232,7 +233,8 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
/* Get the required buffer length */ /* Get the required buffer length */
status = acpi_rs_get_pci_routing_table_length(package_object, status =
acpi_rs_get_pci_routing_table_length(package_object,
&buffer_size_needed); &buffer_size_needed);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
@@ -270,9 +272,9 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
user_prt = ACPI_CAST_PTR(struct acpi_pci_routing_table, buffer); user_prt = ACPI_CAST_PTR(struct acpi_pci_routing_table, buffer);
/* /*
* Fill in the Length field with the information we have at this point. * Fill in the Length field with the information we have at this
* The minus four is to subtract the size of the u8 Source[4] member * point. The minus four is to subtract the size of the u8
* because it is added below. * Source[4] member because it is added below.
*/ */
user_prt->length = (sizeof(struct acpi_pci_routing_table) - 4); user_prt->length = (sizeof(struct acpi_pci_routing_table) - 4);
@@ -345,11 +347,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
(u8 *) output_buffer->pointer); (u8 *) output_buffer->pointer);
path_buffer.pointer = user_prt->source; path_buffer.pointer = user_prt->source;
status = status = acpi_ns_handle_to_pathname((acpi_handle) node, &path_buffer, FALSE);
acpi_ns_handle_to_pathname((acpi_handle)
node,
&path_buffer,
FALSE);
/* +1 to include null terminator */ /* +1 to include null terminator */
@@ -371,8 +369,8 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
case ACPI_TYPE_INTEGER: case ACPI_TYPE_INTEGER:
/* /*
* If this is a number, then the Source Name is NULL, since the * If this is a number, then the Source Name is NULL, since
* entire buffer was zeroed out, we can leave this alone. * the entire buffer was zeroed out, we can leave this alone.
* *
* Add to the Length field the length of the u32 NULL * Add to the Length field the length of the u32 NULL
*/ */
@@ -451,9 +449,9 @@ acpi_rs_create_aml_resources(struct acpi_buffer *resource_list,
/* Get the buffer size needed for the AML byte stream */ /* Get the buffer size needed for the AML byte stream */
status = acpi_rs_get_aml_length(resource_list->pointer, status =
resource_list->length, acpi_rs_get_aml_length(resource_list->pointer,
&aml_size_needed); resource_list->length, &aml_size_needed);
ACPI_DEBUG_PRINT((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n", ACPI_DEBUG_PRINT((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n",
(u32)aml_size_needed, acpi_format_exception(status))); (u32)aml_size_needed, acpi_format_exception(status)));

View File

@@ -483,6 +483,7 @@ static void acpi_rs_dump_address_common(union acpi_resource_data *resource)
static void acpi_rs_out_string(char *title, char *value) static void acpi_rs_out_string(char *title, char *value)
{ {
acpi_os_printf("%27s : %s", title, value); acpi_os_printf("%27s : %s", title, value);
if (!*value) { if (!*value) {
acpi_os_printf("[NULL NAMESTRING]"); acpi_os_printf("[NULL NAMESTRING]");
@@ -497,21 +498,25 @@ static void acpi_rs_out_integer8(char *title, u8 value)
static void acpi_rs_out_integer16(char *title, u16 value) static void acpi_rs_out_integer16(char *title, u16 value)
{ {
acpi_os_printf("%27s : %4.4X\n", title, value); acpi_os_printf("%27s : %4.4X\n", title, value);
} }
static void acpi_rs_out_integer32(char *title, u32 value) static void acpi_rs_out_integer32(char *title, u32 value)
{ {
acpi_os_printf("%27s : %8.8X\n", title, value); acpi_os_printf("%27s : %8.8X\n", title, value);
} }
static void acpi_rs_out_integer64(char *title, u64 value) static void acpi_rs_out_integer64(char *title, u64 value)
{ {
acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value)); acpi_os_printf("%27s : %8.8X%8.8X\n", title, ACPI_FORMAT_UINT64(value));
} }
static void acpi_rs_out_title(char *title) static void acpi_rs_out_title(char *title)
{ {
acpi_os_printf("%27s : ", title); acpi_os_printf("%27s : ", title);
} }
@@ -544,6 +549,7 @@ static void acpi_rs_dump_short_byte_list(u8 length, u8 * data)
for (i = 0; i < length; i++) { for (i = 0; i < length; i++) {
acpi_os_printf("%X ", data[i]); acpi_os_printf("%X ", data[i]);
} }
acpi_os_printf("\n"); acpi_os_printf("\n");
} }

View File

@@ -89,6 +89,7 @@ acpi_rs_convert_aml_to_resources(u8 * aml,
/* Get the appropriate conversion info table */ /* Get the appropriate conversion info table */
aml_resource = ACPI_CAST_PTR(union aml_resource, aml); aml_resource = ACPI_CAST_PTR(union aml_resource, aml);
if (acpi_ut_get_resource_type(aml) == ACPI_RESOURCE_NAME_SERIAL_BUS) { if (acpi_ut_get_resource_type(aml) == ACPI_RESOURCE_NAME_SERIAL_BUS) {
if (aml_resource->common_serial_bus.type > if (aml_resource->common_serial_bus.type >
AML_RESOURCE_MAX_SERIALBUSTYPE) { AML_RESOURCE_MAX_SERIALBUSTYPE) {
@@ -225,9 +226,9 @@ acpi_rs_convert_resources_to_aml(struct acpi_resource *resource,
/* Perform final sanity check on the new AML resource descriptor */ /* Perform final sanity check on the new AML resource descriptor */
status = acpi_ut_validate_resource(NULL, status =
ACPI_CAST_PTR(union acpi_ut_validate_resource(NULL,
aml_resource, ACPI_CAST_PTR(union aml_resource,
aml), NULL); aml), NULL);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);

View File

@@ -189,8 +189,8 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
item_count = ACPI_GET8(source); item_count = ACPI_GET8(source);
ACPI_SET8(destination, item_count); ACPI_SET8(destination, item_count);
resource->length = resource->length + resource->length =
(info->value * item_count); resource->length + (info->value * item_count);
break; break;
case ACPI_RSC_COUNT_GPIO_RES: case ACPI_RSC_COUNT_GPIO_RES:
@@ -445,8 +445,8 @@ exit:
/* Round the resource struct length up to the next boundary (32 or 64) */ /* Round the resource struct length up to the next boundary (32 or 64) */
resource->length = resource->length = (u32)
(u32) ACPI_ROUND_UP_TO_NATIVE_WORD(resource->length); ACPI_ROUND_UP_TO_NATIVE_WORD(resource->length);
} }
return_ACPI_STATUS(AE_OK); return_ACPI_STATUS(AE_OK);
} }
@@ -550,9 +550,8 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
item_count = ACPI_GET8(source); item_count = ACPI_GET8(source);
ACPI_SET8(destination, item_count); ACPI_SET8(destination, item_count);
aml_length = aml_length = (u16)
(u16) (aml_length + (aml_length + (info->value * (item_count - 1)));
(info->value * (item_count - 1)));
break; break;
case ACPI_RSC_COUNT16: case ACPI_RSC_COUNT16:
@@ -723,11 +722,10 @@ acpi_rs_convert_resource_to_aml(struct acpi_resource *resource,
/* /*
* 16-bit encoded bitmask (IRQ macro) * 16-bit encoded bitmask (IRQ macro)
*/ */
temp16 = acpi_rs_encode_bitmask(source, temp16 =
*ACPI_ADD_PTR(u8, acpi_rs_encode_bitmask(source,
resource, *ACPI_ADD_PTR(u8, resource,
info-> info->value));
value));
ACPI_MOVE_16_TO_16(destination, &temp16); ACPI_MOVE_16_TO_16(destination, &temp16);
break; break;

View File

@@ -221,14 +221,13 @@ acpi_rs_set_resource_length(acpi_rsdesc_size total_length,
ACPI_MOVE_16_TO_16(&aml->large_header.resource_length, ACPI_MOVE_16_TO_16(&aml->large_header.resource_length,
&resource_length); &resource_length);
} else { } else {
/* Small descriptor -- bits 2:0 of byte 0 contain the length */ /*
* Small descriptor -- bits 2:0 of byte 0 contain the length
* Clear any existing length, preserving descriptor type bits
*/
aml->small_header.descriptor_type = (u8) aml->small_header.descriptor_type = (u8)
((aml->small_header.descriptor_type &
/* Clear any existing length, preserving descriptor type bits */ ~ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK)
((aml->small_header.
descriptor_type & ~ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK)
| resource_length); | resource_length);
} }
} }
@@ -333,8 +332,8 @@ acpi_rs_get_resource_source(acpi_rs_length resource_length,
aml_resource_source = ACPI_ADD_PTR(u8, aml, minimum_length); aml_resource_source = ACPI_ADD_PTR(u8, aml, minimum_length);
/* /*
* resource_source is present if the length of the descriptor is longer than * resource_source is present if the length of the descriptor is longer
* the minimum length. * than the minimum length.
* *
* Note: Some resource descriptors will have an additional null, so * Note: Some resource descriptors will have an additional null, so
* we add 1 to the minimum length. * we add 1 to the minimum length.
@@ -366,6 +365,7 @@ acpi_rs_get_resource_source(acpi_rs_length resource_length,
total_length = total_length =
(u32)strlen(ACPI_CAST_PTR(char, &aml_resource_source[1])) + (u32)strlen(ACPI_CAST_PTR(char, &aml_resource_source[1])) +
1; 1;
total_length = (u32)ACPI_ROUND_UP_TO_NATIVE_WORD(total_length); total_length = (u32)ACPI_ROUND_UP_TO_NATIVE_WORD(total_length);
memset(resource_source->string_ptr, 0, total_length); memset(resource_source->string_ptr, 0, total_length);
@@ -438,8 +438,8 @@ acpi_rs_set_resource_source(union aml_resource * aml,
* Add the length of the string (+ 1 for null terminator) to the * Add the length of the string (+ 1 for null terminator) to the
* final descriptor length * final descriptor length
*/ */
descriptor_length += descriptor_length += ((acpi_rsdesc_size)
((acpi_rsdesc_size) resource_source->string_length + 1); resource_source->string_length + 1);
} }
/* Return the new total length of the AML descriptor */ /* Return the new total length of the AML descriptor */
@@ -478,8 +478,9 @@ acpi_rs_get_prt_method_data(struct acpi_namespace_node * node,
/* Execute the method, no parameters */ /* Execute the method, no parameters */
status = acpi_ut_evaluate_object(node, METHOD_NAME__PRT, status =
ACPI_BTYPE_PACKAGE, &obj_desc); acpi_ut_evaluate_object(node, METHOD_NAME__PRT, ACPI_BTYPE_PACKAGE,
&obj_desc);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -527,8 +528,9 @@ acpi_rs_get_crs_method_data(struct acpi_namespace_node *node,
/* Execute the method, no parameters */ /* Execute the method, no parameters */
status = acpi_ut_evaluate_object(node, METHOD_NAME__CRS, status =
ACPI_BTYPE_BUFFER, &obj_desc); acpi_ut_evaluate_object(node, METHOD_NAME__CRS, ACPI_BTYPE_BUFFER,
&obj_desc);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -577,8 +579,9 @@ acpi_rs_get_prs_method_data(struct acpi_namespace_node *node,
/* Execute the method, no parameters */ /* Execute the method, no parameters */
status = acpi_ut_evaluate_object(node, METHOD_NAME__PRS, status =
ACPI_BTYPE_BUFFER, &obj_desc); acpi_ut_evaluate_object(node, METHOD_NAME__PRS, ACPI_BTYPE_BUFFER,
&obj_desc);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }
@@ -627,8 +630,9 @@ acpi_rs_get_aei_method_data(struct acpi_namespace_node *node,
/* Execute the method, no parameters */ /* Execute the method, no parameters */
status = acpi_ut_evaluate_object(node, METHOD_NAME__AEI, status =
ACPI_BTYPE_BUFFER, &obj_desc); acpi_ut_evaluate_object(node, METHOD_NAME__AEI, ACPI_BTYPE_BUFFER,
&obj_desc);
if (ACPI_FAILURE(status)) { if (ACPI_FAILURE(status)) {
return_ACPI_STATUS(status); return_ACPI_STATUS(status);
} }

View File

@@ -407,6 +407,7 @@ acpi_tb_verify_temp_table(struct acpi_table_desc * table_desc, char *signature)
table_desc->signature.ascii : "????", table_desc->signature.ascii : "????",
ACPI_FORMAT_UINT64(table_desc-> ACPI_FORMAT_UINT64(table_desc->
address))); address)));
goto invalidate_and_exit; goto invalidate_and_exit;
} }
} }

Some files were not shown because too many files have changed in this diff Show More