Merge branch 'acpica'
* acpica: (21 commits) ACPICA: Update version to 20130517 ACPICA: _CST repair: Handle null package entries ACPICA: Add several repairs for _CST predefined name ACPICA: Move _PRT repair into the standard complex repair module ACPICA: Clear events initialized flag upon event component termination ACPICA: Fix possible memory leak in GPE init error path ACPICA: ACPICA Termination: Delete global lock pending lock ACPICA: Update interface to acpi_ut_valid_acpi_name() ACPICA: Do not use extended sleep registers unless HW-reduced bit is set ACPICA: Split table print utilities to a new a separate file ACPICA: Add option to disable loading of SSDTs from the RSDT/XSDT ACPICA: Standardize all switch() blocks ACPICA: Split internal error msg routines to a separate file ACPICA: Split buffer dump routines into separate file ACPICA: Update version to 20130418 ACPICA: Update for "orphan" embedded controller _REG method support ACPICA: Remove unused macros, no functional change ACPICA: Predefined name support: Remove unused local variable ACPICA: Add argument typechecking for all predefined ACPI names ACPICA: Add BIOS error interface for predefined name validation support ...
This commit is contained in:
Коммит
80338681bb
|
@ -83,6 +83,7 @@ acpi-$(ACPI_FUTURE_USAGE) += hwtimer.o
|
|||
acpi-y += \
|
||||
nsaccess.o \
|
||||
nsalloc.o \
|
||||
nsarguments.o \
|
||||
nsconvert.o \
|
||||
nsdump.o \
|
||||
nseval.o \
|
||||
|
@ -137,6 +138,7 @@ acpi-y += \
|
|||
tbfadt.o \
|
||||
tbfind.o \
|
||||
tbinstal.o \
|
||||
tbprint.o \
|
||||
tbutils.o \
|
||||
tbxface.o \
|
||||
tbxfload.o \
|
||||
|
@ -145,11 +147,13 @@ acpi-y += \
|
|||
acpi-y += \
|
||||
utaddress.o \
|
||||
utalloc.o \
|
||||
utbuffer.o \
|
||||
utcopy.o \
|
||||
utexcep.o \
|
||||
utdebug.o \
|
||||
utdecode.o \
|
||||
utdelete.o \
|
||||
uterror.o \
|
||||
uteval.o \
|
||||
utglobal.o \
|
||||
utids.o \
|
||||
|
|
|
@ -132,6 +132,12 @@ u8 ACPI_INIT_GLOBAL(acpi_gbl_truncate_io_addresses, FALSE);
|
|||
*/
|
||||
u8 ACPI_INIT_GLOBAL(acpi_gbl_disable_auto_repair, FALSE);
|
||||
|
||||
/*
|
||||
* Optionally do not load any SSDTs from the RSDT/XSDT during initialization.
|
||||
* This can be useful for debugging ACPI problems on some machines.
|
||||
*/
|
||||
u8 ACPI_INIT_GLOBAL(acpi_gbl_disable_ssdt_table_load, FALSE);
|
||||
|
||||
/* acpi_gbl_FADT is a local copy of the FADT, converted to a common format. */
|
||||
|
||||
struct acpi_table_fadt acpi_gbl_FADT;
|
||||
|
|
|
@ -362,23 +362,6 @@ union acpi_predefined_info {
|
|||
|
||||
#pragma pack()
|
||||
|
||||
/* Data block used during object validation */
|
||||
|
||||
struct acpi_predefined_data {
|
||||
char *pathname;
|
||||
const union acpi_predefined_info *predefined;
|
||||
union acpi_operand_object *parent_package;
|
||||
struct acpi_namespace_node *node;
|
||||
u32 flags;
|
||||
u32 return_btype;
|
||||
u8 node_flags;
|
||||
};
|
||||
|
||||
/* Defines for Flags field above */
|
||||
|
||||
#define ACPI_OBJECT_REPAIRED 1
|
||||
#define ACPI_OBJECT_WRAPPED 2
|
||||
|
||||
/* Return object auto-repair info */
|
||||
|
||||
typedef acpi_status(*acpi_object_converter) (union acpi_operand_object
|
||||
|
|
|
@ -374,10 +374,11 @@
|
|||
* the plist contains a set of parens to allow variable-length lists.
|
||||
* These macros are used for both the debug and non-debug versions of the code.
|
||||
*/
|
||||
#define ACPI_ERROR_NAMESPACE(s, e) acpi_ut_namespace_error (AE_INFO, s, e);
|
||||
#define ACPI_ERROR_METHOD(s, n, p, e) acpi_ut_method_error (AE_INFO, s, n, p, e);
|
||||
#define ACPI_WARN_PREDEFINED(plist) acpi_ut_predefined_warning plist
|
||||
#define ACPI_INFO_PREDEFINED(plist) acpi_ut_predefined_info plist
|
||||
#define ACPI_ERROR_NAMESPACE(s, e) acpi_ut_namespace_error (AE_INFO, s, e);
|
||||
#define ACPI_ERROR_METHOD(s, n, p, e) acpi_ut_method_error (AE_INFO, s, n, p, e);
|
||||
#define ACPI_WARN_PREDEFINED(plist) acpi_ut_predefined_warning plist
|
||||
#define ACPI_INFO_PREDEFINED(plist) acpi_ut_predefined_info plist
|
||||
#define ACPI_BIOS_ERROR_PREDEFINED(plist) acpi_ut_predefined_bios_error plist
|
||||
|
||||
#else
|
||||
|
||||
|
@ -387,6 +388,7 @@
|
|||
#define ACPI_ERROR_METHOD(s, n, p, e)
|
||||
#define ACPI_WARN_PREDEFINED(plist)
|
||||
#define ACPI_INFO_PREDEFINED(plist)
|
||||
#define ACPI_BIOS_ERROR_PREDEFINED(plist)
|
||||
|
||||
#endif /* ACPI_NO_ERROR_MESSAGES */
|
||||
|
||||
|
|
|
@ -223,22 +223,33 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info);
|
|||
void acpi_ns_exec_module_code_list(void);
|
||||
|
||||
/*
|
||||
* nspredef - Support for predefined/reserved names
|
||||
* nsarguments - Argument count/type checking for predefined/reserved names
|
||||
*/
|
||||
acpi_status
|
||||
acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
||||
u32 user_param_count,
|
||||
acpi_status return_status,
|
||||
union acpi_operand_object **return_object);
|
||||
void
|
||||
acpi_ns_check_argument_count(char *pathname,
|
||||
struct acpi_namespace_node *node,
|
||||
u32 user_param_count,
|
||||
const union acpi_predefined_info *info);
|
||||
|
||||
void
|
||||
acpi_ns_check_parameter_count(char *pathname,
|
||||
acpi_ns_check_acpi_compliance(char *pathname,
|
||||
struct acpi_namespace_node *node,
|
||||
u32 user_param_count,
|
||||
const union acpi_predefined_info *info);
|
||||
const union acpi_predefined_info *predefined);
|
||||
|
||||
void acpi_ns_check_argument_types(struct acpi_evaluate_info *info);
|
||||
|
||||
/*
|
||||
* nspredef - Return value checking for predefined/reserved names
|
||||
*/
|
||||
acpi_status
|
||||
acpi_ns_check_return_value(struct acpi_namespace_node *node,
|
||||
struct acpi_evaluate_info *info,
|
||||
u32 user_param_count,
|
||||
acpi_status return_status,
|
||||
union acpi_operand_object **return_object);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
||||
acpi_ns_check_object_type(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr,
|
||||
u32 expected_btypes, u32 package_index);
|
||||
|
||||
|
@ -246,7 +257,7 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
|||
* nsprepkg - Validation of predefined name packages
|
||||
*/
|
||||
acpi_status
|
||||
acpi_ns_check_package(struct acpi_predefined_data *data,
|
||||
acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
/*
|
||||
|
@ -308,24 +319,24 @@ acpi_ns_get_attached_data(struct acpi_namespace_node *node,
|
|||
* predefined methods/objects
|
||||
*/
|
||||
acpi_status
|
||||
acpi_ns_simple_repair(struct acpi_predefined_data *data,
|
||||
acpi_ns_simple_repair(struct acpi_evaluate_info *info,
|
||||
u32 expected_btypes,
|
||||
u32 package_index,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_wrap_with_package(struct acpi_predefined_data *data,
|
||||
acpi_ns_wrap_with_package(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **obj_desc_ptr);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_repair_null_element(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_null_element(struct acpi_evaluate_info *info,
|
||||
u32 expected_btypes,
|
||||
u32 package_index,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
void
|
||||
acpi_ns_remove_null_elements(struct acpi_predefined_data *data,
|
||||
acpi_ns_remove_null_elements(struct acpi_evaluate_info *info,
|
||||
u8 package_type,
|
||||
union acpi_operand_object *obj_desc);
|
||||
|
||||
|
@ -334,7 +345,7 @@ acpi_ns_remove_null_elements(struct acpi_predefined_data *data,
|
|||
* predefined methods/objects
|
||||
*/
|
||||
acpi_status
|
||||
acpi_ns_complex_repairs(struct acpi_predefined_data *data,
|
||||
acpi_ns_complex_repairs(struct acpi_evaluate_info *info,
|
||||
struct acpi_namespace_node *node,
|
||||
acpi_status validate_status,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
|
|
@ -128,8 +128,8 @@ enum acpi_return_package_types {
|
|||
#define ARG_COUNT_IS_MINIMUM 0x8000
|
||||
#define METHOD_MAX_ARG_TYPE ACPI_TYPE_PACKAGE
|
||||
|
||||
#define METHOD_GET_COUNT(arg_list) (arg_list & METHOD_ARG_MASK)
|
||||
#define METHOD_GET_NEXT_ARG(arg_list) (arg_list >> METHOD_ARG_BIT_WIDTH)
|
||||
#define METHOD_GET_ARG_COUNT(arg_list) ((arg_list) & METHOD_ARG_MASK)
|
||||
#define METHOD_GET_NEXT_TYPE(arg_list) (((arg_list) >>= METHOD_ARG_BIT_WIDTH) & METHOD_ARG_MASK)
|
||||
|
||||
/* Macros used to build the predefined info table */
|
||||
|
||||
|
|
|
@ -178,25 +178,41 @@ union acpi_aml_operands {
|
|||
};
|
||||
|
||||
/*
|
||||
* Structure used to pass object evaluation parameters.
|
||||
* Structure used to pass object evaluation information and parameters.
|
||||
* Purpose is to reduce CPU stack use.
|
||||
*/
|
||||
struct acpi_evaluate_info {
|
||||
struct acpi_namespace_node *prefix_node;
|
||||
char *pathname;
|
||||
union acpi_operand_object *obj_desc;
|
||||
union acpi_operand_object **parameters;
|
||||
struct acpi_namespace_node *resolved_node;
|
||||
union acpi_operand_object *return_object;
|
||||
u8 param_count;
|
||||
u8 pass_number;
|
||||
u8 return_object_type;
|
||||
u8 flags;
|
||||
/* The first 3 elements are passed by the caller to acpi_ns_evaluate */
|
||||
|
||||
struct acpi_namespace_node *prefix_node; /* Input: starting node */
|
||||
char *relative_pathname; /* Input: path relative to prefix_node */
|
||||
union acpi_operand_object **parameters; /* Input: argument list */
|
||||
|
||||
struct acpi_namespace_node *node; /* Resolved node (prefix_node:relative_pathname) */
|
||||
union acpi_operand_object *obj_desc; /* Object attached to the resolved node */
|
||||
char *full_pathname; /* Full pathname of the resolved node */
|
||||
|
||||
const union acpi_predefined_info *predefined; /* Used if Node is a predefined name */
|
||||
union acpi_operand_object *return_object; /* Object returned from the evaluation */
|
||||
union acpi_operand_object *parent_package; /* Used if return object is a Package */
|
||||
|
||||
u32 return_flags; /* Used for return value analysis */
|
||||
u32 return_btype; /* Bitmapped type of the returned object */
|
||||
u16 param_count; /* Count of the input argument list */
|
||||
u8 pass_number; /* Parser pass number */
|
||||
u8 return_object_type; /* Object type of the returned object */
|
||||
u8 node_flags; /* Same as Node->Flags */
|
||||
u8 flags; /* General flags */
|
||||
};
|
||||
|
||||
/* Values for Flags above */
|
||||
|
||||
#define ACPI_IGNORE_RETURN_VALUE 1
|
||||
#define ACPI_IGNORE_RETURN_VALUE 1
|
||||
|
||||
/* Defines for return_flags field above */
|
||||
|
||||
#define ACPI_OBJECT_REPAIRED 1
|
||||
#define ACPI_OBJECT_WRAPPED 2
|
||||
|
||||
/* Info used by acpi_ns_initialize_devices */
|
||||
|
||||
|
|
|
@ -87,6 +87,48 @@ extern const char *acpi_gbl_fc_decode[];
|
|||
extern const char *acpi_gbl_pt_decode[];
|
||||
#endif
|
||||
|
||||
/*
|
||||
* For the iASL compiler case, the output is redirected to stderr so that
|
||||
* any of the various ACPI errors and warnings do not appear in the output
|
||||
* files, for either the compiler or disassembler portions of the tool.
|
||||
*/
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
|
||||
#include <stdio.h>
|
||||
extern FILE *acpi_gbl_output_file;
|
||||
|
||||
#define ACPI_MSG_REDIRECT_BEGIN \
|
||||
FILE *output_file = acpi_gbl_output_file; \
|
||||
acpi_os_redirect_output (stderr);
|
||||
|
||||
#define ACPI_MSG_REDIRECT_END \
|
||||
acpi_os_redirect_output (output_file);
|
||||
|
||||
#else
|
||||
/*
|
||||
* non-iASL case - no redirection, nothing to do
|
||||
*/
|
||||
#define ACPI_MSG_REDIRECT_BEGIN
|
||||
#define ACPI_MSG_REDIRECT_END
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Common error message prefixes
|
||||
*/
|
||||
#define ACPI_MSG_ERROR "ACPI Error: "
|
||||
#define ACPI_MSG_EXCEPTION "ACPI Exception: "
|
||||
#define ACPI_MSG_WARNING "ACPI Warning: "
|
||||
#define ACPI_MSG_INFO "ACPI: "
|
||||
|
||||
#define ACPI_MSG_BIOS_ERROR "ACPI BIOS Error (bug): "
|
||||
#define ACPI_MSG_BIOS_WARNING "ACPI BIOS Warning (bug): "
|
||||
|
||||
/*
|
||||
* Common message suffix
|
||||
*/
|
||||
#define ACPI_MSG_SUFFIX \
|
||||
acpi_os_printf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, module_name, line_number)
|
||||
|
||||
/* Types for Resource descriptor entries */
|
||||
|
||||
#define ACPI_INVALID_RESOURCE 0
|
||||
|
@ -578,7 +620,7 @@ void acpi_ut_print_string(char *string, u8 max_length);
|
|||
|
||||
void ut_convert_backslashes(char *pathname);
|
||||
|
||||
u8 acpi_ut_valid_acpi_name(u32 name);
|
||||
u8 acpi_ut_valid_acpi_name(char *name);
|
||||
|
||||
u8 acpi_ut_valid_acpi_char(char character, u32 position);
|
||||
|
||||
|
@ -670,6 +712,12 @@ acpi_ut_predefined_info(const char *module_name,
|
|||
u32 line_number,
|
||||
char *pathname, u8 node_flags, const char *format, ...);
|
||||
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_ut_predefined_bios_error(const char *module_name,
|
||||
u32 line_number,
|
||||
char *pathname,
|
||||
u8 node_flags, const char *format, ...);
|
||||
|
||||
void
|
||||
acpi_ut_namespace_error(const char *module_name,
|
||||
u32 line_number,
|
||||
|
|
|
@ -78,7 +78,6 @@ acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state,
|
|||
|
||||
switch (op->common.aml_opcode) {
|
||||
case AML_WHILE_OP:
|
||||
|
||||
/*
|
||||
* If this is an additional iteration of a while loop, continue.
|
||||
* There is no need to allocate a new control state.
|
||||
|
@ -99,7 +98,6 @@ acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state,
|
|||
/*lint -fallthrough */
|
||||
|
||||
case AML_IF_OP:
|
||||
|
||||
/*
|
||||
* IF/WHILE: Create a new control state to manage these
|
||||
* constructs. We need to manage these as a stack, in order
|
||||
|
@ -142,6 +140,7 @@ acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -344,6 +343,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
|
|||
case AML_NOOP_OP:
|
||||
|
||||
/* Just do nothing! */
|
||||
|
||||
break;
|
||||
|
||||
case AML_BREAK_POINT_OP:
|
||||
|
|
|
@ -563,21 +563,25 @@ acpi_ds_init_field_objects(union acpi_parse_object *op,
|
|||
*/
|
||||
switch (walk_state->opcode) {
|
||||
case AML_FIELD_OP:
|
||||
|
||||
arg = acpi_ps_get_arg(op, 2);
|
||||
type = ACPI_TYPE_LOCAL_REGION_FIELD;
|
||||
break;
|
||||
|
||||
case AML_BANK_FIELD_OP:
|
||||
|
||||
arg = acpi_ps_get_arg(op, 4);
|
||||
type = ACPI_TYPE_LOCAL_BANK_FIELD;
|
||||
break;
|
||||
|
||||
case AML_INDEX_FIELD_OP:
|
||||
|
||||
arg = acpi_ps_get_arg(op, 3);
|
||||
type = ACPI_TYPE_LOCAL_INDEX_FIELD;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
|
|
|
@ -127,6 +127,7 @@ acpi_ds_init_one_object(acpi_handle obj_handle,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -285,6 +285,7 @@ acpi_ds_method_data_get_node(u8 type,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Type %u is invalid", type));
|
||||
return_ACPI_STATUS(AE_TYPE);
|
||||
}
|
||||
|
@ -428,7 +429,6 @@ acpi_ds_method_data_get_value(u8 type,
|
|||
return_ACPI_STATUS(AE_AML_UNINITIALIZED_ARG);
|
||||
|
||||
case ACPI_REFCLASS_LOCAL:
|
||||
|
||||
/*
|
||||
* No error message for this case, will be trapped again later to
|
||||
* detect and ignore cases of Store(local_x,local_x)
|
||||
|
|
|
@ -648,7 +648,6 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
|
|||
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
/*
|
||||
* Defer evaluation of Buffer term_arg operand
|
||||
*/
|
||||
|
@ -660,7 +659,6 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
|
|||
break;
|
||||
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
|
||||
/*
|
||||
* Defer evaluation of Package term_arg operand
|
||||
*/
|
||||
|
@ -741,6 +739,7 @@ acpi_ds_init_object_from_op(struct acpi_walk_state *walk_state,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Unknown Integer type 0x%X",
|
||||
op_info->type));
|
||||
status = AE_AML_OPERAND_TYPE;
|
||||
|
|
|
@ -636,6 +636,7 @@ acpi_ds_eval_data_object_operands(struct acpi_walk_state *walk_state,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return_ACPI_STATUS(AE_AML_BAD_OPCODE);
|
||||
}
|
||||
|
||||
|
|
|
@ -240,7 +240,6 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
|||
|
||||
case AML_IF_OP:
|
||||
case AML_WHILE_OP:
|
||||
|
||||
/*
|
||||
* If we are executing the predicate AND this is the predicate op,
|
||||
* we will use the return value
|
||||
|
@ -254,7 +253,9 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Ignore other control opcodes */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -263,7 +264,6 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
|||
goto result_not_used;
|
||||
|
||||
case AML_CLASS_CREATE:
|
||||
|
||||
/*
|
||||
* These opcodes allow term_arg(s) as operands and therefore
|
||||
* the operands can be method calls. The result is used.
|
||||
|
@ -292,7 +292,6 @@ acpi_ds_is_result_used(union acpi_parse_object * op,
|
|||
goto result_not_used;
|
||||
|
||||
default:
|
||||
|
||||
/*
|
||||
* In all other cases. the parent will actually use the return
|
||||
* object, so keep it.
|
||||
|
|
|
@ -327,6 +327,7 @@ acpi_ds_exec_begin_op(struct acpi_walk_state *walk_state,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -488,7 +489,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
case AML_TYPE_METHOD_CALL:
|
||||
|
||||
/*
|
||||
* If the method is referenced from within a package
|
||||
* declaration, it is not a invocation of the method, just
|
||||
|
@ -582,7 +582,6 @@ acpi_status acpi_ds_exec_end_op(struct acpi_walk_state *walk_state)
|
|||
|
||||
switch (op->common.parent->common.aml_opcode) {
|
||||
case AML_NAME_OP:
|
||||
|
||||
/*
|
||||
* Put the Node on the object stack (Contains the ACPI Name
|
||||
* of this object)
|
||||
|
|
|
@ -74,6 +74,7 @@ acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number)
|
|||
|
||||
switch (pass_number) {
|
||||
case 1:
|
||||
|
||||
walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 |
|
||||
ACPI_PARSE_DELETE_TREE;
|
||||
walk_state->descending_callback = acpi_ds_load1_begin_op;
|
||||
|
@ -81,6 +82,7 @@ acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number)
|
|||
break;
|
||||
|
||||
case 2:
|
||||
|
||||
walk_state->parse_flags = ACPI_PARSE_LOAD_PASS1 |
|
||||
ACPI_PARSE_DELETE_TREE;
|
||||
walk_state->descending_callback = acpi_ds_load2_begin_op;
|
||||
|
@ -88,6 +90,7 @@ acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number)
|
|||
break;
|
||||
|
||||
case 3:
|
||||
|
||||
#ifndef ACPI_NO_METHOD_EXECUTION
|
||||
walk_state->parse_flags |= ACPI_PARSE_EXECUTE |
|
||||
ACPI_PARSE_DELETE_TREE;
|
||||
|
@ -97,6 +100,7 @@ acpi_ds_init_callbacks(struct acpi_walk_state *walk_state, u32 pass_number)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
|
@ -161,7 +165,6 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
|
|||
|
||||
switch (walk_state->opcode) {
|
||||
case AML_SCOPE_OP:
|
||||
|
||||
/*
|
||||
* The target name of the Scope() operator must exist at this point so
|
||||
* that we can actually open the scope to enter new names underneath it.
|
||||
|
@ -210,7 +213,6 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
|
|||
case ACPI_TYPE_INTEGER:
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
/*
|
||||
* These types we will allow, but we will change the type.
|
||||
* This enables some existing code of the form:
|
||||
|
@ -232,7 +234,6 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
|
|||
break;
|
||||
|
||||
case ACPI_TYPE_METHOD:
|
||||
|
||||
/*
|
||||
* Allow scope change to root during execution of module-level
|
||||
* code. Root is typed METHOD during this time.
|
||||
|
|
|
@ -509,6 +509,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* All NAMED_FIELD opcodes must be handled above */
|
||||
break;
|
||||
}
|
||||
|
@ -548,6 +549,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Unknown opcode */
|
||||
|
||||
status = AE_OK;
|
||||
|
@ -674,6 +676,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
|
|||
#endif /* ACPI_NO_METHOD_EXECUTION */
|
||||
|
||||
default:
|
||||
|
||||
/* All NAMED_COMPLEX opcodes must be handled above */
|
||||
break;
|
||||
}
|
||||
|
@ -721,6 +724,7 @@ acpi_status acpi_ds_load2_end_op(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -128,6 +128,7 @@ acpi_status acpi_ev_remove_global_lock_handler(void)
|
|||
status = acpi_remove_fixed_event_handler(ACPI_EVENT_GLOBAL,
|
||||
acpi_ev_global_lock_handler);
|
||||
|
||||
acpi_os_delete_lock(acpi_gbl_global_lock_pending_lock);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
|
|
@ -529,7 +529,6 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
|
|||
|
||||
switch (local_gpe_event_info->flags & ACPI_GPE_DISPATCH_MASK) {
|
||||
case ACPI_GPE_DISPATCH_NOTIFY:
|
||||
|
||||
/*
|
||||
* Implicit notify.
|
||||
* Dispatch a DEVICE_WAKE notify to the appropriate handler.
|
||||
|
@ -579,11 +578,11 @@ static void ACPI_SYSTEM_XFACE acpi_ev_asynch_execute_gpe_method(void *context)
|
|||
(local_gpe_event_info->dispatch.
|
||||
method_node)));
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return_VOID; /* Should never happen */
|
||||
|
||||
return_VOID; /* Should never happen */
|
||||
}
|
||||
|
||||
/* Defer enabling of GPE until all notify handlers are done */
|
||||
|
@ -755,7 +754,6 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
|||
|
||||
case ACPI_GPE_DISPATCH_METHOD:
|
||||
case ACPI_GPE_DISPATCH_NOTIFY:
|
||||
|
||||
/*
|
||||
* Execute the method associated with the GPE
|
||||
* NOTE: Level-triggered GPEs are cleared after the method completes.
|
||||
|
@ -771,7 +769,6 @@ acpi_ev_gpe_dispatch(struct acpi_namespace_node *gpe_device,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/*
|
||||
* No handler or method to run!
|
||||
* 03/2010: This case should no longer be possible. We will not allow
|
||||
|
|
|
@ -382,6 +382,8 @@ acpi_ev_create_gpe_block(struct acpi_namespace_node *gpe_device,
|
|||
|
||||
status = acpi_ev_install_gpe_block(gpe_block, interrupt_number);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_FREE(gpe_block->register_info);
|
||||
ACPI_FREE(gpe_block->event_info);
|
||||
ACPI_FREE(gpe_block);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
|
|
@ -363,14 +363,17 @@ acpi_ev_match_gpe_method(acpi_handle obj_handle,
|
|||
*/
|
||||
switch (name[1]) {
|
||||
case 'L':
|
||||
|
||||
type = ACPI_GPE_LEVEL_TRIGGERED;
|
||||
break;
|
||||
|
||||
case 'E':
|
||||
|
||||
type = ACPI_GPE_EDGE_TRIGGERED;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Unknown method type, just ignore it */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_LOAD,
|
||||
|
|
|
@ -354,36 +354,43 @@ acpi_ev_install_space_handler(struct acpi_namespace_node * node,
|
|||
|
||||
switch (space_id) {
|
||||
case ACPI_ADR_SPACE_SYSTEM_MEMORY:
|
||||
|
||||
handler = acpi_ex_system_memory_space_handler;
|
||||
setup = acpi_ev_system_memory_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_SYSTEM_IO:
|
||||
|
||||
handler = acpi_ex_system_io_space_handler;
|
||||
setup = acpi_ev_io_space_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_PCI_CONFIG:
|
||||
|
||||
handler = acpi_ex_pci_config_space_handler;
|
||||
setup = acpi_ev_pci_config_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_CMOS:
|
||||
|
||||
handler = acpi_ex_cmos_space_handler;
|
||||
setup = acpi_ev_cmos_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_PCI_BAR_TARGET:
|
||||
|
||||
handler = acpi_ex_pci_bar_space_handler;
|
||||
setup = acpi_ev_pci_bar_region_setup;
|
||||
break;
|
||||
|
||||
case ACPI_ADR_SPACE_DATA_TABLE:
|
||||
|
||||
handler = acpi_ex_data_table_space_handler;
|
||||
setup = NULL;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
status = AE_BAD_PARAMETER;
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
|
|
@ -78,6 +78,7 @@ u8 acpi_ev_is_notify_object(struct acpi_namespace_node *node)
|
|||
return (TRUE);
|
||||
|
||||
default:
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
|
@ -275,6 +276,8 @@ void acpi_ev_terminate(void)
|
|||
ACPI_ERROR((AE_INFO,
|
||||
"Could not remove Global Lock handler"));
|
||||
}
|
||||
|
||||
acpi_gbl_events_initialized = FALSE;
|
||||
}
|
||||
|
||||
/* Deallocate all handler objects installed within GPE info structs */
|
||||
|
|
|
@ -54,7 +54,8 @@ extern u8 acpi_gbl_default_address_spaces[];
|
|||
|
||||
/* Local prototypes */
|
||||
|
||||
static void acpi_ev_orphan_ec_reg_method(void);
|
||||
static void
|
||||
acpi_ev_orphan_ec_reg_method(struct acpi_namespace_node *ec_device_node);
|
||||
|
||||
static acpi_status
|
||||
acpi_ev_reg_run(acpi_handle obj_handle,
|
||||
|
@ -532,7 +533,7 @@ acpi_ev_execute_reg_method(union acpi_operand_object *region_obj, u32 function)
|
|||
}
|
||||
|
||||
info->prefix_node = region_obj2->extra.method_REG;
|
||||
info->pathname = NULL;
|
||||
info->relative_pathname = NULL;
|
||||
info->parameters = args;
|
||||
info->flags = ACPI_IGNORE_RETURN_VALUE;
|
||||
|
||||
|
@ -612,7 +613,7 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
|
|||
/* Special case for EC: handle "orphan" _REG methods with no region */
|
||||
|
||||
if (space_id == ACPI_ADR_SPACE_EC) {
|
||||
acpi_ev_orphan_ec_reg_method();
|
||||
acpi_ev_orphan_ec_reg_method(node);
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
|
@ -681,7 +682,7 @@ acpi_ev_reg_run(acpi_handle obj_handle,
|
|||
*
|
||||
* FUNCTION: acpi_ev_orphan_ec_reg_method
|
||||
*
|
||||
* PARAMETERS: None
|
||||
* PARAMETERS: ec_device_node - Namespace node for an EC device
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
|
@ -693,37 +694,27 @@ acpi_ev_reg_run(acpi_handle obj_handle,
|
|||
* detected by providing a _REG method object underneath the
|
||||
* Embedded Controller device."
|
||||
*
|
||||
* To quickly access the EC device, we use the EC_ID that appears
|
||||
* within the ECDT. Otherwise, we would need to perform a time-
|
||||
* consuming namespace walk, executing _HID methods to find the
|
||||
* EC device.
|
||||
* To quickly access the EC device, we use the ec_device_node used
|
||||
* during EC handler installation. Otherwise, we would need to
|
||||
* perform a time consuming namespace walk, executing _HID
|
||||
* methods to find the EC device.
|
||||
*
|
||||
* MUTEX: Assumes the namespace is locked
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void acpi_ev_orphan_ec_reg_method(void)
|
||||
static void
|
||||
acpi_ev_orphan_ec_reg_method(struct acpi_namespace_node *ec_device_node)
|
||||
{
|
||||
struct acpi_table_ecdt *table;
|
||||
acpi_handle reg_method;
|
||||
struct acpi_namespace_node *next_node;
|
||||
acpi_status status;
|
||||
struct acpi_object_list args;
|
||||
union acpi_object objects[2];
|
||||
struct acpi_namespace_node *ec_device_node;
|
||||
struct acpi_namespace_node *reg_method;
|
||||
struct acpi_namespace_node *next_node;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_orphan_ec_reg_method);
|
||||
|
||||
/* Get the ECDT (if present in system) */
|
||||
|
||||
status = acpi_get_table(ACPI_SIG_ECDT, 0,
|
||||
ACPI_CAST_INDIRECT_PTR(struct acpi_table_header,
|
||||
&table));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/* We need a valid EC_ID string */
|
||||
|
||||
if (!(*table->id)) {
|
||||
if (!ec_device_node) {
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
|
@ -731,22 +722,11 @@ static void acpi_ev_orphan_ec_reg_method(void)
|
|||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
|
||||
/* Get a handle to the EC device referenced in the ECDT */
|
||||
|
||||
status = acpi_get_handle(NULL,
|
||||
ACPI_CAST_PTR(char, table->id),
|
||||
ACPI_CAST_PTR(acpi_handle, &ec_device_node));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Get a handle to a _REG method immediately under the EC device */
|
||||
|
||||
status = acpi_get_handle(ec_device_node,
|
||||
METHOD_NAME__REG, ACPI_CAST_PTR(acpi_handle,
|
||||
®_method));
|
||||
status = acpi_get_handle(ec_device_node, METHOD_NAME__REG, ®_method);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
goto exit; /* There is no _REG method present */
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -754,19 +734,20 @@ static void acpi_ev_orphan_ec_reg_method(void)
|
|||
* this scope with the Embedded Controller space ID. Otherwise, it
|
||||
* will already have been executed. Note, this allows for Regions
|
||||
* with other space IDs to be present; but the code below will then
|
||||
* execute the _REG method with the EC space ID argument.
|
||||
* execute the _REG method with the embedded_control space_ID argument.
|
||||
*/
|
||||
next_node = acpi_ns_get_next_node(ec_device_node, NULL);
|
||||
while (next_node) {
|
||||
if ((next_node->type == ACPI_TYPE_REGION) &&
|
||||
(next_node->object) &&
|
||||
(next_node->object->region.space_id == ACPI_ADR_SPACE_EC)) {
|
||||
goto exit; /* Do not execute _REG */
|
||||
goto exit; /* Do not execute the _REG */
|
||||
}
|
||||
|
||||
next_node = acpi_ns_get_next_node(ec_device_node, next_node);
|
||||
}
|
||||
|
||||
/* Evaluate the _REG(EC,Connect) method */
|
||||
/* Evaluate the _REG(embedded_control,Connect) method */
|
||||
|
||||
args.count = 2;
|
||||
args.pointer = objects;
|
||||
|
|
|
@ -596,7 +596,9 @@ acpi_ev_initialize_region(union acpi_operand_object *region_obj,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Ignore other objects */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -366,16 +366,19 @@ acpi_set_gpe_wake_mask(acpi_handle gpe_device, u32 gpe_number, u8 action)
|
|||
|
||||
switch (action) {
|
||||
case ACPI_GPE_ENABLE:
|
||||
|
||||
ACPI_SET_BIT(gpe_register_info->enable_for_wake,
|
||||
(u8)register_bit);
|
||||
break;
|
||||
|
||||
case ACPI_GPE_DISABLE:
|
||||
|
||||
ACPI_CLEAR_BIT(gpe_register_info->enable_for_wake,
|
||||
(u8)register_bit);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO, "%u, Invalid action", action));
|
||||
status = AE_BAD_PARAMETER;
|
||||
break;
|
||||
|
|
|
@ -139,6 +139,7 @@ acpi_install_address_space_handler(acpi_handle device,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -480,6 +480,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
|
@ -588,7 +589,7 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
|
|||
(ACPI_GET_DESCRIPTOR_TYPE(ddb_handle) != ACPI_DESC_TYPE_OPERAND) ||
|
||||
(ddb_handle->common.type != ACPI_TYPE_LOCAL_REFERENCE) ||
|
||||
(!(ddb_handle->common.flags & AOPOBJ_DATA_VALID))) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
/* Get the table index from the ddb_handle */
|
||||
|
|
|
@ -99,6 +99,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return_ACPI_STATUS(AE_TYPE);
|
||||
}
|
||||
|
||||
|
@ -117,7 +118,6 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
|
|||
|
||||
switch (obj_desc->common.type) {
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
/*
|
||||
* Convert string to an integer - for most cases, the string must be
|
||||
* hexadecimal as per the ACPI specification. The only exception (as
|
||||
|
@ -161,6 +161,7 @@ acpi_ex_convert_to_integer(union acpi_operand_object *obj_desc,
|
|||
default:
|
||||
|
||||
/* No other types can get here */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -213,7 +214,6 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc,
|
|||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
/*
|
||||
* Create a new Buffer object.
|
||||
* Need enough space for one integer
|
||||
|
@ -233,7 +233,6 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc,
|
|||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
/*
|
||||
* Create a new Buffer object
|
||||
* Size will be the string length
|
||||
|
@ -258,6 +257,7 @@ acpi_ex_convert_to_buffer(union acpi_operand_object *obj_desc,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return_ACPI_STATUS(AE_TYPE);
|
||||
}
|
||||
|
||||
|
@ -304,15 +304,18 @@ acpi_ex_convert_to_ascii(u64 integer, u16 base, u8 *string, u8 data_width)
|
|||
|
||||
switch (data_width) {
|
||||
case 1:
|
||||
|
||||
decimal_length = ACPI_MAX8_DECIMAL_DIGITS;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
|
||||
decimal_length = ACPI_MAX32_DECIMAL_DIGITS;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
default:
|
||||
|
||||
decimal_length = ACPI_MAX64_DECIMAL_DIGITS;
|
||||
break;
|
||||
}
|
||||
|
@ -546,6 +549,7 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return_ACPI_STATUS(AE_TYPE);
|
||||
}
|
||||
|
||||
|
@ -599,6 +603,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* No conversion allowed for these types */
|
||||
|
||||
if (destination_type != source_desc->common.type) {
|
||||
|
@ -649,6 +654,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Bad destination type during conversion: 0x%X",
|
||||
destination_type));
|
||||
|
@ -664,6 +670,7 @@ acpi_ex_convert_to_target_type(acpi_object_type destination_type,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Unknown Target type ID 0x%X AmlOpcode 0x%X DestType %s",
|
||||
GET_CURRENT_ARG_TYPE(walk_state->op_info->
|
||||
|
|
|
@ -103,7 +103,6 @@ acpi_status acpi_ex_create_alias(struct acpi_walk_state *walk_state)
|
|||
case ACPI_TYPE_BUFFER:
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
case ACPI_TYPE_BUFFER_FIELD:
|
||||
|
||||
/*
|
||||
* These types open a new scope, so we need the NS node in order to access
|
||||
* any children.
|
||||
|
@ -113,7 +112,6 @@ acpi_status acpi_ex_create_alias(struct acpi_walk_state *walk_state)
|
|||
case ACPI_TYPE_PROCESSOR:
|
||||
case ACPI_TYPE_THERMAL:
|
||||
case ACPI_TYPE_LOCAL_SCOPE:
|
||||
|
||||
/*
|
||||
* The new alias has the type ALIAS and points to the original
|
||||
* NS node, not the object itself.
|
||||
|
@ -124,7 +122,6 @@ acpi_status acpi_ex_create_alias(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
case ACPI_TYPE_METHOD:
|
||||
|
||||
/*
|
||||
* Control method aliases need to be differentiated
|
||||
*/
|
||||
|
|
|
@ -193,6 +193,7 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
|
|||
return_VOID;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -226,6 +227,7 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
acpi_ex_do_debug_object((source_desc->
|
||||
reference.
|
||||
node)->object,
|
||||
|
|
|
@ -357,6 +357,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
|
|||
|
||||
switch (info->opcode) {
|
||||
case ACPI_EXD_INIT:
|
||||
|
||||
break;
|
||||
|
||||
case ACPI_EXD_TYPE:
|
||||
|
@ -718,6 +719,7 @@ void acpi_ex_dump_operand(union acpi_operand_object *obj_desc, u32 depth)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Unknown Type */
|
||||
|
||||
acpi_os_printf("Unknown Type %X\n", obj_desc->common.type);
|
||||
|
|
|
@ -331,21 +331,25 @@ acpi_ex_write_data_to_field(union acpi_operand_object *source_desc,
|
|||
|
||||
switch (source_desc->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
buffer = &source_desc->integer.value;
|
||||
length = sizeof(source_desc->integer.value);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
buffer = source_desc->buffer.pointer;
|
||||
length = source_desc->buffer.length;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
buffer = source_desc->string.pointer;
|
||||
length = source_desc->string.length;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
|
|
|
@ -446,7 +446,6 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc,
|
|||
break;
|
||||
|
||||
case ACPI_TYPE_LOCAL_BANK_FIELD:
|
||||
|
||||
/*
|
||||
* Ensure that the bank_value is not beyond the capacity of
|
||||
* the register
|
||||
|
@ -488,7 +487,6 @@ acpi_ex_field_datum_io(union acpi_operand_object *obj_desc,
|
|||
break;
|
||||
|
||||
case ACPI_TYPE_LOCAL_INDEX_FIELD:
|
||||
|
||||
/*
|
||||
* Ensure that the index_value is not beyond the capacity of
|
||||
* the register
|
||||
|
|
|
@ -105,7 +105,6 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
|
|||
break;
|
||||
|
||||
case ACPI_DESC_TYPE_NAMED:
|
||||
|
||||
/*
|
||||
* A named reference that has already been resolved to a Node
|
||||
*/
|
||||
|
@ -261,20 +260,24 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
|
|||
*/
|
||||
switch (operand0->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
status =
|
||||
acpi_ex_convert_to_integer(operand1, &local_operand1, 16);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
status = acpi_ex_convert_to_string(operand1, &local_operand1,
|
||||
ACPI_IMPLICIT_CONVERT_HEX);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
status = acpi_ex_convert_to_buffer(operand1, &local_operand1);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Invalid object type: 0x%X",
|
||||
operand0->common.type));
|
||||
status = AE_AML_INTERNAL;
|
||||
|
@ -519,6 +522,7 @@ acpi_ex_do_logical_numeric_op(u16 opcode,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
status = AE_AML_INTERNAL;
|
||||
break;
|
||||
}
|
||||
|
@ -580,20 +584,24 @@ acpi_ex_do_logical_op(u16 opcode,
|
|||
*/
|
||||
switch (operand0->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
status =
|
||||
acpi_ex_convert_to_integer(operand1, &local_operand1, 16);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
status = acpi_ex_convert_to_string(operand1, &local_operand1,
|
||||
ACPI_IMPLICIT_CONVERT_HEX);
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
status = acpi_ex_convert_to_buffer(operand1, &local_operand1);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
status = AE_AML_INTERNAL;
|
||||
break;
|
||||
}
|
||||
|
@ -636,6 +644,7 @@ acpi_ex_do_logical_op(u16 opcode,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
status = AE_AML_INTERNAL;
|
||||
break;
|
||||
}
|
||||
|
@ -703,6 +712,7 @@ acpi_ex_do_logical_op(u16 opcode,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
status = AE_AML_INTERNAL;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -327,7 +327,6 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
case AML_FROM_BCD_OP: /* from_bcd (BCDValue, Result) */
|
||||
|
||||
/*
|
||||
* The 64-bit ACPI integer can hold 16 4-bit BCD characters
|
||||
* (if table is 32-bit, integer can hold 8 BCD characters)
|
||||
|
@ -407,7 +406,6 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
case AML_COND_REF_OF_OP: /* cond_ref_of (source_object, Result) */
|
||||
|
||||
/*
|
||||
* This op is a little strange because the internal return value is
|
||||
* different than the return value stored in the result descriptor
|
||||
|
@ -442,13 +440,14 @@ acpi_status acpi_ex_opcode_1A_1T_1R(struct acpi_walk_state *walk_state)
|
|||
goto cleanup;
|
||||
|
||||
default:
|
||||
|
||||
/* No other opcodes get here */
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case AML_STORE_OP: /* Store (Source, Target) */
|
||||
|
||||
/*
|
||||
* A store operand is typically a number, string, buffer or lvalue
|
||||
* Be careful about deleting the source object,
|
||||
|
@ -615,7 +614,6 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
|
||||
case AML_DECREMENT_OP: /* Decrement (Operand) */
|
||||
case AML_INCREMENT_OP: /* Increment (Operand) */
|
||||
|
||||
/*
|
||||
* Create a new integer. Can't just get the base integer and
|
||||
* increment it because it may be an Arg or Field.
|
||||
|
@ -682,7 +680,6 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
case AML_TYPE_OP: /* object_type (source_object) */
|
||||
|
||||
/*
|
||||
* 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
|
||||
|
@ -709,7 +706,6 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
case AML_SIZE_OF_OP: /* size_of (source_object) */
|
||||
|
||||
/*
|
||||
* Note: The operand is not resolved at this point because we want to
|
||||
* get the associated object, not its value.
|
||||
|
@ -735,10 +731,12 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
*/
|
||||
switch (type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
value = acpi_gbl_integer_byte_width;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
value = temp_desc->string.length;
|
||||
break;
|
||||
|
||||
|
@ -759,6 +757,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Operand must be Buffer/Integer/String/Package - found type %s",
|
||||
acpi_ut_get_type_name(type)));
|
||||
|
@ -860,9 +859,11 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
status = AE_AML_OPERAND_TYPE;
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -923,7 +924,6 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
*/
|
||||
switch (operand[0]->reference.class) {
|
||||
case ACPI_REFCLASS_INDEX:
|
||||
|
||||
/*
|
||||
* The target type for the Index operator must be
|
||||
* either a Buffer or a Package
|
||||
|
@ -956,7 +956,6 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
|
||||
/*
|
||||
* Return the referenced element of the package. We must
|
||||
* add another reference to the referenced object, however.
|
||||
|
@ -999,6 +998,7 @@ acpi_status acpi_ex_opcode_1A_0T_1R(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Unknown class in reference(%p) - 0x%2.2X",
|
||||
operand[0],
|
||||
|
|
|
@ -304,7 +304,6 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
|
|||
break;
|
||||
|
||||
case AML_TO_STRING_OP: /* to_string (Buffer, Length, Result) (ACPI 2.0) */
|
||||
|
||||
/*
|
||||
* Input object is guaranteed to be a buffer at this point (it may have
|
||||
* been converted.) Copy the raw buffer data to a new object of
|
||||
|
|
|
@ -155,7 +155,6 @@ acpi_status acpi_ex_opcode_3A_1T_1R(struct acpi_walk_state *walk_state)
|
|||
|
||||
switch (walk_state->opcode) {
|
||||
case AML_MID_OP: /* Mid (Source[0], Index[1], Length[2], Result[3]) */
|
||||
|
||||
/*
|
||||
* Create the return object. The Source operand is guaranteed to be
|
||||
* either a String or a Buffer, so just use its type.
|
||||
|
|
|
@ -119,7 +119,6 @@ acpi_ex_do_match(u32 match_op,
|
|||
break;
|
||||
|
||||
case MATCH_MEQ:
|
||||
|
||||
/*
|
||||
* True if equal: (P[i] == M)
|
||||
* Change to: (M == P[i])
|
||||
|
@ -133,7 +132,6 @@ acpi_ex_do_match(u32 match_op,
|
|||
break;
|
||||
|
||||
case MATCH_MLE:
|
||||
|
||||
/*
|
||||
* True if less than or equal: (P[i] <= M) (P[i] not_greater than M)
|
||||
* Change to: (M >= P[i]) (M not_less than P[i])
|
||||
|
@ -148,7 +146,6 @@ acpi_ex_do_match(u32 match_op,
|
|||
break;
|
||||
|
||||
case MATCH_MLT:
|
||||
|
||||
/*
|
||||
* True if less than: (P[i] < M)
|
||||
* Change to: (M > P[i])
|
||||
|
@ -162,7 +159,6 @@ acpi_ex_do_match(u32 match_op,
|
|||
break;
|
||||
|
||||
case MATCH_MGE:
|
||||
|
||||
/*
|
||||
* True if greater than or equal: (P[i] >= M) (P[i] not_less than M)
|
||||
* Change to: (M <= P[i]) (M not_greater than P[i])
|
||||
|
@ -177,7 +173,6 @@ acpi_ex_do_match(u32 match_op,
|
|||
break;
|
||||
|
||||
case MATCH_MGT:
|
||||
|
||||
/*
|
||||
* True if greater than: (P[i] > M)
|
||||
* Change to: (M < P[i])
|
||||
|
|
|
@ -253,26 +253,31 @@ acpi_ex_decode_field_access(union acpi_operand_object *obj_desc,
|
|||
|
||||
case AML_FIELD_ACCESS_BYTE:
|
||||
case AML_FIELD_ACCESS_BUFFER: /* ACPI 2.0 (SMBus Buffer) */
|
||||
|
||||
byte_alignment = 1;
|
||||
bit_length = 8;
|
||||
break;
|
||||
|
||||
case AML_FIELD_ACCESS_WORD:
|
||||
|
||||
byte_alignment = 2;
|
||||
bit_length = 16;
|
||||
break;
|
||||
|
||||
case AML_FIELD_ACCESS_DWORD:
|
||||
|
||||
byte_alignment = 4;
|
||||
bit_length = 32;
|
||||
break;
|
||||
|
||||
case AML_FIELD_ACCESS_QWORD: /* ACPI 2.0 */
|
||||
|
||||
byte_alignment = 8;
|
||||
bit_length = 64;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Invalid field access type */
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Unknown field access type 0x%X", access));
|
||||
|
@ -598,7 +603,9 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* No other types should get here */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -88,22 +88,27 @@ acpi_ex_system_memory_space_handler(u32 function,
|
|||
|
||||
switch (bit_width) {
|
||||
case 8:
|
||||
|
||||
length = 1;
|
||||
break;
|
||||
|
||||
case 16:
|
||||
|
||||
length = 2;
|
||||
break;
|
||||
|
||||
case 32:
|
||||
|
||||
length = 4;
|
||||
break;
|
||||
|
||||
case 64:
|
||||
|
||||
length = 8;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Invalid SystemMemory width %u",
|
||||
bit_width));
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_VALUE);
|
||||
|
@ -214,23 +219,29 @@ acpi_ex_system_memory_space_handler(u32 function,
|
|||
*value = 0;
|
||||
switch (bit_width) {
|
||||
case 8:
|
||||
*value = (u64) ACPI_GET8(logical_addr_ptr);
|
||||
|
||||
*value = (u64)ACPI_GET8(logical_addr_ptr);
|
||||
break;
|
||||
|
||||
case 16:
|
||||
*value = (u64) ACPI_GET16(logical_addr_ptr);
|
||||
|
||||
*value = (u64)ACPI_GET16(logical_addr_ptr);
|
||||
break;
|
||||
|
||||
case 32:
|
||||
*value = (u64) ACPI_GET32(logical_addr_ptr);
|
||||
|
||||
*value = (u64)ACPI_GET32(logical_addr_ptr);
|
||||
break;
|
||||
|
||||
case 64:
|
||||
*value = (u64) ACPI_GET64(logical_addr_ptr);
|
||||
|
||||
*value = (u64)ACPI_GET64(logical_addr_ptr);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* bit_width was already validated */
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -239,28 +250,35 @@ acpi_ex_system_memory_space_handler(u32 function,
|
|||
|
||||
switch (bit_width) {
|
||||
case 8:
|
||||
|
||||
ACPI_SET8(logical_addr_ptr, *value);
|
||||
break;
|
||||
|
||||
case 16:
|
||||
|
||||
ACPI_SET16(logical_addr_ptr, *value);
|
||||
break;
|
||||
|
||||
case 32:
|
||||
|
||||
ACPI_SET32(logical_addr_ptr, *value);
|
||||
break;
|
||||
|
||||
case 64:
|
||||
|
||||
ACPI_SET64(logical_addr_ptr, *value);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* bit_width was already validated */
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
status = AE_BAD_PARAMETER;
|
||||
break;
|
||||
}
|
||||
|
@ -320,6 +338,7 @@ acpi_ex_system_io_space_handler(u32 function,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
status = AE_BAD_PARAMETER;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -248,6 +248,7 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* No named references are allowed here */
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
|
|
|
@ -156,7 +156,6 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
|
|||
switch (ref_type) {
|
||||
case ACPI_REFCLASS_LOCAL:
|
||||
case ACPI_REFCLASS_ARG:
|
||||
|
||||
/*
|
||||
* Get the local from the method's state info
|
||||
* Note: this increments the local's object reference count
|
||||
|
@ -309,6 +308,7 @@ acpi_ex_resolve_object_to_value(union acpi_operand_object **stack_ptr,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -348,10 +348,12 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
|
|||
|
||||
switch (ACPI_GET_DESCRIPTOR_TYPE(obj_desc)) {
|
||||
case ACPI_DESC_TYPE_OPERAND:
|
||||
|
||||
type = obj_desc->common.type;
|
||||
break;
|
||||
|
||||
case ACPI_DESC_TYPE_NAMED:
|
||||
|
||||
type = ((struct acpi_namespace_node *)obj_desc)->type;
|
||||
obj_desc =
|
||||
acpi_ns_get_attached_object((struct acpi_namespace_node *)
|
||||
|
@ -538,7 +540,9 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* No change to Type required */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -307,7 +307,6 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
case ARGI_TARGETREF: /* Allows implicit conversion rules before store */
|
||||
case ARGI_FIXED_TARGET: /* No implicit conversion before store to target */
|
||||
case ARGI_SIMPLE_TARGET: /* Name, Local, or arg - no implicit conversion */
|
||||
|
||||
/*
|
||||
* Need an operand of type ACPI_TYPE_LOCAL_REFERENCE
|
||||
* A Namespace Node is OK as-is
|
||||
|
@ -326,7 +325,6 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
goto next_operand;
|
||||
|
||||
case ARGI_DATAREFOBJ: /* Store operator only */
|
||||
|
||||
/*
|
||||
* We don't want to resolve index_op reference objects during
|
||||
* a store because this would be an implicit de_ref_of operation.
|
||||
|
@ -343,7 +341,9 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* All cases covered above */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -433,7 +433,6 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
goto next_operand;
|
||||
|
||||
case ARGI_BUFFER:
|
||||
|
||||
/*
|
||||
* Need an operand of type ACPI_TYPE_BUFFER,
|
||||
* But we can implicitly convert from a STRING or INTEGER
|
||||
|
@ -459,7 +458,6 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
goto next_operand;
|
||||
|
||||
case ARGI_STRING:
|
||||
|
||||
/*
|
||||
* Need an operand of type ACPI_TYPE_STRING,
|
||||
* But we can implicitly convert from a BUFFER or INTEGER
|
||||
|
@ -562,6 +560,7 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Needed [Buffer/String/Package/Reference], found [%s] %p",
|
||||
acpi_ut_get_object_type_name
|
||||
|
@ -584,6 +583,7 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Needed [Buffer/String/Package], found [%s] %p",
|
||||
acpi_ut_get_object_type_name
|
||||
|
@ -605,6 +605,7 @@ acpi_ex_resolve_operands(u16 opcode,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Needed [Region/Buffer], found [%s] %p",
|
||||
acpi_ut_get_object_type_name
|
||||
|
|
|
@ -114,6 +114,7 @@ acpi_ex_store(union acpi_operand_object *source_desc,
|
|||
|
||||
switch (dest_desc->common.type) {
|
||||
case ACPI_TYPE_LOCAL_REFERENCE:
|
||||
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
@ -178,7 +179,6 @@ acpi_ex_store(union acpi_operand_object *source_desc,
|
|||
break;
|
||||
|
||||
case ACPI_REFCLASS_DEBUG:
|
||||
|
||||
/*
|
||||
* Storing to the Debug object causes the value stored to be
|
||||
* displayed and otherwise has no effect -- see ACPI Specification
|
||||
|
@ -291,7 +291,6 @@ acpi_ex_store_object_to_index(union acpi_operand_object *source_desc,
|
|||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER_FIELD:
|
||||
|
||||
/*
|
||||
* Store into a Buffer or String (not actually a real buffer_field)
|
||||
* at a location defined by an Index.
|
||||
|
@ -447,7 +446,6 @@ acpi_ex_store_object_to_node(union acpi_operand_object *source_desc,
|
|||
case ACPI_TYPE_INTEGER:
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
/*
|
||||
* These target types are all of type Integer/String/Buffer, and
|
||||
* therefore support implicit conversion before the store.
|
||||
|
|
|
@ -85,11 +85,9 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr,
|
|||
* These cases all require only Integers or values that
|
||||
* can be converted to Integers (Strings or Buffers)
|
||||
*/
|
||||
|
||||
case ACPI_TYPE_INTEGER:
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
/*
|
||||
* Stores into a Field/Region or into a Integer/Buffer/String
|
||||
* are all essentially the same. This case handles the
|
||||
|
@ -133,7 +131,6 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr,
|
|||
|
||||
case ACPI_TYPE_LOCAL_ALIAS:
|
||||
case ACPI_TYPE_LOCAL_METHOD_ALIAS:
|
||||
|
||||
/*
|
||||
* All aliases should have been resolved earlier, during the
|
||||
* operand resolution phase.
|
||||
|
@ -144,7 +141,6 @@ acpi_ex_resolve_object(union acpi_operand_object **source_desc_ptr,
|
|||
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
default:
|
||||
|
||||
/*
|
||||
* All other types than Alias and the various Fields come here,
|
||||
* including the untyped case - ACPI_TYPE_ANY.
|
||||
|
|
|
@ -108,7 +108,6 @@ acpi_status acpi_hw_set_mode(u32 mode)
|
|||
break;
|
||||
|
||||
case ACPI_SYS_MODE_LEGACY:
|
||||
|
||||
/*
|
||||
* BIOS should clear all fixed status bits and restore fixed event
|
||||
* enable bits to default
|
||||
|
@ -120,6 +119,7 @@ acpi_status acpi_hw_set_mode(u32 mode)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
|
|
|
@ -127,14 +127,17 @@ acpi_hw_low_set_gpe(struct acpi_gpe_event_info *gpe_event_info, u32 action)
|
|||
/*lint -fallthrough */
|
||||
|
||||
case ACPI_GPE_ENABLE:
|
||||
|
||||
ACPI_SET_BIT(enable_mask, register_bit);
|
||||
break;
|
||||
|
||||
case ACPI_GPE_DISABLE:
|
||||
|
||||
ACPI_CLEAR_BIT(enable_mask, register_bit);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Invalid GPE Action, %u", action));
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
|
|
@ -419,6 +419,7 @@ acpi_status acpi_hw_register_read(u32 register_id, u32 *return_value)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Unknown Register ID: 0x%X", register_id));
|
||||
status = AE_BAD_PARAMETER;
|
||||
break;
|
||||
|
@ -491,7 +492,6 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value)
|
|||
break;
|
||||
|
||||
case ACPI_REGISTER_PM1_CONTROL: /* PM1 A/B: 16-bit access each */
|
||||
|
||||
/*
|
||||
* Perform a read first to preserve certain bits (per ACPI spec)
|
||||
* Note: This includes SCI_EN, we never want to change this bit
|
||||
|
@ -520,7 +520,6 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value)
|
|||
break;
|
||||
|
||||
case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
|
||||
|
||||
/*
|
||||
* For control registers, all reserved bits must be preserved,
|
||||
* as per the ACPI spec.
|
||||
|
@ -555,6 +554,7 @@ acpi_status acpi_hw_register_write(u32 register_id, u32 value)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
ACPI_ERROR((AE_INFO, "Unknown Register ID: 0x%X", register_id));
|
||||
status = AE_BAD_PARAMETER;
|
||||
break;
|
||||
|
|
|
@ -495,7 +495,7 @@ 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
|
||||
* for this state
|
||||
*/
|
||||
info->pathname =
|
||||
info->relative_pathname =
|
||||
ACPI_CAST_PTR(char, acpi_gbl_sleep_state_names[sleep_state]);
|
||||
status = acpi_ns_evaluate(info);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
@ -506,7 +506,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
|
|||
|
||||
if (!info->return_object) {
|
||||
ACPI_ERROR((AE_INFO, "No Sleep State object returned from [%s]",
|
||||
info->pathname));
|
||||
info->relative_pathname));
|
||||
status = AE_AML_NO_RETURN_VALUE;
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -528,10 +528,12 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
|
|||
elements = info->return_object->package.elements;
|
||||
switch (info->return_object->package.count) {
|
||||
case 0:
|
||||
|
||||
status = AE_AML_PACKAGE_LIMIT;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
|
||||
if (elements[0]->common.type != ACPI_TYPE_INTEGER) {
|
||||
status = AE_AML_OPERAND_TYPE;
|
||||
break;
|
||||
|
@ -545,6 +547,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
|
|||
|
||||
case 2:
|
||||
default:
|
||||
|
||||
if ((elements[0]->common.type != ACPI_TYPE_INTEGER) ||
|
||||
(elements[1]->common.type != ACPI_TYPE_INTEGER)) {
|
||||
status = AE_AML_OPERAND_TYPE;
|
||||
|
@ -565,7 +568,7 @@ acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
|
|||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"While evaluating Sleep State [%s]",
|
||||
info->pathname));
|
||||
info->relative_pathname));
|
||||
}
|
||||
|
||||
ACPI_FREE(info);
|
||||
|
|
|
@ -240,12 +240,14 @@ static acpi_status acpi_hw_sleep_dispatch(u8 sleep_state, u32 function_id)
|
|||
&acpi_sleep_dispatch[function_id];
|
||||
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
|
||||
/*
|
||||
* If the Hardware Reduced flag is set (from the FADT), we must
|
||||
* use the extended sleep registers
|
||||
* use the extended sleep registers (FADT). Note: As per the ACPI
|
||||
* specification, these extended registers are to be used for HW-reduced
|
||||
* platforms only. They are not general-purpose replacements for the
|
||||
* legacy PM register sleep support.
|
||||
*/
|
||||
if (acpi_gbl_reduced_hardware || acpi_gbl_FADT.sleep_control.address) {
|
||||
if (acpi_gbl_reduced_hardware) {
|
||||
status = sleep_functions->extended_function(sleep_state);
|
||||
} else {
|
||||
/* Legacy sleep */
|
||||
|
@ -314,20 +316,24 @@ acpi_status acpi_enter_sleep_state_prep(u8 sleep_state)
|
|||
|
||||
switch (sleep_state) {
|
||||
case ACPI_STATE_S0:
|
||||
|
||||
sst_value = ACPI_SST_WORKING;
|
||||
break;
|
||||
|
||||
case ACPI_STATE_S1:
|
||||
case ACPI_STATE_S2:
|
||||
case ACPI_STATE_S3:
|
||||
|
||||
sst_value = ACPI_SST_SLEEPING;
|
||||
break;
|
||||
|
||||
case ACPI_STATE_S4:
|
||||
|
||||
sst_value = ACPI_SST_SLEEP_CONTEXT;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
sst_value = ACPI_SST_INDICATOR_OFF; /* Default is off */
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -151,6 +151,7 @@ acpi_status acpi_ns_root_initialize(void)
|
|||
*/
|
||||
switch (init_val->type) {
|
||||
case ACPI_TYPE_METHOD:
|
||||
|
||||
obj_desc->method.param_count =
|
||||
(u8) ACPI_TO_INTEGER(val);
|
||||
obj_desc->common.flags |= AOPOBJ_DATA_VALID;
|
||||
|
|
|
@ -0,0 +1,294 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Module Name: nsarguments - Validation of args for ACPI predefined methods
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2013, 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 "acpredef.h"
|
||||
|
||||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsarguments")
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_argument_types
|
||||
*
|
||||
* PARAMETERS: info - Method execution information block
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Check the incoming argument count and all argument types
|
||||
* against the argument type list for a predefined name.
|
||||
*
|
||||
******************************************************************************/
|
||||
void acpi_ns_check_argument_types(struct acpi_evaluate_info *info)
|
||||
{
|
||||
u16 arg_type_list;
|
||||
u8 arg_count;
|
||||
u8 arg_type;
|
||||
u8 user_arg_type;
|
||||
u32 i;
|
||||
|
||||
/* If not a predefined name, cannot typecheck args */
|
||||
|
||||
if (!info->predefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
arg_type_list = info->predefined->info.argument_list;
|
||||
arg_count = METHOD_GET_ARG_COUNT(arg_type_list);
|
||||
|
||||
/* Typecheck all arguments */
|
||||
|
||||
for (i = 0; ((i < arg_count) && (i < info->param_count)); i++) {
|
||||
arg_type = METHOD_GET_NEXT_TYPE(arg_type_list);
|
||||
user_arg_type = info->parameters[i]->common.type;
|
||||
|
||||
if (user_arg_type != arg_type) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Argument #%u type mismatch - "
|
||||
"Found [%s], ACPI requires [%s]",
|
||||
(i + 1),
|
||||
acpi_ut_get_type_name
|
||||
(user_arg_type),
|
||||
acpi_ut_get_type_name(arg_type)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_acpi_compliance
|
||||
*
|
||||
* PARAMETERS: pathname - Full pathname to the node (for error msgs)
|
||||
* node - Namespace node for the method/object
|
||||
* predefined - Pointer to entry in predefined name table
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Check that the declared parameter count (in ASL/AML) for a
|
||||
* predefined name is what is expected (matches what is defined in
|
||||
* the ACPI specification for this predefined name.)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ns_check_acpi_compliance(char *pathname,
|
||||
struct acpi_namespace_node *node,
|
||||
const union acpi_predefined_info *predefined)
|
||||
{
|
||||
u32 aml_param_count;
|
||||
u32 required_param_count;
|
||||
|
||||
if (!predefined) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Get the ACPI-required arg count from the predefined info table */
|
||||
|
||||
required_param_count =
|
||||
METHOD_GET_ARG_COUNT(predefined->info.argument_list);
|
||||
|
||||
/*
|
||||
* If this object is not a control method, we can check if the ACPI
|
||||
* spec requires that it be a method.
|
||||
*/
|
||||
if (node->type != ACPI_TYPE_METHOD) {
|
||||
if (required_param_count > 0) {
|
||||
|
||||
/* Object requires args, must be implemented as a method */
|
||||
|
||||
ACPI_BIOS_ERROR_PREDEFINED((AE_INFO, pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Object (%s) must be a control method with %u arguments",
|
||||
acpi_ut_get_type_name(node->
|
||||
type),
|
||||
required_param_count));
|
||||
} else if (!required_param_count
|
||||
&& !predefined->info.expected_btypes) {
|
||||
|
||||
/* Object requires no args and no return value, must be a method */
|
||||
|
||||
ACPI_BIOS_ERROR_PREDEFINED((AE_INFO, pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Object (%s) must be a control method "
|
||||
"with no arguments and no return value",
|
||||
acpi_ut_get_type_name(node->
|
||||
type)));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a control method.
|
||||
* Check that the ASL/AML-defined parameter count for this method
|
||||
* matches the ACPI-required parameter count
|
||||
*
|
||||
* Some methods are allowed to have a "minimum" number of args (_SCP)
|
||||
* because their definition in ACPI has changed over time.
|
||||
*
|
||||
* Note: These are BIOS errors in the declaration of the object
|
||||
*/
|
||||
aml_param_count = node->object->method.param_count;
|
||||
|
||||
if (aml_param_count < required_param_count) {
|
||||
ACPI_BIOS_ERROR_PREDEFINED((AE_INFO, pathname, ACPI_WARN_ALWAYS,
|
||||
"Insufficient arguments - "
|
||||
"ASL declared %u, ACPI requires %u",
|
||||
aml_param_count,
|
||||
required_param_count));
|
||||
} else if ((aml_param_count > required_param_count)
|
||||
&& !(predefined->info.
|
||||
argument_list & ARG_COUNT_IS_MINIMUM)) {
|
||||
ACPI_BIOS_ERROR_PREDEFINED((AE_INFO, pathname, ACPI_WARN_ALWAYS,
|
||||
"Excess arguments - "
|
||||
"ASL declared %u, ACPI requires %u",
|
||||
aml_param_count,
|
||||
required_param_count));
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_argument_count
|
||||
*
|
||||
* PARAMETERS: pathname - Full pathname to the node (for error msgs)
|
||||
* node - Namespace node for the method/object
|
||||
* user_param_count - Number of args passed in by the caller
|
||||
* predefined - Pointer to entry in predefined name table
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Check that incoming argument count matches the declared
|
||||
* parameter count (in the ASL/AML) for an object.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ns_check_argument_count(char *pathname,
|
||||
struct acpi_namespace_node *node,
|
||||
u32 user_param_count,
|
||||
const union acpi_predefined_info *predefined)
|
||||
{
|
||||
u32 aml_param_count;
|
||||
u32 required_param_count;
|
||||
|
||||
if (!predefined) {
|
||||
/*
|
||||
* Not a predefined name. Check the incoming user argument count
|
||||
* against the count that is specified in the method/object.
|
||||
*/
|
||||
if (node->type != ACPI_TYPE_METHOD) {
|
||||
if (user_param_count) {
|
||||
ACPI_INFO_PREDEFINED((AE_INFO, pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"%u arguments were passed to a non-method ACPI object (%s)",
|
||||
user_param_count,
|
||||
acpi_ut_get_type_name
|
||||
(node->type)));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a control method. Check the parameter count.
|
||||
* We can only check the incoming argument count against the
|
||||
* argument count declared for the method in the ASL/AML.
|
||||
*
|
||||
* Emit a message if too few or too many arguments have been passed
|
||||
* by the caller.
|
||||
*
|
||||
* Note: Too many arguments will not cause the method to
|
||||
* fail. However, the method will fail if there are too few
|
||||
* arguments and the method attempts to use one of the missing ones.
|
||||
*/
|
||||
aml_param_count = node->object->method.param_count;
|
||||
|
||||
if (user_param_count < aml_param_count) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Insufficient arguments - "
|
||||
"Caller passed %u, method requires %u",
|
||||
user_param_count,
|
||||
aml_param_count));
|
||||
} else if (user_param_count > aml_param_count) {
|
||||
ACPI_INFO_PREDEFINED((AE_INFO, pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Excess arguments - "
|
||||
"Caller passed %u, method requires %u",
|
||||
user_param_count,
|
||||
aml_param_count));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is a predefined name. Validate the user-supplied parameter
|
||||
* count against the ACPI specification. We don't validate against
|
||||
* the method itself because what is important here is that the
|
||||
* caller is in conformance with the spec. (The arg count for the
|
||||
* method was checked against the ACPI spec earlier.)
|
||||
*
|
||||
* Some methods are allowed to have a "minimum" number of args (_SCP)
|
||||
* because their definition in ACPI has changed over time.
|
||||
*/
|
||||
required_param_count =
|
||||
METHOD_GET_ARG_COUNT(predefined->info.argument_list);
|
||||
|
||||
if (user_param_count < required_param_count) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, pathname, ACPI_WARN_ALWAYS,
|
||||
"Insufficient arguments - "
|
||||
"Caller passed %u, ACPI requires %u",
|
||||
user_param_count, required_param_count));
|
||||
} else if ((user_param_count > required_param_count) &&
|
||||
!(predefined->info.argument_list & ARG_COUNT_IS_MINIMUM)) {
|
||||
ACPI_INFO_PREDEFINED((AE_INFO, pathname, ACPI_WARN_ALWAYS,
|
||||
"Excess arguments - "
|
||||
"Caller passed %u, ACPI requires %u",
|
||||
user_param_count, required_param_count));
|
||||
}
|
||||
}
|
|
@ -103,6 +103,7 @@ acpi_ns_convert_to_integer(union acpi_operand_object *original_object,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
|
@ -191,6 +192,7 @@ acpi_ns_convert_to_string(union acpi_operand_object *original_object,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
|
@ -294,6 +296,7 @@ acpi_ns_convert_to_buffer(union acpi_operand_object *original_object,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
|
|
|
@ -244,10 +244,12 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
|
|||
case ACPI_TYPE_BUFFER:
|
||||
case ACPI_TYPE_STRING:
|
||||
case ACPI_TYPE_METHOD:
|
||||
|
||||
acpi_os_printf("<No attached object>");
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -433,6 +435,7 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -567,32 +570,39 @@ acpi_ns_dump_one_object(acpi_handle obj_handle,
|
|||
goto cleanup;
|
||||
|
||||
case ACPI_TYPE_BUFFER_FIELD:
|
||||
|
||||
obj_desc =
|
||||
(union acpi_operand_object *)obj_desc->buffer_field.
|
||||
buffer_obj;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
|
||||
obj_desc = (void *)obj_desc->package.elements;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_METHOD:
|
||||
|
||||
obj_desc = (void *)obj_desc->method.aml_start;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_LOCAL_REGION_FIELD:
|
||||
|
||||
obj_desc = (void *)obj_desc->field.region_obj;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_LOCAL_BANK_FIELD:
|
||||
|
||||
obj_desc = (void *)obj_desc->bank_field.region_obj;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_LOCAL_INDEX_FIELD:
|
||||
|
||||
obj_desc = (void *)obj_desc->index_field.index_obj;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
|
|
|
@ -61,7 +61,7 @@ acpi_ns_exec_module_code(union acpi_operand_object *method_obj,
|
|||
*
|
||||
* PARAMETERS: info - Evaluation info block, contains:
|
||||
* prefix_node - Prefix or Method/Object Node to execute
|
||||
* pathname - Name of method to execute, If NULL, the
|
||||
* relative_path - Name of method to execute, If NULL, the
|
||||
* Node is the object to execute
|
||||
* parameters - List of parameters to pass to the method,
|
||||
* terminated by NULL. Params itself may be
|
||||
|
@ -82,10 +82,9 @@ acpi_ns_exec_module_code(union acpi_operand_object *method_obj,
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
|
||||
acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *node;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ns_evaluate);
|
||||
|
||||
|
@ -93,83 +92,138 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
|
|||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
/* Initialize the return value to an invalid object */
|
||||
|
||||
info->return_object = NULL;
|
||||
info->param_count = 0;
|
||||
|
||||
if (!info->resolved_node) {
|
||||
if (!info->node) {
|
||||
/*
|
||||
* Get the actual namespace node for the target object if we need to.
|
||||
* Handles these cases:
|
||||
* Get the actual namespace node for the target object if we
|
||||
* need to. Handles these cases:
|
||||
*
|
||||
* 1) Null node, Pathname (absolute path)
|
||||
* 2) Node, Pathname (path relative to Node)
|
||||
* 3) Node, Null Pathname
|
||||
* 1) Null node, valid pathname from root (absolute path)
|
||||
* 2) Node and valid pathname (path relative to Node)
|
||||
* 3) Node, Null pathname
|
||||
*/
|
||||
status = acpi_ns_get_node(info->prefix_node, info->pathname,
|
||||
ACPI_NS_NO_UPSEARCH,
|
||||
&info->resolved_node);
|
||||
status =
|
||||
acpi_ns_get_node(info->prefix_node, info->relative_pathname,
|
||||
ACPI_NS_NO_UPSEARCH, &info->node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* For a method alias, we must grab the actual method node so that proper
|
||||
* scoping context will be established before execution.
|
||||
* For a method alias, we must grab the actual method node so that
|
||||
* proper scoping context will be established before execution.
|
||||
*/
|
||||
if (acpi_ns_get_type(info->resolved_node) ==
|
||||
ACPI_TYPE_LOCAL_METHOD_ALIAS) {
|
||||
info->resolved_node =
|
||||
if (acpi_ns_get_type(info->node) == ACPI_TYPE_LOCAL_METHOD_ALIAS) {
|
||||
info->node =
|
||||
ACPI_CAST_PTR(struct acpi_namespace_node,
|
||||
info->resolved_node->object);
|
||||
info->node->object);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "%s [%p] Value %p\n", info->pathname,
|
||||
info->resolved_node,
|
||||
acpi_ns_get_attached_object(info->resolved_node)));
|
||||
/* Complete the info block initialization */
|
||||
|
||||
node = info->resolved_node;
|
||||
info->return_object = NULL;
|
||||
info->node_flags = info->node->flags;
|
||||
info->obj_desc = acpi_ns_get_attached_object(info->node);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "%s [%p] Value %p\n",
|
||||
info->relative_pathname, info->node,
|
||||
acpi_ns_get_attached_object(info->node)));
|
||||
|
||||
/* Get info if we have a predefined name (_HID, etc.) */
|
||||
|
||||
info->predefined =
|
||||
acpi_ut_match_predefined_method(info->node->name.ascii);
|
||||
|
||||
/* Get the full pathname to the object, for use in warning messages */
|
||||
|
||||
info->full_pathname = acpi_ns_get_external_pathname(info->node);
|
||||
if (!info->full_pathname) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
/* Count the number of arguments being passed in */
|
||||
|
||||
info->param_count = 0;
|
||||
if (info->parameters) {
|
||||
while (info->parameters[info->param_count]) {
|
||||
info->param_count++;
|
||||
}
|
||||
|
||||
/* Warn on impossible argument count */
|
||||
|
||||
if (info->param_count > ACPI_METHOD_NUM_ARGS) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Excess arguments (%u) - using only %u",
|
||||
info->param_count,
|
||||
ACPI_METHOD_NUM_ARGS));
|
||||
|
||||
info->param_count = ACPI_METHOD_NUM_ARGS;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Two major cases here:
|
||||
*
|
||||
* 1) The object is a control method -- execute it
|
||||
* 2) The object is not a method -- just return it's current value
|
||||
* For predefined names: Check that the declared argument count
|
||||
* matches the ACPI spec -- otherwise this is a BIOS error.
|
||||
*/
|
||||
if (acpi_ns_get_type(info->resolved_node) == ACPI_TYPE_METHOD) {
|
||||
acpi_ns_check_acpi_compliance(info->full_pathname, info->node,
|
||||
info->predefined);
|
||||
|
||||
/*
|
||||
* For all names: Check that the incoming argument count for
|
||||
* this method/object matches the actual ASL/AML definition.
|
||||
*/
|
||||
acpi_ns_check_argument_count(info->full_pathname, info->node,
|
||||
info->param_count, info->predefined);
|
||||
|
||||
/* For predefined names: Typecheck all incoming arguments */
|
||||
|
||||
acpi_ns_check_argument_types(info);
|
||||
|
||||
/*
|
||||
* Three major evaluation cases:
|
||||
*
|
||||
* 1) Object types that cannot be evaluated by definition
|
||||
* 2) The object is a control method -- execute it
|
||||
* 3) The object is not a method -- just return it's current value
|
||||
*/
|
||||
switch (acpi_ns_get_type(info->node)) {
|
||||
case ACPI_TYPE_DEVICE:
|
||||
case ACPI_TYPE_EVENT:
|
||||
case ACPI_TYPE_MUTEX:
|
||||
case ACPI_TYPE_REGION:
|
||||
case ACPI_TYPE_THERMAL:
|
||||
case ACPI_TYPE_LOCAL_SCOPE:
|
||||
/*
|
||||
* 1) Object is a control method - execute it
|
||||
* 1) Disallow evaluation of certain object types. For these,
|
||||
* object evaluation is undefined and not supported.
|
||||
*/
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"%s: Evaluation of object type [%s] is not supported",
|
||||
info->full_pathname,
|
||||
acpi_ut_get_type_name(info->node->type)));
|
||||
|
||||
status = AE_TYPE;
|
||||
goto cleanup;
|
||||
|
||||
case ACPI_TYPE_METHOD:
|
||||
/*
|
||||
* 2) Object is a control method - execute it
|
||||
*/
|
||||
|
||||
/* Verify that there is a method object associated with this node */
|
||||
|
||||
info->obj_desc =
|
||||
acpi_ns_get_attached_object(info->resolved_node);
|
||||
if (!info->obj_desc) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Control method has no attached sub-object"));
|
||||
return_ACPI_STATUS(AE_NULL_OBJECT);
|
||||
"%s: Method has no attached sub-object",
|
||||
info->full_pathname));
|
||||
status = AE_NULL_OBJECT;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Count the number of arguments being passed to the method */
|
||||
|
||||
if (info->parameters) {
|
||||
while (info->parameters[info->param_count]) {
|
||||
if (info->param_count > ACPI_METHOD_MAX_ARG) {
|
||||
return_ACPI_STATUS(AE_LIMIT);
|
||||
}
|
||||
info->param_count++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
ACPI_DUMP_PATHNAME(info->resolved_node, "ACPI: Execute Method",
|
||||
ACPI_LV_INFO, _COMPONENT);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"Method at AML address %p Length %X\n",
|
||||
"**** Execute method [%s] at AML address %p length %X\n",
|
||||
info->full_pathname,
|
||||
info->obj_desc->method.aml_start + 1,
|
||||
info->obj_desc->method.aml_length - 1));
|
||||
|
||||
|
@ -184,81 +238,61 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
|
|||
acpi_ex_enter_interpreter();
|
||||
status = acpi_ps_execute_method(info);
|
||||
acpi_ex_exit_interpreter();
|
||||
} else {
|
||||
break;
|
||||
|
||||
default:
|
||||
/*
|
||||
* 2) Object is not a method, return its current value
|
||||
*
|
||||
* Disallow certain object types. For these, "evaluation" is undefined.
|
||||
* 3) All other non-method objects -- get the current object value
|
||||
*/
|
||||
switch (info->resolved_node->type) {
|
||||
case ACPI_TYPE_DEVICE:
|
||||
case ACPI_TYPE_EVENT:
|
||||
case ACPI_TYPE_MUTEX:
|
||||
case ACPI_TYPE_REGION:
|
||||
case ACPI_TYPE_THERMAL:
|
||||
case ACPI_TYPE_LOCAL_SCOPE:
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"[%4.4s] Evaluation of object type [%s] is not supported",
|
||||
info->resolved_node->name.ascii,
|
||||
acpi_ut_get_type_name(info->resolved_node->
|
||||
type)));
|
||||
|
||||
return_ACPI_STATUS(AE_TYPE);
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Objects require additional resolution steps (e.g., the Node may be
|
||||
* a field that must be read, etc.) -- we can't just grab the object
|
||||
* out of the node.
|
||||
* Some objects require additional resolution steps (e.g., the Node
|
||||
* may be a field that must be read, etc.) -- we can't just grab
|
||||
* the object out of the node.
|
||||
*
|
||||
* Use resolve_node_to_value() to get the associated value.
|
||||
*
|
||||
* NOTE: we can get away with passing in NULL for a walk state because
|
||||
* resolved_node is guaranteed to not be a reference to either a method
|
||||
* the Node is guaranteed to not be a reference to either a method
|
||||
* local or a method argument (because this interface is never called
|
||||
* from a running method.)
|
||||
*
|
||||
* Even though we do not directly invoke the interpreter for object
|
||||
* resolution, we must lock it because we could access an opregion.
|
||||
* The opregion access code assumes that the interpreter is locked.
|
||||
* resolution, we must lock it because we could access an op_region.
|
||||
* The op_region access code assumes that the interpreter is locked.
|
||||
*/
|
||||
acpi_ex_enter_interpreter();
|
||||
|
||||
/* Function has a strange interface */
|
||||
/* TBD: resolve_node_to_value has a strange interface, fix */
|
||||
|
||||
info->return_object =
|
||||
ACPI_CAST_PTR(union acpi_operand_object, info->node);
|
||||
|
||||
status =
|
||||
acpi_ex_resolve_node_to_value(&info->resolved_node, NULL);
|
||||
acpi_ex_resolve_node_to_value(ACPI_CAST_INDIRECT_PTR
|
||||
(struct acpi_namespace_node,
|
||||
&info->return_object), NULL);
|
||||
acpi_ex_exit_interpreter();
|
||||
|
||||
/*
|
||||
* If acpi_ex_resolve_node_to_value() succeeded, the return value was placed
|
||||
* in resolved_node.
|
||||
*/
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
status = AE_CTRL_RETURN_VALUE;
|
||||
info->return_object =
|
||||
ACPI_CAST_PTR(union acpi_operand_object,
|
||||
info->resolved_node);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
|
||||
"Returning object %p [%s]\n",
|
||||
info->return_object,
|
||||
acpi_ut_get_object_type_name(info->
|
||||
return_object)));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "Returned object %p [%s]\n",
|
||||
info->return_object,
|
||||
acpi_ut_get_object_type_name(info->
|
||||
return_object)));
|
||||
|
||||
status = AE_CTRL_RETURN_VALUE; /* Always has a "return value" */
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check input argument count against the ASL-defined count for a method.
|
||||
* Also check predefined names: argument count and return value against
|
||||
* the ACPI specification. Some incorrect return value types are repaired.
|
||||
* For predefined names, check the return value against the ACPI
|
||||
* specification. Some incorrect return value types are repaired.
|
||||
*/
|
||||
(void)acpi_ns_check_predefined_names(node, info->param_count,
|
||||
status, &info->return_object);
|
||||
(void)acpi_ns_check_return_value(info->node, info, info->param_count,
|
||||
status, &info->return_object);
|
||||
|
||||
/* Check if there is a return value that must be dealt with */
|
||||
|
||||
|
@ -278,12 +312,15 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info * info)
|
|||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
|
||||
"*** Completed evaluation of object %s ***\n",
|
||||
info->pathname));
|
||||
info->relative_pathname));
|
||||
|
||||
cleanup:
|
||||
/*
|
||||
* Namespace was unlocked by the handling acpi_ns* function, so we
|
||||
* just return
|
||||
* just free the pathname and return
|
||||
*/
|
||||
ACPI_FREE(info->full_pathname);
|
||||
info->full_pathname = NULL;
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
|
|
@ -176,7 +176,7 @@ acpi_status acpi_ns_initialize_devices(void)
|
|||
* part of the ACPI specification.
|
||||
*/
|
||||
info.evaluate_info->prefix_node = acpi_gbl_root_node;
|
||||
info.evaluate_info->pathname = METHOD_NAME__INI;
|
||||
info.evaluate_info->relative_pathname = METHOD_NAME__INI;
|
||||
info.evaluate_info->parameters = NULL;
|
||||
info.evaluate_info->flags = ACPI_IGNORE_RETURN_VALUE;
|
||||
|
||||
|
@ -266,28 +266,34 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
|
|||
|
||||
switch (type) {
|
||||
case ACPI_TYPE_REGION:
|
||||
|
||||
info->op_region_count++;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER_FIELD:
|
||||
|
||||
info->field_count++;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_LOCAL_BANK_FIELD:
|
||||
|
||||
info->field_count++;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
info->buffer_count++;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
|
||||
info->package_count++;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* No init required, just exit now */
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
|
@ -337,7 +343,9 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* No other types can get here */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -416,6 +424,7 @@ acpi_ns_find_ini_methods(acpi_handle obj_handle,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -560,7 +569,7 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
|
|||
|
||||
ACPI_MEMSET(info, 0, sizeof(struct acpi_evaluate_info));
|
||||
info->prefix_node = device_node;
|
||||
info->pathname = METHOD_NAME__INI;
|
||||
info->relative_pathname = METHOD_NAME__INI;
|
||||
info->parameters = NULL;
|
||||
info->flags = ACPI_IGNORE_RETURN_VALUE;
|
||||
|
||||
|
@ -574,8 +583,7 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
|
|||
|
||||
/* Ignore error and move on to next device */
|
||||
|
||||
char *scope_name =
|
||||
acpi_ns_get_external_pathname(info->resolved_node);
|
||||
char *scope_name = acpi_ns_get_external_pathname(info->node);
|
||||
|
||||
ACPI_EXCEPTION((AE_INFO, status, "during %s._INI execution",
|
||||
scope_name));
|
||||
|
|
|
@ -61,28 +61,29 @@ ACPI_MODULE_NAME("nspredef")
|
|||
* There are several areas that are validated:
|
||||
*
|
||||
* 1) The number of input arguments as defined by the method/object in the
|
||||
* ASL is validated against the ACPI specification.
|
||||
* ASL is validated against the ACPI specification.
|
||||
* 2) The type of the return object (if any) is validated against the ACPI
|
||||
* specification.
|
||||
* specification.
|
||||
* 3) For returned package objects, the count of package elements is
|
||||
* validated, as well as the type of each package element. Nested
|
||||
* packages are supported.
|
||||
* validated, as well as the type of each package element. Nested
|
||||
* packages are supported.
|
||||
*
|
||||
* For any problems found, a warning message is issued.
|
||||
*
|
||||
******************************************************************************/
|
||||
/* Local prototypes */
|
||||
static acpi_status
|
||||
acpi_ns_check_reference(struct acpi_predefined_data *data,
|
||||
acpi_ns_check_reference(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object *return_object);
|
||||
|
||||
static u32 acpi_ns_get_bitmapped_type(union acpi_operand_object *return_object);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_predefined_names
|
||||
* FUNCTION: acpi_ns_check_return_value
|
||||
*
|
||||
* PARAMETERS: node - Namespace node for the method/object
|
||||
* info - Method execution information block
|
||||
* user_param_count - Number of parameters actually passed
|
||||
* return_status - Status from the object evaluation
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
|
@ -90,44 +91,25 @@ static u32 acpi_ns_get_bitmapped_type(union acpi_operand_object *return_object);
|
|||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Check an ACPI name for a match in the predefined name list.
|
||||
* DESCRIPTION: Check the value returned from a predefined name.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
||||
u32 user_param_count,
|
||||
acpi_status return_status,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
acpi_ns_check_return_value(struct acpi_namespace_node *node,
|
||||
struct acpi_evaluate_info *info,
|
||||
u32 user_param_count,
|
||||
acpi_status return_status,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
acpi_status status = AE_OK;
|
||||
acpi_status status;
|
||||
const union acpi_predefined_info *predefined;
|
||||
char *pathname;
|
||||
struct acpi_predefined_data *data;
|
||||
|
||||
/* Match the name for this method/object against the predefined list */
|
||||
|
||||
predefined = acpi_ut_match_predefined_method(node->name.ascii);
|
||||
|
||||
/* Get the full pathname to the object, for use in warning messages */
|
||||
|
||||
pathname = acpi_ns_get_external_pathname(node);
|
||||
if (!pathname) {
|
||||
return (AE_OK); /* Could not get pathname, ignore */
|
||||
}
|
||||
|
||||
/*
|
||||
* Check that the parameter count for this method matches the ASL
|
||||
* definition. For predefined names, ensure that both the caller and
|
||||
* the method itself are in accordance with the ACPI specification.
|
||||
*/
|
||||
acpi_ns_check_parameter_count(pathname, node, user_param_count,
|
||||
predefined);
|
||||
|
||||
/* If not a predefined name, we cannot validate the return object */
|
||||
|
||||
predefined = info->predefined;
|
||||
if (!predefined) {
|
||||
goto cleanup;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -135,7 +117,7 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
|||
* validate the return object
|
||||
*/
|
||||
if ((return_status != AE_OK) && (return_status != AE_CTRL_RETURN_VALUE)) {
|
||||
goto cleanup;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -154,25 +136,14 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
|||
if (acpi_gbl_disable_auto_repair ||
|
||||
(!predefined->info.expected_btypes) ||
|
||||
(predefined->info.expected_btypes == ACPI_RTYPE_ALL)) {
|
||||
goto cleanup;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Create the parameter data block for object validation */
|
||||
|
||||
data = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_predefined_data));
|
||||
if (!data) {
|
||||
goto cleanup;
|
||||
}
|
||||
data->predefined = predefined;
|
||||
data->node = node;
|
||||
data->node_flags = node->flags;
|
||||
data->pathname = pathname;
|
||||
|
||||
/*
|
||||
* Check that the type of the main return object is what is expected
|
||||
* for this predefined name
|
||||
*/
|
||||
status = acpi_ns_check_object_type(data, return_object_ptr,
|
||||
status = acpi_ns_check_object_type(info, return_object_ptr,
|
||||
predefined->info.expected_btypes,
|
||||
ACPI_NOT_PACKAGE_ELEMENT);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
@ -184,10 +155,16 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
|||
* Note: Package may have been newly created by call above.
|
||||
*/
|
||||
if ((*return_object_ptr)->common.type == ACPI_TYPE_PACKAGE) {
|
||||
data->parent_package = *return_object_ptr;
|
||||
status = acpi_ns_check_package(data, return_object_ptr);
|
||||
info->parent_package = *return_object_ptr;
|
||||
status = acpi_ns_check_package(info, return_object_ptr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
|
||||
/* We might be able to fix some errors */
|
||||
|
||||
if ((status != AE_AML_OPERAND_TYPE) &&
|
||||
(status != AE_AML_OPERAND_VALUE)) {
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -199,7 +176,7 @@ acpi_ns_check_predefined_names(struct acpi_namespace_node *node,
|
|||
* performed on a per-name basis, i.e., the code is specific to
|
||||
* particular predefined names.
|
||||
*/
|
||||
status = acpi_ns_complex_repairs(data, node, status, return_object_ptr);
|
||||
status = acpi_ns_complex_repairs(info, node, status, return_object_ptr);
|
||||
|
||||
exit:
|
||||
/*
|
||||
|
@ -207,112 +184,18 @@ exit:
|
|||
* or more objects, mark the parent node to suppress further warning
|
||||
* messages during the next evaluation of the same method/object.
|
||||
*/
|
||||
if (ACPI_FAILURE(status) || (data->flags & ACPI_OBJECT_REPAIRED)) {
|
||||
if (ACPI_FAILURE(status) || (info->return_flags & ACPI_OBJECT_REPAIRED)) {
|
||||
node->flags |= ANOBJ_EVALUATED;
|
||||
}
|
||||
ACPI_FREE(data);
|
||||
|
||||
cleanup:
|
||||
ACPI_FREE(pathname);
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_parameter_count
|
||||
*
|
||||
* PARAMETERS: pathname - Full pathname to the node (for error msgs)
|
||||
* node - Namespace node for the method/object
|
||||
* user_param_count - Number of args passed in by the caller
|
||||
* predefined - Pointer to entry in predefined name table
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Check that the declared (in ASL/AML) parameter count for a
|
||||
* predefined name is what is expected (i.e., what is defined in
|
||||
* the ACPI specification for this predefined name.)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ns_check_parameter_count(char *pathname,
|
||||
struct acpi_namespace_node *node,
|
||||
u32 user_param_count,
|
||||
const union acpi_predefined_info *predefined)
|
||||
{
|
||||
u32 param_count;
|
||||
u32 required_params_current;
|
||||
u32 required_params_old;
|
||||
|
||||
/* Methods have 0-7 parameters. All other types have zero. */
|
||||
|
||||
param_count = 0;
|
||||
if (node->type == ACPI_TYPE_METHOD) {
|
||||
param_count = node->object->method.param_count;
|
||||
}
|
||||
|
||||
if (!predefined) {
|
||||
/*
|
||||
* Check the parameter count for non-predefined methods/objects.
|
||||
*
|
||||
* Warning if too few or too many arguments have been passed by the
|
||||
* caller. An incorrect number of arguments may not cause the method
|
||||
* to fail. However, the method will fail if there are too few
|
||||
* arguments and the method attempts to use one of the missing ones.
|
||||
*/
|
||||
if (user_param_count < param_count) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Insufficient arguments - needs %u, found %u",
|
||||
param_count, user_param_count));
|
||||
} else if (user_param_count > param_count) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Excess arguments - needs %u, found %u",
|
||||
param_count, user_param_count));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Validate the user-supplied parameter count.
|
||||
* Allow two different legal argument counts (_SCP, etc.)
|
||||
*/
|
||||
required_params_current =
|
||||
predefined->info.argument_list & METHOD_ARG_MASK;
|
||||
required_params_old =
|
||||
predefined->info.argument_list >> METHOD_ARG_BIT_WIDTH;
|
||||
|
||||
if (user_param_count != ACPI_UINT32_MAX) {
|
||||
if ((user_param_count != required_params_current) &&
|
||||
(user_param_count != required_params_old)) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Parameter count mismatch - "
|
||||
"caller passed %u, ACPI requires %u",
|
||||
user_param_count,
|
||||
required_params_current));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Check that the ASL-defined parameter count is what is expected for
|
||||
* this predefined name (parameter count as defined by the ACPI
|
||||
* specification)
|
||||
*/
|
||||
if ((param_count != required_params_current) &&
|
||||
(param_count != required_params_old)) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, pathname, node->flags,
|
||||
"Parameter count mismatch - ASL declared %u, ACPI requires %u",
|
||||
param_count, required_params_current));
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_object_type
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
* expected_btypes - Bitmap of expected return type(s)
|
||||
|
@ -328,7 +211,7 @@ acpi_ns_check_parameter_count(char *pathname,
|
|||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
||||
acpi_ns_check_object_type(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr,
|
||||
u32 expected_btypes, u32 package_index)
|
||||
{
|
||||
|
@ -340,7 +223,8 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
|||
|
||||
if (return_object &&
|
||||
ACPI_GET_DESCRIPTOR_TYPE(return_object) == ACPI_DESC_TYPE_NAMED) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"Invalid return type - Found a Namespace node [%4.4s] type %s",
|
||||
return_object->node.name.ascii,
|
||||
acpi_ut_get_type_name(return_object->node.
|
||||
|
@ -356,8 +240,8 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
|||
* from all of the predefined names (including elements of returned
|
||||
* packages)
|
||||
*/
|
||||
data->return_btype = acpi_ns_get_bitmapped_type(return_object);
|
||||
if (data->return_btype == ACPI_RTYPE_ANY) {
|
||||
info->return_btype = acpi_ns_get_bitmapped_type(return_object);
|
||||
if (info->return_btype == ACPI_RTYPE_ANY) {
|
||||
|
||||
/* Not one of the supported objects, must be incorrect */
|
||||
goto type_error_exit;
|
||||
|
@ -365,16 +249,18 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
|||
|
||||
/* For reference objects, check that the reference type is correct */
|
||||
|
||||
if ((data->return_btype & expected_btypes) == ACPI_RTYPE_REFERENCE) {
|
||||
status = acpi_ns_check_reference(data, return_object);
|
||||
if ((info->return_btype & expected_btypes) == ACPI_RTYPE_REFERENCE) {
|
||||
status = acpi_ns_check_reference(info, return_object);
|
||||
return (status);
|
||||
}
|
||||
|
||||
/* Attempt simple repair of the returned object if necessary */
|
||||
|
||||
status = acpi_ns_simple_repair(data, expected_btypes,
|
||||
status = acpi_ns_simple_repair(info, expected_btypes,
|
||||
package_index, return_object_ptr);
|
||||
return (status);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
return (AE_OK); /* Successful repair */
|
||||
}
|
||||
|
||||
type_error_exit:
|
||||
|
||||
|
@ -383,12 +269,14 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
|||
acpi_ut_get_expected_return_types(type_buffer, expected_btypes);
|
||||
|
||||
if (package_index == ACPI_NOT_PACKAGE_ELEMENT) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"Return type mismatch - found %s, expected %s",
|
||||
acpi_ut_get_object_type_name
|
||||
(return_object), type_buffer));
|
||||
} else {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"Return Package type mismatch at index %u - "
|
||||
"found %s, expected %s", package_index,
|
||||
acpi_ut_get_object_type_name
|
||||
|
@ -402,7 +290,7 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
|||
*
|
||||
* FUNCTION: acpi_ns_check_reference
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* return_object - Object returned from the evaluation of a
|
||||
* method or object
|
||||
*
|
||||
|
@ -415,7 +303,7 @@ acpi_ns_check_object_type(struct acpi_predefined_data *data,
|
|||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_reference(struct acpi_predefined_data *data,
|
||||
acpi_ns_check_reference(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object *return_object)
|
||||
{
|
||||
|
||||
|
@ -428,7 +316,7 @@ acpi_ns_check_reference(struct acpi_predefined_data *data,
|
|||
return (AE_OK);
|
||||
}
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, info->node_flags,
|
||||
"Return type mismatch - unexpected reference object type [%s] %2.2X",
|
||||
acpi_ut_get_reference_name(return_object),
|
||||
return_object->reference.class));
|
||||
|
@ -462,26 +350,32 @@ static u32 acpi_ns_get_bitmapped_type(union acpi_operand_object *return_object)
|
|||
|
||||
switch (return_object->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
return_btype = ACPI_RTYPE_INTEGER;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
return_btype = ACPI_RTYPE_BUFFER;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
return_btype = ACPI_RTYPE_STRING;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
|
||||
return_btype = ACPI_RTYPE_PACKAGE;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_LOCAL_REFERENCE:
|
||||
|
||||
return_btype = ACPI_RTYPE_REFERENCE;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Not one of the supported objects, must be incorrect */
|
||||
|
||||
return_btype = ACPI_RTYPE_ANY;
|
||||
|
|
|
@ -51,12 +51,12 @@ ACPI_MODULE_NAME("nsprepkg")
|
|||
|
||||
/* Local prototypes */
|
||||
static acpi_status
|
||||
acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
||||
acpi_ns_check_package_list(struct acpi_evaluate_info *info,
|
||||
const union acpi_predefined_info *package,
|
||||
union acpi_operand_object **elements, u32 count);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_package_elements(struct acpi_predefined_data *data,
|
||||
acpi_ns_check_package_elements(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **elements,
|
||||
u8 type1,
|
||||
u32 count1,
|
||||
|
@ -66,7 +66,7 @@ acpi_ns_check_package_elements(struct acpi_predefined_data *data,
|
|||
*
|
||||
* FUNCTION: acpi_ns_check_package
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
|
@ -78,7 +78,7 @@ acpi_ns_check_package_elements(struct acpi_predefined_data *data,
|
|||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_check_package(struct acpi_predefined_data *data,
|
||||
acpi_ns_check_package(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
|
@ -93,18 +93,18 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
|
||||
/* The package info for this name is in the next table entry */
|
||||
|
||||
package = data->predefined + 1;
|
||||
package = info->predefined + 1;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
|
||||
"%s Validating return Package of Type %X, Count %X\n",
|
||||
data->pathname, package->ret_info.type,
|
||||
info->full_pathname, package->ret_info.type,
|
||||
return_object->package.count));
|
||||
|
||||
/*
|
||||
* For variable-length Packages, we can safely remove all embedded
|
||||
* and trailing NULL package elements
|
||||
*/
|
||||
acpi_ns_remove_null_elements(data, package->ret_info.type,
|
||||
acpi_ns_remove_null_elements(info, package->ret_info.type,
|
||||
return_object);
|
||||
|
||||
/* Extract package count and elements array */
|
||||
|
@ -121,7 +121,8 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
return (AE_OK);
|
||||
}
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"Return Package has no elements (empty)"));
|
||||
|
||||
return (AE_AML_OPERAND_VALUE);
|
||||
|
@ -135,7 +136,6 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
*/
|
||||
switch (package->ret_info.type) {
|
||||
case ACPI_PTYPE1_FIXED:
|
||||
|
||||
/*
|
||||
* The package count is fixed and there are no sub-packages
|
||||
*
|
||||
|
@ -150,13 +150,13 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||
"%s: Return Package is larger than needed - "
|
||||
"found %u, expected %u\n",
|
||||
data->pathname, count,
|
||||
info->full_pathname, count,
|
||||
expected_count));
|
||||
}
|
||||
|
||||
/* Validate all elements of the returned package */
|
||||
|
||||
status = acpi_ns_check_package_elements(data, elements,
|
||||
status = acpi_ns_check_package_elements(info, elements,
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
package->ret_info.
|
||||
|
@ -168,13 +168,12 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
break;
|
||||
|
||||
case ACPI_PTYPE1_VAR:
|
||||
|
||||
/*
|
||||
* The package count is variable, there are no sub-packages, and all
|
||||
* elements must be of the same type
|
||||
*/
|
||||
for (i = 0; i < count; i++) {
|
||||
status = acpi_ns_check_object_type(data, elements,
|
||||
status = acpi_ns_check_object_type(info, elements,
|
||||
package->ret_info.
|
||||
object_type1, i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
@ -185,7 +184,6 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
break;
|
||||
|
||||
case ACPI_PTYPE1_OPTION:
|
||||
|
||||
/*
|
||||
* The package count is variable, there are no sub-packages. There are
|
||||
* a fixed number of required elements, and a variable number of
|
||||
|
@ -206,7 +204,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
/* These are the required package elements (0, 1, or 2) */
|
||||
|
||||
status =
|
||||
acpi_ns_check_object_type(data, elements,
|
||||
acpi_ns_check_object_type(info, elements,
|
||||
package->
|
||||
ret_info3.
|
||||
object_type[i],
|
||||
|
@ -218,7 +216,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
/* These are the optional package elements */
|
||||
|
||||
status =
|
||||
acpi_ns_check_object_type(data, elements,
|
||||
acpi_ns_check_object_type(info, elements,
|
||||
package->
|
||||
ret_info3.
|
||||
tail_object_type,
|
||||
|
@ -235,7 +233,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
|
||||
/* First element is the (Integer) revision */
|
||||
|
||||
status = acpi_ns_check_object_type(data, elements,
|
||||
status = acpi_ns_check_object_type(info, elements,
|
||||
ACPI_RTYPE_INTEGER, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
|
@ -247,14 +245,14 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
/* Examine the sub-packages */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_list(data, package, elements, count);
|
||||
acpi_ns_check_package_list(info, package, elements, count);
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2_PKG_COUNT:
|
||||
|
||||
/* First element is the (Integer) count of sub-packages to follow */
|
||||
|
||||
status = acpi_ns_check_object_type(data, elements,
|
||||
status = acpi_ns_check_object_type(info, elements,
|
||||
ACPI_RTYPE_INTEGER, 0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
|
@ -275,7 +273,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
/* Examine the sub-packages */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_list(data, package, elements, count);
|
||||
acpi_ns_check_package_list(info, package, elements, count);
|
||||
break;
|
||||
|
||||
case ACPI_PTYPE2:
|
||||
|
@ -283,7 +281,6 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
case ACPI_PTYPE2_MIN:
|
||||
case ACPI_PTYPE2_COUNT:
|
||||
case ACPI_PTYPE2_FIX_VAR:
|
||||
|
||||
/*
|
||||
* These types all return a single Package that consists of a
|
||||
* variable number of sub-Packages.
|
||||
|
@ -300,7 +297,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
/* Create the new outer package and populate it */
|
||||
|
||||
status =
|
||||
acpi_ns_wrap_with_package(data, return_object,
|
||||
acpi_ns_wrap_with_package(info, return_object,
|
||||
return_object_ptr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
|
@ -316,14 +313,15 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
/* Examine the sub-packages */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_list(data, package, elements, count);
|
||||
acpi_ns_check_package_list(info, package, elements, count);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Should not get here if predefined info table is correct */
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"Invalid internal return type in table entry: %X",
|
||||
package->ret_info.type));
|
||||
|
||||
|
@ -336,7 +334,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
|
||||
/* Error exit for the case with an incorrect package count */
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, info->node_flags,
|
||||
"Return Package is too small - found %u elements, expected %u",
|
||||
count, expected_count));
|
||||
|
||||
|
@ -347,7 +345,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
*
|
||||
* FUNCTION: acpi_ns_check_package_list
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* package - Pointer to package-specific info for method
|
||||
* elements - Element list of parent package. All elements
|
||||
* of this list should be of type Package.
|
||||
|
@ -360,7 +358,7 @@ acpi_ns_check_package(struct acpi_predefined_data *data,
|
|||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
||||
acpi_ns_check_package_list(struct acpi_evaluate_info *info,
|
||||
const union acpi_predefined_info *package,
|
||||
union acpi_operand_object **elements, u32 count)
|
||||
{
|
||||
|
@ -381,11 +379,11 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
|||
for (i = 0; i < count; i++) {
|
||||
sub_package = *elements;
|
||||
sub_elements = sub_package->package.elements;
|
||||
data->parent_package = sub_package;
|
||||
info->parent_package = sub_package;
|
||||
|
||||
/* Each sub-object must be of type Package */
|
||||
|
||||
status = acpi_ns_check_object_type(data, &sub_package,
|
||||
status = acpi_ns_check_object_type(info, &sub_package,
|
||||
ACPI_RTYPE_PACKAGE, i);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
|
@ -393,7 +391,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
|||
|
||||
/* Examine the different types of expected sub-packages */
|
||||
|
||||
data->parent_package = sub_package;
|
||||
info->parent_package = sub_package;
|
||||
switch (package->ret_info.type) {
|
||||
case ACPI_PTYPE2:
|
||||
case ACPI_PTYPE2_PKG_COUNT:
|
||||
|
@ -408,7 +406,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
|||
}
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_elements(data, sub_elements,
|
||||
acpi_ns_check_package_elements(info, sub_elements,
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
package->ret_info.
|
||||
|
@ -434,7 +432,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
|||
}
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_elements(data, sub_elements,
|
||||
acpi_ns_check_package_elements(info, sub_elements,
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
package->ret_info.
|
||||
|
@ -463,7 +461,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
|||
|
||||
for (j = 0; j < expected_count; j++) {
|
||||
status =
|
||||
acpi_ns_check_object_type(data,
|
||||
acpi_ns_check_object_type(info,
|
||||
&sub_elements[j],
|
||||
package->
|
||||
ret_info2.
|
||||
|
@ -487,7 +485,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
|||
/* Check the type of each sub-package element */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_elements(data, sub_elements,
|
||||
acpi_ns_check_package_elements(info, sub_elements,
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
sub_package->package.
|
||||
|
@ -498,12 +496,11 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
|||
break;
|
||||
|
||||
case ACPI_PTYPE2_COUNT:
|
||||
|
||||
/*
|
||||
* First element is the (Integer) count of elements, including
|
||||
* the count field (the ACPI name is num_elements)
|
||||
*/
|
||||
status = acpi_ns_check_object_type(data, sub_elements,
|
||||
status = acpi_ns_check_object_type(info, sub_elements,
|
||||
ACPI_RTYPE_INTEGER,
|
||||
0);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
@ -537,7 +534,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
|||
/* Check the type of each sub-package element */
|
||||
|
||||
status =
|
||||
acpi_ns_check_package_elements(data,
|
||||
acpi_ns_check_package_elements(info,
|
||||
(sub_elements + 1),
|
||||
package->ret_info.
|
||||
object_type1,
|
||||
|
@ -562,7 +559,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
|||
|
||||
/* The sub-package count was smaller than required */
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, info->node_flags,
|
||||
"Return Sub-Package[%u] is too small - found %u elements, expected %u",
|
||||
i, sub_package->package.count, expected_count));
|
||||
|
||||
|
@ -573,7 +570,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
|||
*
|
||||
* FUNCTION: acpi_ns_check_package_elements
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* elements - Pointer to the package elements array
|
||||
* type1 - Object type for first group
|
||||
* count1 - Count for first group
|
||||
|
@ -589,7 +586,7 @@ acpi_ns_check_package_list(struct acpi_predefined_data *data,
|
|||
******************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_package_elements(struct acpi_predefined_data *data,
|
||||
acpi_ns_check_package_elements(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **elements,
|
||||
u8 type1,
|
||||
u32 count1,
|
||||
|
@ -605,7 +602,7 @@ acpi_ns_check_package_elements(struct acpi_predefined_data *data,
|
|||
* The second group can have a count of zero.
|
||||
*/
|
||||
for (i = 0; i < count1; i++) {
|
||||
status = acpi_ns_check_object_type(data, this_element,
|
||||
status = acpi_ns_check_object_type(info, this_element,
|
||||
type1, i + start_index);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
|
@ -614,7 +611,7 @@ acpi_ns_check_package_elements(struct acpi_predefined_data *data,
|
|||
}
|
||||
|
||||
for (i = 0; i < count2; i++) {
|
||||
status = acpi_ns_check_object_type(data, this_element,
|
||||
status = acpi_ns_check_object_type(info, this_element,
|
||||
type2,
|
||||
(i + count1 + start_index));
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
|
|
@ -130,7 +130,7 @@ static const struct acpi_simple_repair_info acpi_object_repair_info[] = {
|
|||
*
|
||||
* FUNCTION: acpi_ns_simple_repair
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* expected_btypes - Object types expected
|
||||
* package_index - Index of object within parent package (if
|
||||
* applicable - ACPI_NOT_PACKAGE_ELEMENT
|
||||
|
@ -146,7 +146,7 @@ static const struct acpi_simple_repair_info acpi_object_repair_info[] = {
|
|||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_simple_repair(struct acpi_predefined_data *data,
|
||||
acpi_ns_simple_repair(struct acpi_evaluate_info *info,
|
||||
u32 expected_btypes,
|
||||
u32 package_index,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
|
@ -162,12 +162,12 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data,
|
|||
* Special repairs for certain names that are in the repair table.
|
||||
* Check if this name is in the list of repairable names.
|
||||
*/
|
||||
predefined = acpi_ns_match_simple_repair(data->node,
|
||||
data->return_btype,
|
||||
predefined = acpi_ns_match_simple_repair(info->node,
|
||||
info->return_btype,
|
||||
package_index);
|
||||
if (predefined) {
|
||||
if (!return_object) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Missing expected return value"));
|
||||
}
|
||||
|
@ -191,7 +191,7 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data,
|
|||
* Do not perform simple object repair unless the return type is not
|
||||
* expected.
|
||||
*/
|
||||
if (data->return_btype & expected_btypes) {
|
||||
if (info->return_btype & expected_btypes) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
|
@ -211,7 +211,7 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data,
|
|||
*/
|
||||
if (!return_object) {
|
||||
if (expected_btypes && (!(expected_btypes & ACPI_RTYPE_NONE))) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Missing expected return value"));
|
||||
|
||||
|
@ -247,14 +247,14 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data,
|
|||
* for correct contents (expected object type or types).
|
||||
*/
|
||||
status =
|
||||
acpi_ns_wrap_with_package(data, return_object, &new_object);
|
||||
acpi_ns_wrap_with_package(info, return_object, &new_object);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
/*
|
||||
* The original object just had its reference count
|
||||
* incremented for being inserted into the new package.
|
||||
*/
|
||||
*return_object_ptr = new_object; /* New Package object */
|
||||
data->flags |= ACPI_OBJECT_REPAIRED;
|
||||
info->return_flags |= ACPI_OBJECT_REPAIRED;
|
||||
return (AE_OK);
|
||||
}
|
||||
}
|
||||
|
@ -277,7 +277,7 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data,
|
|||
* package object as part of the repair, we don't need to
|
||||
* change the reference count.
|
||||
*/
|
||||
if (!(data->flags & ACPI_OBJECT_WRAPPED)) {
|
||||
if (!(info->return_flags & ACPI_OBJECT_WRAPPED)) {
|
||||
new_object->common.reference_count =
|
||||
return_object->common.reference_count;
|
||||
|
||||
|
@ -288,14 +288,14 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data,
|
|||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||
"%s: Converted %s to expected %s at Package index %u\n",
|
||||
data->pathname,
|
||||
info->full_pathname,
|
||||
acpi_ut_get_object_type_name(return_object),
|
||||
acpi_ut_get_object_type_name(new_object),
|
||||
package_index));
|
||||
} else {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||
"%s: Converted %s to expected %s\n",
|
||||
data->pathname,
|
||||
info->full_pathname,
|
||||
acpi_ut_get_object_type_name(return_object),
|
||||
acpi_ut_get_object_type_name(new_object)));
|
||||
}
|
||||
|
@ -304,7 +304,7 @@ acpi_ns_simple_repair(struct acpi_predefined_data *data,
|
|||
|
||||
acpi_ut_remove_reference(return_object);
|
||||
*return_object_ptr = new_object;
|
||||
data->flags |= ACPI_OBJECT_REPAIRED;
|
||||
info->return_flags |= ACPI_OBJECT_REPAIRED;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
|
@ -359,7 +359,7 @@ static const struct acpi_simple_repair_info *acpi_ns_match_simple_repair(struct
|
|||
*
|
||||
* FUNCTION: acpi_ns_repair_null_element
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* expected_btypes - Object types expected
|
||||
* package_index - Index of object within parent package (if
|
||||
* applicable - ACPI_NOT_PACKAGE_ELEMENT
|
||||
|
@ -374,7 +374,7 @@ static const struct acpi_simple_repair_info *acpi_ns_match_simple_repair(struct
|
|||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_repair_null_element(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_null_element(struct acpi_evaluate_info * info,
|
||||
u32 expected_btypes,
|
||||
u32 package_index,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
|
@ -424,16 +424,16 @@ acpi_ns_repair_null_element(struct acpi_predefined_data *data,
|
|||
/* Set the reference count according to the parent Package object */
|
||||
|
||||
new_object->common.reference_count =
|
||||
data->parent_package->common.reference_count;
|
||||
info->parent_package->common.reference_count;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||
"%s: Converted NULL package element to expected %s at index %u\n",
|
||||
data->pathname,
|
||||
info->full_pathname,
|
||||
acpi_ut_get_object_type_name(new_object),
|
||||
package_index));
|
||||
|
||||
*return_object_ptr = new_object;
|
||||
data->flags |= ACPI_OBJECT_REPAIRED;
|
||||
info->return_flags |= ACPI_OBJECT_REPAIRED;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
|
@ -441,7 +441,7 @@ acpi_ns_repair_null_element(struct acpi_predefined_data *data,
|
|||
*
|
||||
* FUNCTION: acpi_ns_remove_null_elements
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* package_type - An acpi_return_package_types value
|
||||
* obj_desc - A Package object
|
||||
*
|
||||
|
@ -454,7 +454,7 @@ acpi_ns_repair_null_element(struct acpi_predefined_data *data,
|
|||
*****************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ns_remove_null_elements(struct acpi_predefined_data *data,
|
||||
acpi_ns_remove_null_elements(struct acpi_evaluate_info *info,
|
||||
u8 package_type,
|
||||
union acpi_operand_object *obj_desc)
|
||||
{
|
||||
|
@ -480,6 +480,7 @@ acpi_ns_remove_null_elements(struct acpi_predefined_data *data,
|
|||
case ACPI_PTYPE2_MIN:
|
||||
case ACPI_PTYPE2_REV_FIXED:
|
||||
case ACPI_PTYPE2_FIX_VAR:
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -511,7 +512,7 @@ acpi_ns_remove_null_elements(struct acpi_predefined_data *data,
|
|||
if (new_count < count) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||
"%s: Found and removed %u NULL elements\n",
|
||||
data->pathname, (count - new_count)));
|
||||
info->full_pathname, (count - new_count)));
|
||||
|
||||
/* NULL terminate list and update the package count */
|
||||
|
||||
|
@ -524,7 +525,7 @@ acpi_ns_remove_null_elements(struct acpi_predefined_data *data,
|
|||
*
|
||||
* FUNCTION: acpi_ns_wrap_with_package
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* original_object - Pointer to the object to repair.
|
||||
* obj_desc_ptr - The new package object is returned here
|
||||
*
|
||||
|
@ -545,7 +546,7 @@ acpi_ns_remove_null_elements(struct acpi_predefined_data *data,
|
|||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_wrap_with_package(struct acpi_predefined_data *data,
|
||||
acpi_ns_wrap_with_package(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object *original_object,
|
||||
union acpi_operand_object **obj_desc_ptr)
|
||||
{
|
||||
|
@ -566,12 +567,12 @@ acpi_ns_wrap_with_package(struct acpi_predefined_data *data,
|
|||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||
"%s: Wrapped %s with expected Package object\n",
|
||||
data->pathname,
|
||||
info->full_pathname,
|
||||
acpi_ut_get_object_type_name(original_object)));
|
||||
|
||||
/* Return the new object in the object pointer */
|
||||
|
||||
*obj_desc_ptr = pkg_obj_desc;
|
||||
data->flags |= ACPI_OBJECT_REPAIRED | ACPI_OBJECT_WRAPPED;
|
||||
info->return_flags |= ACPI_OBJECT_REPAIRED | ACPI_OBJECT_WRAPPED;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@ ACPI_MODULE_NAME("nsrepair2")
|
|||
* be repaired on a per-name basis.
|
||||
*/
|
||||
typedef
|
||||
acpi_status(*acpi_repair_function) (struct acpi_predefined_data *data,
|
||||
acpi_status(*acpi_repair_function) (struct acpi_evaluate_info * info,
|
||||
union acpi_operand_object
|
||||
**return_object_ptr);
|
||||
|
||||
|
@ -71,45 +71,57 @@ static const struct acpi_repair_info *acpi_ns_match_complex_repair(struct
|
|||
*node);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_ALR(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_ALR(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_CID(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_CID(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_FDE(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_CST(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_HID(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_FDE(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_PSS(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_HID(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_TSS(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_PRT(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_sorted_list(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_PSS(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_TSS(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr);
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_sorted_list(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object *return_object,
|
||||
u32 start_index,
|
||||
u32 expected_count,
|
||||
u32 sort_index,
|
||||
u8 sort_direction, char *sort_key_name);
|
||||
|
||||
static void
|
||||
acpi_ns_sort_list(union acpi_operand_object **elements,
|
||||
u32 count, u32 index, u8 sort_direction);
|
||||
|
||||
/* Values for sort_direction above */
|
||||
|
||||
#define ACPI_SORT_ASCENDING 0
|
||||
#define ACPI_SORT_DESCENDING 1
|
||||
|
||||
static void
|
||||
acpi_ns_remove_element(union acpi_operand_object *obj_desc, u32 index);
|
||||
|
||||
static void
|
||||
acpi_ns_sort_list(union acpi_operand_object **elements,
|
||||
u32 count, u32 index, u8 sort_direction);
|
||||
|
||||
/*
|
||||
* This table contains the names of the predefined methods for which we can
|
||||
* perform more complex repairs.
|
||||
|
@ -118,9 +130,11 @@ acpi_ns_sort_list(union acpi_operand_object **elements,
|
|||
*
|
||||
* _ALR: Sort the list ascending by ambient_illuminance
|
||||
* _CID: Strings: uppercase all, remove any leading asterisk
|
||||
* _CST: Sort the list ascending by C state type
|
||||
* _FDE: Convert Buffer of BYTEs to a Buffer of DWORDs
|
||||
* _GTM: Convert Buffer of BYTEs to a Buffer of DWORDs
|
||||
* _HID: Strings: uppercase all, remove any leading asterisk
|
||||
* _PRT: Fix reversed source_name and source_index
|
||||
* _PSS: Sort the list descending by Power
|
||||
* _TSS: Sort the list descending by Power
|
||||
*
|
||||
|
@ -134,9 +148,11 @@ acpi_ns_sort_list(union acpi_operand_object **elements,
|
|||
static const struct acpi_repair_info acpi_ns_repairable_names[] = {
|
||||
{"_ALR", acpi_ns_repair_ALR},
|
||||
{"_CID", acpi_ns_repair_CID},
|
||||
{"_CST", acpi_ns_repair_CST},
|
||||
{"_FDE", acpi_ns_repair_FDE},
|
||||
{"_GTM", acpi_ns_repair_FDE}, /* _GTM has same repair as _FDE */
|
||||
{"_HID", acpi_ns_repair_HID},
|
||||
{"_PRT", acpi_ns_repair_PRT},
|
||||
{"_PSS", acpi_ns_repair_PSS},
|
||||
{"_TSS", acpi_ns_repair_TSS},
|
||||
{{0, 0, 0, 0}, NULL} /* Table terminator */
|
||||
|
@ -150,7 +166,7 @@ static const struct acpi_repair_info acpi_ns_repairable_names[] = {
|
|||
*
|
||||
* FUNCTION: acpi_ns_complex_repairs
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* node - Namespace node for the method/object
|
||||
* validate_status - Original status of earlier validation
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
|
@ -165,7 +181,7 @@ static const struct acpi_repair_info acpi_ns_repairable_names[] = {
|
|||
*****************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ns_complex_repairs(struct acpi_predefined_data *data,
|
||||
acpi_ns_complex_repairs(struct acpi_evaluate_info *info,
|
||||
struct acpi_namespace_node *node,
|
||||
acpi_status validate_status,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
|
@ -180,7 +196,7 @@ acpi_ns_complex_repairs(struct acpi_predefined_data *data,
|
|||
return (validate_status);
|
||||
}
|
||||
|
||||
status = predefined->repair_function(data, return_object_ptr);
|
||||
status = predefined->repair_function(info, return_object_ptr);
|
||||
return (status);
|
||||
}
|
||||
|
||||
|
@ -219,7 +235,7 @@ static const struct acpi_repair_info *acpi_ns_match_complex_repair(struct
|
|||
*
|
||||
* FUNCTION: acpi_ns_repair_ALR
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
|
@ -231,13 +247,13 @@ static const struct acpi_repair_info *acpi_ns_match_complex_repair(struct
|
|||
*****************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_ALR(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_ALR(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_ns_check_sorted_list(data, return_object, 2, 1,
|
||||
status = acpi_ns_check_sorted_list(info, return_object, 0, 2, 1,
|
||||
ACPI_SORT_ASCENDING,
|
||||
"AmbientIlluminance");
|
||||
|
||||
|
@ -248,7 +264,7 @@ acpi_ns_repair_ALR(struct acpi_predefined_data *data,
|
|||
*
|
||||
* FUNCTION: acpi_ns_repair_FDE
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
|
@ -262,7 +278,7 @@ acpi_ns_repair_ALR(struct acpi_predefined_data *data,
|
|||
*****************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_FDE(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_FDE(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
|
@ -285,8 +301,8 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data,
|
|||
/* We can only repair if we have exactly 5 BYTEs */
|
||||
|
||||
if (return_object->buffer.length != ACPI_FDE_BYTE_BUFFER_SIZE) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname,
|
||||
data->node_flags,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"Incorrect return buffer length %u, expected %u",
|
||||
return_object->buffer.length,
|
||||
ACPI_FDE_DWORD_BUFFER_SIZE));
|
||||
|
@ -316,10 +332,11 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data,
|
|||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||
"%s Expanded Byte Buffer to expected DWord Buffer\n",
|
||||
data->pathname));
|
||||
info->full_pathname));
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
return (AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
|
@ -328,7 +345,7 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data,
|
|||
acpi_ut_remove_reference(return_object);
|
||||
*return_object_ptr = buffer_object;
|
||||
|
||||
data->flags |= ACPI_OBJECT_REPAIRED;
|
||||
info->return_flags |= ACPI_OBJECT_REPAIRED;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
|
@ -336,7 +353,7 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data,
|
|||
*
|
||||
* FUNCTION: acpi_ns_repair_CID
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
|
@ -349,7 +366,7 @@ acpi_ns_repair_FDE(struct acpi_predefined_data *data,
|
|||
*****************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_CID(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_CID(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
acpi_status status;
|
||||
|
@ -362,7 +379,7 @@ acpi_ns_repair_CID(struct acpi_predefined_data *data,
|
|||
/* Check for _CID as a simple string */
|
||||
|
||||
if (return_object->common.type == ACPI_TYPE_STRING) {
|
||||
status = acpi_ns_repair_HID(data, return_object_ptr);
|
||||
status = acpi_ns_repair_HID(info, return_object_ptr);
|
||||
return (status);
|
||||
}
|
||||
|
||||
|
@ -379,7 +396,7 @@ acpi_ns_repair_CID(struct acpi_predefined_data *data,
|
|||
original_element = *element_ptr;
|
||||
original_ref_count = original_element->common.reference_count;
|
||||
|
||||
status = acpi_ns_repair_HID(data, element_ptr);
|
||||
status = acpi_ns_repair_HID(info, element_ptr);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
@ -402,11 +419,97 @@ acpi_ns_repair_CID(struct acpi_predefined_data *data,
|
|||
return (AE_OK);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_repair_CST
|
||||
*
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
* RETURN: Status. AE_OK if object is OK or was repaired successfully
|
||||
*
|
||||
* DESCRIPTION: Repair for the _CST object:
|
||||
* 1. Sort the list ascending by C state type
|
||||
* 2. Ensure type cannot be zero
|
||||
* 3. A sub-package count of zero means _CST is meaningless
|
||||
* 4. Count must match the number of C state sub-packages
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_CST(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
union acpi_operand_object **outer_elements;
|
||||
u32 outer_element_count;
|
||||
union acpi_operand_object *obj_desc;
|
||||
acpi_status status;
|
||||
u8 removing;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_NAME(ns_repair_CST);
|
||||
|
||||
/*
|
||||
* Check if the C-state type values are proportional.
|
||||
*/
|
||||
outer_element_count = return_object->package.count - 1;
|
||||
i = 0;
|
||||
while (i < outer_element_count) {
|
||||
outer_elements = &return_object->package.elements[i + 1];
|
||||
removing = FALSE;
|
||||
|
||||
if ((*outer_elements)->package.count == 0) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"SubPackage[%u] - removing entry due to zero count",
|
||||
i));
|
||||
removing = TRUE;
|
||||
goto remove_element;
|
||||
}
|
||||
|
||||
obj_desc = (*outer_elements)->package.elements[1]; /* Index1 = Type */
|
||||
if ((u32)obj_desc->integer.value == 0) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"SubPackage[%u] - removing entry due to invalid Type(0)",
|
||||
i));
|
||||
removing = TRUE;
|
||||
}
|
||||
|
||||
remove_element:
|
||||
if (removing) {
|
||||
acpi_ns_remove_element(return_object, i + 1);
|
||||
outer_element_count--;
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Update top-level package count, Type "Integer" checked elsewhere */
|
||||
|
||||
obj_desc = return_object->package.elements[0];
|
||||
obj_desc->integer.value = outer_element_count;
|
||||
|
||||
/*
|
||||
* Entries (subpackages) in the _CST Package must be sorted by the
|
||||
* C-state type, in ascending order.
|
||||
*/
|
||||
status = acpi_ns_check_sorted_list(info, return_object, 1, 4, 1,
|
||||
ACPI_SORT_ASCENDING, "C-State Type");
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_repair_HID
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
|
@ -418,7 +521,7 @@ acpi_ns_repair_CID(struct acpi_predefined_data *data,
|
|||
*****************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_HID(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_HID(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
|
@ -435,12 +538,13 @@ acpi_ns_repair_HID(struct acpi_predefined_data *data,
|
|||
}
|
||||
|
||||
if (return_object->string.length == 0) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname, data->node_flags,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"Invalid zero-length _HID or _CID string"));
|
||||
|
||||
/* Return AE_OK anyway, let driver handle it */
|
||||
|
||||
data->flags |= ACPI_OBJECT_REPAIRED;
|
||||
info->return_flags |= ACPI_OBJECT_REPAIRED;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
|
@ -464,7 +568,7 @@ acpi_ns_repair_HID(struct acpi_predefined_data *data,
|
|||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||
"%s: Removed invalid leading asterisk\n",
|
||||
data->pathname));
|
||||
info->full_pathname));
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -486,53 +590,69 @@ acpi_ns_repair_HID(struct acpi_predefined_data *data,
|
|||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_repair_TSS
|
||||
* FUNCTION: acpi_ns_repair_PRT
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
* RETURN: Status. AE_OK if object is OK or was repaired successfully
|
||||
*
|
||||
* DESCRIPTION: Repair for the _TSS object. If necessary, sort the object list
|
||||
* descending by the power dissipation values.
|
||||
* DESCRIPTION: Repair for the _PRT object. If necessary, fix reversed
|
||||
* source_name and source_index field, a common BIOS bug.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_TSS(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_PRT(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *node;
|
||||
union acpi_operand_object *package_object = *return_object_ptr;
|
||||
union acpi_operand_object **top_object_list;
|
||||
union acpi_operand_object **sub_object_list;
|
||||
union acpi_operand_object *obj_desc;
|
||||
u32 element_count;
|
||||
u32 index;
|
||||
|
||||
/*
|
||||
* We can only sort the _TSS return package if there is no _PSS in the
|
||||
* same scope. This is because if _PSS is present, the ACPI specification
|
||||
* dictates that the _TSS Power Dissipation field is to be ignored, and
|
||||
* therefore some BIOSs leave garbage values in the _TSS Power field(s).
|
||||
* In this case, it is best to just return the _TSS package as-is.
|
||||
* (May, 2011)
|
||||
*/
|
||||
status =
|
||||
acpi_ns_get_node(data->node, "^_PSS", ACPI_NS_NO_UPSEARCH, &node);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
return (AE_OK);
|
||||
/* Each element in the _PRT package is a subpackage */
|
||||
|
||||
top_object_list = package_object->package.elements;
|
||||
element_count = package_object->package.count;
|
||||
|
||||
for (index = 0; index < element_count; index++) {
|
||||
sub_object_list = (*top_object_list)->package.elements;
|
||||
|
||||
/*
|
||||
* If the BIOS has erroneously reversed the _PRT source_name (index 2)
|
||||
* and the source_index (index 3), fix it. _PRT is important enough to
|
||||
* workaround this BIOS error. This also provides compatibility with
|
||||
* other ACPI implementations.
|
||||
*/
|
||||
obj_desc = sub_object_list[3];
|
||||
if (!obj_desc || (obj_desc->common.type != ACPI_TYPE_INTEGER)) {
|
||||
sub_object_list[3] = sub_object_list[2];
|
||||
sub_object_list[2] = obj_desc;
|
||||
info->return_flags |= ACPI_OBJECT_REPAIRED;
|
||||
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"PRT[%X]: Fixed reversed SourceName and SourceIndex",
|
||||
index));
|
||||
}
|
||||
|
||||
/* Point to the next union acpi_operand_object in the top level package */
|
||||
|
||||
top_object_list++;
|
||||
}
|
||||
|
||||
status = acpi_ns_check_sorted_list(data, return_object, 5, 1,
|
||||
ACPI_SORT_DESCENDING,
|
||||
"PowerDissipation");
|
||||
|
||||
return (status);
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_repair_PSS
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
|
@ -546,7 +666,7 @@ acpi_ns_repair_TSS(struct acpi_predefined_data *data,
|
|||
*****************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_PSS(struct acpi_predefined_data *data,
|
||||
acpi_ns_repair_PSS(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
|
@ -564,7 +684,7 @@ acpi_ns_repair_PSS(struct acpi_predefined_data *data,
|
|||
* incorrectly sorted, sort it. We sort by cpu_frequency, since this
|
||||
* should be proportional to the power.
|
||||
*/
|
||||
status = acpi_ns_check_sorted_list(data, return_object, 6, 0,
|
||||
status = acpi_ns_check_sorted_list(info, return_object, 0, 6, 0,
|
||||
ACPI_SORT_DESCENDING,
|
||||
"CpuFrequency");
|
||||
if (ACPI_FAILURE(status)) {
|
||||
|
@ -584,8 +704,8 @@ acpi_ns_repair_PSS(struct acpi_predefined_data *data,
|
|||
obj_desc = elements[1]; /* Index1 = power_dissipation */
|
||||
|
||||
if ((u32) obj_desc->integer.value > previous_value) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, data->pathname,
|
||||
data->node_flags,
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname,
|
||||
info->node_flags,
|
||||
"SubPackage[%u,%u] - suspicious power dissipation values",
|
||||
i - 1, i));
|
||||
}
|
||||
|
@ -597,12 +717,57 @@ acpi_ns_repair_PSS(struct acpi_predefined_data *data,
|
|||
return (AE_OK);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_repair_TSS
|
||||
*
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* return_object_ptr - Pointer to the object returned from the
|
||||
* evaluation of a method or object
|
||||
*
|
||||
* RETURN: Status. AE_OK if object is OK or was repaired successfully
|
||||
*
|
||||
* DESCRIPTION: Repair for the _TSS object. If necessary, sort the object list
|
||||
* descending by the power dissipation values.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_repair_TSS(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object **return_object_ptr)
|
||||
{
|
||||
union acpi_operand_object *return_object = *return_object_ptr;
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *node;
|
||||
|
||||
/*
|
||||
* We can only sort the _TSS return package if there is no _PSS in the
|
||||
* same scope. This is because if _PSS is present, the ACPI specification
|
||||
* dictates that the _TSS Power Dissipation field is to be ignored, and
|
||||
* therefore some BIOSs leave garbage values in the _TSS Power field(s).
|
||||
* In this case, it is best to just return the _TSS package as-is.
|
||||
* (May, 2011)
|
||||
*/
|
||||
status = acpi_ns_get_node(info->node, "^_PSS",
|
||||
ACPI_NS_NO_UPSEARCH, &node);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
status = acpi_ns_check_sorted_list(info, return_object, 0, 5, 1,
|
||||
ACPI_SORT_DESCENDING,
|
||||
"PowerDissipation");
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_check_sorted_list
|
||||
*
|
||||
* PARAMETERS: data - Pointer to validation data structure
|
||||
* PARAMETERS: info - Method execution information block
|
||||
* return_object - Pointer to the top-level returned object
|
||||
* start_index - Index of the first sub-package
|
||||
* expected_count - Minimum length of each sub-package
|
||||
* sort_index - Sub-package entry to sort on
|
||||
* sort_direction - Ascending or descending
|
||||
|
@ -617,8 +782,9 @@ acpi_ns_repair_PSS(struct acpi_predefined_data *data,
|
|||
*****************************************************************************/
|
||||
|
||||
static acpi_status
|
||||
acpi_ns_check_sorted_list(struct acpi_predefined_data *data,
|
||||
acpi_ns_check_sorted_list(struct acpi_evaluate_info *info,
|
||||
union acpi_operand_object *return_object,
|
||||
u32 start_index,
|
||||
u32 expected_count,
|
||||
u32 sort_index,
|
||||
u8 sort_direction, char *sort_key_name)
|
||||
|
@ -643,12 +809,14 @@ acpi_ns_check_sorted_list(struct acpi_predefined_data *data,
|
|||
* Any NULL elements should have been removed by earlier call
|
||||
* to acpi_ns_remove_null_elements.
|
||||
*/
|
||||
outer_elements = return_object->package.elements;
|
||||
outer_element_count = return_object->package.count;
|
||||
if (!outer_element_count) {
|
||||
if (!outer_element_count || start_index >= outer_element_count) {
|
||||
return (AE_AML_PACKAGE_LIMIT);
|
||||
}
|
||||
|
||||
outer_elements = &return_object->package.elements[start_index];
|
||||
outer_element_count -= start_index;
|
||||
|
||||
previous_value = 0;
|
||||
if (sort_direction == ACPI_SORT_DESCENDING) {
|
||||
previous_value = ACPI_UINT32_MAX;
|
||||
|
@ -685,15 +853,16 @@ acpi_ns_check_sorted_list(struct acpi_predefined_data *data,
|
|||
(obj_desc->integer.value < previous_value)) ||
|
||||
((sort_direction == ACPI_SORT_DESCENDING) &&
|
||||
(obj_desc->integer.value > previous_value))) {
|
||||
acpi_ns_sort_list(return_object->package.elements,
|
||||
acpi_ns_sort_list(&return_object->package.
|
||||
elements[start_index],
|
||||
outer_element_count, sort_index,
|
||||
sort_direction);
|
||||
|
||||
data->flags |= ACPI_OBJECT_REPAIRED;
|
||||
info->return_flags |= ACPI_OBJECT_REPAIRED;
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||
"%s: Repaired unsorted list - now sorted by %s\n",
|
||||
data->pathname, sort_key_name));
|
||||
info->full_pathname, sort_key_name));
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
|
@ -752,3 +921,52 @@ acpi_ns_sort_list(union acpi_operand_object **elements,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_remove_element
|
||||
*
|
||||
* PARAMETERS: obj_desc - Package object element list
|
||||
* index - Index of element to remove
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Remove the requested element of a package and delete it.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
static void
|
||||
acpi_ns_remove_element(union acpi_operand_object *obj_desc, u32 index)
|
||||
{
|
||||
union acpi_operand_object **source;
|
||||
union acpi_operand_object **dest;
|
||||
u32 count;
|
||||
u32 new_count;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_NAME(ns_remove_element);
|
||||
|
||||
count = obj_desc->package.count;
|
||||
new_count = count - 1;
|
||||
|
||||
source = obj_desc->package.elements;
|
||||
dest = source;
|
||||
|
||||
/* Examine all elements of the package object, remove matched index */
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (i == index) {
|
||||
acpi_ut_remove_reference(*source); /* Remove one ref for being in pkg */
|
||||
acpi_ut_remove_reference(*source);
|
||||
} else {
|
||||
*dest = *source;
|
||||
dest++;
|
||||
}
|
||||
source++;
|
||||
}
|
||||
|
||||
/* NULL terminate list and update the package count */
|
||||
|
||||
*dest = NULL;
|
||||
obj_desc->package.count = new_count;
|
||||
}
|
||||
|
|
|
@ -419,10 +419,12 @@ acpi_ns_externalize_name(u32 internal_name_length,
|
|||
|
||||
switch (internal_name[0]) {
|
||||
case AML_ROOT_PREFIX:
|
||||
|
||||
prefix_length = 1;
|
||||
break;
|
||||
|
||||
case AML_PARENT_PREFIX:
|
||||
|
||||
for (i = 0; i < internal_name_length; i++) {
|
||||
if (ACPI_IS_PARENT_PREFIX(internal_name[i])) {
|
||||
prefix_length = i + 1;
|
||||
|
@ -438,6 +440,7 @@ acpi_ns_externalize_name(u32 internal_name_length,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -187,8 +187,6 @@ acpi_evaluate_object(acpi_handle handle,
|
|||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
info->pathname = pathname;
|
||||
|
||||
/* Convert and validate the device handle */
|
||||
|
||||
info->prefix_node = acpi_ns_validate_handle(handle);
|
||||
|
@ -198,55 +196,23 @@ acpi_evaluate_object(acpi_handle handle,
|
|||
}
|
||||
|
||||
/*
|
||||
* If there are parameters to be passed to a control method, the external
|
||||
* objects must all be converted to internal objects
|
||||
*/
|
||||
if (external_params && external_params->count) {
|
||||
/*
|
||||
* Allocate a new parameter block for the internal objects
|
||||
* Add 1 to count to allow for null terminated internal list
|
||||
*/
|
||||
info->parameters = ACPI_ALLOCATE_ZEROED(((acpi_size)
|
||||
external_params->
|
||||
count +
|
||||
1) * sizeof(void *));
|
||||
if (!info->parameters) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Convert each external object in the list to an internal object */
|
||||
|
||||
for (i = 0; i < external_params->count; i++) {
|
||||
status =
|
||||
acpi_ut_copy_eobject_to_iobject(&external_params->
|
||||
pointer[i],
|
||||
&info->
|
||||
parameters[i]);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
info->parameters[external_params->count] = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Three major cases:
|
||||
* 1) Fully qualified pathname
|
||||
* 2) No handle, not fully qualified pathname (error)
|
||||
* 3) Valid handle
|
||||
* Get the actual namespace node for the target object.
|
||||
* Handles these cases:
|
||||
*
|
||||
* 1) Null node, valid pathname from root (absolute path)
|
||||
* 2) Node and valid pathname (path relative to Node)
|
||||
* 3) Node, Null pathname
|
||||
*/
|
||||
if ((pathname) && (ACPI_IS_ROOT_PREFIX(pathname[0]))) {
|
||||
|
||||
/* The path is fully qualified, just evaluate by name */
|
||||
|
||||
info->prefix_node = NULL;
|
||||
status = acpi_ns_evaluate(info);
|
||||
} else if (!handle) {
|
||||
/*
|
||||
* A handle is optional iff a fully qualified pathname is specified.
|
||||
* Since we've already handled fully qualified names above, this is
|
||||
* an error
|
||||
* an error.
|
||||
*/
|
||||
if (!pathname) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||
|
@ -258,12 +224,144 @@ acpi_evaluate_object(acpi_handle handle,
|
|||
}
|
||||
|
||||
status = AE_BAD_PARAMETER;
|
||||
} else {
|
||||
/* We have a namespace a node and a possible relative path */
|
||||
|
||||
status = acpi_ns_evaluate(info);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
info->relative_pathname = pathname;
|
||||
|
||||
/*
|
||||
* Convert all external objects passed as arguments to the
|
||||
* internal version(s).
|
||||
*/
|
||||
if (external_params && external_params->count) {
|
||||
info->param_count = (u16)external_params->count;
|
||||
|
||||
/* Warn on impossible argument count */
|
||||
|
||||
if (info->param_count > ACPI_METHOD_NUM_ARGS) {
|
||||
ACPI_WARN_PREDEFINED((AE_INFO, pathname,
|
||||
ACPI_WARN_ALWAYS,
|
||||
"Excess arguments (%u) - using only %u",
|
||||
info->param_count,
|
||||
ACPI_METHOD_NUM_ARGS));
|
||||
|
||||
info->param_count = ACPI_METHOD_NUM_ARGS;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate a new parameter block for the internal objects
|
||||
* Add 1 to count to allow for null terminated internal list
|
||||
*/
|
||||
info->parameters = ACPI_ALLOCATE_ZEROED(((acpi_size) info->
|
||||
param_count +
|
||||
1) * sizeof(void *));
|
||||
if (!info->parameters) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Convert each external object in the list to an internal object */
|
||||
|
||||
for (i = 0; i < info->param_count; i++) {
|
||||
status =
|
||||
acpi_ut_copy_eobject_to_iobject(&external_params->
|
||||
pointer[i],
|
||||
&info->
|
||||
parameters[i]);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
info->parameters[info->param_count] = NULL;
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
/*
|
||||
* Begin incoming argument count analysis. Check for too few args
|
||||
* and too many args.
|
||||
*/
|
||||
|
||||
switch (acpi_ns_get_type(info->node)) {
|
||||
case ACPI_TYPE_METHOD:
|
||||
|
||||
/* Check incoming argument count against the method definition */
|
||||
|
||||
if (info->obj_desc->method.param_count > info->param_count) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Insufficient arguments (%u) - %u are required",
|
||||
info->param_count,
|
||||
info->obj_desc->method.param_count));
|
||||
|
||||
status = AE_MISSING_ARGUMENTS;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
else if (info->obj_desc->method.param_count < info->param_count) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"Excess arguments (%u) - only %u are required",
|
||||
info->param_count,
|
||||
info->obj_desc->method.param_count));
|
||||
|
||||
/* Just pass the required number of arguments */
|
||||
|
||||
info->param_count = info->obj_desc->method.param_count;
|
||||
}
|
||||
|
||||
/*
|
||||
* Any incoming external objects to be passed as arguments to the
|
||||
* method must be converted to internal objects
|
||||
*/
|
||||
if (info->param_count) {
|
||||
/*
|
||||
* Allocate a new parameter block for the internal objects
|
||||
* Add 1 to count to allow for null terminated internal list
|
||||
*/
|
||||
info->parameters = ACPI_ALLOCATE_ZEROED(((acpi_size)
|
||||
info->
|
||||
param_count +
|
||||
1) *
|
||||
sizeof(void *));
|
||||
if (!info->parameters) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Convert each external object in the list to an internal object */
|
||||
|
||||
for (i = 0; i < info->param_count; i++) {
|
||||
status =
|
||||
acpi_ut_copy_eobject_to_iobject
|
||||
(&external_params->pointer[i],
|
||||
&info->parameters[i]);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto cleanup;
|
||||
}
|
||||
}
|
||||
|
||||
info->parameters[info->param_count] = NULL;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Warn if arguments passed to an object that is not a method */
|
||||
|
||||
if (info->param_count) {
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"%u arguments were passed to a non-method ACPI object",
|
||||
info->param_count));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* Now we can evaluate the object */
|
||||
|
||||
status = acpi_ns_evaluate(info);
|
||||
|
||||
/*
|
||||
* If we are expecting a return value, and all went well above,
|
||||
* copy the return value to an external object.
|
||||
|
@ -413,6 +511,7 @@ static void acpi_ns_resolve_references(struct acpi_evaluate_info *info)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -629,24 +629,28 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
|
|||
|
||||
switch (opcode) {
|
||||
case AML_BYTE_OP: /* AML_BYTEDATA_ARG */
|
||||
|
||||
buffer_length =
|
||||
ACPI_GET8(parser_state->aml);
|
||||
parser_state->aml += 1;
|
||||
break;
|
||||
|
||||
case AML_WORD_OP: /* AML_WORDDATA_ARG */
|
||||
|
||||
buffer_length =
|
||||
ACPI_GET16(parser_state->aml);
|
||||
parser_state->aml += 2;
|
||||
break;
|
||||
|
||||
case AML_DWORD_OP: /* AML_DWORDATA_ARG */
|
||||
|
||||
buffer_length =
|
||||
ACPI_GET32(parser_state->aml);
|
||||
parser_state->aml += 4;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
buffer_length = 0;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -164,7 +164,6 @@ acpi_ps_get_arguments(struct acpi_walk_state *walk_state,
|
|||
case AML_IF_OP:
|
||||
case AML_ELSE_OP:
|
||||
case AML_WHILE_OP:
|
||||
|
||||
/*
|
||||
* Currently supported module-level opcodes are:
|
||||
* IF/ELSE/WHILE. These appear to be the most common,
|
||||
|
@ -289,6 +288,7 @@ acpi_ps_get_arguments(struct acpi_walk_state *walk_state,
|
|||
default:
|
||||
|
||||
/* No action for all other opcodes */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -402,6 +402,7 @@ acpi_ps_complete_op(struct acpi_walk_state *walk_state,
|
|||
|
||||
switch (status) {
|
||||
case AE_OK:
|
||||
|
||||
break;
|
||||
|
||||
case AE_CTRL_TRANSFER:
|
||||
|
|
|
@ -176,10 +176,10 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
|
|||
|
||||
switch (parent_info->class) {
|
||||
case AML_CLASS_CONTROL:
|
||||
|
||||
break;
|
||||
|
||||
case AML_CLASS_CREATE:
|
||||
|
||||
/*
|
||||
* These opcodes contain term_arg operands. The current
|
||||
* op must be replaced by a placeholder return op
|
||||
|
@ -192,7 +192,6 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
|
|||
break;
|
||||
|
||||
case AML_CLASS_NAMED_OBJECT:
|
||||
|
||||
/*
|
||||
* These opcodes contain term_arg operands. The current
|
||||
* op must be replaced by a placeholder return op
|
||||
|
|
|
@ -308,7 +308,9 @@ union acpi_parse_object *acpi_ps_get_child(union acpi_parse_object *op)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* All others have no children */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -125,7 +125,7 @@ static void acpi_ps_start_trace(struct acpi_evaluate_info *info)
|
|||
}
|
||||
|
||||
if ((!acpi_gbl_trace_method_name) ||
|
||||
(acpi_gbl_trace_method_name != info->resolved_node->name.integer)) {
|
||||
(acpi_gbl_trace_method_name != info->node->name.integer)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
@ -170,7 +170,7 @@ static void acpi_ps_stop_trace(struct acpi_evaluate_info *info)
|
|||
}
|
||||
|
||||
if ((!acpi_gbl_trace_method_name) ||
|
||||
(acpi_gbl_trace_method_name != info->resolved_node->name.integer)) {
|
||||
(acpi_gbl_trace_method_name != info->node->name.integer)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
@ -226,15 +226,14 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info)
|
|||
|
||||
/* Validate the Info and method Node */
|
||||
|
||||
if (!info || !info->resolved_node) {
|
||||
if (!info || !info->node) {
|
||||
return_ACPI_STATUS(AE_NULL_ENTRY);
|
||||
}
|
||||
|
||||
/* Init for new method, wait on concurrency semaphore */
|
||||
|
||||
status =
|
||||
acpi_ds_begin_method_execution(info->resolved_node, info->obj_desc,
|
||||
NULL);
|
||||
acpi_ds_begin_method_execution(info->node, info->obj_desc, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -253,8 +252,7 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info)
|
|||
*/
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
|
||||
"**** Begin Method Parse/Execute [%4.4s] **** Node=%p Obj=%p\n",
|
||||
info->resolved_node->name.ascii, info->resolved_node,
|
||||
info->obj_desc));
|
||||
info->node->name.ascii, info->node, info->obj_desc));
|
||||
|
||||
/* Create and init a Root Node */
|
||||
|
||||
|
@ -275,7 +273,7 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info)
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
status = acpi_ds_init_aml_walk(walk_state, op, info->resolved_node,
|
||||
status = acpi_ds_init_aml_walk(walk_state, op, info->node,
|
||||
info->obj_desc->method.aml_start,
|
||||
info->obj_desc->method.aml_length, info,
|
||||
info->pass_number);
|
||||
|
|
|
@ -352,6 +352,7 @@ acpi_rs_get_aml_length(struct acpi_resource * resource, acpi_size * size_needed)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -539,6 +540,7 @@ acpi_rs_get_list_length(u8 * aml_buffer,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -650,8 +652,9 @@ acpi_rs_get_pci_routing_table_length(union acpi_operand_object *package_object,
|
|||
|
||||
name_found = FALSE;
|
||||
|
||||
for (table_index = 0; table_index < 4 && !name_found;
|
||||
table_index++) {
|
||||
for (table_index = 0;
|
||||
table_index < package_element->package.count
|
||||
&& !name_found; table_index++) {
|
||||
if (*sub_object_list && /* Null object allowed */
|
||||
((ACPI_TYPE_STRING ==
|
||||
(*sub_object_list)->common.type) ||
|
||||
|
|
|
@ -273,17 +273,6 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
|
|||
*/
|
||||
user_prt->length = (sizeof(struct acpi_pci_routing_table) - 4);
|
||||
|
||||
/* Each element of the top-level package must also be a package */
|
||||
|
||||
if ((*top_object_list)->common.type != ACPI_TYPE_PACKAGE) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"(PRT[%u]) Need sub-package, found %s",
|
||||
index,
|
||||
acpi_ut_get_object_type_name
|
||||
(*top_object_list)));
|
||||
return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
|
||||
}
|
||||
|
||||
/* Each sub-package must be of length 4 */
|
||||
|
||||
if ((*top_object_list)->package.count != 4) {
|
||||
|
@ -326,22 +315,6 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
|
|||
|
||||
user_prt->pin = (u32) obj_desc->integer.value;
|
||||
|
||||
/*
|
||||
* If the BIOS has erroneously reversed the _PRT source_name (index 2)
|
||||
* and the source_index (index 3), fix it. _PRT is important enough to
|
||||
* workaround this BIOS error. This also provides compatibility with
|
||||
* other ACPI implementations.
|
||||
*/
|
||||
obj_desc = sub_object_list[3];
|
||||
if (!obj_desc || (obj_desc->common.type != ACPI_TYPE_INTEGER)) {
|
||||
sub_object_list[3] = sub_object_list[2];
|
||||
sub_object_list[2] = obj_desc;
|
||||
|
||||
ACPI_WARNING((AE_INFO,
|
||||
"(PRT[%X].Source) SourceName and SourceIndex are reversed, fixed",
|
||||
index));
|
||||
}
|
||||
|
||||
/*
|
||||
* 3) Third subobject: Dereference the PRT.source_name
|
||||
* The name may be unresolved (slack mode), so allow a null object
|
||||
|
|
|
@ -120,17 +120,20 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
|
|||
/* Strings */
|
||||
|
||||
case ACPI_RSD_LITERAL:
|
||||
|
||||
acpi_rs_out_string(name,
|
||||
ACPI_CAST_PTR(char, table->pointer));
|
||||
break;
|
||||
|
||||
case ACPI_RSD_STRING:
|
||||
|
||||
acpi_rs_out_string(name, ACPI_CAST_PTR(char, target));
|
||||
break;
|
||||
|
||||
/* Data items, 8/16/32/64 bit */
|
||||
|
||||
case ACPI_RSD_UINT8:
|
||||
|
||||
if (table->pointer) {
|
||||
acpi_rs_out_string(name, ACPI_CAST_PTR(char,
|
||||
table->
|
||||
|
@ -142,20 +145,24 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
|
|||
break;
|
||||
|
||||
case ACPI_RSD_UINT16:
|
||||
|
||||
acpi_rs_out_integer16(name, ACPI_GET16(target));
|
||||
break;
|
||||
|
||||
case ACPI_RSD_UINT32:
|
||||
|
||||
acpi_rs_out_integer32(name, ACPI_GET32(target));
|
||||
break;
|
||||
|
||||
case ACPI_RSD_UINT64:
|
||||
|
||||
acpi_rs_out_integer64(name, ACPI_GET64(target));
|
||||
break;
|
||||
|
||||
/* Flags: 1-bit and 2-bit flags supported */
|
||||
|
||||
case ACPI_RSD_1BITFLAG:
|
||||
|
||||
acpi_rs_out_string(name, ACPI_CAST_PTR(char,
|
||||
table->
|
||||
pointer[*target &
|
||||
|
@ -163,6 +170,7 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
|
|||
break;
|
||||
|
||||
case ACPI_RSD_2BITFLAG:
|
||||
|
||||
acpi_rs_out_string(name, ACPI_CAST_PTR(char,
|
||||
table->
|
||||
pointer[*target &
|
||||
|
@ -170,6 +178,7 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
|
|||
break;
|
||||
|
||||
case ACPI_RSD_3BITFLAG:
|
||||
|
||||
acpi_rs_out_string(name, ACPI_CAST_PTR(char,
|
||||
table->
|
||||
pointer[*target &
|
||||
|
@ -258,6 +267,7 @@ acpi_rs_dump_descriptor(void *resource, struct acpi_rsdump_info *table)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
acpi_os_printf("**** Invalid table opcode [%X] ****\n",
|
||||
table->opcode);
|
||||
return;
|
||||
|
|
|
@ -194,7 +194,6 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
|
|||
break;
|
||||
|
||||
case ACPI_RSC_COUNT_GPIO_RES:
|
||||
|
||||
/*
|
||||
* Vendor data is optional (length/offset may both be zero)
|
||||
* Examine vendor data length field first
|
||||
|
@ -410,12 +409,14 @@ acpi_rs_convert_aml_to_resource(struct acpi_resource *resource,
|
|||
*/
|
||||
switch (info->resource_offset) {
|
||||
case ACPI_RSC_COMPARE_AML_LENGTH:
|
||||
|
||||
if (aml_resource_length != info->value) {
|
||||
goto exit;
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_RSC_COMPARE_VALUE:
|
||||
|
||||
if (ACPI_GET8(source) != info->value) {
|
||||
goto exit;
|
||||
}
|
||||
|
|
|
@ -147,6 +147,7 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type)
|
|||
case ACPI_RSC_MOVE_GPIO_RES:
|
||||
case ACPI_RSC_MOVE_SERIAL_VEN:
|
||||
case ACPI_RSC_MOVE_SERIAL_RES:
|
||||
|
||||
ACPI_MEMCPY(destination, source, item_count);
|
||||
return;
|
||||
|
||||
|
@ -157,21 +158,25 @@ acpi_rs_move_data(void *destination, void *source, u16 item_count, u8 move_type)
|
|||
*/
|
||||
case ACPI_RSC_MOVE16:
|
||||
case ACPI_RSC_MOVE_GPIO_PIN:
|
||||
|
||||
ACPI_MOVE_16_TO_16(&ACPI_CAST_PTR(u16, destination)[i],
|
||||
&ACPI_CAST_PTR(u16, source)[i]);
|
||||
break;
|
||||
|
||||
case ACPI_RSC_MOVE32:
|
||||
|
||||
ACPI_MOVE_32_TO_32(&ACPI_CAST_PTR(u32, destination)[i],
|
||||
&ACPI_CAST_PTR(u32, source)[i]);
|
||||
break;
|
||||
|
||||
case ACPI_RSC_MOVE64:
|
||||
|
||||
ACPI_MOVE_64_TO_64(&ACPI_CAST_PTR(u64, destination)[i],
|
||||
&ACPI_CAST_PTR(u64, source)[i]);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -736,7 +741,7 @@ acpi_rs_set_srs_method_data(struct acpi_namespace_node *node,
|
|||
}
|
||||
|
||||
info->prefix_node = node;
|
||||
info->pathname = METHOD_NAME__SRS;
|
||||
info->relative_pathname = METHOD_NAME__SRS;
|
||||
info->parameters = args;
|
||||
info->flags = ACPI_IGNORE_RETURN_VALUE;
|
||||
|
||||
|
|
|
@ -402,6 +402,7 @@ acpi_resource_to_address64(struct acpi_resource *resource,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
|
|
|
@ -141,8 +141,7 @@ acpi_tb_add_table(struct acpi_table_desc *table_desc, u32 *table_index)
|
|||
ACPI_BIOS_ERROR((AE_INFO,
|
||||
"Table has invalid signature [%4.4s] (0x%8.8X), "
|
||||
"must be SSDT or OEMx",
|
||||
acpi_ut_valid_acpi_name(*(u32 *)table_desc->
|
||||
pointer->
|
||||
acpi_ut_valid_acpi_name(table_desc->pointer->
|
||||
signature) ?
|
||||
table_desc->pointer->signature : "????",
|
||||
*(u32 *)table_desc->pointer->signature));
|
||||
|
@ -471,15 +470,19 @@ void acpi_tb_delete_table(struct acpi_table_desc *table_desc)
|
|||
}
|
||||
switch (table_desc->flags & ACPI_TABLE_ORIGIN_MASK) {
|
||||
case ACPI_TABLE_ORIGIN_MAPPED:
|
||||
|
||||
acpi_os_unmap_memory(table_desc->pointer, table_desc->length);
|
||||
break;
|
||||
|
||||
case ACPI_TABLE_ORIGIN_ALLOCATED:
|
||||
|
||||
ACPI_FREE(table_desc->pointer);
|
||||
break;
|
||||
|
||||
/* Not mapped or allocated, there is nothing we can do */
|
||||
|
||||
default:
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,237 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Module Name: tbprint - Table output utilities
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2013, 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 "actables.h"
|
||||
|
||||
#define _COMPONENT ACPI_TABLES
|
||||
ACPI_MODULE_NAME("tbprint")
|
||||
|
||||
/* Local prototypes */
|
||||
static void acpi_tb_fix_string(char *string, acpi_size length);
|
||||
|
||||
static void
|
||||
acpi_tb_cleanup_table_header(struct acpi_table_header *out_header,
|
||||
struct acpi_table_header *header);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_fix_string
|
||||
*
|
||||
* PARAMETERS: string - String to be repaired
|
||||
* length - Maximum length
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Replace every non-printable or non-ascii byte in the string
|
||||
* with a question mark '?'.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void acpi_tb_fix_string(char *string, acpi_size length)
|
||||
{
|
||||
|
||||
while (length && *string) {
|
||||
if (!ACPI_IS_PRINT(*string)) {
|
||||
*string = '?';
|
||||
}
|
||||
string++;
|
||||
length--;
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_cleanup_table_header
|
||||
*
|
||||
* PARAMETERS: out_header - Where the cleaned header is returned
|
||||
* header - Input ACPI table header
|
||||
*
|
||||
* RETURN: Returns the cleaned header in out_header
|
||||
*
|
||||
* DESCRIPTION: Copy the table header and ensure that all "string" fields in
|
||||
* the header consist of printable characters.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void
|
||||
acpi_tb_cleanup_table_header(struct acpi_table_header *out_header,
|
||||
struct acpi_table_header *header)
|
||||
{
|
||||
|
||||
ACPI_MEMCPY(out_header, header, sizeof(struct acpi_table_header));
|
||||
|
||||
acpi_tb_fix_string(out_header->signature, ACPI_NAME_SIZE);
|
||||
acpi_tb_fix_string(out_header->oem_id, ACPI_OEM_ID_SIZE);
|
||||
acpi_tb_fix_string(out_header->oem_table_id, ACPI_OEM_TABLE_ID_SIZE);
|
||||
acpi_tb_fix_string(out_header->asl_compiler_id, ACPI_NAME_SIZE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_print_table_header
|
||||
*
|
||||
* PARAMETERS: address - Table physical address
|
||||
* header - Table header
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_tb_print_table_header(acpi_physical_address address,
|
||||
struct acpi_table_header *header)
|
||||
{
|
||||
struct acpi_table_header local_header;
|
||||
|
||||
/*
|
||||
* The reason that the Address is cast to a void pointer is so that we
|
||||
* can use %p which will work properly on both 32-bit and 64-bit hosts.
|
||||
*/
|
||||
if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_FACS)) {
|
||||
|
||||
/* FACS only has signature and length fields */
|
||||
|
||||
ACPI_INFO((AE_INFO, "%4.4s %p %05X",
|
||||
header->signature, ACPI_CAST_PTR(void, address),
|
||||
header->length));
|
||||
} else if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_RSDP)) {
|
||||
|
||||
/* RSDP has no common fields */
|
||||
|
||||
ACPI_MEMCPY(local_header.oem_id,
|
||||
ACPI_CAST_PTR(struct acpi_table_rsdp,
|
||||
header)->oem_id, ACPI_OEM_ID_SIZE);
|
||||
acpi_tb_fix_string(local_header.oem_id, ACPI_OEM_ID_SIZE);
|
||||
|
||||
ACPI_INFO((AE_INFO, "RSDP %p %05X (v%.2d %6.6s)",
|
||||
ACPI_CAST_PTR(void, address),
|
||||
(ACPI_CAST_PTR(struct acpi_table_rsdp, header)->
|
||||
revision >
|
||||
0) ? ACPI_CAST_PTR(struct acpi_table_rsdp,
|
||||
header)->length : 20,
|
||||
ACPI_CAST_PTR(struct acpi_table_rsdp,
|
||||
header)->revision,
|
||||
local_header.oem_id));
|
||||
} else {
|
||||
/* Standard ACPI table with full common header */
|
||||
|
||||
acpi_tb_cleanup_table_header(&local_header, header);
|
||||
|
||||
ACPI_INFO((AE_INFO,
|
||||
"%4.4s %p %05X (v%.2d %6.6s %8.8s %08X %4.4s %08X)",
|
||||
local_header.signature, ACPI_CAST_PTR(void, address),
|
||||
local_header.length, local_header.revision,
|
||||
local_header.oem_id, local_header.oem_table_id,
|
||||
local_header.oem_revision,
|
||||
local_header.asl_compiler_id,
|
||||
local_header.asl_compiler_revision));
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_validate_checksum
|
||||
*
|
||||
* PARAMETERS: table - ACPI table to verify
|
||||
* length - Length of entire table
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Verifies that the table checksums to zero. Optionally returns
|
||||
* exception on bad checksum.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length)
|
||||
{
|
||||
u8 checksum;
|
||||
|
||||
/* Compute the checksum on the table */
|
||||
|
||||
checksum = acpi_tb_checksum(ACPI_CAST_PTR(u8, table), length);
|
||||
|
||||
/* Checksum ok? (should be zero) */
|
||||
|
||||
if (checksum) {
|
||||
ACPI_BIOS_WARNING((AE_INFO,
|
||||
"Incorrect checksum in table [%4.4s] - 0x%2.2X, "
|
||||
"should be 0x%2.2X",
|
||||
table->signature, table->checksum,
|
||||
(u8)(table->checksum - checksum)));
|
||||
|
||||
#if (ACPI_CHECKSUM_ABORT)
|
||||
return (AE_BAD_CHECKSUM);
|
||||
#endif
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_checksum
|
||||
*
|
||||
* PARAMETERS: buffer - Pointer to memory region to be checked
|
||||
* length - Length of this memory region
|
||||
*
|
||||
* RETURN: Checksum (u8)
|
||||
*
|
||||
* DESCRIPTION: Calculates circular checksum of memory region.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_tb_checksum(u8 *buffer, u32 length)
|
||||
{
|
||||
u8 sum = 0;
|
||||
u8 *end = buffer + length;
|
||||
|
||||
while (buffer < end) {
|
||||
sum = (u8)(sum + *(buffer++));
|
||||
}
|
||||
|
||||
return (sum);
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Module Name: tbutils - table utilities
|
||||
* Module Name: tbutils - ACPI Table utilities
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
@ -49,12 +49,6 @@
|
|||
ACPI_MODULE_NAME("tbutils")
|
||||
|
||||
/* Local prototypes */
|
||||
static void acpi_tb_fix_string(char *string, acpi_size length);
|
||||
|
||||
static void
|
||||
acpi_tb_cleanup_table_header(struct acpi_table_header *out_header,
|
||||
struct acpi_table_header *header);
|
||||
|
||||
static acpi_physical_address
|
||||
acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size);
|
||||
|
||||
|
@ -174,189 +168,6 @@ u8 acpi_tb_tables_loaded(void)
|
|||
return (FALSE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_fix_string
|
||||
*
|
||||
* PARAMETERS: string - String to be repaired
|
||||
* length - Maximum length
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Replace every non-printable or non-ascii byte in the string
|
||||
* with a question mark '?'.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void acpi_tb_fix_string(char *string, acpi_size length)
|
||||
{
|
||||
|
||||
while (length && *string) {
|
||||
if (!ACPI_IS_PRINT(*string)) {
|
||||
*string = '?';
|
||||
}
|
||||
string++;
|
||||
length--;
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_cleanup_table_header
|
||||
*
|
||||
* PARAMETERS: out_header - Where the cleaned header is returned
|
||||
* header - Input ACPI table header
|
||||
*
|
||||
* RETURN: Returns the cleaned header in out_header
|
||||
*
|
||||
* DESCRIPTION: Copy the table header and ensure that all "string" fields in
|
||||
* the header consist of printable characters.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void
|
||||
acpi_tb_cleanup_table_header(struct acpi_table_header *out_header,
|
||||
struct acpi_table_header *header)
|
||||
{
|
||||
|
||||
ACPI_MEMCPY(out_header, header, sizeof(struct acpi_table_header));
|
||||
|
||||
acpi_tb_fix_string(out_header->signature, ACPI_NAME_SIZE);
|
||||
acpi_tb_fix_string(out_header->oem_id, ACPI_OEM_ID_SIZE);
|
||||
acpi_tb_fix_string(out_header->oem_table_id, ACPI_OEM_TABLE_ID_SIZE);
|
||||
acpi_tb_fix_string(out_header->asl_compiler_id, ACPI_NAME_SIZE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_print_table_header
|
||||
*
|
||||
* PARAMETERS: address - Table physical address
|
||||
* header - Table header
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_tb_print_table_header(acpi_physical_address address,
|
||||
struct acpi_table_header *header)
|
||||
{
|
||||
struct acpi_table_header local_header;
|
||||
|
||||
/*
|
||||
* The reason that the Address is cast to a void pointer is so that we
|
||||
* can use %p which will work properly on both 32-bit and 64-bit hosts.
|
||||
*/
|
||||
if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_FACS)) {
|
||||
|
||||
/* FACS only has signature and length fields */
|
||||
|
||||
ACPI_INFO((AE_INFO, "%4.4s %p %05X",
|
||||
header->signature, ACPI_CAST_PTR(void, address),
|
||||
header->length));
|
||||
} else if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_RSDP)) {
|
||||
|
||||
/* RSDP has no common fields */
|
||||
|
||||
ACPI_MEMCPY(local_header.oem_id,
|
||||
ACPI_CAST_PTR(struct acpi_table_rsdp,
|
||||
header)->oem_id, ACPI_OEM_ID_SIZE);
|
||||
acpi_tb_fix_string(local_header.oem_id, ACPI_OEM_ID_SIZE);
|
||||
|
||||
ACPI_INFO((AE_INFO, "RSDP %p %05X (v%.2d %6.6s)",
|
||||
ACPI_CAST_PTR (void, address),
|
||||
(ACPI_CAST_PTR(struct acpi_table_rsdp, header)->
|
||||
revision >
|
||||
0) ? ACPI_CAST_PTR(struct acpi_table_rsdp,
|
||||
header)->length : 20,
|
||||
ACPI_CAST_PTR(struct acpi_table_rsdp,
|
||||
header)->revision,
|
||||
local_header.oem_id));
|
||||
} else {
|
||||
/* Standard ACPI table with full common header */
|
||||
|
||||
acpi_tb_cleanup_table_header(&local_header, header);
|
||||
|
||||
ACPI_INFO((AE_INFO,
|
||||
"%4.4s %p %05X (v%.2d %6.6s %8.8s %08X %4.4s %08X)",
|
||||
local_header.signature, ACPI_CAST_PTR(void, address),
|
||||
local_header.length, local_header.revision,
|
||||
local_header.oem_id, local_header.oem_table_id,
|
||||
local_header.oem_revision,
|
||||
local_header.asl_compiler_id,
|
||||
local_header.asl_compiler_revision));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_validate_checksum
|
||||
*
|
||||
* PARAMETERS: table - ACPI table to verify
|
||||
* length - Length of entire table
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Verifies that the table checksums to zero. Optionally returns
|
||||
* exception on bad checksum.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length)
|
||||
{
|
||||
u8 checksum;
|
||||
|
||||
/* Compute the checksum on the table */
|
||||
|
||||
checksum = acpi_tb_checksum(ACPI_CAST_PTR(u8, table), length);
|
||||
|
||||
/* Checksum ok? (should be zero) */
|
||||
|
||||
if (checksum) {
|
||||
ACPI_BIOS_WARNING((AE_INFO,
|
||||
"Incorrect checksum in table [%4.4s] - 0x%2.2X, "
|
||||
"should be 0x%2.2X",
|
||||
table->signature, table->checksum,
|
||||
(u8)(table->checksum - checksum)));
|
||||
|
||||
#if (ACPI_CHECKSUM_ABORT)
|
||||
|
||||
return (AE_BAD_CHECKSUM);
|
||||
#endif
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_checksum
|
||||
*
|
||||
* PARAMETERS: buffer - Pointer to memory region to be checked
|
||||
* length - Length of this memory region
|
||||
*
|
||||
* RETURN: Checksum (u8)
|
||||
*
|
||||
* DESCRIPTION: Calculates circular checksum of memory region.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_tb_checksum(u8 *buffer, u32 length)
|
||||
{
|
||||
u8 sum = 0;
|
||||
u8 *end = buffer + length;
|
||||
|
||||
while (buffer < end) {
|
||||
sum = (u8) (sum + *(buffer++));
|
||||
}
|
||||
|
||||
return (sum);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_tb_check_dsdt_header
|
||||
|
|
|
@ -53,8 +53,6 @@ ACPI_MODULE_NAME("tbxfload")
|
|||
/* Local prototypes */
|
||||
static acpi_status acpi_tb_load_namespace(void);
|
||||
|
||||
static int no_auto_ssdt;
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_load_tables
|
||||
|
@ -180,8 +178,16 @@ static acpi_status acpi_tb_load_namespace(void)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (no_auto_ssdt) {
|
||||
printk(KERN_WARNING "ACPI: SSDT ignored due to \"acpi_no_auto_ssdt\"\n");
|
||||
/*
|
||||
* Optionally do not load any SSDTs from the RSDT/XSDT. This can
|
||||
* be useful for debugging ACPI problems on some machines.
|
||||
*/
|
||||
if (acpi_gbl_disable_ssdt_table_load) {
|
||||
ACPI_INFO((AE_INFO, "Ignoring %4.4s at %p",
|
||||
acpi_gbl_root_table_list.tables[i].signature.
|
||||
ascii, ACPI_CAST_PTR(void,
|
||||
acpi_gbl_root_table_list.
|
||||
tables[i].address)));
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -376,14 +382,3 @@ acpi_status acpi_unload_parent_table(acpi_handle object)
|
|||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_unload_parent_table)
|
||||
|
||||
static int __init acpi_no_auto_ssdt_setup(char *s) {
|
||||
|
||||
printk(KERN_NOTICE "ACPI: SSDT auto-load disabled\n");
|
||||
|
||||
no_auto_ssdt = 1;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("acpi_no_auto_ssdt", acpi_no_auto_ssdt_setup);
|
||||
|
|
|
@ -0,0 +1,201 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Module Name: utbuffer - Buffer dump routines
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2013, 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"
|
||||
|
||||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utbuffer")
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_dump_buffer
|
||||
*
|
||||
* PARAMETERS: buffer - Buffer to dump
|
||||
* count - Amount to dump, in bytes
|
||||
* display - BYTE, WORD, DWORD, or QWORD display:
|
||||
* DB_BYTE_DISPLAY
|
||||
* DB_WORD_DISPLAY
|
||||
* DB_DWORD_DISPLAY
|
||||
* DB_QWORD_DISPLAY
|
||||
* base_offset - Beginning buffer offset (display only)
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Generic dump buffer in both hex and ascii.
|
||||
*
|
||||
******************************************************************************/
|
||||
void acpi_ut_dump_buffer(u8 *buffer, u32 count, u32 display, u32 base_offset)
|
||||
{
|
||||
u32 i = 0;
|
||||
u32 j;
|
||||
u32 temp32;
|
||||
u8 buf_char;
|
||||
|
||||
if (!buffer) {
|
||||
acpi_os_printf("Null Buffer Pointer in DumpBuffer!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if ((count < 4) || (count & 0x01)) {
|
||||
display = DB_BYTE_DISPLAY;
|
||||
}
|
||||
|
||||
/* Nasty little dump buffer routine! */
|
||||
|
||||
while (i < count) {
|
||||
|
||||
/* Print current offset */
|
||||
|
||||
acpi_os_printf("%6.4X: ", (base_offset + i));
|
||||
|
||||
/* Print 16 hex chars */
|
||||
|
||||
for (j = 0; j < 16;) {
|
||||
if (i + j >= count) {
|
||||
|
||||
/* Dump fill spaces */
|
||||
|
||||
acpi_os_printf("%*s", ((display * 2) + 1), " ");
|
||||
j += display;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (display) {
|
||||
case DB_BYTE_DISPLAY:
|
||||
default: /* Default is BYTE display */
|
||||
|
||||
acpi_os_printf("%02X ",
|
||||
buffer[(acpi_size) i + j]);
|
||||
break;
|
||||
|
||||
case DB_WORD_DISPLAY:
|
||||
|
||||
ACPI_MOVE_16_TO_32(&temp32,
|
||||
&buffer[(acpi_size) i + j]);
|
||||
acpi_os_printf("%04X ", temp32);
|
||||
break;
|
||||
|
||||
case DB_DWORD_DISPLAY:
|
||||
|
||||
ACPI_MOVE_32_TO_32(&temp32,
|
||||
&buffer[(acpi_size) i + j]);
|
||||
acpi_os_printf("%08X ", temp32);
|
||||
break;
|
||||
|
||||
case DB_QWORD_DISPLAY:
|
||||
|
||||
ACPI_MOVE_32_TO_32(&temp32,
|
||||
&buffer[(acpi_size) i + j]);
|
||||
acpi_os_printf("%08X", temp32);
|
||||
|
||||
ACPI_MOVE_32_TO_32(&temp32,
|
||||
&buffer[(acpi_size) i + j +
|
||||
4]);
|
||||
acpi_os_printf("%08X ", temp32);
|
||||
break;
|
||||
}
|
||||
|
||||
j += display;
|
||||
}
|
||||
|
||||
/*
|
||||
* Print the ASCII equivalent characters but watch out for the bad
|
||||
* unprintable ones (printable chars are 0x20 through 0x7E)
|
||||
*/
|
||||
acpi_os_printf(" ");
|
||||
for (j = 0; j < 16; j++) {
|
||||
if (i + j >= count) {
|
||||
acpi_os_printf("\n");
|
||||
return;
|
||||
}
|
||||
|
||||
buf_char = buffer[(acpi_size) i + j];
|
||||
if (ACPI_IS_PRINT(buf_char)) {
|
||||
acpi_os_printf("%c", buf_char);
|
||||
} else {
|
||||
acpi_os_printf(".");
|
||||
}
|
||||
}
|
||||
|
||||
/* Done with that line. */
|
||||
|
||||
acpi_os_printf("\n");
|
||||
i += 16;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_debug_dump_buffer
|
||||
*
|
||||
* PARAMETERS: buffer - Buffer to dump
|
||||
* count - Amount to dump, in bytes
|
||||
* display - BYTE, WORD, DWORD, or QWORD display:
|
||||
* DB_BYTE_DISPLAY
|
||||
* DB_WORD_DISPLAY
|
||||
* DB_DWORD_DISPLAY
|
||||
* DB_QWORD_DISPLAY
|
||||
* component_ID - Caller's component ID
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Generic dump buffer in both hex and ascii.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ut_debug_dump_buffer(u8 *buffer, u32 count, u32 display, u32 component_id)
|
||||
{
|
||||
|
||||
/* Only dump the buffer if tracing is enabled */
|
||||
|
||||
if (!((ACPI_LV_TABLES & acpi_dbg_level) &&
|
||||
(component_id & acpi_dbg_layer))) {
|
||||
return;
|
||||
}
|
||||
|
||||
acpi_ut_dump_buffer(buffer, count, display, 0);
|
||||
}
|
|
@ -178,7 +178,6 @@ acpi_ut_copy_isimple_to_esimple(union acpi_operand_object *internal_object,
|
|||
|
||||
switch (internal_object->reference.class) {
|
||||
case ACPI_REFCLASS_NAME:
|
||||
|
||||
/*
|
||||
* For namepath, return the object handle ("reference")
|
||||
* We are referring to the namespace node
|
||||
|
@ -264,7 +263,6 @@ acpi_ut_copy_ielement_to_eelement(u8 object_type,
|
|||
|
||||
switch (object_type) {
|
||||
case ACPI_COPY_TYPE_SIMPLE:
|
||||
|
||||
/*
|
||||
* This is a simple or null object
|
||||
*/
|
||||
|
@ -278,7 +276,6 @@ acpi_ut_copy_ielement_to_eelement(u8 object_type,
|
|||
break;
|
||||
|
||||
case ACPI_COPY_TYPE_PACKAGE:
|
||||
|
||||
/*
|
||||
* Build the package object
|
||||
*/
|
||||
|
@ -304,6 +301,7 @@ acpi_ut_copy_ielement_to_eelement(u8 object_type,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
|
@ -481,6 +479,7 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object,
|
|||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
default:
|
||||
|
||||
/* All other types are not supported */
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
|
@ -544,7 +543,9 @@ acpi_ut_copy_esimple_to_isimple(union acpi_object *external_object,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Other types can't get here */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -800,7 +801,9 @@ acpi_ut_copy_simple_object(union acpi_operand_object *source_desc,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Nothing to do for other simple objects */
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -868,7 +871,6 @@ acpi_ut_copy_ielement_to_ielement(u8 object_type,
|
|||
break;
|
||||
|
||||
case ACPI_COPY_TYPE_PACKAGE:
|
||||
|
||||
/*
|
||||
* This object is a package - go down another nesting level
|
||||
* Create and build the package object
|
||||
|
@ -891,6 +893,7 @@ acpi_ut_copy_ielement_to_ielement(u8 object_type,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Module Name: utdebug - Debug print routines
|
||||
* Module Name: utdebug - Debug print/trace routines
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
|
@ -543,149 +543,3 @@ acpi_ut_ptr_exit(u32 line_number,
|
|||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_dump_buffer
|
||||
*
|
||||
* PARAMETERS: buffer - Buffer to dump
|
||||
* count - Amount to dump, in bytes
|
||||
* display - BYTE, WORD, DWORD, or QWORD display
|
||||
* offset - Beginning buffer offset (display only)
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Generic dump buffer in both hex and ascii.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_dump_buffer(u8 *buffer, u32 count, u32 display, u32 base_offset)
|
||||
{
|
||||
u32 i = 0;
|
||||
u32 j;
|
||||
u32 temp32;
|
||||
u8 buf_char;
|
||||
|
||||
if (!buffer) {
|
||||
acpi_os_printf("Null Buffer Pointer in DumpBuffer!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if ((count < 4) || (count & 0x01)) {
|
||||
display = DB_BYTE_DISPLAY;
|
||||
}
|
||||
|
||||
/* Nasty little dump buffer routine! */
|
||||
|
||||
while (i < count) {
|
||||
|
||||
/* Print current offset */
|
||||
|
||||
acpi_os_printf("%6.4X: ", (base_offset + i));
|
||||
|
||||
/* Print 16 hex chars */
|
||||
|
||||
for (j = 0; j < 16;) {
|
||||
if (i + j >= count) {
|
||||
|
||||
/* Dump fill spaces */
|
||||
|
||||
acpi_os_printf("%*s", ((display * 2) + 1), " ");
|
||||
j += display;
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (display) {
|
||||
case DB_BYTE_DISPLAY:
|
||||
default: /* Default is BYTE display */
|
||||
|
||||
acpi_os_printf("%02X ",
|
||||
buffer[(acpi_size) i + j]);
|
||||
break;
|
||||
|
||||
case DB_WORD_DISPLAY:
|
||||
|
||||
ACPI_MOVE_16_TO_32(&temp32,
|
||||
&buffer[(acpi_size) i + j]);
|
||||
acpi_os_printf("%04X ", temp32);
|
||||
break;
|
||||
|
||||
case DB_DWORD_DISPLAY:
|
||||
|
||||
ACPI_MOVE_32_TO_32(&temp32,
|
||||
&buffer[(acpi_size) i + j]);
|
||||
acpi_os_printf("%08X ", temp32);
|
||||
break;
|
||||
|
||||
case DB_QWORD_DISPLAY:
|
||||
|
||||
ACPI_MOVE_32_TO_32(&temp32,
|
||||
&buffer[(acpi_size) i + j]);
|
||||
acpi_os_printf("%08X", temp32);
|
||||
|
||||
ACPI_MOVE_32_TO_32(&temp32,
|
||||
&buffer[(acpi_size) i + j +
|
||||
4]);
|
||||
acpi_os_printf("%08X ", temp32);
|
||||
break;
|
||||
}
|
||||
|
||||
j += display;
|
||||
}
|
||||
|
||||
/*
|
||||
* Print the ASCII equivalent characters but watch out for the bad
|
||||
* unprintable ones (printable chars are 0x20 through 0x7E)
|
||||
*/
|
||||
acpi_os_printf(" ");
|
||||
for (j = 0; j < 16; j++) {
|
||||
if (i + j >= count) {
|
||||
acpi_os_printf("\n");
|
||||
return;
|
||||
}
|
||||
|
||||
buf_char = buffer[(acpi_size) i + j];
|
||||
if (ACPI_IS_PRINT(buf_char)) {
|
||||
acpi_os_printf("%c", buf_char);
|
||||
} else {
|
||||
acpi_os_printf(".");
|
||||
}
|
||||
}
|
||||
|
||||
/* Done with that line. */
|
||||
|
||||
acpi_os_printf("\n");
|
||||
i += 16;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_debug_dump_buffer
|
||||
*
|
||||
* PARAMETERS: buffer - Buffer to dump
|
||||
* count - Amount to dump, in bytes
|
||||
* display - BYTE, WORD, DWORD, or QWORD display
|
||||
* component_ID - Caller's component ID
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Generic dump buffer in both hex and ascii.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ut_debug_dump_buffer(u8 *buffer, u32 count, u32 display, u32 component_id)
|
||||
{
|
||||
|
||||
/* Only dump the buffer if tracing is enabled */
|
||||
|
||||
if (!((ACPI_LV_TABLES & acpi_dbg_level) &&
|
||||
(component_id & acpi_dbg_layer))) {
|
||||
return;
|
||||
}
|
||||
|
||||
acpi_ut_dump_buffer(buffer, count, display, 0);
|
||||
}
|
||||
|
|
|
@ -303,6 +303,7 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -508,7 +509,6 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
|
|||
case ACPI_TYPE_PROCESSOR:
|
||||
case ACPI_TYPE_POWER:
|
||||
case ACPI_TYPE_THERMAL:
|
||||
|
||||
/*
|
||||
* Update the notify objects for these types (if present)
|
||||
* Two lists, system and device notify handlers.
|
||||
|
@ -623,6 +623,7 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
|
|||
|
||||
case ACPI_TYPE_REGION:
|
||||
default:
|
||||
|
||||
break; /* No subobjects for all other types */
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,289 @@
|
|||
/*******************************************************************************
|
||||
*
|
||||
* Module Name: uterror - Various internal error/warning output functions
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2013, 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"
|
||||
|
||||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("uterror")
|
||||
|
||||
/*
|
||||
* This module contains internal error functions that may
|
||||
* be configured out.
|
||||
*/
|
||||
#if !defined (ACPI_NO_ERROR_MESSAGES)
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_predefined_warning
|
||||
*
|
||||
* PARAMETERS: module_name - Caller's module name (for error output)
|
||||
* line_number - Caller's line number (for error output)
|
||||
* pathname - Full pathname to the node
|
||||
* node_flags - From Namespace node for the method/object
|
||||
* format - Printf format string + additional args
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Warnings for the predefined validation module. Messages are
|
||||
* only emitted the first time a problem with a particular
|
||||
* method/object is detected. This prevents a flood of error
|
||||
* messages for methods that are repeatedly evaluated.
|
||||
*
|
||||
******************************************************************************/
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_ut_predefined_warning(const char *module_name,
|
||||
u32 line_number,
|
||||
char *pathname,
|
||||
u8 node_flags, const char *format, ...)
|
||||
{
|
||||
va_list arg_list;
|
||||
|
||||
/*
|
||||
* Warning messages for this method/object will be disabled after the
|
||||
* first time a validation fails or an object is successfully repaired.
|
||||
*/
|
||||
if (node_flags & ANOBJ_EVALUATED) {
|
||||
return;
|
||||
}
|
||||
|
||||
acpi_os_printf(ACPI_MSG_WARNING "%s: ", pathname);
|
||||
|
||||
va_start(arg_list, format);
|
||||
acpi_os_vprintf(format, arg_list);
|
||||
ACPI_MSG_SUFFIX;
|
||||
va_end(arg_list);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_predefined_info
|
||||
*
|
||||
* PARAMETERS: module_name - Caller's module name (for error output)
|
||||
* line_number - Caller's line number (for error output)
|
||||
* pathname - Full pathname to the node
|
||||
* node_flags - From Namespace node for the method/object
|
||||
* format - Printf format string + additional args
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Info messages for the predefined validation module. Messages
|
||||
* are only emitted the first time a problem with a particular
|
||||
* method/object is detected. This prevents a flood of
|
||||
* messages for methods that are repeatedly evaluated.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_ut_predefined_info(const char *module_name,
|
||||
u32 line_number,
|
||||
char *pathname, u8 node_flags, const char *format, ...)
|
||||
{
|
||||
va_list arg_list;
|
||||
|
||||
/*
|
||||
* Warning messages for this method/object will be disabled after the
|
||||
* first time a validation fails or an object is successfully repaired.
|
||||
*/
|
||||
if (node_flags & ANOBJ_EVALUATED) {
|
||||
return;
|
||||
}
|
||||
|
||||
acpi_os_printf(ACPI_MSG_INFO "%s: ", pathname);
|
||||
|
||||
va_start(arg_list, format);
|
||||
acpi_os_vprintf(format, arg_list);
|
||||
ACPI_MSG_SUFFIX;
|
||||
va_end(arg_list);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_predefined_bios_error
|
||||
*
|
||||
* PARAMETERS: module_name - Caller's module name (for error output)
|
||||
* line_number - Caller's line number (for error output)
|
||||
* pathname - Full pathname to the node
|
||||
* node_flags - From Namespace node for the method/object
|
||||
* format - Printf format string + additional args
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: BIOS error message for predefined names. Messages
|
||||
* are only emitted the first time a problem with a particular
|
||||
* method/object is detected. This prevents a flood of
|
||||
* messages for methods that are repeatedly evaluated.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_ut_predefined_bios_error(const char *module_name,
|
||||
u32 line_number,
|
||||
char *pathname,
|
||||
u8 node_flags, const char *format, ...)
|
||||
{
|
||||
va_list arg_list;
|
||||
|
||||
/*
|
||||
* Warning messages for this method/object will be disabled after the
|
||||
* first time a validation fails or an object is successfully repaired.
|
||||
*/
|
||||
if (node_flags & ANOBJ_EVALUATED) {
|
||||
return;
|
||||
}
|
||||
|
||||
acpi_os_printf(ACPI_MSG_BIOS_ERROR "%s: ", pathname);
|
||||
|
||||
va_start(arg_list, format);
|
||||
acpi_os_vprintf(format, arg_list);
|
||||
ACPI_MSG_SUFFIX;
|
||||
va_end(arg_list);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_namespace_error
|
||||
*
|
||||
* PARAMETERS: module_name - Caller's module name (for error output)
|
||||
* line_number - Caller's line number (for error output)
|
||||
* internal_name - Name or path of the namespace node
|
||||
* lookup_status - Exception code from NS lookup
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Print error message with the full pathname for the NS node.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ut_namespace_error(const char *module_name,
|
||||
u32 line_number,
|
||||
const char *internal_name, acpi_status lookup_status)
|
||||
{
|
||||
acpi_status status;
|
||||
u32 bad_name;
|
||||
char *name = NULL;
|
||||
|
||||
ACPI_MSG_REDIRECT_BEGIN;
|
||||
acpi_os_printf(ACPI_MSG_ERROR);
|
||||
|
||||
if (lookup_status == AE_BAD_CHARACTER) {
|
||||
|
||||
/* There is a non-ascii character in the name */
|
||||
|
||||
ACPI_MOVE_32_TO_32(&bad_name,
|
||||
ACPI_CAST_PTR(u32, internal_name));
|
||||
acpi_os_printf("[0x%.8X] (NON-ASCII)", bad_name);
|
||||
} else {
|
||||
/* Convert path to external format */
|
||||
|
||||
status = acpi_ns_externalize_name(ACPI_UINT32_MAX,
|
||||
internal_name, NULL, &name);
|
||||
|
||||
/* Print target name */
|
||||
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
acpi_os_printf("[%s]", name);
|
||||
} else {
|
||||
acpi_os_printf("[COULD NOT EXTERNALIZE NAME]");
|
||||
}
|
||||
|
||||
if (name) {
|
||||
ACPI_FREE(name);
|
||||
}
|
||||
}
|
||||
|
||||
acpi_os_printf(" Namespace lookup failure, %s",
|
||||
acpi_format_exception(lookup_status));
|
||||
|
||||
ACPI_MSG_SUFFIX;
|
||||
ACPI_MSG_REDIRECT_END;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_method_error
|
||||
*
|
||||
* PARAMETERS: module_name - Caller's module name (for error output)
|
||||
* line_number - Caller's line number (for error output)
|
||||
* message - Error message to use on failure
|
||||
* prefix_node - Prefix relative to the path
|
||||
* path - Path to the node (optional)
|
||||
* method_status - Execution status
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Print error message with the full pathname for the method.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ut_method_error(const char *module_name,
|
||||
u32 line_number,
|
||||
const char *message,
|
||||
struct acpi_namespace_node *prefix_node,
|
||||
const char *path, acpi_status method_status)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *node = prefix_node;
|
||||
|
||||
ACPI_MSG_REDIRECT_BEGIN;
|
||||
acpi_os_printf(ACPI_MSG_ERROR);
|
||||
|
||||
if (path) {
|
||||
status =
|
||||
acpi_ns_get_node(prefix_node, path, ACPI_NS_NO_UPSEARCH,
|
||||
&node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_os_printf("[Could not get node by pathname]");
|
||||
}
|
||||
}
|
||||
|
||||
acpi_ns_print_node_pathname(node, message);
|
||||
acpi_os_printf(", %s", acpi_format_exception(method_status));
|
||||
|
||||
ACPI_MSG_SUFFIX;
|
||||
ACPI_MSG_REDIRECT_END;
|
||||
}
|
||||
|
||||
#endif /* ACPI_NO_ERROR_MESSAGES */
|
|
@ -68,7 +68,7 @@ ACPI_MODULE_NAME("uteval")
|
|||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_ut_evaluate_object(struct acpi_namespace_node * prefix_node,
|
||||
acpi_ut_evaluate_object(struct acpi_namespace_node *prefix_node,
|
||||
char *path,
|
||||
u32 expected_return_btypes,
|
||||
union acpi_operand_object **return_desc)
|
||||
|
@ -87,7 +87,7 @@ acpi_ut_evaluate_object(struct acpi_namespace_node * prefix_node,
|
|||
}
|
||||
|
||||
info->prefix_node = prefix_node;
|
||||
info->pathname = path;
|
||||
info->relative_pathname = path;
|
||||
|
||||
/* Evaluate the object/method */
|
||||
|
||||
|
@ -123,22 +123,27 @@ acpi_ut_evaluate_object(struct acpi_namespace_node * prefix_node,
|
|||
|
||||
switch ((info->return_object)->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
return_btype = ACPI_BTYPE_INTEGER;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_BUFFER:
|
||||
|
||||
return_btype = ACPI_BTYPE_BUFFER;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
return_btype = ACPI_BTYPE_STRING;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_PACKAGE:
|
||||
|
||||
return_btype = ACPI_BTYPE_PACKAGE;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
return_btype = 0;
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -146,6 +146,7 @@ const struct acpi_exception_info *acpi_ut_validate_exception(acpi_status status)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -341,14 +341,17 @@ acpi_ut_execute_CID(struct acpi_namespace_node *device_node,
|
|||
|
||||
switch (cid_objects[i]->common.type) {
|
||||
case ACPI_TYPE_INTEGER:
|
||||
|
||||
string_area_size += ACPI_EISAID_STRING_SIZE;
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_STRING:
|
||||
|
||||
string_area_size += cid_objects[i]->string.length + 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
status = AE_TYPE;
|
||||
goto cleanup;
|
||||
}
|
||||
|
|
|
@ -382,10 +382,12 @@ acpi_ut_display_init_pathname(u8 type,
|
|||
|
||||
switch (type) {
|
||||
case ACPI_TYPE_METHOD:
|
||||
|
||||
acpi_os_printf("Executing ");
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
acpi_os_printf("Initializing ");
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -129,6 +129,7 @@ union acpi_operand_object *acpi_ut_create_internal_object_dbg(const char
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* All others have no secondary object */
|
||||
break;
|
||||
}
|
||||
|
@ -353,6 +354,7 @@ u8 acpi_ut_valid_internal_object(void *object)
|
|||
return (TRUE);
|
||||
|
||||
default:
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
|
||||
"%p is not not an ACPI operand obj [%s]\n",
|
||||
object, acpi_ut_get_descriptor_name(object)));
|
||||
|
@ -509,7 +511,6 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
|
|||
|
||||
switch (internal_object->reference.class) {
|
||||
case ACPI_REFCLASS_NAME:
|
||||
|
||||
/*
|
||||
* Get the actual length of the full pathname to this object.
|
||||
* The reference will be converted to the pathname to the object
|
||||
|
@ -525,7 +526,6 @@ acpi_ut_get_simple_object_size(union acpi_operand_object *internal_object,
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
/*
|
||||
* No other reference opcodes are supported.
|
||||
* Notably, Locals and Args are not supported, but this may be
|
||||
|
@ -585,7 +585,6 @@ acpi_ut_get_element_length(u8 object_type,
|
|||
|
||||
switch (object_type) {
|
||||
case ACPI_COPY_TYPE_SIMPLE:
|
||||
|
||||
/*
|
||||
* Simple object - just get the size (Null object/entry is handled
|
||||
* here also) and sum it into the running package length
|
||||
|
|
|
@ -147,6 +147,11 @@ void acpi_ut_get_expected_return_types(char *buffer, u32 expected_btypes)
|
|||
u32 i;
|
||||
u32 j;
|
||||
|
||||
if (!expected_btypes) {
|
||||
ACPI_STRCPY(buffer, "NONE");
|
||||
return;
|
||||
}
|
||||
|
||||
j = 1;
|
||||
buffer[0] = 0;
|
||||
this_rtype = ACPI_RTYPE_INTEGER;
|
||||
|
@ -328,9 +333,7 @@ static u32 acpi_ut_get_argument_types(char *buffer, u16 argument_types)
|
|||
|
||||
/* First field in the types list is the count of args to follow */
|
||||
|
||||
arg_count = (argument_types & METHOD_ARG_MASK);
|
||||
argument_types >>= METHOD_ARG_BIT_WIDTH;
|
||||
|
||||
arg_count = METHOD_GET_ARG_COUNT(argument_types);
|
||||
if (arg_count > METHOD_PREDEF_ARGS_MAX) {
|
||||
printf("**** Invalid argument count (%u) "
|
||||
"in predefined info structure\n", arg_count);
|
||||
|
@ -340,7 +343,8 @@ static u32 acpi_ut_get_argument_types(char *buffer, u16 argument_types)
|
|||
/* Get each argument from the list, convert to ascii, store to buffer */
|
||||
|
||||
for (i = 0; i < arg_count; i++) {
|
||||
this_argument_type = (argument_types & METHOD_ARG_MASK);
|
||||
this_argument_type = METHOD_GET_NEXT_TYPE(argument_types);
|
||||
|
||||
if (!this_argument_type
|
||||
|| (this_argument_type > METHOD_MAX_ARG_TYPE)) {
|
||||
printf("**** Invalid argument type (%u) "
|
||||
|
@ -351,10 +355,6 @@ static u32 acpi_ut_get_argument_types(char *buffer, u16 argument_types)
|
|||
|
||||
strcat(buffer,
|
||||
ut_external_type_names[this_argument_type] + sub_index);
|
||||
|
||||
/* Shift to next argument type field */
|
||||
|
||||
argument_types >>= METHOD_ARG_BIT_WIDTH;
|
||||
sub_index = 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -186,10 +186,13 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
|||
switch (base) {
|
||||
case ACPI_ANY_BASE:
|
||||
case 16:
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Invalid Base */
|
||||
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
|
@ -355,36 +358,44 @@ void acpi_ut_print_string(char *string, u8 max_length)
|
|||
|
||||
switch (string[i]) {
|
||||
case 0x07:
|
||||
|
||||
acpi_os_printf("\\a"); /* BELL */
|
||||
break;
|
||||
|
||||
case 0x08:
|
||||
|
||||
acpi_os_printf("\\b"); /* BACKSPACE */
|
||||
break;
|
||||
|
||||
case 0x0C:
|
||||
|
||||
acpi_os_printf("\\f"); /* FORMFEED */
|
||||
break;
|
||||
|
||||
case 0x0A:
|
||||
|
||||
acpi_os_printf("\\n"); /* LINEFEED */
|
||||
break;
|
||||
|
||||
case 0x0D:
|
||||
|
||||
acpi_os_printf("\\r"); /* CARRIAGE RETURN */
|
||||
break;
|
||||
|
||||
case 0x09:
|
||||
|
||||
acpi_os_printf("\\t"); /* HORIZONTAL TAB */
|
||||
break;
|
||||
|
||||
case 0x0B:
|
||||
|
||||
acpi_os_printf("\\v"); /* VERTICAL TAB */
|
||||
break;
|
||||
|
||||
case '\'': /* Single Quote */
|
||||
case '\"': /* Double Quote */
|
||||
case '\\': /* Backslash */
|
||||
|
||||
acpi_os_printf("\\%c", (int)string[i]);
|
||||
break;
|
||||
|
||||
|
@ -451,7 +462,8 @@ u8 acpi_ut_valid_acpi_char(char character, u32 position)
|
|||
*
|
||||
* FUNCTION: acpi_ut_valid_acpi_name
|
||||
*
|
||||
* PARAMETERS: name - The name to be examined
|
||||
* PARAMETERS: name - The name to be examined. Does not have to
|
||||
* be NULL terminated string.
|
||||
*
|
||||
* RETURN: TRUE if the name is valid, FALSE otherwise
|
||||
*
|
||||
|
@ -462,15 +474,14 @@ u8 acpi_ut_valid_acpi_char(char character, u32 position)
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_ut_valid_acpi_name(u32 name)
|
||||
u8 acpi_ut_valid_acpi_name(char *name)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
for (i = 0; i < ACPI_NAME_SIZE; i++) {
|
||||
if (!acpi_ut_valid_acpi_char
|
||||
((ACPI_CAST_PTR(char, &name))[i], i)) {
|
||||
if (!acpi_ut_valid_acpi_char(name[i], i)) {
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -603,6 +603,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module)
|
|||
switch (ACPI_GET_DESCRIPTOR_TYPE
|
||||
(descriptor)) {
|
||||
case ACPI_DESC_TYPE_OPERAND:
|
||||
|
||||
if (element->size ==
|
||||
sizeof(union
|
||||
acpi_operand_object))
|
||||
|
@ -613,6 +614,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module)
|
|||
break;
|
||||
|
||||
case ACPI_DESC_TYPE_PARSER:
|
||||
|
||||
if (element->size ==
|
||||
sizeof(union
|
||||
acpi_parse_object)) {
|
||||
|
@ -622,6 +624,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module)
|
|||
break;
|
||||
|
||||
case ACPI_DESC_TYPE_NAMED:
|
||||
|
||||
if (element->size ==
|
||||
sizeof(struct
|
||||
acpi_namespace_node))
|
||||
|
@ -632,6 +635,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -639,6 +643,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module)
|
|||
|
||||
switch (descriptor_type) {
|
||||
case ACPI_DESC_TYPE_OPERAND:
|
||||
|
||||
acpi_os_printf
|
||||
("%12.12s RefCount 0x%04X\n",
|
||||
acpi_ut_get_type_name
|
||||
|
@ -649,6 +654,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module)
|
|||
break;
|
||||
|
||||
case ACPI_DESC_TYPE_PARSER:
|
||||
|
||||
acpi_os_printf
|
||||
("AmlOpcode 0x%04hX\n",
|
||||
descriptor->op.asl.
|
||||
|
@ -656,6 +662,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module)
|
|||
break;
|
||||
|
||||
case ACPI_DESC_TYPE_NAMED:
|
||||
|
||||
acpi_os_printf("%4.4s\n",
|
||||
acpi_ut_get_node_name
|
||||
(&descriptor->
|
||||
|
@ -663,6 +670,7 @@ void acpi_ut_dump_allocations(u32 component, const char *module)
|
|||
break;
|
||||
|
||||
default:
|
||||
|
||||
acpi_os_printf("\n");
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -44,7 +44,6 @@
|
|||
#include <linux/export.h>
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utxferror")
|
||||
|
@ -52,43 +51,7 @@ ACPI_MODULE_NAME("utxferror")
|
|||
/*
|
||||
* This module is used for the in-kernel ACPICA as well as the ACPICA
|
||||
* tools/applications.
|
||||
*
|
||||
* For the iASL compiler case, the output is redirected to stderr so that
|
||||
* any of the various ACPI errors and warnings do not appear in the output
|
||||
* files, for either the compiler or disassembler portions of the tool.
|
||||
*/
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
#include <stdio.h>
|
||||
extern FILE *acpi_gbl_output_file;
|
||||
|
||||
#define ACPI_MSG_REDIRECT_BEGIN \
|
||||
FILE *output_file = acpi_gbl_output_file; \
|
||||
acpi_os_redirect_output (stderr);
|
||||
|
||||
#define ACPI_MSG_REDIRECT_END \
|
||||
acpi_os_redirect_output (output_file);
|
||||
|
||||
#else
|
||||
/*
|
||||
* non-iASL case - no redirection, nothing to do
|
||||
*/
|
||||
#define ACPI_MSG_REDIRECT_BEGIN
|
||||
#define ACPI_MSG_REDIRECT_END
|
||||
#endif
|
||||
/*
|
||||
* Common message prefixes
|
||||
*/
|
||||
#define ACPI_MSG_ERROR "ACPI Error: "
|
||||
#define ACPI_MSG_EXCEPTION "ACPI Exception: "
|
||||
#define ACPI_MSG_WARNING "ACPI Warning: "
|
||||
#define ACPI_MSG_INFO "ACPI: "
|
||||
#define ACPI_MSG_BIOS_ERROR "ACPI BIOS Bug: Error: "
|
||||
#define ACPI_MSG_BIOS_WARNING "ACPI BIOS Bug: Warning: "
|
||||
/*
|
||||
* Common message suffix
|
||||
*/
|
||||
#define ACPI_MSG_SUFFIX \
|
||||
acpi_os_printf (" (%8.8X/%s-%u)\n", ACPI_CA_VERSION, module_name, line_number)
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_error
|
||||
|
@ -285,200 +248,3 @@ acpi_bios_warning(const char *module_name,
|
|||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_bios_warning)
|
||||
|
||||
/*
|
||||
* The remainder of this module contains internal error functions that may
|
||||
* be configured out.
|
||||
*/
|
||||
#if !defined (ACPI_NO_ERROR_MESSAGES) && !defined (ACPI_BIN_APP)
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_predefined_warning
|
||||
*
|
||||
* PARAMETERS: module_name - Caller's module name (for error output)
|
||||
* line_number - Caller's line number (for error output)
|
||||
* pathname - Full pathname to the node
|
||||
* node_flags - From Namespace node for the method/object
|
||||
* format - Printf format string + additional args
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Warnings for the predefined validation module. Messages are
|
||||
* only emitted the first time a problem with a particular
|
||||
* method/object is detected. This prevents a flood of error
|
||||
* messages for methods that are repeatedly evaluated.
|
||||
*
|
||||
******************************************************************************/
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_ut_predefined_warning(const char *module_name,
|
||||
u32 line_number,
|
||||
char *pathname,
|
||||
u8 node_flags, const char *format, ...)
|
||||
{
|
||||
va_list arg_list;
|
||||
|
||||
/*
|
||||
* Warning messages for this method/object will be disabled after the
|
||||
* first time a validation fails or an object is successfully repaired.
|
||||
*/
|
||||
if (node_flags & ANOBJ_EVALUATED) {
|
||||
return;
|
||||
}
|
||||
|
||||
acpi_os_printf(ACPI_MSG_WARNING "For %s: ", pathname);
|
||||
|
||||
va_start(arg_list, format);
|
||||
acpi_os_vprintf(format, arg_list);
|
||||
ACPI_MSG_SUFFIX;
|
||||
va_end(arg_list);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_predefined_info
|
||||
*
|
||||
* PARAMETERS: module_name - Caller's module name (for error output)
|
||||
* line_number - Caller's line number (for error output)
|
||||
* pathname - Full pathname to the node
|
||||
* node_flags - From Namespace node for the method/object
|
||||
* format - Printf format string + additional args
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Info messages for the predefined validation module. Messages
|
||||
* are only emitted the first time a problem with a particular
|
||||
* method/object is detected. This prevents a flood of
|
||||
* messages for methods that are repeatedly evaluated.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_ut_predefined_info(const char *module_name,
|
||||
u32 line_number,
|
||||
char *pathname, u8 node_flags, const char *format, ...)
|
||||
{
|
||||
va_list arg_list;
|
||||
|
||||
/*
|
||||
* Warning messages for this method/object will be disabled after the
|
||||
* first time a validation fails or an object is successfully repaired.
|
||||
*/
|
||||
if (node_flags & ANOBJ_EVALUATED) {
|
||||
return;
|
||||
}
|
||||
|
||||
acpi_os_printf(ACPI_MSG_INFO "For %s: ", pathname);
|
||||
|
||||
va_start(arg_list, format);
|
||||
acpi_os_vprintf(format, arg_list);
|
||||
ACPI_MSG_SUFFIX;
|
||||
va_end(arg_list);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_namespace_error
|
||||
*
|
||||
* PARAMETERS: module_name - Caller's module name (for error output)
|
||||
* line_number - Caller's line number (for error output)
|
||||
* internal_name - Name or path of the namespace node
|
||||
* lookup_status - Exception code from NS lookup
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Print error message with the full pathname for the NS node.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ut_namespace_error(const char *module_name,
|
||||
u32 line_number,
|
||||
const char *internal_name, acpi_status lookup_status)
|
||||
{
|
||||
acpi_status status;
|
||||
u32 bad_name;
|
||||
char *name = NULL;
|
||||
|
||||
ACPI_MSG_REDIRECT_BEGIN;
|
||||
acpi_os_printf(ACPI_MSG_ERROR);
|
||||
|
||||
if (lookup_status == AE_BAD_CHARACTER) {
|
||||
|
||||
/* There is a non-ascii character in the name */
|
||||
|
||||
ACPI_MOVE_32_TO_32(&bad_name,
|
||||
ACPI_CAST_PTR(u32, internal_name));
|
||||
acpi_os_printf("[0x%.8X] (NON-ASCII)", bad_name);
|
||||
} else {
|
||||
/* Convert path to external format */
|
||||
|
||||
status = acpi_ns_externalize_name(ACPI_UINT32_MAX,
|
||||
internal_name, NULL, &name);
|
||||
|
||||
/* Print target name */
|
||||
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
acpi_os_printf("[%s]", name);
|
||||
} else {
|
||||
acpi_os_printf("[COULD NOT EXTERNALIZE NAME]");
|
||||
}
|
||||
|
||||
if (name) {
|
||||
ACPI_FREE(name);
|
||||
}
|
||||
}
|
||||
|
||||
acpi_os_printf(" Namespace lookup failure, %s",
|
||||
acpi_format_exception(lookup_status));
|
||||
|
||||
ACPI_MSG_SUFFIX;
|
||||
ACPI_MSG_REDIRECT_END;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_method_error
|
||||
*
|
||||
* PARAMETERS: module_name - Caller's module name (for error output)
|
||||
* line_number - Caller's line number (for error output)
|
||||
* message - Error message to use on failure
|
||||
* prefix_node - Prefix relative to the path
|
||||
* path - Path to the node (optional)
|
||||
* method_status - Execution status
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Print error message with the full pathname for the method.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ut_method_error(const char *module_name,
|
||||
u32 line_number,
|
||||
const char *message,
|
||||
struct acpi_namespace_node *prefix_node,
|
||||
const char *path, acpi_status method_status)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *node = prefix_node;
|
||||
|
||||
ACPI_MSG_REDIRECT_BEGIN;
|
||||
acpi_os_printf(ACPI_MSG_ERROR);
|
||||
|
||||
if (path) {
|
||||
status =
|
||||
acpi_ns_get_node(prefix_node, path, ACPI_NS_NO_UPSEARCH,
|
||||
&node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_os_printf("[Could not get node by pathname]");
|
||||
}
|
||||
}
|
||||
|
||||
acpi_ns_print_node_pathname(node, message);
|
||||
acpi_os_printf(", %s", acpi_format_exception(method_status));
|
||||
|
||||
ACPI_MSG_SUFFIX;
|
||||
ACPI_MSG_REDIRECT_END;
|
||||
}
|
||||
|
||||
#endif /* ACPI_NO_ERROR_MESSAGES */
|
||||
|
|
|
@ -1715,6 +1715,17 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
|
|||
}
|
||||
#endif
|
||||
|
||||
static int __init acpi_no_auto_ssdt_setup(char *s)
|
||||
{
|
||||
printk(KERN_NOTICE PREFIX "SSDT auto-load disabled\n");
|
||||
|
||||
acpi_gbl_disable_ssdt_table_load = TRUE;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
__setup("acpi_no_auto_ssdt", acpi_no_auto_ssdt_setup);
|
||||
|
||||
acpi_status __init acpi_os_initialize(void)
|
||||
{
|
||||
acpi_os_map_generic_address(&acpi_gbl_FADT.xpm1a_event_block);
|
||||
|
|
|
@ -219,8 +219,8 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#define ACPI_DEBUGGER_MAX_ARGS 8 /* Must be max method args + 1 */
|
||||
#define ACPI_DB_LINE_BUFFER_SIZE 512
|
||||
#define ACPI_DEBUGGER_MAX_ARGS ACPI_METHOD_NUM_ARGS + 4 /* Max command line arguments */
|
||||
#define ACPI_DB_LINE_BUFFER_SIZE 512
|
||||
|
||||
#define ACPI_DEBUGGER_COMMAND_PROMPT '-'
|
||||
#define ACPI_DEBUGGER_EXECUTE_PROMPT '%'
|
||||
|
|
|
@ -428,27 +428,21 @@
|
|||
* This is the non-debug case -- make everything go away,
|
||||
* leaving no executable debug code!
|
||||
*/
|
||||
#define ACPI_FUNCTION_NAME(a)
|
||||
#define ACPI_DEBUG_PRINT(pl)
|
||||
#define ACPI_DEBUG_PRINT_RAW(pl)
|
||||
#define ACPI_DEBUG_EXEC(a)
|
||||
#define ACPI_DEBUG_ONLY_MEMBERS(a)
|
||||
#define ACPI_FUNCTION_NAME(a)
|
||||
#define ACPI_FUNCTION_TRACE(a)
|
||||
#define ACPI_FUNCTION_TRACE_PTR(a, b)
|
||||
#define ACPI_FUNCTION_TRACE_U32(a, b)
|
||||
#define ACPI_FUNCTION_TRACE_STR(a, b)
|
||||
#define ACPI_FUNCTION_EXIT
|
||||
#define ACPI_FUNCTION_STATUS_EXIT(s)
|
||||
#define ACPI_FUNCTION_VALUE_EXIT(s)
|
||||
#define ACPI_FUNCTION_ENTRY()
|
||||
#define ACPI_DUMP_STACK_ENTRY(a)
|
||||
#define ACPI_DUMP_OPERANDS(a, b, c)
|
||||
#define ACPI_DUMP_ENTRY(a, b)
|
||||
#define ACPI_DUMP_TABLES(a, b)
|
||||
#define ACPI_DUMP_PATHNAME(a, b, c, d)
|
||||
#define ACPI_DUMP_BUFFER(a, b)
|
||||
#define ACPI_DEBUG_PRINT(pl)
|
||||
#define ACPI_DEBUG_PRINT_RAW(pl)
|
||||
#define ACPI_IS_DEBUG_ENABLED(level, component) 0
|
||||
|
||||
/* Return macros must have a return statement at the minimum */
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
|
||||
/* Current ACPICA subsystem version in YYYYMMDD format */
|
||||
|
||||
#define ACPI_CA_VERSION 0x20130328
|
||||
#define ACPI_CA_VERSION 0x20130517
|
||||
|
||||
#include <acpi/acconfig.h>
|
||||
#include <acpi/actypes.h>
|
||||
|
@ -80,6 +80,7 @@ extern bool acpi_gbl_enable_aml_debug_object;
|
|||
extern u8 acpi_gbl_copy_dsdt_locally;
|
||||
extern u8 acpi_gbl_truncate_io_addresses;
|
||||
extern u8 acpi_gbl_disable_auto_repair;
|
||||
extern u8 acpi_gbl_disable_ssdt_table_load;
|
||||
|
||||
/*
|
||||
* Hardware-reduced prototypes. All interfaces that use these macros will
|
||||
|
|
Загрузка…
Ссылка в новой задаче