mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-13 14:14:37 +00:00
Merge branch 'acpica'
* acpica: (42 commits) ACPICA: Update version to 20150818 ACPICA: Debugger: Cleanup debugging outputs to dump name path without trailing underscores ACPICA: Disassembler: Cleanup acpi_gbl_db_opt_verbose acpiexec usage ACPICA: Disassembler: Cleanup acpi_gbl_db_opt_disasm ACPICA: Debugger: Split debugger initialization/termination APIs ACPICA: Header support to improve compatibility with MSVC ACPICA: Make the max-number-of-loops runtime configurable ACPICA: Debugger: Add option to display namespace summary/counts ACPICA: Add additional debug info/statements ACPICA: Table handling: Cleanup and update debug output for tools ACPICA: acpiexec/acpinames: Support very large number of ACPI tables ACPICA: acpinames: Add new options and wildcard support ACPICA: Headers: Fix some comments, no functional change ACPICA: Tables: Cleanup to reduce FACS globals ACPICA: Tables: Fix global table list issues by removing fixed table indexes ACPICA: Update info messages during ACPICA init ACPICA: Disassembler: Update for new listing mode ACPICA: Update parameter validation for data_table_region and load_table ACPICA: Disassembler: Remove duplicate code in _PLD processing. ACPICA: Correctly cleanup after a ACPI table load failure ...
This commit is contained in:
commit
c91c5b276b
68 changed files with 1816 additions and 892 deletions
|
@ -11,6 +11,7 @@ obj-y += acpi.o
|
|||
acpi-y := \
|
||||
dsargs.o \
|
||||
dscontrol.o \
|
||||
dsdebug.o \
|
||||
dsfield.o \
|
||||
dsinit.o \
|
||||
dsmethod.o \
|
||||
|
@ -164,6 +165,7 @@ acpi-y += \
|
|||
utmath.o \
|
||||
utmisc.o \
|
||||
utmutex.o \
|
||||
utnonansi.o \
|
||||
utobject.o \
|
||||
utosi.o \
|
||||
utownerid.o \
|
||||
|
|
|
@ -67,9 +67,6 @@ struct acpi_db_execute_walk {
|
|||
};
|
||||
|
||||
#define PARAM_LIST(pl) pl
|
||||
#define DBTEST_OUTPUT_LEVEL(lvl) if (acpi_gbl_db_opt_verbose)
|
||||
#define VERBOSE_PRINT(fp) DBTEST_OUTPUT_LEVEL(lvl) {\
|
||||
acpi_os_printf PARAM_LIST(fp);}
|
||||
|
||||
#define EX_NO_SINGLE_STEP 1
|
||||
#define EX_SINGLE_STEP 2
|
||||
|
@ -77,10 +74,6 @@ struct acpi_db_execute_walk {
|
|||
/*
|
||||
* dbxface - external debugger interfaces
|
||||
*/
|
||||
acpi_status acpi_db_initialize(void);
|
||||
|
||||
void acpi_db_terminate(void);
|
||||
|
||||
acpi_status
|
||||
acpi_db_single_step(struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object *op, u32 op_type);
|
||||
|
@ -102,6 +95,8 @@ void acpi_db_display_interfaces(char *action_arg, char *interface_name_arg);
|
|||
|
||||
acpi_status acpi_db_sleep(char *object_arg);
|
||||
|
||||
void acpi_db_trace(char *enable_arg, char *method_arg, char *once_arg);
|
||||
|
||||
void acpi_db_display_locks(void);
|
||||
|
||||
void acpi_db_display_resources(char *object_arg);
|
||||
|
@ -261,6 +256,23 @@ acpi_status acpi_db_user_commands(char prompt, union acpi_parse_object *op);
|
|||
char *acpi_db_get_next_token(char *string,
|
||||
char **next, acpi_object_type * return_type);
|
||||
|
||||
/*
|
||||
* dbobject
|
||||
*/
|
||||
void acpi_db_decode_internal_object(union acpi_operand_object *obj_desc);
|
||||
|
||||
void
|
||||
acpi_db_display_internal_object(union acpi_operand_object *obj_desc,
|
||||
struct acpi_walk_state *walk_state);
|
||||
|
||||
void acpi_db_decode_arguments(struct acpi_walk_state *walk_state);
|
||||
|
||||
void acpi_db_decode_locals(struct acpi_walk_state *walk_state);
|
||||
|
||||
void
|
||||
acpi_db_dump_method_info(acpi_status status,
|
||||
struct acpi_walk_state *walk_state);
|
||||
|
||||
/*
|
||||
* dbstats - Generation and display of ACPI table statistics
|
||||
*/
|
||||
|
|
|
@ -354,4 +354,12 @@ acpi_status
|
|||
acpi_ds_result_push(union acpi_operand_object *object,
|
||||
struct acpi_walk_state *walk_state);
|
||||
|
||||
/*
|
||||
* dsdebug - parser debugging routines
|
||||
*/
|
||||
void
|
||||
acpi_ds_dump_method_stack(acpi_status status,
|
||||
struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object *op);
|
||||
|
||||
#endif /* _ACDISPAT_H_ */
|
||||
|
|
|
@ -58,11 +58,12 @@ ACPI_GLOBAL(struct acpi_table_list, acpi_gbl_root_table_list);
|
|||
|
||||
ACPI_GLOBAL(struct acpi_table_header *, acpi_gbl_DSDT);
|
||||
ACPI_GLOBAL(struct acpi_table_header, acpi_gbl_original_dsdt_header);
|
||||
ACPI_INIT_GLOBAL(u32, acpi_gbl_dsdt_index, ACPI_INVALID_TABLE_INDEX);
|
||||
ACPI_INIT_GLOBAL(u32, acpi_gbl_facs_index, ACPI_INVALID_TABLE_INDEX);
|
||||
ACPI_INIT_GLOBAL(u32, acpi_gbl_xfacs_index, ACPI_INVALID_TABLE_INDEX);
|
||||
|
||||
#if (!ACPI_REDUCED_HARDWARE)
|
||||
ACPI_GLOBAL(struct acpi_table_facs *, acpi_gbl_FACS);
|
||||
ACPI_GLOBAL(struct acpi_table_facs *, acpi_gbl_facs32);
|
||||
ACPI_GLOBAL(struct acpi_table_facs *, acpi_gbl_facs64);
|
||||
|
||||
#endif /* !ACPI_REDUCED_HARDWARE */
|
||||
|
||||
|
@ -235,6 +236,10 @@ ACPI_INIT_GLOBAL(u32, acpi_gbl_nesting_level, 0);
|
|||
|
||||
ACPI_GLOBAL(struct acpi_thread_state *, acpi_gbl_current_walk_list);
|
||||
|
||||
/* Maximum number of While() loop iterations before forced abort */
|
||||
|
||||
ACPI_GLOBAL(u16, acpi_gbl_max_loop_iterations);
|
||||
|
||||
/* Control method single step flag */
|
||||
|
||||
ACPI_GLOBAL(u8, acpi_gbl_cm_single_step);
|
||||
|
@ -290,8 +295,6 @@ ACPI_GLOBAL(u32, acpi_fixed_event_count[ACPI_NUM_FIXED_EVENTS]);
|
|||
|
||||
ACPI_GLOBAL(u32, acpi_gbl_original_dbg_level);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_original_dbg_layer);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_trace_dbg_level);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_trace_dbg_layer);
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
|
@ -309,9 +312,10 @@ ACPI_INIT_GLOBAL(u8, acpi_gbl_no_resource_disassembly, FALSE);
|
|||
ACPI_INIT_GLOBAL(u8, acpi_gbl_ignore_noop_operator, FALSE);
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_cstyle_disassembly, TRUE);
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_force_aml_disassembly, FALSE);
|
||||
ACPI_INIT_GLOBAL(u8, acpi_gbl_dm_opt_verbose, TRUE);
|
||||
|
||||
ACPI_GLOBAL(u8, acpi_gbl_db_opt_disasm);
|
||||
ACPI_GLOBAL(u8, acpi_gbl_db_opt_verbose);
|
||||
ACPI_GLOBAL(u8, acpi_gbl_dm_opt_disasm);
|
||||
ACPI_GLOBAL(u8, acpi_gbl_dm_opt_listing);
|
||||
ACPI_GLOBAL(u8, acpi_gbl_num_external_methods);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_resolved_external_methods);
|
||||
ACPI_GLOBAL(struct acpi_external_list *, acpi_gbl_external_list);
|
||||
|
@ -346,8 +350,8 @@ ACPI_GLOBAL(char, acpi_gbl_db_debug_filename[ACPI_DB_LINE_BUFFER_SIZE]);
|
|||
/*
|
||||
* Statistic globals
|
||||
*/
|
||||
ACPI_GLOBAL(u16, acpi_gbl_obj_type_count[ACPI_TYPE_NS_NODE_MAX + 1]);
|
||||
ACPI_GLOBAL(u16, acpi_gbl_node_type_count[ACPI_TYPE_NS_NODE_MAX + 1]);
|
||||
ACPI_GLOBAL(u16, acpi_gbl_obj_type_count[ACPI_TOTAL_TYPES]);
|
||||
ACPI_GLOBAL(u16, acpi_gbl_node_type_count[ACPI_TOTAL_TYPES]);
|
||||
ACPI_GLOBAL(u16, acpi_gbl_obj_type_count_misc);
|
||||
ACPI_GLOBAL(u16, acpi_gbl_node_type_count_misc);
|
||||
ACPI_GLOBAL(u32, acpi_gbl_num_nodes);
|
||||
|
|
|
@ -131,6 +131,28 @@ void
|
|||
acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
|
||||
u32 level, u32 index);
|
||||
|
||||
void
|
||||
acpi_ex_start_trace_method(struct acpi_namespace_node *method_node,
|
||||
union acpi_operand_object *obj_desc,
|
||||
struct acpi_walk_state *walk_state);
|
||||
|
||||
void
|
||||
acpi_ex_stop_trace_method(struct acpi_namespace_node *method_node,
|
||||
union acpi_operand_object *obj_desc,
|
||||
struct acpi_walk_state *walk_state);
|
||||
|
||||
void
|
||||
acpi_ex_start_trace_opcode(union acpi_parse_object *op,
|
||||
struct acpi_walk_state *walk_state);
|
||||
|
||||
void
|
||||
acpi_ex_stop_trace_opcode(union acpi_parse_object *op,
|
||||
struct acpi_walk_state *walk_state);
|
||||
|
||||
void
|
||||
acpi_ex_trace_point(acpi_trace_event_type type,
|
||||
u8 begin, u8 *aml, char *pathname);
|
||||
|
||||
/*
|
||||
* exfield - ACPI AML (p-code) execution - field manipulation
|
||||
*/
|
||||
|
|
|
@ -174,8 +174,12 @@ struct acpi_namespace_node {
|
|||
*/
|
||||
#ifdef ACPI_LARGE_NAMESPACE_NODE
|
||||
union acpi_parse_object *op;
|
||||
void *method_locals;
|
||||
void *method_args;
|
||||
u32 value;
|
||||
u32 length;
|
||||
u8 arg_count;
|
||||
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -209,11 +213,9 @@ struct acpi_table_list {
|
|||
#define ACPI_ROOT_ORIGIN_ALLOCATED (1)
|
||||
#define ACPI_ROOT_ALLOW_RESIZE (2)
|
||||
|
||||
/* Predefined (fixed) table indexes */
|
||||
/* Predefined table indexes */
|
||||
|
||||
#define ACPI_TABLE_INDEX_DSDT (0)
|
||||
#define ACPI_TABLE_INDEX_FACS (1)
|
||||
#define ACPI_TABLE_INDEX_X_FACS (2)
|
||||
#define ACPI_INVALID_TABLE_INDEX (0xFFFFFFFF)
|
||||
|
||||
struct acpi_find_context {
|
||||
char *search_for;
|
||||
|
@ -404,6 +406,13 @@ struct acpi_simple_repair_info {
|
|||
|
||||
#define ACPI_NUM_RTYPES 5 /* Number of actual object types */
|
||||
|
||||
/* Info for running the _REG methods */
|
||||
|
||||
struct acpi_reg_walk_info {
|
||||
acpi_adr_space_type space_id;
|
||||
u32 reg_run_count;
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Event typedefs and structs
|
||||
|
@ -715,7 +724,7 @@ union acpi_parse_value {
|
|||
union acpi_parse_object *arg; /* arguments and contained ops */
|
||||
};
|
||||
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
#if defined(ACPI_DISASSEMBLER) || defined(ACPI_DEBUG_OUTPUT)
|
||||
#define ACPI_DISASM_ONLY_MEMBERS(a) a;
|
||||
#else
|
||||
#define ACPI_DISASM_ONLY_MEMBERS(a)
|
||||
|
@ -726,7 +735,7 @@ union acpi_parse_value {
|
|||
u8 descriptor_type; /* To differentiate various internal objs */\
|
||||
u8 flags; /* Type of Op */\
|
||||
u16 aml_opcode; /* AML opcode */\
|
||||
u32 aml_offset; /* Offset of declaration in AML */\
|
||||
u8 *aml; /* Address of declaration in AML */\
|
||||
union acpi_parse_object *next; /* Next op */\
|
||||
struct acpi_namespace_node *node; /* For use by interpreter */\
|
||||
union acpi_parse_value value; /* Value or args associated with the opcode */\
|
||||
|
@ -1103,6 +1112,9 @@ struct acpi_db_method_info {
|
|||
* Index of current thread inside all them created.
|
||||
*/
|
||||
char init_args;
|
||||
#ifdef ACPI_DEBUGGER
|
||||
acpi_object_type arg_types[4];
|
||||
#endif
|
||||
char *arguments[4];
|
||||
char num_threads_str[11];
|
||||
char id_of_thread_str[11];
|
||||
|
@ -1119,6 +1131,10 @@ struct acpi_integrity_info {
|
|||
#define ACPI_DB_CONSOLE_OUTPUT 0x02
|
||||
#define ACPI_DB_DUPLICATE_OUTPUT 0x03
|
||||
|
||||
struct acpi_object_info {
|
||||
u32 types[ACPI_TOTAL_TYPES];
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
* Debug
|
||||
|
|
|
@ -220,6 +220,15 @@
|
|||
#define ACPI_MUL_32(a) _ACPI_MUL(a, 5)
|
||||
#define ACPI_MOD_32(a) _ACPI_MOD(a, 32)
|
||||
|
||||
/* Test for ASCII character */
|
||||
|
||||
#define ACPI_IS_ASCII(c) ((c) < 0x80)
|
||||
|
||||
/* Signed integers */
|
||||
|
||||
#define ACPI_SIGN_POSITIVE 0
|
||||
#define ACPI_SIGN_NEGATIVE 1
|
||||
|
||||
/*
|
||||
* Rounding macros (Power of two boundaries only)
|
||||
*/
|
||||
|
|
|
@ -272,17 +272,20 @@ acpi_ns_check_package(struct acpi_evaluate_info *info,
|
|||
*/
|
||||
u32 acpi_ns_opens_scope(acpi_object_type type);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_build_external_path(struct acpi_namespace_node *node,
|
||||
acpi_size size, char *name_buffer);
|
||||
|
||||
char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node);
|
||||
|
||||
u32
|
||||
acpi_ns_build_normalized_path(struct acpi_namespace_node *node,
|
||||
char *full_path, u32 path_size, u8 no_trailing);
|
||||
|
||||
char *acpi_ns_get_normalized_pathname(struct acpi_namespace_node *node,
|
||||
u8 no_trailing);
|
||||
|
||||
char *acpi_ns_name_of_current_scope(struct acpi_walk_state *walk_state);
|
||||
|
||||
acpi_status
|
||||
acpi_ns_handle_to_pathname(acpi_handle target_handle,
|
||||
struct acpi_buffer *buffer);
|
||||
struct acpi_buffer *buffer, u8 no_trailing);
|
||||
|
||||
u8
|
||||
acpi_ns_pattern_match(struct acpi_namespace_node *obj_node, char *search_for);
|
||||
|
|
|
@ -176,6 +176,7 @@ struct acpi_object_method {
|
|||
u8 param_count;
|
||||
u8 sync_level;
|
||||
union acpi_operand_object *mutex;
|
||||
union acpi_operand_object *node;
|
||||
u8 *aml_start;
|
||||
union {
|
||||
acpi_internal_method implementation;
|
||||
|
|
|
@ -225,11 +225,11 @@ void acpi_ps_delete_parse_tree(union acpi_parse_object *root);
|
|||
/*
|
||||
* psutils - parser utilities
|
||||
*/
|
||||
union acpi_parse_object *acpi_ps_create_scope_op(void);
|
||||
union acpi_parse_object *acpi_ps_create_scope_op(u8 *aml);
|
||||
|
||||
void acpi_ps_init_op(union acpi_parse_object *op, u16 opcode);
|
||||
|
||||
union acpi_parse_object *acpi_ps_alloc_op(u16 opcode);
|
||||
union acpi_parse_object *acpi_ps_alloc_op(u16 opcode, u8 *aml);
|
||||
|
||||
void acpi_ps_free_op(union acpi_parse_object *op);
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ struct acpi_walk_state {
|
|||
u8 namespace_override; /* Override existing objects */
|
||||
u8 result_size; /* Total elements for the result stack */
|
||||
u8 result_count; /* Current number of occupied elements of result stack */
|
||||
u32 aml_offset;
|
||||
u8 *aml;
|
||||
u32 arg_types;
|
||||
u32 method_breakpoint; /* For single stepping */
|
||||
u32 user_breakpoint; /* User AML breakpoint */
|
||||
|
|
|
@ -154,14 +154,20 @@ void acpi_tb_check_dsdt_header(void);
|
|||
struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index);
|
||||
|
||||
void
|
||||
acpi_tb_install_table_with_override(u32 table_index,
|
||||
struct acpi_table_desc *new_table_desc,
|
||||
u8 override);
|
||||
acpi_tb_install_table_with_override(struct acpi_table_desc *new_table_desc,
|
||||
u8 override, u32 *table_index);
|
||||
|
||||
acpi_status
|
||||
acpi_tb_install_fixed_table(acpi_physical_address address,
|
||||
char *signature, u32 table_index);
|
||||
char *signature, u32 *table_index);
|
||||
|
||||
acpi_status acpi_tb_parse_root_table(acpi_physical_address rsdp_address);
|
||||
|
||||
u8 acpi_is_valid_signature(char *signature);
|
||||
|
||||
/*
|
||||
* tbxfload
|
||||
*/
|
||||
acpi_status acpi_tb_load_namespace(void);
|
||||
|
||||
#endif /* __ACTABLES_H__ */
|
||||
|
|
|
@ -166,6 +166,17 @@ struct acpi_pkg_info {
|
|||
#define DB_DWORD_DISPLAY 4
|
||||
#define DB_QWORD_DISPLAY 8
|
||||
|
||||
/*
|
||||
* utnonansi - Non-ANSI C library functions
|
||||
*/
|
||||
void acpi_ut_strupr(char *src_string);
|
||||
|
||||
void acpi_ut_strlwr(char *src_string);
|
||||
|
||||
int acpi_ut_stricmp(char *string1, char *string2);
|
||||
|
||||
acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer);
|
||||
|
||||
/*
|
||||
* utglobal - Global data structures and procedures
|
||||
*/
|
||||
|
@ -205,8 +216,6 @@ acpi_status acpi_ut_hardware_initialize(void);
|
|||
|
||||
void acpi_ut_subsystem_shutdown(void);
|
||||
|
||||
#define ACPI_IS_ASCII(c) ((c) < 0x80)
|
||||
|
||||
/*
|
||||
* utcopy - Object construction and conversion interfaces
|
||||
*/
|
||||
|
@ -508,7 +517,7 @@ const struct acpi_exception_info *acpi_ut_validate_exception(acpi_status
|
|||
|
||||
u8 acpi_ut_is_pci_root_bridge(char *id);
|
||||
|
||||
#if (defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP)
|
||||
#if (defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP || defined ACPI_NAMES_APP)
|
||||
u8 acpi_ut_is_aml_table(struct acpi_table_header *table);
|
||||
#endif
|
||||
|
||||
|
@ -567,16 +576,6 @@ acpi_ut_get_resource_end_tag(union acpi_operand_object *obj_desc, u8 **end_tag);
|
|||
/*
|
||||
* utstring - String and character utilities
|
||||
*/
|
||||
void acpi_ut_strupr(char *src_string);
|
||||
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
void acpi_ut_strlwr(char *src_string);
|
||||
|
||||
int acpi_ut_stricmp(char *string1, char *string2);
|
||||
#endif
|
||||
|
||||
acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer);
|
||||
|
||||
void acpi_ut_print_string(char *string, u16 max_length);
|
||||
|
||||
#if defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP
|
||||
|
|
|
@ -86,7 +86,7 @@ acpi_ds_execute_arguments(struct acpi_namespace_node *node,
|
|||
|
||||
/* Allocate a new parser op to be the root of the parsed tree */
|
||||
|
||||
op = acpi_ps_alloc_op(AML_INT_EVAL_SUBTREE_OP);
|
||||
op = acpi_ps_alloc_op(AML_INT_EVAL_SUBTREE_OP, aml_start);
|
||||
if (!op) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
@ -129,7 +129,7 @@ acpi_ds_execute_arguments(struct acpi_namespace_node *node,
|
|||
|
||||
/* Evaluate the deferred arguments */
|
||||
|
||||
op = acpi_ps_alloc_op(AML_INT_EVAL_SUBTREE_OP);
|
||||
op = acpi_ps_alloc_op(AML_INT_EVAL_SUBTREE_OP, aml_start);
|
||||
if (!op) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
|
|
@ -212,7 +212,7 @@ acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state,
|
|||
*/
|
||||
control_state->control.loop_count++;
|
||||
if (control_state->control.loop_count >
|
||||
ACPI_MAX_LOOP_ITERATIONS) {
|
||||
acpi_gbl_max_loop_iterations) {
|
||||
status = AE_AML_INFINITE_LOOP;
|
||||
break;
|
||||
}
|
||||
|
|
231
drivers/acpi/acpica/dsdebug.c
Normal file
231
drivers/acpi/acpica/dsdebug.c
Normal file
|
@ -0,0 +1,231 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Module Name: dsdebug - Parser/Interpreter interface - debugging
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2015, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acdispat.h"
|
||||
#include "acnamesp.h"
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
#include "acdisasm.h"
|
||||
#endif
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME("dsdebug")
|
||||
|
||||
#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
|
||||
/* Local prototypes */
|
||||
static void
|
||||
acpi_ds_print_node_pathname(struct acpi_namespace_node *node,
|
||||
const char *message);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_print_node_pathname
|
||||
*
|
||||
* PARAMETERS: node - Object
|
||||
* message - Prefix message
|
||||
*
|
||||
* DESCRIPTION: Print an object's full namespace pathname
|
||||
* Manages allocation/freeing of a pathname buffer
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void
|
||||
acpi_ds_print_node_pathname(struct acpi_namespace_node *node,
|
||||
const char *message)
|
||||
{
|
||||
struct acpi_buffer buffer;
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ds_print_node_pathname);
|
||||
|
||||
if (!node) {
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_DISPATCH, "[NULL NAME]"));
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/* Convert handle to full pathname and print it (with supplied message) */
|
||||
|
||||
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
|
||||
|
||||
status = acpi_ns_handle_to_pathname(node, &buffer, TRUE);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
if (message) {
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_DISPATCH, "%s ",
|
||||
message));
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_DISPATCH, "[%s] (Node %p)",
|
||||
(char *)buffer.pointer, node));
|
||||
ACPI_FREE(buffer.pointer);
|
||||
}
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ds_dump_method_stack
|
||||
*
|
||||
* PARAMETERS: status - Method execution status
|
||||
* walk_state - Current state of the parse tree walk
|
||||
* op - Executing parse op
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Called when a method has been aborted because of an error.
|
||||
* Dumps the method execution stack.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ds_dump_method_stack(acpi_status status,
|
||||
struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object *op)
|
||||
{
|
||||
union acpi_parse_object *next;
|
||||
struct acpi_thread_state *thread;
|
||||
struct acpi_walk_state *next_walk_state;
|
||||
struct acpi_namespace_node *previous_method = NULL;
|
||||
union acpi_operand_object *method_desc;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ds_dump_method_stack);
|
||||
|
||||
/* Ignore control codes, they are not errors */
|
||||
|
||||
if ((status & AE_CODE_MASK) == AE_CODE_CONTROL) {
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/* We may be executing a deferred opcode */
|
||||
|
||||
if (walk_state->deferred_node) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
|
||||
"Executing subtree for Buffer/Package/Region\n"));
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*
|
||||
* If there is no Thread, we are not actually executing a method.
|
||||
* This can happen when the iASL compiler calls the interpreter
|
||||
* to perform constant folding.
|
||||
*/
|
||||
thread = walk_state->thread;
|
||||
if (!thread) {
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/* Display exception and method name */
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
|
||||
"\n**** Exception %s during execution of method ",
|
||||
acpi_format_exception(status)));
|
||||
acpi_ds_print_node_pathname(walk_state->method_node, NULL);
|
||||
|
||||
/* Display stack of executing methods */
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_DISPATCH,
|
||||
"\n\nMethod Execution Stack:\n"));
|
||||
next_walk_state = thread->walk_state_list;
|
||||
|
||||
/* Walk list of linked walk states */
|
||||
|
||||
while (next_walk_state) {
|
||||
method_desc = next_walk_state->method_desc;
|
||||
if (method_desc) {
|
||||
acpi_ex_stop_trace_method((struct acpi_namespace_node *)
|
||||
method_desc->method.node,
|
||||
method_desc, walk_state);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
|
||||
" Method [%4.4s] executing: ",
|
||||
acpi_ut_get_node_name(next_walk_state->
|
||||
method_node)));
|
||||
|
||||
/* First method is the currently executing method */
|
||||
|
||||
if (next_walk_state == walk_state) {
|
||||
if (op) {
|
||||
|
||||
/* Display currently executing ASL statement */
|
||||
|
||||
next = op->common.next;
|
||||
op->common.next = NULL;
|
||||
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
acpi_dm_disassemble(next_walk_state, op,
|
||||
ACPI_UINT32_MAX);
|
||||
#endif
|
||||
op->common.next = next;
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* This method has called another method
|
||||
* NOTE: the method call parse subtree is already deleted at this
|
||||
* point, so we cannot disassemble the method invocation.
|
||||
*/
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_DISPATCH,
|
||||
"Call to method "));
|
||||
acpi_ds_print_node_pathname(previous_method, NULL);
|
||||
}
|
||||
|
||||
previous_method = next_walk_state->method_node;
|
||||
next_walk_state = next_walk_state->next;
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_DISPATCH, "\n"));
|
||||
}
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
#else
|
||||
void
|
||||
acpi_ds_dump_method_stack(acpi_status status,
|
||||
struct acpi_walk_state *walk_state,
|
||||
union acpi_parse_object *op)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -237,12 +237,22 @@ acpi_ds_initialize_objects(u32 table_index,
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* DSDT is always the first AML table */
|
||||
|
||||
if (ACPI_COMPARE_NAME(table->signature, ACPI_SIG_DSDT)) {
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
"\nInitializing Namespace objects:\n"));
|
||||
}
|
||||
|
||||
/* Summary of objects initialized */
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
"Table [%4.4s] (id %4.4X) - %4u Objects with %3u Devices, "
|
||||
"%3u Regions, %3u Methods (%u/%u/%u Serial/Non/Cvt)\n",
|
||||
table->signature, owner_id, info.object_count,
|
||||
info.device_count, info.op_region_count,
|
||||
info.method_count, info.serial_method_count,
|
||||
"Table [%4.4s:%8.8s] (id %.2X) - %4u Objects with %3u Devices, "
|
||||
"%3u Regions, %4u Methods (%u/%u/%u Serial/Non/Cvt)\n",
|
||||
table->signature, table->oem_table_id, owner_id,
|
||||
info.object_count, info.device_count,
|
||||
info.op_region_count, info.method_count,
|
||||
info.serial_method_count,
|
||||
info.non_serial_method_count,
|
||||
info.serialized_method_count));
|
||||
|
||||
|
|
|
@ -46,11 +46,9 @@
|
|||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "acnamesp.h"
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
#include "acdisasm.h"
|
||||
#endif
|
||||
#include "acparser.h"
|
||||
#include "amlcode.h"
|
||||
#include "acdebug.h"
|
||||
|
||||
#define _COMPONENT ACPI_DISPATCHER
|
||||
ACPI_MODULE_NAME("dsmethod")
|
||||
|
@ -103,7 +101,7 @@ acpi_ds_auto_serialize_method(struct acpi_namespace_node *node,
|
|||
|
||||
/* Create/Init a root op for the method parse tree */
|
||||
|
||||
op = acpi_ps_alloc_op(AML_METHOD_OP);
|
||||
op = acpi_ps_alloc_op(AML_METHOD_OP, obj_desc->method.aml_start);
|
||||
if (!op) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
@ -205,7 +203,7 @@ acpi_ds_detect_named_opcodes(struct acpi_walk_state *walk_state,
|
|||
* RETURN: Status
|
||||
*
|
||||
* DESCRIPTION: Called on method error. Invoke the global exception handler if
|
||||
* present, dump the method data if the disassembler is configured
|
||||
* present, dump the method data if the debugger is configured
|
||||
*
|
||||
* Note: Allows the exception handler to change the status code
|
||||
*
|
||||
|
@ -214,6 +212,8 @@ acpi_ds_detect_named_opcodes(struct acpi_walk_state *walk_state,
|
|||
acpi_status
|
||||
acpi_ds_method_error(acpi_status status, struct acpi_walk_state * walk_state)
|
||||
{
|
||||
u32 aml_offset;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/* Ignore AE_OK and control exception codes */
|
||||
|
@ -234,26 +234,30 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state * walk_state)
|
|||
* Handler can map the exception code to anything it wants, including
|
||||
* AE_OK, in which case the executing method will not be aborted.
|
||||
*/
|
||||
aml_offset = (u32)ACPI_PTR_DIFF(walk_state->aml,
|
||||
walk_state->parser_state.
|
||||
aml_start);
|
||||
|
||||
status = acpi_gbl_exception_handler(status,
|
||||
walk_state->method_node ?
|
||||
walk_state->method_node->
|
||||
name.integer : 0,
|
||||
walk_state->opcode,
|
||||
walk_state->aml_offset,
|
||||
NULL);
|
||||
aml_offset, NULL);
|
||||
acpi_ex_enter_interpreter();
|
||||
}
|
||||
|
||||
acpi_ds_clear_implicit_return(walk_state);
|
||||
|
||||
#ifdef ACPI_DISASSEMBLER
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_ds_dump_method_stack(status, walk_state, walk_state->op);
|
||||
|
||||
/* Display method locals/args if disassembler is present */
|
||||
/* Display method locals/args if debugger is present */
|
||||
|
||||
acpi_dm_dump_method_info(status, walk_state, walk_state->op);
|
||||
}
|
||||
#ifdef ACPI_DEBUGGER
|
||||
acpi_db_dump_method_info(status, walk_state);
|
||||
#endif
|
||||
}
|
||||
|
||||
return (status);
|
||||
}
|
||||
|
@ -328,6 +332,8 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
|
|||
return_ACPI_STATUS(AE_NULL_ENTRY);
|
||||
}
|
||||
|
||||
acpi_ex_start_trace_method(method_node, obj_desc, walk_state);
|
||||
|
||||
/* Prevent wraparound of thread count */
|
||||
|
||||
if (obj_desc->method.thread_count == ACPI_UINT8_MAX) {
|
||||
|
@ -574,9 +580,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
|||
/* On error, we must terminate the method properly */
|
||||
|
||||
acpi_ds_terminate_control_method(obj_desc, next_walk_state);
|
||||
if (next_walk_state) {
|
||||
acpi_ds_delete_walk_state(next_walk_state);
|
||||
}
|
||||
acpi_ds_delete_walk_state(next_walk_state);
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -826,5 +830,8 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
|
|||
}
|
||||
}
|
||||
|
||||
acpi_ex_stop_trace_method((struct acpi_namespace_node *)method_desc->
|
||||
method.node, method_desc, walk_state);
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
|
|
@ -480,8 +480,8 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
|||
union acpi_operand_object **operand;
|
||||
struct acpi_namespace_node *node;
|
||||
union acpi_parse_object *next_op;
|
||||
u32 table_index;
|
||||
struct acpi_table_header *table;
|
||||
u32 table_index;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ds_eval_table_region_operands, op);
|
||||
|
||||
|
@ -504,6 +504,8 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
operand = &walk_state->operands[0];
|
||||
|
||||
/*
|
||||
* Resolve the Signature string, oem_id string,
|
||||
* and oem_table_id string operands
|
||||
|
@ -511,32 +513,34 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
|||
status = acpi_ex_resolve_operands(op->common.aml_opcode,
|
||||
ACPI_WALK_OPERANDS, walk_state);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
operand = &walk_state->operands[0];
|
||||
|
||||
/* Find the ACPI table */
|
||||
|
||||
status = acpi_tb_find_table(operand[0]->string.pointer,
|
||||
operand[1]->string.pointer,
|
||||
operand[2]->string.pointer, &table_index);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
if (status == AE_NOT_FOUND) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"ACPI Table [%4.4s] OEM:(%s, %s) not found in RSDT/XSDT",
|
||||
operand[0]->string.pointer,
|
||||
operand[1]->string.pointer,
|
||||
operand[2]->string.pointer));
|
||||
}
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
acpi_ut_remove_reference(operand[0]);
|
||||
acpi_ut_remove_reference(operand[1]);
|
||||
acpi_ut_remove_reference(operand[2]);
|
||||
|
||||
status = acpi_get_table_by_index(table_index, &table);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
obj_desc = acpi_ns_get_attached_object(node);
|
||||
if (!obj_desc) {
|
||||
return_ACPI_STATUS(AE_NOT_EXIST);
|
||||
status = AE_NOT_EXIST;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
obj_desc->region.address = ACPI_PTR_TO_PHYSADDR(table);
|
||||
|
@ -551,6 +555,11 @@ acpi_ds_eval_table_region_operands(struct acpi_walk_state *walk_state,
|
|||
|
||||
obj_desc->region.flags |= AOPOBJ_DATA_VALID;
|
||||
|
||||
cleanup:
|
||||
acpi_ut_remove_reference(operand[0]);
|
||||
acpi_ut_remove_reference(operand[1]);
|
||||
acpi_ut_remove_reference(operand[2]);
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
|
|
@ -388,7 +388,7 @@ acpi_ds_load1_begin_op(struct acpi_walk_state * walk_state,
|
|||
|
||||
/* Create a new op */
|
||||
|
||||
op = acpi_ps_alloc_op(walk_state->opcode);
|
||||
op = acpi_ps_alloc_op(walk_state->opcode, walk_state->aml);
|
||||
if (!op) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
|
|
@ -335,7 +335,7 @@ acpi_ds_load2_begin_op(struct acpi_walk_state *walk_state,
|
|||
|
||||
/* Create a new op */
|
||||
|
||||
op = acpi_ps_alloc_op(walk_state->opcode);
|
||||
op = acpi_ps_alloc_op(walk_state->opcode, walk_state->aml);
|
||||
if (!op) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
|
|
@ -626,9 +626,17 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
|
|||
acpi_adr_space_type space_id)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_reg_walk_info info;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ev_execute_reg_methods);
|
||||
|
||||
info.space_id = space_id;
|
||||
info.reg_run_count = 0;
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_NAMES,
|
||||
" Running _REG methods for SpaceId %s\n",
|
||||
acpi_ut_get_region_name(info.space_id)));
|
||||
|
||||
/*
|
||||
* Run all _REG methods for all Operation Regions for this space ID. This
|
||||
* is a separate walk in order to handle any interdependencies between
|
||||
|
@ -637,7 +645,7 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
|
|||
*/
|
||||
status = acpi_ns_walk_namespace(ACPI_TYPE_ANY, node, ACPI_UINT32_MAX,
|
||||
ACPI_NS_WALK_UNLOCK, acpi_ev_reg_run,
|
||||
NULL, &space_id, NULL);
|
||||
NULL, &info, NULL);
|
||||
|
||||
/* Special case for EC: handle "orphan" _REG methods with no region */
|
||||
|
||||
|
@ -645,6 +653,11 @@ acpi_ev_execute_reg_methods(struct acpi_namespace_node *node,
|
|||
acpi_ev_orphan_ec_reg_method(node);
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_NAMES,
|
||||
" Executed %u _REG methods for SpaceId %s\n",
|
||||
info.reg_run_count,
|
||||
acpi_ut_get_region_name(info.space_id)));
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
|
@ -664,10 +677,10 @@ acpi_ev_reg_run(acpi_handle obj_handle,
|
|||
{
|
||||
union acpi_operand_object *obj_desc;
|
||||
struct acpi_namespace_node *node;
|
||||
acpi_adr_space_type space_id;
|
||||
acpi_status status;
|
||||
struct acpi_reg_walk_info *info;
|
||||
|
||||
space_id = *ACPI_CAST_PTR(acpi_adr_space_type, context);
|
||||
info = ACPI_CAST_PTR(struct acpi_reg_walk_info, context);
|
||||
|
||||
/* Convert and validate the device handle */
|
||||
|
||||
|
@ -696,13 +709,14 @@ acpi_ev_reg_run(acpi_handle obj_handle,
|
|||
|
||||
/* Object is a Region */
|
||||
|
||||
if (obj_desc->region.space_id != space_id) {
|
||||
if (obj_desc->region.space_id != info->space_id) {
|
||||
|
||||
/* This region is for a different address space, just ignore it */
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
info->reg_run_count++;
|
||||
status = acpi_ev_execute_reg_method(obj_desc, ACPI_REG_CONNECT);
|
||||
return (status);
|
||||
}
|
||||
|
|
|
@ -162,14 +162,6 @@ acpi_ex_load_table_op(struct acpi_walk_state *walk_state,
|
|||
|
||||
ACPI_FUNCTION_TRACE(ex_load_table_op);
|
||||
|
||||
/* Validate lengths for the Signature, oem_id, and oem_table_id strings */
|
||||
|
||||
if ((operand[0]->string.length > ACPI_NAME_SIZE) ||
|
||||
(operand[1]->string.length > ACPI_OEM_ID_SIZE) ||
|
||||
(operand[2]->string.length > ACPI_OEM_TABLE_ID_SIZE)) {
|
||||
return_ACPI_STATUS(AE_AML_STRING_LIMIT);
|
||||
}
|
||||
|
||||
/* Find the ACPI table in the RSDT/XSDT */
|
||||
|
||||
status = acpi_tb_find_table(operand[0]->string.pointer,
|
||||
|
|
|
@ -486,6 +486,7 @@ acpi_ex_create_method(u8 * aml_start,
|
|||
|
||||
obj_desc->method.aml_start = aml_start;
|
||||
obj_desc->method.aml_length = aml_length;
|
||||
obj_desc->method.node = operand[0];
|
||||
|
||||
/*
|
||||
* Disassemble the method flags. Split off the arg_count, Serialized
|
||||
|
|
|
@ -43,11 +43,21 @@
|
|||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acnamesp.h"
|
||||
#include "acinterp.h"
|
||||
#include "acparser.h"
|
||||
|
||||
#define _COMPONENT ACPI_EXECUTER
|
||||
ACPI_MODULE_NAME("exdebug")
|
||||
|
||||
static union acpi_operand_object *acpi_gbl_trace_method_object = NULL;
|
||||
|
||||
/* Local prototypes */
|
||||
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type);
|
||||
#endif
|
||||
|
||||
#ifndef ACPI_NO_ERROR_MESSAGES
|
||||
/*******************************************************************************
|
||||
*
|
||||
|
@ -70,6 +80,7 @@ ACPI_MODULE_NAME("exdebug")
|
|||
* enabled if necessary.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
|
||||
u32 level, u32 index)
|
||||
|
@ -308,3 +319,316 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
|
|||
return_VOID;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_interpreter_trace_enabled
|
||||
*
|
||||
* PARAMETERS: name - Whether method name should be matched,
|
||||
* this should be checked before starting
|
||||
* the tracer
|
||||
*
|
||||
* RETURN: TRUE if interpreter trace is enabled.
|
||||
*
|
||||
* DESCRIPTION: Check whether interpreter trace is enabled
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static u8 acpi_ex_interpreter_trace_enabled(char *name)
|
||||
{
|
||||
|
||||
/* Check if tracing is enabled */
|
||||
|
||||
if (!(acpi_gbl_trace_flags & ACPI_TRACE_ENABLED)) {
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Check if tracing is filtered:
|
||||
*
|
||||
* 1. If the tracer is started, acpi_gbl_trace_method_object should have
|
||||
* been filled by the trace starter
|
||||
* 2. If the tracer is not started, acpi_gbl_trace_method_name should be
|
||||
* matched if it is specified
|
||||
* 3. If the tracer is oneshot style, acpi_gbl_trace_method_name should
|
||||
* not be cleared by the trace stopper during the first match
|
||||
*/
|
||||
if (acpi_gbl_trace_method_object) {
|
||||
return (TRUE);
|
||||
}
|
||||
if (name &&
|
||||
(acpi_gbl_trace_method_name &&
|
||||
strcmp(acpi_gbl_trace_method_name, name))) {
|
||||
return (FALSE);
|
||||
}
|
||||
if ((acpi_gbl_trace_flags & ACPI_TRACE_ONESHOT) &&
|
||||
!acpi_gbl_trace_method_name) {
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_get_trace_event_name
|
||||
*
|
||||
* PARAMETERS: type - Trace event type
|
||||
*
|
||||
* RETURN: Trace event name.
|
||||
*
|
||||
* DESCRIPTION: Used to obtain the full trace event name.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef ACPI_DEBUG_OUTPUT
|
||||
|
||||
static const char *acpi_ex_get_trace_event_name(acpi_trace_event_type type)
|
||||
{
|
||||
switch (type) {
|
||||
case ACPI_TRACE_AML_METHOD:
|
||||
|
||||
return "Method";
|
||||
|
||||
case ACPI_TRACE_AML_OPCODE:
|
||||
|
||||
return "Opcode";
|
||||
|
||||
case ACPI_TRACE_AML_REGION:
|
||||
|
||||
return "Region";
|
||||
|
||||
default:
|
||||
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_trace_point
|
||||
*
|
||||
* PARAMETERS: type - Trace event type
|
||||
* begin - TRUE if before execution
|
||||
* aml - Executed AML address
|
||||
* pathname - Object path
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Internal interpreter execution trace.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ex_trace_point(acpi_trace_event_type type,
|
||||
u8 begin, u8 *aml, char *pathname)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_NAME(ex_trace_point);
|
||||
|
||||
if (pathname) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
|
||||
"%s %s [0x%p:%s] execution.\n",
|
||||
acpi_ex_get_trace_event_name(type),
|
||||
begin ? "Begin" : "End", aml, pathname));
|
||||
} else {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_TRACE_POINT,
|
||||
"%s %s [0x%p] execution.\n",
|
||||
acpi_ex_get_trace_event_name(type),
|
||||
begin ? "Begin" : "End", aml));
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_start_trace_method
|
||||
*
|
||||
* PARAMETERS: method_node - Node of the method
|
||||
* obj_desc - The method object
|
||||
* walk_state - current state, NULL if not yet executing
|
||||
* a method.
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Start control method execution trace
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ex_start_trace_method(struct acpi_namespace_node *method_node,
|
||||
union acpi_operand_object *obj_desc,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
acpi_status status;
|
||||
char *pathname = NULL;
|
||||
u8 enabled = FALSE;
|
||||
|
||||
ACPI_FUNCTION_NAME(ex_start_trace_method);
|
||||
|
||||
if (method_node) {
|
||||
pathname = acpi_ns_get_normalized_pathname(method_node, TRUE);
|
||||
}
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
enabled = acpi_ex_interpreter_trace_enabled(pathname);
|
||||
if (enabled && !acpi_gbl_trace_method_object) {
|
||||
acpi_gbl_trace_method_object = obj_desc;
|
||||
acpi_gbl_original_dbg_level = acpi_dbg_level;
|
||||
acpi_gbl_original_dbg_layer = acpi_dbg_layer;
|
||||
acpi_dbg_level = ACPI_TRACE_LEVEL_ALL;
|
||||
acpi_dbg_layer = ACPI_TRACE_LAYER_ALL;
|
||||
|
||||
if (acpi_gbl_trace_dbg_level) {
|
||||
acpi_dbg_level = acpi_gbl_trace_dbg_level;
|
||||
}
|
||||
if (acpi_gbl_trace_dbg_layer) {
|
||||
acpi_dbg_layer = acpi_gbl_trace_dbg_layer;
|
||||
}
|
||||
}
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
|
||||
exit:
|
||||
if (enabled) {
|
||||
ACPI_TRACE_POINT(ACPI_TRACE_AML_METHOD, TRUE,
|
||||
obj_desc ? obj_desc->method.aml_start : NULL,
|
||||
pathname);
|
||||
}
|
||||
if (pathname) {
|
||||
ACPI_FREE(pathname);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_stop_trace_method
|
||||
*
|
||||
* PARAMETERS: method_node - Node of the method
|
||||
* obj_desc - The method object
|
||||
* walk_state - current state, NULL if not yet executing
|
||||
* a method.
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Stop control method execution trace
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ex_stop_trace_method(struct acpi_namespace_node *method_node,
|
||||
union acpi_operand_object *obj_desc,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
acpi_status status;
|
||||
char *pathname = NULL;
|
||||
u8 enabled;
|
||||
|
||||
ACPI_FUNCTION_NAME(ex_stop_trace_method);
|
||||
|
||||
if (method_node) {
|
||||
pathname = acpi_ns_get_normalized_pathname(method_node, TRUE);
|
||||
}
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit_path;
|
||||
}
|
||||
|
||||
enabled = acpi_ex_interpreter_trace_enabled(NULL);
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
|
||||
if (enabled) {
|
||||
ACPI_TRACE_POINT(ACPI_TRACE_AML_METHOD, FALSE,
|
||||
obj_desc ? obj_desc->method.aml_start : NULL,
|
||||
pathname);
|
||||
}
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto exit_path;
|
||||
}
|
||||
|
||||
/* Check whether the tracer should be stopped */
|
||||
|
||||
if (acpi_gbl_trace_method_object == obj_desc) {
|
||||
|
||||
/* Disable further tracing if type is one-shot */
|
||||
|
||||
if (acpi_gbl_trace_flags & ACPI_TRACE_ONESHOT) {
|
||||
acpi_gbl_trace_method_name = NULL;
|
||||
}
|
||||
|
||||
acpi_dbg_level = acpi_gbl_original_dbg_level;
|
||||
acpi_dbg_layer = acpi_gbl_original_dbg_layer;
|
||||
acpi_gbl_trace_method_object = NULL;
|
||||
}
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
|
||||
exit_path:
|
||||
if (pathname) {
|
||||
ACPI_FREE(pathname);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_start_trace_opcode
|
||||
*
|
||||
* PARAMETERS: op - The parser opcode object
|
||||
* walk_state - current state, NULL if not yet executing
|
||||
* a method.
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Start opcode execution trace
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ex_start_trace_opcode(union acpi_parse_object *op,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_NAME(ex_start_trace_opcode);
|
||||
|
||||
if (acpi_ex_interpreter_trace_enabled(NULL) &&
|
||||
(acpi_gbl_trace_flags & ACPI_TRACE_OPCODE)) {
|
||||
ACPI_TRACE_POINT(ACPI_TRACE_AML_OPCODE, TRUE,
|
||||
op->common.aml, op->common.aml_op_name);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ex_stop_trace_opcode
|
||||
*
|
||||
* PARAMETERS: op - The parser opcode object
|
||||
* walk_state - current state, NULL if not yet executing
|
||||
* a method.
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Stop opcode execution trace
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_ex_stop_trace_opcode(union acpi_parse_object *op,
|
||||
struct acpi_walk_state *walk_state)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_NAME(ex_stop_trace_opcode);
|
||||
|
||||
if (acpi_ex_interpreter_trace_enabled(NULL) &&
|
||||
(acpi_gbl_trace_flags & ACPI_TRACE_OPCODE)) {
|
||||
ACPI_TRACE_POINT(ACPI_TRACE_AML_OPCODE, FALSE,
|
||||
op->common.aml, op->common.aml_op_name);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -995,9 +995,8 @@ static void acpi_ex_dump_reference_obj(union acpi_operand_object *obj_desc)
|
|||
if (obj_desc->reference.class == ACPI_REFCLASS_NAME) {
|
||||
acpi_os_printf(" %p ", obj_desc->reference.node);
|
||||
|
||||
status =
|
||||
acpi_ns_handle_to_pathname(obj_desc->reference.node,
|
||||
&ret_buf);
|
||||
status = acpi_ns_handle_to_pathname(obj_desc->reference.node,
|
||||
&ret_buf, TRUE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_os_printf(" Could not convert name to pathname\n");
|
||||
} else {
|
||||
|
|
|
@ -126,7 +126,7 @@ acpi_ex_resolve_node_to_value(struct acpi_namespace_node **object_ptr,
|
|||
if (!source_desc) {
|
||||
ACPI_ERROR((AE_INFO, "No object attached to node [%4.4s] %p",
|
||||
node->name.ascii, node));
|
||||
return_ACPI_STATUS(AE_AML_NO_OPERAND);
|
||||
return_ACPI_STATUS(AE_AML_UNINITIALIZED_NODE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -337,8 +337,9 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
|
|||
acpi_object_type * return_type,
|
||||
union acpi_operand_object **return_desc)
|
||||
{
|
||||
union acpi_operand_object *obj_desc = (void *)operand;
|
||||
struct acpi_namespace_node *node;
|
||||
union acpi_operand_object *obj_desc = ACPI_CAST_PTR(void, operand);
|
||||
struct acpi_namespace_node *node =
|
||||
ACPI_CAST_PTR(struct acpi_namespace_node, operand);
|
||||
acpi_object_type type;
|
||||
acpi_status status;
|
||||
|
||||
|
@ -355,9 +356,7 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
|
|||
case ACPI_DESC_TYPE_NAMED:
|
||||
|
||||
type = ((struct acpi_namespace_node *)obj_desc)->type;
|
||||
obj_desc =
|
||||
acpi_ns_get_attached_object((struct acpi_namespace_node *)
|
||||
obj_desc);
|
||||
obj_desc = acpi_ns_get_attached_object(node);
|
||||
|
||||
/* If we had an Alias node, use the attached object for type info */
|
||||
|
||||
|
@ -368,6 +367,13 @@ acpi_ex_resolve_multiple(struct acpi_walk_state *walk_state,
|
|||
acpi_namespace_node *)
|
||||
obj_desc);
|
||||
}
|
||||
|
||||
if (!obj_desc) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"[%4.4s] Node is unresolved or uninitialized",
|
||||
acpi_ut_get_node_name(node)));
|
||||
return_ACPI_STATUS(AE_AML_UNINITIALIZED_NODE);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -160,19 +160,8 @@ acpi_set_firmware_waking_vectors(acpi_physical_address physical_address,
|
|||
|
||||
ACPI_FUNCTION_TRACE(acpi_set_firmware_waking_vectors);
|
||||
|
||||
/* If Hardware Reduced flag is set, there is no FACS */
|
||||
|
||||
if (acpi_gbl_reduced_hardware) {
|
||||
return_ACPI_STATUS (AE_OK);
|
||||
}
|
||||
|
||||
if (acpi_gbl_facs32) {
|
||||
(void)acpi_hw_set_firmware_waking_vectors(acpi_gbl_facs32,
|
||||
physical_address,
|
||||
physical_address64);
|
||||
}
|
||||
if (acpi_gbl_facs64) {
|
||||
(void)acpi_hw_set_firmware_waking_vectors(acpi_gbl_facs64,
|
||||
if (acpi_gbl_FACS) {
|
||||
(void)acpi_hw_set_firmware_waking_vectors(acpi_gbl_FACS,
|
||||
physical_address,
|
||||
physical_address64);
|
||||
}
|
||||
|
|
|
@ -274,6 +274,7 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)
|
|||
acpi_ex_exit_interpreter();
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
info->return_object = NULL;
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
|
@ -464,7 +465,8 @@ acpi_ns_exec_module_code(union acpi_operand_object *method_obj,
|
|||
|
||||
status = acpi_ns_evaluate(info);
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INIT, "Executed module-level code at %p\n",
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_INIT_NAMES,
|
||||
"Executed module-level code at %p\n",
|
||||
method_obj->method.aml_start));
|
||||
|
||||
/* Delete a possible implicit return value (in slack mode) */
|
||||
|
|
|
@ -111,7 +111,21 @@ acpi_ns_load_table(u32 table_index, struct acpi_namespace_node *node)
|
|||
if (ACPI_SUCCESS(status)) {
|
||||
acpi_tb_set_table_loaded_flag(table_index, TRUE);
|
||||
} else {
|
||||
(void)acpi_tb_release_owner_id(table_index);
|
||||
/*
|
||||
* On error, delete any namespace objects created by this table.
|
||||
* We cannot initialize these objects, so delete them. There are
|
||||
* a couple of expecially bad cases:
|
||||
* AE_ALREADY_EXISTS - namespace collision.
|
||||
* AE_NOT_FOUND - the target of a Scope operator does not
|
||||
* exist. This target of Scope must already exist in the
|
||||
* namespace, as per the ACPI specification.
|
||||
*/
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
acpi_ns_delete_namespace_by_owner(acpi_gbl_root_table_list.
|
||||
tables[table_index].owner_id);
|
||||
acpi_tb_release_owner_id(table_index);
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
unlock:
|
||||
|
|
|
@ -49,73 +49,6 @@
|
|||
#define _COMPONENT ACPI_NAMESPACE
|
||||
ACPI_MODULE_NAME("nsnames")
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_build_external_path
|
||||
*
|
||||
* PARAMETERS: node - NS node whose pathname is needed
|
||||
* size - Size of the pathname
|
||||
* *name_buffer - Where to return the pathname
|
||||
*
|
||||
* RETURN: Status
|
||||
* Places the pathname into the name_buffer, in external format
|
||||
* (name segments separated by path separators)
|
||||
*
|
||||
* DESCRIPTION: Generate a full pathaname
|
||||
*
|
||||
******************************************************************************/
|
||||
acpi_status
|
||||
acpi_ns_build_external_path(struct acpi_namespace_node *node,
|
||||
acpi_size size, char *name_buffer)
|
||||
{
|
||||
acpi_size index;
|
||||
struct acpi_namespace_node *parent_node;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/* Special case for root */
|
||||
|
||||
index = size - 1;
|
||||
if (index < ACPI_NAME_SIZE) {
|
||||
name_buffer[0] = AML_ROOT_PREFIX;
|
||||
name_buffer[1] = 0;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/* Store terminator byte, then build name backwards */
|
||||
|
||||
parent_node = node;
|
||||
name_buffer[index] = 0;
|
||||
|
||||
while ((index > ACPI_NAME_SIZE) && (parent_node != acpi_gbl_root_node)) {
|
||||
index -= ACPI_NAME_SIZE;
|
||||
|
||||
/* Put the name into the buffer */
|
||||
|
||||
ACPI_MOVE_32_TO_32((name_buffer + index), &parent_node->name);
|
||||
parent_node = parent_node->parent;
|
||||
|
||||
/* Prefix name with the path separator */
|
||||
|
||||
index--;
|
||||
name_buffer[index] = ACPI_PATH_SEPARATOR;
|
||||
}
|
||||
|
||||
/* Overwrite final separator with the root prefix character */
|
||||
|
||||
name_buffer[index] = AML_ROOT_PREFIX;
|
||||
|
||||
if (index != 0) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Could not construct external pathname; index=%u, size=%u, Path=%s",
|
||||
(u32) index, (u32) size, &name_buffer[size]));
|
||||
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_get_external_pathname
|
||||
|
@ -130,37 +63,13 @@ acpi_ns_build_external_path(struct acpi_namespace_node *node,
|
|||
* for error and debug statements.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
|
||||
{
|
||||
acpi_status status;
|
||||
char *name_buffer;
|
||||
acpi_size size;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ns_get_external_pathname, node);
|
||||
|
||||
/* Calculate required buffer size based on depth below root */
|
||||
|
||||
size = acpi_ns_get_pathname_length(node);
|
||||
if (!size) {
|
||||
return_PTR(NULL);
|
||||
}
|
||||
|
||||
/* Allocate a buffer to be returned to caller */
|
||||
|
||||
name_buffer = ACPI_ALLOCATE_ZEROED(size);
|
||||
if (!name_buffer) {
|
||||
ACPI_ERROR((AE_INFO, "Could not allocate %u bytes", (u32)size));
|
||||
return_PTR(NULL);
|
||||
}
|
||||
|
||||
/* Build the path in the allocated buffer */
|
||||
|
||||
status = acpi_ns_build_external_path(node, size, name_buffer);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_FREE(name_buffer);
|
||||
return_PTR(NULL);
|
||||
}
|
||||
name_buffer = acpi_ns_get_normalized_pathname(node, FALSE);
|
||||
|
||||
return_PTR(name_buffer);
|
||||
}
|
||||
|
@ -180,33 +89,12 @@ char *acpi_ns_get_external_pathname(struct acpi_namespace_node *node)
|
|||
acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node)
|
||||
{
|
||||
acpi_size size;
|
||||
struct acpi_namespace_node *next_node;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
/*
|
||||
* Compute length of pathname as 5 * number of name segments.
|
||||
* Go back up the parent tree to the root
|
||||
*/
|
||||
size = 0;
|
||||
next_node = node;
|
||||
size = acpi_ns_build_normalized_path(node, NULL, 0, FALSE);
|
||||
|
||||
while (next_node && (next_node != acpi_gbl_root_node)) {
|
||||
if (ACPI_GET_DESCRIPTOR_TYPE(next_node) != ACPI_DESC_TYPE_NAMED) {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Invalid Namespace Node (%p) while traversing namespace",
|
||||
next_node));
|
||||
return (0);
|
||||
}
|
||||
size += ACPI_PATH_SEGMENT_LENGTH;
|
||||
next_node = next_node->parent;
|
||||
}
|
||||
|
||||
if (!size) {
|
||||
size = 1; /* Root node case */
|
||||
}
|
||||
|
||||
return (size + 1); /* +1 for null string terminator */
|
||||
return (size);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -216,6 +104,8 @@ acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node)
|
|||
* PARAMETERS: target_handle - Handle of named object whose name is
|
||||
* to be found
|
||||
* buffer - Where the pathname is returned
|
||||
* no_trailing - Remove trailing '_' for each name
|
||||
* segment
|
||||
*
|
||||
* RETURN: Status, Buffer is filled with pathname if status is AE_OK
|
||||
*
|
||||
|
@ -225,7 +115,7 @@ acpi_size acpi_ns_get_pathname_length(struct acpi_namespace_node *node)
|
|||
|
||||
acpi_status
|
||||
acpi_ns_handle_to_pathname(acpi_handle target_handle,
|
||||
struct acpi_buffer * buffer)
|
||||
struct acpi_buffer * buffer, u8 no_trailing)
|
||||
{
|
||||
acpi_status status;
|
||||
struct acpi_namespace_node *node;
|
||||
|
@ -240,7 +130,8 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle,
|
|||
|
||||
/* Determine size required for the caller buffer */
|
||||
|
||||
required_size = acpi_ns_get_pathname_length(node);
|
||||
required_size =
|
||||
acpi_ns_build_normalized_path(node, NULL, 0, no_trailing);
|
||||
if (!required_size) {
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
@ -254,8 +145,8 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle,
|
|||
|
||||
/* Build the path in the caller buffer */
|
||||
|
||||
status =
|
||||
acpi_ns_build_external_path(node, required_size, buffer->pointer);
|
||||
(void)acpi_ns_build_normalized_path(node, buffer->pointer,
|
||||
required_size, no_trailing);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
@ -264,3 +155,149 @@ acpi_ns_handle_to_pathname(acpi_handle target_handle,
|
|||
(char *)buffer->pointer, (u32) required_size));
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_build_normalized_path
|
||||
*
|
||||
* PARAMETERS: node - Namespace node
|
||||
* full_path - Where the path name is returned
|
||||
* path_size - Size of returned path name buffer
|
||||
* no_trailing - Remove trailing '_' from each name segment
|
||||
*
|
||||
* RETURN: Return 1 if the AML path is empty, otherwise returning (length
|
||||
* of pathname + 1) which means the 'FullPath' contains a trailing
|
||||
* null.
|
||||
*
|
||||
* DESCRIPTION: Build and return a full namespace pathname.
|
||||
* Note that if the size of 'FullPath' isn't large enough to
|
||||
* contain the namespace node's path name, the actual required
|
||||
* buffer length is returned, and it should be greater than
|
||||
* 'PathSize'. So callers are able to check the returning value
|
||||
* to determine the buffer size of 'FullPath'.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u32
|
||||
acpi_ns_build_normalized_path(struct acpi_namespace_node *node,
|
||||
char *full_path, u32 path_size, u8 no_trailing)
|
||||
{
|
||||
u32 length = 0, i;
|
||||
char name[ACPI_NAME_SIZE];
|
||||
u8 do_no_trailing;
|
||||
char c, *left, *right;
|
||||
struct acpi_namespace_node *next_node;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ns_build_normalized_path, node);
|
||||
|
||||
#define ACPI_PATH_PUT8(path, size, byte, length) \
|
||||
do { \
|
||||
if ((length) < (size)) \
|
||||
{ \
|
||||
(path)[(length)] = (byte); \
|
||||
} \
|
||||
(length)++; \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Make sure the path_size is correct, so that we don't need to
|
||||
* validate both full_path and path_size.
|
||||
*/
|
||||
if (!full_path) {
|
||||
path_size = 0;
|
||||
}
|
||||
|
||||
if (!node) {
|
||||
goto build_trailing_null;
|
||||
}
|
||||
|
||||
next_node = node;
|
||||
while (next_node && next_node != acpi_gbl_root_node) {
|
||||
if (next_node != node) {
|
||||
ACPI_PATH_PUT8(full_path, path_size,
|
||||
AML_DUAL_NAME_PREFIX, length);
|
||||
}
|
||||
ACPI_MOVE_32_TO_32(name, &next_node->name);
|
||||
do_no_trailing = no_trailing;
|
||||
for (i = 0; i < 4; i++) {
|
||||
c = name[4 - i - 1];
|
||||
if (do_no_trailing && c != '_') {
|
||||
do_no_trailing = FALSE;
|
||||
}
|
||||
if (!do_no_trailing) {
|
||||
ACPI_PATH_PUT8(full_path, path_size, c, length);
|
||||
}
|
||||
}
|
||||
next_node = next_node->parent;
|
||||
}
|
||||
ACPI_PATH_PUT8(full_path, path_size, AML_ROOT_PREFIX, length);
|
||||
|
||||
/* Reverse the path string */
|
||||
|
||||
if (length <= path_size) {
|
||||
left = full_path;
|
||||
right = full_path + length - 1;
|
||||
while (left < right) {
|
||||
c = *left;
|
||||
*left++ = *right;
|
||||
*right-- = c;
|
||||
}
|
||||
}
|
||||
|
||||
/* Append the trailing null */
|
||||
|
||||
build_trailing_null:
|
||||
ACPI_PATH_PUT8(full_path, path_size, '\0', length);
|
||||
|
||||
#undef ACPI_PATH_PUT8
|
||||
|
||||
return_UINT32(length);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ns_get_normalized_pathname
|
||||
*
|
||||
* PARAMETERS: node - Namespace node whose pathname is needed
|
||||
* no_trailing - Remove trailing '_' from each name segment
|
||||
*
|
||||
* RETURN: Pointer to storage containing the fully qualified name of
|
||||
* the node, In external format (name segments separated by path
|
||||
* separators.)
|
||||
*
|
||||
* DESCRIPTION: Used to obtain the full pathname to a namespace node, usually
|
||||
* for error and debug statements. All trailing '_' will be
|
||||
* removed from the full pathname if 'NoTrailing' is specified..
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
char *acpi_ns_get_normalized_pathname(struct acpi_namespace_node *node,
|
||||
u8 no_trailing)
|
||||
{
|
||||
char *name_buffer;
|
||||
acpi_size size;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ns_get_normalized_pathname, node);
|
||||
|
||||
/* Calculate required buffer size based on depth below root */
|
||||
|
||||
size = acpi_ns_build_normalized_path(node, NULL, 0, no_trailing);
|
||||
if (!size) {
|
||||
return_PTR(NULL);
|
||||
}
|
||||
|
||||
/* Allocate a buffer to be returned to caller */
|
||||
|
||||
name_buffer = ACPI_ALLOCATE_ZEROED(size);
|
||||
if (!name_buffer) {
|
||||
ACPI_ERROR((AE_INFO, "Could not allocate %u bytes", (u32)size));
|
||||
return_PTR(NULL);
|
||||
}
|
||||
|
||||
/* Build the path in the allocated buffer */
|
||||
|
||||
(void)acpi_ns_build_normalized_path(node, name_buffer, size,
|
||||
no_trailing);
|
||||
|
||||
return_PTR(name_buffer);
|
||||
}
|
||||
|
|
|
@ -70,7 +70,7 @@ acpi_ns_one_complete_parse(u32 pass_number,
|
|||
{
|
||||
union acpi_parse_object *parse_root;
|
||||
acpi_status status;
|
||||
u32 aml_length;
|
||||
u32 aml_length;
|
||||
u8 *aml_start;
|
||||
struct acpi_walk_state *walk_state;
|
||||
struct acpi_table_header *table;
|
||||
|
@ -78,6 +78,20 @@ acpi_ns_one_complete_parse(u32 pass_number,
|
|||
|
||||
ACPI_FUNCTION_TRACE(ns_one_complete_parse);
|
||||
|
||||
status = acpi_get_table_by_index(table_index, &table);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Table must consist of at least a complete header */
|
||||
|
||||
if (table->length < sizeof(struct acpi_table_header)) {
|
||||
return_ACPI_STATUS(AE_BAD_HEADER);
|
||||
}
|
||||
|
||||
aml_start = (u8 *)table + sizeof(struct acpi_table_header);
|
||||
aml_length = table->length - sizeof(struct acpi_table_header);
|
||||
|
||||
status = acpi_tb_get_owner_id(table_index, &owner_id);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
|
@ -85,7 +99,7 @@ acpi_ns_one_complete_parse(u32 pass_number,
|
|||
|
||||
/* Create and init a Root Node */
|
||||
|
||||
parse_root = acpi_ps_create_scope_op();
|
||||
parse_root = acpi_ps_create_scope_op(aml_start);
|
||||
if (!parse_root) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
@ -98,23 +112,12 @@ acpi_ns_one_complete_parse(u32 pass_number,
|
|||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
||||
status = acpi_get_table_by_index(table_index, &table);
|
||||
status = acpi_ds_init_aml_walk(walk_state, parse_root, NULL,
|
||||
aml_start, aml_length, NULL,
|
||||
(u8)pass_number);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_ds_delete_walk_state(walk_state);
|
||||
acpi_ps_free_op(parse_root);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Table must consist of at least a complete header */
|
||||
|
||||
if (table->length < sizeof(struct acpi_table_header)) {
|
||||
status = AE_BAD_HEADER;
|
||||
} else {
|
||||
aml_start = (u8 *) table + sizeof(struct acpi_table_header);
|
||||
aml_length = table->length - sizeof(struct acpi_table_header);
|
||||
status = acpi_ds_init_aml_walk(walk_state, parse_root, NULL,
|
||||
aml_start, aml_length, NULL,
|
||||
(u8) pass_number);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* Found OSDT table, enable the namespace override feature */
|
||||
|
@ -124,11 +127,6 @@ acpi_ns_one_complete_parse(u32 pass_number,
|
|||
walk_state->namespace_override = TRUE;
|
||||
}
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_ds_delete_walk_state(walk_state);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* start_node is the default location to load the table */
|
||||
|
||||
if (start_node && start_node != acpi_gbl_root_node) {
|
||||
|
|
|
@ -83,7 +83,7 @@ acpi_ns_print_node_pathname(struct acpi_namespace_node *node,
|
|||
|
||||
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
|
||||
|
||||
status = acpi_ns_handle_to_pathname(node, &buffer);
|
||||
status = acpi_ns_handle_to_pathname(node, &buffer, TRUE);
|
||||
if (ACPI_SUCCESS(status)) {
|
||||
if (message) {
|
||||
acpi_os_printf("%s ", message);
|
||||
|
@ -596,6 +596,23 @@ void acpi_ns_terminate(void)
|
|||
|
||||
ACPI_FUNCTION_TRACE(ns_terminate);
|
||||
|
||||
#ifdef ACPI_EXEC_APP
|
||||
{
|
||||
union acpi_operand_object *prev;
|
||||
union acpi_operand_object *next;
|
||||
|
||||
/* Delete any module-level code blocks */
|
||||
|
||||
next = acpi_gbl_module_code_list;
|
||||
while (next) {
|
||||
prev = next;
|
||||
next = next->method.mutex;
|
||||
prev->method.mutex = NULL; /* Clear the Mutex (cheated) field */
|
||||
acpi_ut_remove_reference(prev);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Free the entire namespace -- all nodes and all objects
|
||||
* attached to the nodes
|
||||
|
|
|
@ -172,11 +172,15 @@ acpi_get_name(acpi_handle handle, u32 name_type, struct acpi_buffer * buffer)
|
|||
return (status);
|
||||
}
|
||||
|
||||
if (name_type == ACPI_FULL_PATHNAME) {
|
||||
if (name_type == ACPI_FULL_PATHNAME ||
|
||||
name_type == ACPI_FULL_PATHNAME_NO_TRAILING) {
|
||||
|
||||
/* Get the full pathname (From the namespace root) */
|
||||
|
||||
status = acpi_ns_handle_to_pathname(handle, buffer);
|
||||
status = acpi_ns_handle_to_pathname(handle, buffer,
|
||||
name_type ==
|
||||
ACPI_FULL_PATHNAME ? FALSE :
|
||||
TRUE);
|
||||
return (status);
|
||||
}
|
||||
|
||||
|
|
|
@ -287,7 +287,7 @@ acpi_ps_get_next_namepath(struct acpi_walk_state *walk_state,
|
|||
"Control Method - %p Desc %p Path=%p\n", node,
|
||||
method_desc, path));
|
||||
|
||||
name_op = acpi_ps_alloc_op(AML_INT_NAMEPATH_OP);
|
||||
name_op = acpi_ps_alloc_op(AML_INT_NAMEPATH_OP, start);
|
||||
if (!name_op) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
@ -484,7 +484,7 @@ acpi_ps_get_next_simple_arg(struct acpi_parse_state *parser_state,
|
|||
static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
|
||||
*parser_state)
|
||||
{
|
||||
u32 aml_offset;
|
||||
u8 *aml;
|
||||
union acpi_parse_object *field;
|
||||
union acpi_parse_object *arg = NULL;
|
||||
u16 opcode;
|
||||
|
@ -498,8 +498,7 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
|
|||
|
||||
ACPI_FUNCTION_TRACE(ps_get_next_field);
|
||||
|
||||
aml_offset =
|
||||
(u32)ACPI_PTR_DIFF(parser_state->aml, parser_state->aml_start);
|
||||
aml = parser_state->aml;
|
||||
|
||||
/* Determine field type */
|
||||
|
||||
|
@ -536,13 +535,11 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
|
|||
|
||||
/* Allocate a new field op */
|
||||
|
||||
field = acpi_ps_alloc_op(opcode);
|
||||
field = acpi_ps_alloc_op(opcode, aml);
|
||||
if (!field) {
|
||||
return_PTR(NULL);
|
||||
}
|
||||
|
||||
field->common.aml_offset = aml_offset;
|
||||
|
||||
/* Decode the field type */
|
||||
|
||||
switch (opcode) {
|
||||
|
@ -604,6 +601,7 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
|
|||
* Argument for Connection operator can be either a Buffer
|
||||
* (resource descriptor), or a name_string.
|
||||
*/
|
||||
aml = parser_state->aml;
|
||||
if (ACPI_GET8(parser_state->aml) == AML_BUFFER_OP) {
|
||||
parser_state->aml++;
|
||||
|
||||
|
@ -616,7 +614,8 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
|
|||
|
||||
/* Non-empty list */
|
||||
|
||||
arg = acpi_ps_alloc_op(AML_INT_BYTELIST_OP);
|
||||
arg =
|
||||
acpi_ps_alloc_op(AML_INT_BYTELIST_OP, aml);
|
||||
if (!arg) {
|
||||
acpi_ps_free_op(field);
|
||||
return_PTR(NULL);
|
||||
|
@ -665,7 +664,7 @@ static union acpi_parse_object *acpi_ps_get_next_field(struct acpi_parse_state
|
|||
|
||||
parser_state->aml = pkg_end;
|
||||
} else {
|
||||
arg = acpi_ps_alloc_op(AML_INT_NAMEPATH_OP);
|
||||
arg = acpi_ps_alloc_op(AML_INT_NAMEPATH_OP, aml);
|
||||
if (!arg) {
|
||||
acpi_ps_free_op(field);
|
||||
return_PTR(NULL);
|
||||
|
@ -730,7 +729,7 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
|
|||
|
||||
/* Constants, strings, and namestrings are all the same size */
|
||||
|
||||
arg = acpi_ps_alloc_op(AML_BYTE_OP);
|
||||
arg = acpi_ps_alloc_op(AML_BYTE_OP, parser_state->aml);
|
||||
if (!arg) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
@ -777,7 +776,8 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
|
|||
|
||||
/* Non-empty list */
|
||||
|
||||
arg = acpi_ps_alloc_op(AML_INT_BYTELIST_OP);
|
||||
arg = acpi_ps_alloc_op(AML_INT_BYTELIST_OP,
|
||||
parser_state->aml);
|
||||
if (!arg) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
@ -807,7 +807,9 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
|
|||
|
||||
/* null_name or name_string */
|
||||
|
||||
arg = acpi_ps_alloc_op(AML_INT_NAMEPATH_OP);
|
||||
arg =
|
||||
acpi_ps_alloc_op(AML_INT_NAMEPATH_OP,
|
||||
parser_state->aml);
|
||||
if (!arg) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
#include "acparser.h"
|
||||
#include "acdispat.h"
|
||||
#include "amlcode.h"
|
||||
|
@ -125,10 +126,7 @@ acpi_ps_get_arguments(struct acpi_walk_state *walk_state,
|
|||
*/
|
||||
while (GET_CURRENT_ARG_TYPE(walk_state->arg_types)
|
||||
&& !walk_state->arg_count) {
|
||||
walk_state->aml_offset =
|
||||
(u32) ACPI_PTR_DIFF(walk_state->parser_state.aml,
|
||||
walk_state->parser_state.
|
||||
aml_start);
|
||||
walk_state->aml = walk_state->parser_state.aml;
|
||||
|
||||
status =
|
||||
acpi_ps_get_next_arg(walk_state,
|
||||
|
@ -140,7 +138,6 @@ acpi_ps_get_arguments(struct acpi_walk_state *walk_state,
|
|||
}
|
||||
|
||||
if (arg) {
|
||||
arg->common.aml_offset = walk_state->aml_offset;
|
||||
acpi_ps_append_arg(op, arg);
|
||||
}
|
||||
|
||||
|
@ -324,6 +321,8 @@ acpi_ps_link_module_code(union acpi_parse_object *parent_op,
|
|||
union acpi_operand_object *method_obj;
|
||||
struct acpi_namespace_node *parent_node;
|
||||
|
||||
ACPI_FUNCTION_TRACE(ps_link_module_code);
|
||||
|
||||
/* Get the tail of the list */
|
||||
|
||||
prev = next = acpi_gbl_module_code_list;
|
||||
|
@ -343,9 +342,13 @@ acpi_ps_link_module_code(union acpi_parse_object *parent_op,
|
|||
|
||||
method_obj = acpi_ut_create_internal_object(ACPI_TYPE_METHOD);
|
||||
if (!method_obj) {
|
||||
return;
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
|
||||
"Create/Link new code block: %p\n",
|
||||
method_obj));
|
||||
|
||||
if (parent_op->common.node) {
|
||||
parent_node = parent_op->common.node;
|
||||
} else {
|
||||
|
@ -370,8 +373,14 @@ acpi_ps_link_module_code(union acpi_parse_object *parent_op,
|
|||
prev->method.mutex = method_obj;
|
||||
}
|
||||
} else {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
|
||||
"Appending to existing code block: %p\n",
|
||||
prev));
|
||||
|
||||
prev->method.aml_length += aml_length;
|
||||
}
|
||||
|
||||
return_VOID;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -494,16 +503,7 @@ acpi_status acpi_ps_parse_loop(struct acpi_walk_state *walk_state)
|
|||
continue;
|
||||
}
|
||||
|
||||
op->common.aml_offset = walk_state->aml_offset;
|
||||
|
||||
if (walk_state->op_info) {
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
|
||||
"Opcode %4.4X [%s] Op %p Aml %p AmlOffset %5.5X\n",
|
||||
(u32) op->common.aml_opcode,
|
||||
walk_state->op_info->name, op,
|
||||
parser_state->aml,
|
||||
op->common.aml_offset));
|
||||
}
|
||||
acpi_ex_start_trace_opcode(op, walk_state);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -66,12 +66,11 @@ static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state);
|
|||
|
||||
static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state)
|
||||
{
|
||||
u32 aml_offset;
|
||||
|
||||
ACPI_FUNCTION_TRACE_PTR(ps_get_aml_opcode, walk_state);
|
||||
|
||||
walk_state->aml_offset =
|
||||
(u32)ACPI_PTR_DIFF(walk_state->parser_state.aml,
|
||||
walk_state->parser_state.aml_start);
|
||||
walk_state->aml = walk_state->parser_state.aml;
|
||||
walk_state->opcode = acpi_ps_peek_opcode(&(walk_state->parser_state));
|
||||
|
||||
/*
|
||||
|
@ -98,10 +97,14 @@ static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state)
|
|||
/* The opcode is unrecognized. Complain and skip unknown opcodes */
|
||||
|
||||
if (walk_state->pass_number == 2) {
|
||||
aml_offset = (u32)ACPI_PTR_DIFF(walk_state->aml,
|
||||
walk_state->
|
||||
parser_state.aml_start);
|
||||
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"Unknown opcode 0x%.2X at table offset 0x%.4X, ignoring",
|
||||
walk_state->opcode,
|
||||
(u32)(walk_state->aml_offset +
|
||||
(u32)(aml_offset +
|
||||
sizeof(struct acpi_table_header))));
|
||||
|
||||
ACPI_DUMP_BUFFER((walk_state->parser_state.aml - 16),
|
||||
|
@ -115,14 +118,14 @@ static acpi_status acpi_ps_get_aml_opcode(struct acpi_walk_state *walk_state)
|
|||
acpi_os_printf
|
||||
("/*\nError: Unknown opcode 0x%.2X at table offset 0x%.4X, context:\n",
|
||||
walk_state->opcode,
|
||||
(u32)(walk_state->aml_offset +
|
||||
(u32)(aml_offset +
|
||||
sizeof(struct acpi_table_header)));
|
||||
|
||||
/* Dump the context surrounding the invalid opcode */
|
||||
|
||||
acpi_ut_dump_buffer(((u8 *)walk_state->parser_state.
|
||||
aml - 16), 48, DB_BYTE_DISPLAY,
|
||||
(walk_state->aml_offset +
|
||||
(aml_offset +
|
||||
sizeof(struct acpi_table_header) -
|
||||
16));
|
||||
acpi_os_printf(" */\n");
|
||||
|
@ -294,7 +297,7 @@ acpi_ps_create_op(struct acpi_walk_state *walk_state,
|
|||
/* Create Op structure and append to parent's argument list */
|
||||
|
||||
walk_state->op_info = acpi_ps_get_opcode_info(walk_state->opcode);
|
||||
op = acpi_ps_alloc_op(walk_state->opcode);
|
||||
op = acpi_ps_alloc_op(walk_state->opcode, aml_op_start);
|
||||
if (!op) {
|
||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||
}
|
||||
|
|
|
@ -147,6 +147,8 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
|
|||
return_ACPI_STATUS(AE_OK); /* OK for now */
|
||||
}
|
||||
|
||||
acpi_ex_stop_trace_opcode(op, walk_state);
|
||||
|
||||
/* Delete this op and the subtree below it if asked to */
|
||||
|
||||
if (((walk_state->parse_flags & ACPI_PARSE_TREE_MASK) !=
|
||||
|
@ -185,7 +187,8 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
|
|||
* op must be replaced by a placeholder return op
|
||||
*/
|
||||
replacement_op =
|
||||
acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP);
|
||||
acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP,
|
||||
op->common.aml);
|
||||
if (!replacement_op) {
|
||||
status = AE_NO_MEMORY;
|
||||
}
|
||||
|
@ -209,7 +212,8 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
|
|||
|| (op->common.parent->common.aml_opcode ==
|
||||
AML_VAR_PACKAGE_OP)) {
|
||||
replacement_op =
|
||||
acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP);
|
||||
acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP,
|
||||
op->common.aml);
|
||||
if (!replacement_op) {
|
||||
status = AE_NO_MEMORY;
|
||||
}
|
||||
|
@ -224,7 +228,8 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
|
|||
AML_VAR_PACKAGE_OP)) {
|
||||
replacement_op =
|
||||
acpi_ps_alloc_op(op->common.
|
||||
aml_opcode);
|
||||
aml_opcode,
|
||||
op->common.aml);
|
||||
if (!replacement_op) {
|
||||
status = AE_NO_MEMORY;
|
||||
} else {
|
||||
|
@ -240,7 +245,8 @@ acpi_ps_complete_this_op(struct acpi_walk_state * walk_state,
|
|||
default:
|
||||
|
||||
replacement_op =
|
||||
acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP);
|
||||
acpi_ps_alloc_op(AML_INT_RETURN_VALUE_OP,
|
||||
op->common.aml);
|
||||
if (!replacement_op) {
|
||||
status = AE_NO_MEMORY;
|
||||
}
|
||||
|
|
|
@ -60,11 +60,11 @@ ACPI_MODULE_NAME("psutils")
|
|||
* DESCRIPTION: Create a Scope and associated namepath op with the root name
|
||||
*
|
||||
******************************************************************************/
|
||||
union acpi_parse_object *acpi_ps_create_scope_op(void)
|
||||
union acpi_parse_object *acpi_ps_create_scope_op(u8 *aml)
|
||||
{
|
||||
union acpi_parse_object *scope_op;
|
||||
|
||||
scope_op = acpi_ps_alloc_op(AML_SCOPE_OP);
|
||||
scope_op = acpi_ps_alloc_op(AML_SCOPE_OP, aml);
|
||||
if (!scope_op) {
|
||||
return (NULL);
|
||||
}
|
||||
|
@ -103,6 +103,7 @@ void acpi_ps_init_op(union acpi_parse_object *op, u16 opcode)
|
|||
* FUNCTION: acpi_ps_alloc_op
|
||||
*
|
||||
* PARAMETERS: opcode - Opcode that will be stored in the new Op
|
||||
* aml - Address of the opcode
|
||||
*
|
||||
* RETURN: Pointer to the new Op, null on failure
|
||||
*
|
||||
|
@ -112,7 +113,7 @@ void acpi_ps_init_op(union acpi_parse_object *op, u16 opcode)
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
union acpi_parse_object *acpi_ps_alloc_op(u16 opcode)
|
||||
union acpi_parse_object *acpi_ps_alloc_op(u16 opcode, u8 *aml)
|
||||
{
|
||||
union acpi_parse_object *op;
|
||||
const struct acpi_opcode_info *op_info;
|
||||
|
@ -149,6 +150,7 @@ union acpi_parse_object *acpi_ps_alloc_op(u16 opcode)
|
|||
|
||||
if (op) {
|
||||
acpi_ps_init_op(op, opcode);
|
||||
op->common.aml = aml;
|
||||
op->common.flags = flags;
|
||||
}
|
||||
|
||||
|
|
|
@ -47,15 +47,12 @@
|
|||
#include "acdispat.h"
|
||||
#include "acinterp.h"
|
||||
#include "actables.h"
|
||||
#include "acnamesp.h"
|
||||
|
||||
#define _COMPONENT ACPI_PARSER
|
||||
ACPI_MODULE_NAME("psxface")
|
||||
|
||||
/* Local Prototypes */
|
||||
static void acpi_ps_start_trace(struct acpi_evaluate_info *info);
|
||||
|
||||
static void acpi_ps_stop_trace(struct acpi_evaluate_info *info);
|
||||
|
||||
static void
|
||||
acpi_ps_update_parameter_list(struct acpi_evaluate_info *info, u16 action);
|
||||
|
||||
|
@ -76,7 +73,7 @@ acpi_ps_update_parameter_list(struct acpi_evaluate_info *info, u16 action);
|
|||
******************************************************************************/
|
||||
|
||||
acpi_status
|
||||
acpi_debug_trace(char *name, u32 debug_level, u32 debug_layer, u32 flags)
|
||||
acpi_debug_trace(const char *name, u32 debug_level, u32 debug_layer, u32 flags)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
|
@ -85,108 +82,14 @@ acpi_debug_trace(char *name, u32 debug_level, u32 debug_layer, u32 flags)
|
|||
return (status);
|
||||
}
|
||||
|
||||
/* TBDs: Validate name, allow full path or just nameseg */
|
||||
|
||||
acpi_gbl_trace_method_name = *ACPI_CAST_PTR(u32, name);
|
||||
acpi_gbl_trace_method_name = name;
|
||||
acpi_gbl_trace_flags = flags;
|
||||
|
||||
if (debug_level) {
|
||||
acpi_gbl_trace_dbg_level = debug_level;
|
||||
}
|
||||
if (debug_layer) {
|
||||
acpi_gbl_trace_dbg_layer = debug_layer;
|
||||
}
|
||||
acpi_gbl_trace_dbg_level = debug_level;
|
||||
acpi_gbl_trace_dbg_layer = debug_layer;
|
||||
status = AE_OK;
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_start_trace
|
||||
*
|
||||
* PARAMETERS: info - Method info struct
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Start control method execution trace
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void acpi_ps_start_trace(struct acpi_evaluate_info *info)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((!acpi_gbl_trace_method_name) ||
|
||||
(acpi_gbl_trace_method_name != info->node->name.integer)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
acpi_gbl_original_dbg_level = acpi_dbg_level;
|
||||
acpi_gbl_original_dbg_layer = acpi_dbg_layer;
|
||||
|
||||
acpi_dbg_level = 0x00FFFFFF;
|
||||
acpi_dbg_layer = ACPI_UINT32_MAX;
|
||||
|
||||
if (acpi_gbl_trace_dbg_level) {
|
||||
acpi_dbg_level = acpi_gbl_trace_dbg_level;
|
||||
}
|
||||
if (acpi_gbl_trace_dbg_layer) {
|
||||
acpi_dbg_layer = acpi_gbl_trace_dbg_layer;
|
||||
}
|
||||
|
||||
exit:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ps_stop_trace
|
||||
*
|
||||
* PARAMETERS: info - Method info struct
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Stop control method execution trace
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
static void acpi_ps_stop_trace(struct acpi_evaluate_info *info)
|
||||
{
|
||||
acpi_status status;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
status = acpi_ut_acquire_mutex(ACPI_MTX_NAMESPACE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((!acpi_gbl_trace_method_name) ||
|
||||
(acpi_gbl_trace_method_name != info->node->name.integer)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* Disable further tracing if type is one-shot */
|
||||
|
||||
if (acpi_gbl_trace_flags & 1) {
|
||||
acpi_gbl_trace_method_name = 0;
|
||||
acpi_gbl_trace_dbg_level = 0;
|
||||
acpi_gbl_trace_dbg_layer = 0;
|
||||
}
|
||||
|
||||
acpi_dbg_level = acpi_gbl_original_dbg_level;
|
||||
acpi_dbg_layer = acpi_gbl_original_dbg_layer;
|
||||
|
||||
exit:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
return (status);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
@ -212,7 +115,7 @@ static void acpi_ps_stop_trace(struct acpi_evaluate_info *info)
|
|||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info)
|
||||
acpi_status acpi_ps_execute_method(struct acpi_evaluate_info * info)
|
||||
{
|
||||
acpi_status status;
|
||||
union acpi_parse_object *op;
|
||||
|
@ -243,10 +146,6 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info)
|
|||
*/
|
||||
acpi_ps_update_parameter_list(info, REF_INCREMENT);
|
||||
|
||||
/* Begin tracing if requested */
|
||||
|
||||
acpi_ps_start_trace(info);
|
||||
|
||||
/*
|
||||
* Execute the method. Performs parse simultaneously
|
||||
*/
|
||||
|
@ -256,7 +155,7 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info)
|
|||
|
||||
/* Create and init a Root Node */
|
||||
|
||||
op = acpi_ps_create_scope_op();
|
||||
op = acpi_ps_create_scope_op(info->obj_desc->method.aml_start);
|
||||
if (!op) {
|
||||
status = AE_NO_MEMORY;
|
||||
goto cleanup;
|
||||
|
@ -326,10 +225,6 @@ acpi_status acpi_ps_execute_method(struct acpi_evaluate_info *info)
|
|||
cleanup:
|
||||
acpi_ps_delete_parse_tree(op);
|
||||
|
||||
/* End optional tracing */
|
||||
|
||||
acpi_ps_stop_trace(info);
|
||||
|
||||
/* Take away the extra reference that we gave the parameters above */
|
||||
|
||||
acpi_ps_update_parameter_list(info, REF_DECREMENT);
|
||||
|
|
|
@ -348,7 +348,8 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
|
|||
status =
|
||||
acpi_ns_handle_to_pathname((acpi_handle)
|
||||
node,
|
||||
&path_buffer);
|
||||
&path_buffer,
|
||||
FALSE);
|
||||
|
||||
/* +1 to include null terminator */
|
||||
|
||||
|
|
|
@ -345,7 +345,7 @@ void acpi_tb_parse_fadt(u32 table_index)
|
|||
/* Obtain the DSDT and FACS tables via their addresses within the FADT */
|
||||
|
||||
acpi_tb_install_fixed_table((acpi_physical_address) acpi_gbl_FADT.Xdsdt,
|
||||
ACPI_SIG_DSDT, ACPI_TABLE_INDEX_DSDT);
|
||||
ACPI_SIG_DSDT, &acpi_gbl_dsdt_index);
|
||||
|
||||
/* If Hardware Reduced flag is set, there is no FACS */
|
||||
|
||||
|
@ -354,13 +354,13 @@ void acpi_tb_parse_fadt(u32 table_index)
|
|||
acpi_tb_install_fixed_table((acpi_physical_address)
|
||||
acpi_gbl_FADT.facs,
|
||||
ACPI_SIG_FACS,
|
||||
ACPI_TABLE_INDEX_FACS);
|
||||
&acpi_gbl_facs_index);
|
||||
}
|
||||
if (acpi_gbl_FADT.Xfacs) {
|
||||
acpi_tb_install_fixed_table((acpi_physical_address)
|
||||
acpi_gbl_FADT.Xfacs,
|
||||
ACPI_SIG_FACS,
|
||||
ACPI_TABLE_INDEX_X_FACS);
|
||||
&acpi_gbl_xfacs_index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -68,12 +68,25 @@ acpi_status
|
|||
acpi_tb_find_table(char *signature,
|
||||
char *oem_id, char *oem_table_id, u32 *table_index)
|
||||
{
|
||||
u32 i;
|
||||
acpi_status status;
|
||||
struct acpi_table_header header;
|
||||
u32 i;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_find_table);
|
||||
|
||||
/* Validate the input table signature */
|
||||
|
||||
if (!acpi_is_valid_signature(signature)) {
|
||||
return_ACPI_STATUS(AE_BAD_SIGNATURE);
|
||||
}
|
||||
|
||||
/* Don't allow the OEM strings to be too long */
|
||||
|
||||
if ((strlen(oem_id) > ACPI_OEM_ID_SIZE) ||
|
||||
(strlen(oem_table_id) > ACPI_OEM_TABLE_ID_SIZE)) {
|
||||
return_ACPI_STATUS(AE_AML_STRING_LIMIT);
|
||||
}
|
||||
|
||||
/* Normalize the input strings */
|
||||
|
||||
memset(&header, 0, sizeof(struct acpi_table_header));
|
||||
|
|
|
@ -100,9 +100,9 @@ acpi_tb_compare_tables(struct acpi_table_desc *table_desc, u32 table_index)
|
|||
*
|
||||
* FUNCTION: acpi_tb_install_table_with_override
|
||||
*
|
||||
* PARAMETERS: table_index - Index into root table array
|
||||
* new_table_desc - New table descriptor to install
|
||||
* PARAMETERS: new_table_desc - New table descriptor to install
|
||||
* override - Whether override should be performed
|
||||
* table_index - Where the table index is returned
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
|
@ -114,12 +114,14 @@ acpi_tb_compare_tables(struct acpi_table_desc *table_desc, u32 table_index)
|
|||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_tb_install_table_with_override(u32 table_index,
|
||||
struct acpi_table_desc *new_table_desc,
|
||||
u8 override)
|
||||
acpi_tb_install_table_with_override(struct acpi_table_desc *new_table_desc,
|
||||
u8 override, u32 *table_index)
|
||||
{
|
||||
u32 i;
|
||||
acpi_status status;
|
||||
|
||||
if (table_index >= acpi_gbl_root_table_list.current_table_count) {
|
||||
status = acpi_tb_get_next_table_descriptor(&i, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -134,8 +136,7 @@ acpi_tb_install_table_with_override(u32 table_index,
|
|||
acpi_tb_override_table(new_table_desc);
|
||||
}
|
||||
|
||||
acpi_tb_init_table_descriptor(&acpi_gbl_root_table_list.
|
||||
tables[table_index],
|
||||
acpi_tb_init_table_descriptor(&acpi_gbl_root_table_list.tables[i],
|
||||
new_table_desc->address,
|
||||
new_table_desc->flags,
|
||||
new_table_desc->pointer);
|
||||
|
@ -143,9 +144,13 @@ acpi_tb_install_table_with_override(u32 table_index,
|
|||
acpi_tb_print_table_header(new_table_desc->address,
|
||||
new_table_desc->pointer);
|
||||
|
||||
/* This synchronizes acpi_gbl_dsdt_index */
|
||||
|
||||
*table_index = i;
|
||||
|
||||
/* Set the global integer width (based upon revision of the DSDT) */
|
||||
|
||||
if (table_index == ACPI_TABLE_INDEX_DSDT) {
|
||||
if (i == acpi_gbl_dsdt_index) {
|
||||
acpi_ut_set_integer_width(new_table_desc->pointer->revision);
|
||||
}
|
||||
}
|
||||
|
@ -157,7 +162,7 @@ acpi_tb_install_table_with_override(u32 table_index,
|
|||
* PARAMETERS: address - Physical address of DSDT or FACS
|
||||
* signature - Table signature, NULL if no need to
|
||||
* match
|
||||
* table_index - Index into root table array
|
||||
* table_index - Where the table index is returned
|
||||
*
|
||||
* RETURN: Status
|
||||
*
|
||||
|
@ -168,7 +173,7 @@ acpi_tb_install_table_with_override(u32 table_index,
|
|||
|
||||
acpi_status
|
||||
acpi_tb_install_fixed_table(acpi_physical_address address,
|
||||
char *signature, u32 table_index)
|
||||
char *signature, u32 *table_index)
|
||||
{
|
||||
struct acpi_table_desc new_table_desc;
|
||||
acpi_status status;
|
||||
|
@ -200,7 +205,9 @@ acpi_tb_install_fixed_table(acpi_physical_address address,
|
|||
goto release_and_exit;
|
||||
}
|
||||
|
||||
acpi_tb_install_table_with_override(table_index, &new_table_desc, TRUE);
|
||||
/* Add the table to the global root table list */
|
||||
|
||||
acpi_tb_install_table_with_override(&new_table_desc, TRUE, table_index);
|
||||
|
||||
release_and_exit:
|
||||
|
||||
|
@ -355,13 +362,8 @@ acpi_tb_install_standard_table(acpi_physical_address address,
|
|||
|
||||
/* Add the table to the global root table list */
|
||||
|
||||
status = acpi_tb_get_next_table_descriptor(&i, NULL);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
goto release_and_exit;
|
||||
}
|
||||
|
||||
*table_index = i;
|
||||
acpi_tb_install_table_with_override(i, &new_table_desc, override);
|
||||
acpi_tb_install_table_with_override(&new_table_desc, override,
|
||||
table_index);
|
||||
|
||||
release_and_exit:
|
||||
|
||||
|
|
|
@ -68,28 +68,27 @@ acpi_tb_get_root_table_entry(u8 *table_entry, u32 table_entry_size);
|
|||
|
||||
acpi_status acpi_tb_initialize_facs(void)
|
||||
{
|
||||
struct acpi_table_facs *facs;
|
||||
|
||||
/* If Hardware Reduced flag is set, there is no FACS */
|
||||
|
||||
if (acpi_gbl_reduced_hardware) {
|
||||
acpi_gbl_FACS = NULL;
|
||||
return (AE_OK);
|
||||
}
|
||||
|
||||
(void)acpi_get_table_by_index(ACPI_TABLE_INDEX_FACS,
|
||||
ACPI_CAST_INDIRECT_PTR(struct
|
||||
acpi_table_header,
|
||||
&acpi_gbl_facs32));
|
||||
(void)acpi_get_table_by_index(ACPI_TABLE_INDEX_X_FACS,
|
||||
ACPI_CAST_INDIRECT_PTR(struct
|
||||
acpi_table_header,
|
||||
&acpi_gbl_facs64));
|
||||
|
||||
if (acpi_gbl_facs64
|
||||
&& (!acpi_gbl_facs32 || !acpi_gbl_use32_bit_facs_addresses)) {
|
||||
acpi_gbl_FACS = acpi_gbl_facs64;
|
||||
} else if (acpi_gbl_facs32) {
|
||||
acpi_gbl_FACS = acpi_gbl_facs32;
|
||||
} else if (acpi_gbl_FADT.Xfacs &&
|
||||
(!acpi_gbl_FADT.facs
|
||||
|| !acpi_gbl_use32_bit_facs_addresses)) {
|
||||
(void)acpi_get_table_by_index(acpi_gbl_xfacs_index,
|
||||
ACPI_CAST_INDIRECT_PTR(struct
|
||||
acpi_table_header,
|
||||
&facs));
|
||||
acpi_gbl_FACS = facs;
|
||||
} else if (acpi_gbl_FADT.facs) {
|
||||
(void)acpi_get_table_by_index(acpi_gbl_facs_index,
|
||||
ACPI_CAST_INDIRECT_PTR(struct
|
||||
acpi_table_header,
|
||||
&facs));
|
||||
acpi_gbl_FACS = facs;
|
||||
}
|
||||
|
||||
/* If there is no FACS, just continue. There was already an error msg */
|
||||
|
@ -192,7 +191,7 @@ struct acpi_table_header *acpi_tb_copy_dsdt(u32 table_index)
|
|||
acpi_tb_uninstall_table(table_desc);
|
||||
|
||||
acpi_tb_init_table_descriptor(&acpi_gbl_root_table_list.
|
||||
tables[ACPI_TABLE_INDEX_DSDT],
|
||||
tables[acpi_gbl_dsdt_index],
|
||||
ACPI_PTR_TO_PHYSADDR(new_table),
|
||||
ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL,
|
||||
new_table);
|
||||
|
@ -369,13 +368,6 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
|
|||
table_entry_size);
|
||||
table_entry = ACPI_ADD_PTR(u8, table, sizeof(struct acpi_table_header));
|
||||
|
||||
/*
|
||||
* First three entries in the table array are reserved for the DSDT
|
||||
* and 32bit/64bit FACS, which are not actually present in the
|
||||
* RSDT/XSDT - they come from the FADT
|
||||
*/
|
||||
acpi_gbl_root_table_list.current_table_count = 3;
|
||||
|
||||
/* Initialize the root table array from the RSDT/XSDT */
|
||||
|
||||
for (i = 0; i < table_count; i++) {
|
||||
|
@ -412,3 +404,36 @@ acpi_status __init acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
|
|||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_is_valid_signature
|
||||
*
|
||||
* PARAMETERS: signature - Sig string to be validated
|
||||
*
|
||||
* RETURN: TRUE if signature is correct length and has valid characters
|
||||
*
|
||||
* DESCRIPTION: Validate an ACPI table signature.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_is_valid_signature(char *signature)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
/* Validate the signature length */
|
||||
|
||||
if (strlen(signature) != ACPI_NAME_SIZE) {
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
/* Validate each character in the signature */
|
||||
|
||||
for (i = 0; i < ACPI_NAME_SIZE; i++) {
|
||||
if (!acpi_ut_valid_acpi_char(signature[i], i)) {
|
||||
return (FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
return (TRUE);
|
||||
}
|
||||
|
|
|
@ -51,9 +51,6 @@
|
|||
#define _COMPONENT ACPI_TABLES
|
||||
ACPI_MODULE_NAME("tbxfload")
|
||||
|
||||
/* Local prototypes */
|
||||
static acpi_status acpi_tb_load_namespace(void);
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_load_tables
|
||||
|
@ -65,7 +62,6 @@ static acpi_status acpi_tb_load_namespace(void);
|
|||
* DESCRIPTION: Load the ACPI tables from the RSDT/XSDT
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status __init acpi_load_tables(void)
|
||||
{
|
||||
acpi_status status;
|
||||
|
@ -75,6 +71,13 @@ acpi_status __init acpi_load_tables(void)
|
|||
/* Load the namespace from the tables */
|
||||
|
||||
status = acpi_tb_load_namespace();
|
||||
|
||||
/* Don't let single failures abort the load */
|
||||
|
||||
if (status == AE_CTRL_TERMINATE) {
|
||||
status = AE_OK;
|
||||
}
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"While loading namespace from ACPI tables"));
|
||||
|
@ -97,11 +100,14 @@ ACPI_EXPORT_SYMBOL_INIT(acpi_load_tables)
|
|||
* the RSDT/XSDT.
|
||||
*
|
||||
******************************************************************************/
|
||||
static acpi_status acpi_tb_load_namespace(void)
|
||||
acpi_status acpi_tb_load_namespace(void)
|
||||
{
|
||||
acpi_status status;
|
||||
u32 i;
|
||||
struct acpi_table_header *new_dsdt;
|
||||
struct acpi_table_desc *table;
|
||||
u32 tables_loaded = 0;
|
||||
u32 tables_failed = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE(tb_load_namespace);
|
||||
|
||||
|
@ -111,15 +117,11 @@ static acpi_status acpi_tb_load_namespace(void)
|
|||
* Load the namespace. The DSDT is required, but any SSDT and
|
||||
* PSDT tables are optional. Verify the DSDT.
|
||||
*/
|
||||
table = &acpi_gbl_root_table_list.tables[acpi_gbl_dsdt_index];
|
||||
|
||||
if (!acpi_gbl_root_table_list.current_table_count ||
|
||||
!ACPI_COMPARE_NAME(&
|
||||
(acpi_gbl_root_table_list.
|
||||
tables[ACPI_TABLE_INDEX_DSDT].signature),
|
||||
ACPI_SIG_DSDT)
|
||||
||
|
||||
ACPI_FAILURE(acpi_tb_validate_table
|
||||
(&acpi_gbl_root_table_list.
|
||||
tables[ACPI_TABLE_INDEX_DSDT]))) {
|
||||
!ACPI_COMPARE_NAME(table->signature.ascii, ACPI_SIG_DSDT) ||
|
||||
ACPI_FAILURE(acpi_tb_validate_table(table))) {
|
||||
status = AE_NO_ACPI_TABLES;
|
||||
goto unlock_and_exit;
|
||||
}
|
||||
|
@ -130,8 +132,7 @@ static acpi_status acpi_tb_load_namespace(void)
|
|||
* array can change dynamically as tables are loaded at run-time. Note:
|
||||
* .Pointer field is not validated until after call to acpi_tb_validate_table.
|
||||
*/
|
||||
acpi_gbl_DSDT =
|
||||
acpi_gbl_root_table_list.tables[ACPI_TABLE_INDEX_DSDT].pointer;
|
||||
acpi_gbl_DSDT = table->pointer;
|
||||
|
||||
/*
|
||||
* Optionally copy the entire DSDT to local memory (instead of simply
|
||||
|
@ -140,7 +141,7 @@ static acpi_status acpi_tb_load_namespace(void)
|
|||
* the DSDT.
|
||||
*/
|
||||
if (acpi_gbl_copy_dsdt_locally) {
|
||||
new_dsdt = acpi_tb_copy_dsdt(ACPI_TABLE_INDEX_DSDT);
|
||||
new_dsdt = acpi_tb_copy_dsdt(acpi_gbl_dsdt_index);
|
||||
if (new_dsdt) {
|
||||
acpi_gbl_DSDT = new_dsdt;
|
||||
}
|
||||
|
@ -157,41 +158,65 @@ static acpi_status acpi_tb_load_namespace(void)
|
|||
|
||||
/* Load and parse tables */
|
||||
|
||||
status = acpi_ns_load_table(ACPI_TABLE_INDEX_DSDT, acpi_gbl_root_node);
|
||||
status = acpi_ns_load_table(acpi_gbl_dsdt_index, acpi_gbl_root_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
ACPI_EXCEPTION((AE_INFO, status, "[DSDT] table load failed"));
|
||||
tables_failed++;
|
||||
} else {
|
||||
tables_loaded++;
|
||||
}
|
||||
|
||||
/* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */
|
||||
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) {
|
||||
table = &acpi_gbl_root_table_list.tables[i];
|
||||
|
||||
if (!acpi_gbl_root_table_list.tables[i].address ||
|
||||
(!ACPI_COMPARE_NAME
|
||||
(&(acpi_gbl_root_table_list.tables[i].signature),
|
||||
ACPI_SIG_SSDT)
|
||||
&&
|
||||
!ACPI_COMPARE_NAME(&
|
||||
(acpi_gbl_root_table_list.tables[i].
|
||||
signature), ACPI_SIG_PSDT)
|
||||
&&
|
||||
!ACPI_COMPARE_NAME(&
|
||||
(acpi_gbl_root_table_list.tables[i].
|
||||
signature), ACPI_SIG_OSDT))
|
||||
||
|
||||
ACPI_FAILURE(acpi_tb_validate_table
|
||||
(&acpi_gbl_root_table_list.tables[i]))) {
|
||||
(!ACPI_COMPARE_NAME(table->signature.ascii, ACPI_SIG_SSDT)
|
||||
&& !ACPI_COMPARE_NAME(table->signature.ascii,
|
||||
ACPI_SIG_PSDT)
|
||||
&& !ACPI_COMPARE_NAME(table->signature.ascii,
|
||||
ACPI_SIG_OSDT))
|
||||
|| ACPI_FAILURE(acpi_tb_validate_table(table))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Ignore errors while loading tables, get as many as possible */
|
||||
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
(void)acpi_ns_load_table(i, acpi_gbl_root_node);
|
||||
status = acpi_ns_load_table(i, acpi_gbl_root_node);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"(%4.4s:%8.8s) while loading table",
|
||||
table->signature.ascii,
|
||||
table->pointer->oem_table_id));
|
||||
tables_failed++;
|
||||
|
||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_INIT,
|
||||
"Table [%4.4s:%8.8s] (id FF) - Table namespace load failed\n\n",
|
||||
table->signature.ascii,
|
||||
table->pointer->oem_table_id));
|
||||
} else {
|
||||
tables_loaded++;
|
||||
}
|
||||
|
||||
(void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
|
||||
}
|
||||
|
||||
ACPI_INFO((AE_INFO, "All ACPI Tables successfully acquired"));
|
||||
if (!tables_failed) {
|
||||
ACPI_INFO((AE_INFO,
|
||||
"%u ACPI AML tables successfully acquired and loaded",
|
||||
tables_loaded));
|
||||
} else {
|
||||
ACPI_ERROR((AE_INFO,
|
||||
"%u table load failures, %u successful",
|
||||
tables_failed, tables_loaded));
|
||||
|
||||
/* Indicate at least one failure */
|
||||
|
||||
status = AE_CTRL_TERMINATE;
|
||||
}
|
||||
|
||||
unlock_and_exit:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
#include "acinterp.h"
|
||||
|
||||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utdebug")
|
||||
|
@ -560,8 +561,37 @@ acpi_ut_ptr_exit(u32 line_number,
|
|||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_trace_point
|
||||
*
|
||||
* PARAMETERS: type - Trace event type
|
||||
* begin - TRUE if before execution
|
||||
* aml - Executed AML address
|
||||
* pathname - Object path
|
||||
* pointer - Pointer to the related object
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Interpreter execution trace.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void
|
||||
acpi_trace_point(acpi_trace_event_type type, u8 begin, u8 *aml, char *pathname)
|
||||
{
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
acpi_ex_trace_point(type, begin, aml, pathname);
|
||||
|
||||
#ifdef ACPI_USE_SYSTEM_TRACER
|
||||
acpi_os_trace_point(type, begin, aml, pathname);
|
||||
#endif
|
||||
}
|
||||
|
||||
ACPI_EXPORT_SYMBOL(acpi_trace_point)
|
||||
#endif
|
||||
#ifdef ACPI_APPLICATION
|
||||
/*******************************************************************************
|
||||
*
|
||||
|
@ -575,7 +605,6 @@ acpi_ut_ptr_exit(u32 line_number,
|
|||
* DESCRIPTION: Print error message to the console, used by applications.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void ACPI_INTERNAL_VAR_XFACE acpi_log_error(const char *format, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
|
|
@ -209,6 +209,9 @@ static void acpi_ut_delete_internal_obj(union acpi_operand_object *object)
|
|||
acpi_ut_delete_object_desc(object->method.mutex);
|
||||
object->method.mutex = NULL;
|
||||
}
|
||||
if (object->method.node) {
|
||||
object->method.node = NULL;
|
||||
}
|
||||
break;
|
||||
|
||||
case ACPI_TYPE_REGION:
|
||||
|
|
|
@ -312,7 +312,7 @@ acpi_ut_read_table_from_file(char *filename, struct acpi_table_header ** table)
|
|||
/* Get the entire file */
|
||||
|
||||
fprintf(stderr,
|
||||
"Reading ACPI table from file %10s - Length %.8u (0x%06X)\n",
|
||||
"Reading ACPI table from file %12s - Length %.8u (0x%06X)\n",
|
||||
filename, file_size, file_size);
|
||||
|
||||
status = acpi_ut_read_table(file, table, &table_length);
|
||||
|
|
|
@ -204,11 +204,10 @@ acpi_status acpi_ut_init_globals(void)
|
|||
acpi_gbl_acpi_hardware_present = TRUE;
|
||||
acpi_gbl_last_owner_id_index = 0;
|
||||
acpi_gbl_next_owner_id_offset = 0;
|
||||
acpi_gbl_trace_dbg_level = 0;
|
||||
acpi_gbl_trace_dbg_layer = 0;
|
||||
acpi_gbl_debugger_configuration = DEBUGGER_THREADING;
|
||||
acpi_gbl_osi_mutex = NULL;
|
||||
acpi_gbl_reg_methods_executed = FALSE;
|
||||
acpi_gbl_max_loop_iterations = 0xFFFF;
|
||||
|
||||
/* Hardware oriented */
|
||||
|
||||
|
|
|
@ -75,7 +75,7 @@ u8 acpi_ut_is_pci_root_bridge(char *id)
|
|||
return (FALSE);
|
||||
}
|
||||
|
||||
#if (defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP)
|
||||
#if (defined ACPI_ASL_COMPILER || defined ACPI_EXEC_APP || defined ACPI_NAMES_APP)
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_is_aml_table
|
||||
|
@ -376,7 +376,7 @@ acpi_ut_display_init_pathname(u8 type,
|
|||
/* Get the full pathname to the node */
|
||||
|
||||
buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
|
||||
status = acpi_ns_handle_to_pathname(obj_handle, &buffer);
|
||||
status = acpi_ns_handle_to_pathname(obj_handle, &buffer, TRUE);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return;
|
||||
}
|
||||
|
|
380
drivers/acpi/acpica/utnonansi.c
Normal file
380
drivers/acpi/acpica/utnonansi.c
Normal file
|
@ -0,0 +1,380 @@
|
|||
/*******************************************************************************
|
||||
*
|
||||
* Module Name: utnonansi - Non-ansi C library functions
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2015, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#include <acpi/acpi.h>
|
||||
#include "accommon.h"
|
||||
|
||||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utnonansi")
|
||||
|
||||
/*
|
||||
* Non-ANSI C library functions - strlwr, strupr, stricmp, and a 64-bit
|
||||
* version of strtoul.
|
||||
*/
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_strlwr (strlwr)
|
||||
*
|
||||
* PARAMETERS: src_string - The source string to convert
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Convert a string to lowercase
|
||||
*
|
||||
******************************************************************************/
|
||||
void acpi_ut_strlwr(char *src_string)
|
||||
{
|
||||
char *string;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (!src_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Walk entire string, lowercasing the letters */
|
||||
|
||||
for (string = src_string; *string; string++) {
|
||||
*string = (char)tolower((int)*string);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_strupr (strupr)
|
||||
*
|
||||
* PARAMETERS: src_string - The source string to convert
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Convert a string to uppercase
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_strupr(char *src_string)
|
||||
{
|
||||
char *string;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (!src_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Walk entire string, uppercasing the letters */
|
||||
|
||||
for (string = src_string; *string; string++) {
|
||||
*string = (char)toupper((int)*string);
|
||||
}
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_stricmp (stricmp)
|
||||
*
|
||||
* PARAMETERS: string1 - first string to compare
|
||||
* string2 - second string to compare
|
||||
*
|
||||
* RETURN: int that signifies string relationship. Zero means strings
|
||||
* are equal.
|
||||
*
|
||||
* DESCRIPTION: Case-insensitive string compare. Implementation of the
|
||||
* non-ANSI stricmp function.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
int acpi_ut_stricmp(char *string1, char *string2)
|
||||
{
|
||||
int c1;
|
||||
int c2;
|
||||
|
||||
do {
|
||||
c1 = tolower((int)*string1);
|
||||
c2 = tolower((int)*string2);
|
||||
|
||||
string1++;
|
||||
string2++;
|
||||
}
|
||||
while ((c1 == c2) && (c1));
|
||||
|
||||
return (c1 - c2);
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_strtoul64
|
||||
*
|
||||
* PARAMETERS: string - Null terminated string
|
||||
* base - Radix of the string: 16 or ACPI_ANY_BASE;
|
||||
* ACPI_ANY_BASE means 'in behalf of to_integer'
|
||||
* ret_integer - Where the converted integer is returned
|
||||
*
|
||||
* RETURN: Status and Converted value
|
||||
*
|
||||
* DESCRIPTION: Convert a string into an unsigned value. Performs either a
|
||||
* 32-bit or 64-bit conversion, depending on the current mode
|
||||
* of the interpreter.
|
||||
*
|
||||
* NOTE: Does not support Octal strings, not needed.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
||||
{
|
||||
u32 this_digit = 0;
|
||||
u64 return_value = 0;
|
||||
u64 quotient;
|
||||
u64 dividend;
|
||||
u32 to_integer_op = (base == ACPI_ANY_BASE);
|
||||
u32 mode32 = (acpi_gbl_integer_byte_width == 4);
|
||||
u8 valid_digits = 0;
|
||||
u8 sign_of0x = 0;
|
||||
u8 term = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE_STR(ut_stroul64, string);
|
||||
|
||||
switch (base) {
|
||||
case ACPI_ANY_BASE:
|
||||
case 16:
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Invalid Base */
|
||||
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
if (!string) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
/* Skip over any white space in the buffer */
|
||||
|
||||
while ((*string) && (isspace((int)*string) || *string == '\t')) {
|
||||
string++;
|
||||
}
|
||||
|
||||
if (to_integer_op) {
|
||||
/*
|
||||
* Base equal to ACPI_ANY_BASE means 'ToInteger operation case'.
|
||||
* We need to determine if it is decimal or hexadecimal.
|
||||
*/
|
||||
if ((*string == '0') && (tolower((int)*(string + 1)) == 'x')) {
|
||||
sign_of0x = 1;
|
||||
base = 16;
|
||||
|
||||
/* Skip over the leading '0x' */
|
||||
string += 2;
|
||||
} else {
|
||||
base = 10;
|
||||
}
|
||||
}
|
||||
|
||||
/* Any string left? Check that '0x' is not followed by white space. */
|
||||
|
||||
if (!(*string) || isspace((int)*string) || *string == '\t') {
|
||||
if (to_integer_op) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
goto all_done;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform a 32-bit or 64-bit conversion, depending upon the current
|
||||
* execution mode of the interpreter
|
||||
*/
|
||||
dividend = (mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX;
|
||||
|
||||
/* Main loop: convert the string to a 32- or 64-bit integer */
|
||||
|
||||
while (*string) {
|
||||
if (isdigit((int)*string)) {
|
||||
|
||||
/* Convert ASCII 0-9 to Decimal value */
|
||||
|
||||
this_digit = ((u8)*string) - '0';
|
||||
} else if (base == 10) {
|
||||
|
||||
/* Digit is out of range; possible in to_integer case only */
|
||||
|
||||
term = 1;
|
||||
} else {
|
||||
this_digit = (u8)toupper((int)*string);
|
||||
if (isxdigit((int)this_digit)) {
|
||||
|
||||
/* Convert ASCII Hex char to value */
|
||||
|
||||
this_digit = this_digit - 'A' + 10;
|
||||
} else {
|
||||
term = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (term) {
|
||||
if (to_integer_op) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if ((valid_digits == 0) && (this_digit == 0)
|
||||
&& !sign_of0x) {
|
||||
|
||||
/* Skip zeros */
|
||||
string++;
|
||||
continue;
|
||||
}
|
||||
|
||||
valid_digits++;
|
||||
|
||||
if (sign_of0x
|
||||
&& ((valid_digits > 16)
|
||||
|| ((valid_digits > 8) && mode32))) {
|
||||
/*
|
||||
* This is to_integer operation case.
|
||||
* No any restrictions for string-to-integer conversion,
|
||||
* see ACPI spec.
|
||||
*/
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
/* Divide the digit into the correct position */
|
||||
|
||||
(void)acpi_ut_short_divide((dividend - (u64)this_digit),
|
||||
base, "ient, NULL);
|
||||
|
||||
if (return_value > quotient) {
|
||||
if (to_integer_op) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return_value *= base;
|
||||
return_value += this_digit;
|
||||
string++;
|
||||
}
|
||||
|
||||
/* All done, normal exit */
|
||||
|
||||
all_done:
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
|
||||
ACPI_FORMAT_UINT64(return_value)));
|
||||
|
||||
*ret_integer = return_value;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
error_exit:
|
||||
/* Base was set/validated above */
|
||||
|
||||
if (base == 10) {
|
||||
return_ACPI_STATUS(AE_BAD_DECIMAL_CONSTANT);
|
||||
} else {
|
||||
return_ACPI_STATUS(AE_BAD_HEX_CONSTANT);
|
||||
}
|
||||
}
|
||||
|
||||
#if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION)
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_safe_strcpy, acpi_ut_safe_strcat, acpi_ut_safe_strncat
|
||||
*
|
||||
* PARAMETERS: Adds a "DestSize" parameter to each of the standard string
|
||||
* functions. This is the size of the Destination buffer.
|
||||
*
|
||||
* RETURN: TRUE if the operation would overflow the destination buffer.
|
||||
*
|
||||
* DESCRIPTION: Safe versions of standard Clib string functions. Ensure that
|
||||
* the result of the operation will not overflow the output string
|
||||
* buffer.
|
||||
*
|
||||
* NOTE: These functions are typically only helpful for processing
|
||||
* user input and command lines. For most ACPICA code, the
|
||||
* required buffer length is precisely calculated before buffer
|
||||
* allocation, so the use of these functions is unnecessary.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_ut_safe_strcpy(char *dest, acpi_size dest_size, char *source)
|
||||
{
|
||||
|
||||
if (strlen(source) >= dest_size) {
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
strcpy(dest, source);
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
u8 acpi_ut_safe_strcat(char *dest, acpi_size dest_size, char *source)
|
||||
{
|
||||
|
||||
if ((strlen(dest) + strlen(source)) >= dest_size) {
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
strcat(dest, source);
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
u8
|
||||
acpi_ut_safe_strncat(char *dest,
|
||||
acpi_size dest_size,
|
||||
char *source, acpi_size max_transfer_length)
|
||||
{
|
||||
acpi_size actual_transfer_length;
|
||||
|
||||
actual_transfer_length = ACPI_MIN(max_transfer_length, strlen(source));
|
||||
|
||||
if ((strlen(dest) + actual_transfer_length) >= dest_size) {
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
strncat(dest, source, max_transfer_length);
|
||||
return (FALSE);
|
||||
}
|
||||
#endif
|
|
@ -48,286 +48,6 @@
|
|||
#define _COMPONENT ACPI_UTILITIES
|
||||
ACPI_MODULE_NAME("utstring")
|
||||
|
||||
/*
|
||||
* Non-ANSI C library functions - strlwr, strupr, stricmp, and a 64-bit
|
||||
* version of strtoul.
|
||||
*/
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_strlwr (strlwr)
|
||||
*
|
||||
* PARAMETERS: src_string - The source string to convert
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Convert string to lowercase
|
||||
*
|
||||
* NOTE: This is not a POSIX function, so it appears here, not in utclib.c
|
||||
*
|
||||
******************************************************************************/
|
||||
void acpi_ut_strlwr(char *src_string)
|
||||
{
|
||||
char *string;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (!src_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Walk entire string, lowercasing the letters */
|
||||
|
||||
for (string = src_string; *string; string++) {
|
||||
*string = (char)tolower((int)*string);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_stricmp (stricmp)
|
||||
*
|
||||
* PARAMETERS: string1 - first string to compare
|
||||
* string2 - second string to compare
|
||||
*
|
||||
* RETURN: int that signifies string relationship. Zero means strings
|
||||
* are equal.
|
||||
*
|
||||
* DESCRIPTION: Implementation of the non-ANSI stricmp function (compare
|
||||
* strings with no case sensitivity)
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
int acpi_ut_stricmp(char *string1, char *string2)
|
||||
{
|
||||
int c1;
|
||||
int c2;
|
||||
|
||||
do {
|
||||
c1 = tolower((int)*string1);
|
||||
c2 = tolower((int)*string2);
|
||||
|
||||
string1++;
|
||||
string2++;
|
||||
}
|
||||
while ((c1 == c2) && (c1));
|
||||
|
||||
return (c1 - c2);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_strupr (strupr)
|
||||
*
|
||||
* PARAMETERS: src_string - The source string to convert
|
||||
*
|
||||
* RETURN: None
|
||||
*
|
||||
* DESCRIPTION: Convert string to uppercase
|
||||
*
|
||||
* NOTE: This is not a POSIX function, so it appears here, not in utclib.c
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_strupr(char *src_string)
|
||||
{
|
||||
char *string;
|
||||
|
||||
ACPI_FUNCTION_ENTRY();
|
||||
|
||||
if (!src_string) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Walk entire string, uppercasing the letters */
|
||||
|
||||
for (string = src_string; *string; string++) {
|
||||
*string = (char)toupper((int)*string);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_strtoul64
|
||||
*
|
||||
* PARAMETERS: string - Null terminated string
|
||||
* base - Radix of the string: 16 or ACPI_ANY_BASE;
|
||||
* ACPI_ANY_BASE means 'in behalf of to_integer'
|
||||
* ret_integer - Where the converted integer is returned
|
||||
*
|
||||
* RETURN: Status and Converted value
|
||||
*
|
||||
* DESCRIPTION: Convert a string into an unsigned value. Performs either a
|
||||
* 32-bit or 64-bit conversion, depending on the current mode
|
||||
* of the interpreter.
|
||||
* NOTE: Does not support Octal strings, not needed.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
||||
{
|
||||
u32 this_digit = 0;
|
||||
u64 return_value = 0;
|
||||
u64 quotient;
|
||||
u64 dividend;
|
||||
u32 to_integer_op = (base == ACPI_ANY_BASE);
|
||||
u32 mode32 = (acpi_gbl_integer_byte_width == 4);
|
||||
u8 valid_digits = 0;
|
||||
u8 sign_of0x = 0;
|
||||
u8 term = 0;
|
||||
|
||||
ACPI_FUNCTION_TRACE_STR(ut_stroul64, string);
|
||||
|
||||
switch (base) {
|
||||
case ACPI_ANY_BASE:
|
||||
case 16:
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
/* Invalid Base */
|
||||
|
||||
return_ACPI_STATUS(AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
if (!string) {
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
/* Skip over any white space in the buffer */
|
||||
|
||||
while ((*string) && (isspace((int)*string) || *string == '\t')) {
|
||||
string++;
|
||||
}
|
||||
|
||||
if (to_integer_op) {
|
||||
/*
|
||||
* Base equal to ACPI_ANY_BASE means 'ToInteger operation case'.
|
||||
* We need to determine if it is decimal or hexadecimal.
|
||||
*/
|
||||
if ((*string == '0') && (tolower((int)*(string + 1)) == 'x')) {
|
||||
sign_of0x = 1;
|
||||
base = 16;
|
||||
|
||||
/* Skip over the leading '0x' */
|
||||
string += 2;
|
||||
} else {
|
||||
base = 10;
|
||||
}
|
||||
}
|
||||
|
||||
/* Any string left? Check that '0x' is not followed by white space. */
|
||||
|
||||
if (!(*string) || isspace((int)*string) || *string == '\t') {
|
||||
if (to_integer_op) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
goto all_done;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform a 32-bit or 64-bit conversion, depending upon the current
|
||||
* execution mode of the interpreter
|
||||
*/
|
||||
dividend = (mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX;
|
||||
|
||||
/* Main loop: convert the string to a 32- or 64-bit integer */
|
||||
|
||||
while (*string) {
|
||||
if (isdigit((int)*string)) {
|
||||
|
||||
/* Convert ASCII 0-9 to Decimal value */
|
||||
|
||||
this_digit = ((u8)*string) - '0';
|
||||
} else if (base == 10) {
|
||||
|
||||
/* Digit is out of range; possible in to_integer case only */
|
||||
|
||||
term = 1;
|
||||
} else {
|
||||
this_digit = (u8)toupper((int)*string);
|
||||
if (isxdigit((int)this_digit)) {
|
||||
|
||||
/* Convert ASCII Hex char to value */
|
||||
|
||||
this_digit = this_digit - 'A' + 10;
|
||||
} else {
|
||||
term = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (term) {
|
||||
if (to_integer_op) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
} else if ((valid_digits == 0) && (this_digit == 0)
|
||||
&& !sign_of0x) {
|
||||
|
||||
/* Skip zeros */
|
||||
string++;
|
||||
continue;
|
||||
}
|
||||
|
||||
valid_digits++;
|
||||
|
||||
if (sign_of0x
|
||||
&& ((valid_digits > 16)
|
||||
|| ((valid_digits > 8) && mode32))) {
|
||||
/*
|
||||
* This is to_integer operation case.
|
||||
* No any restrictions for string-to-integer conversion,
|
||||
* see ACPI spec.
|
||||
*/
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
/* Divide the digit into the correct position */
|
||||
|
||||
(void)acpi_ut_short_divide((dividend - (u64)this_digit),
|
||||
base, "ient, NULL);
|
||||
|
||||
if (return_value > quotient) {
|
||||
if (to_integer_op) {
|
||||
goto error_exit;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return_value *= base;
|
||||
return_value += this_digit;
|
||||
string++;
|
||||
}
|
||||
|
||||
/* All done, normal exit */
|
||||
|
||||
all_done:
|
||||
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
|
||||
ACPI_FORMAT_UINT64(return_value)));
|
||||
|
||||
*ret_integer = return_value;
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
|
||||
error_exit:
|
||||
/* Base was set/validated above */
|
||||
|
||||
if (base == 10) {
|
||||
return_ACPI_STATUS(AE_BAD_DECIMAL_CONSTANT);
|
||||
} else {
|
||||
return_ACPI_STATUS(AE_BAD_HEX_CONSTANT);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_print_string
|
||||
|
@ -342,7 +62,6 @@ acpi_status acpi_ut_strtoul64(char *string, u32 base, u64 *ret_integer)
|
|||
* sequences.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
void acpi_ut_print_string(char *string, u16 max_length)
|
||||
{
|
||||
u32 i;
|
||||
|
@ -584,64 +303,3 @@ void ut_convert_backslashes(char *pathname)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined (ACPI_DEBUGGER) || defined (ACPI_APPLICATION)
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_ut_safe_strcpy, acpi_ut_safe_strcat, acpi_ut_safe_strncat
|
||||
*
|
||||
* PARAMETERS: Adds a "DestSize" parameter to each of the standard string
|
||||
* functions. This is the size of the Destination buffer.
|
||||
*
|
||||
* RETURN: TRUE if the operation would overflow the destination buffer.
|
||||
*
|
||||
* DESCRIPTION: Safe versions of standard Clib string functions. Ensure that
|
||||
* the result of the operation will not overflow the output string
|
||||
* buffer.
|
||||
*
|
||||
* NOTE: These functions are typically only helpful for processing
|
||||
* user input and command lines. For most ACPICA code, the
|
||||
* required buffer length is precisely calculated before buffer
|
||||
* allocation, so the use of these functions is unnecessary.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
u8 acpi_ut_safe_strcpy(char *dest, acpi_size dest_size, char *source)
|
||||
{
|
||||
|
||||
if (strlen(source) >= dest_size) {
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
strcpy(dest, source);
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
u8 acpi_ut_safe_strcat(char *dest, acpi_size dest_size, char *source)
|
||||
{
|
||||
|
||||
if ((strlen(dest) + strlen(source)) >= dest_size) {
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
strcat(dest, source);
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
u8
|
||||
acpi_ut_safe_strncat(char *dest,
|
||||
acpi_size dest_size,
|
||||
char *source, acpi_size max_transfer_length)
|
||||
{
|
||||
acpi_size actual_transfer_length;
|
||||
|
||||
actual_transfer_length = ACPI_MIN(max_transfer_length, strlen(source));
|
||||
|
||||
if ((strlen(dest) + actual_transfer_length) >= dest_size) {
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
strncat(dest, source, max_transfer_length);
|
||||
return (FALSE);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -92,13 +92,6 @@ acpi_status __init acpi_terminate(void)
|
|||
|
||||
acpi_ut_mutex_terminate();
|
||||
|
||||
#ifdef ACPI_DEBUGGER
|
||||
|
||||
/* Shut down the debugger */
|
||||
|
||||
acpi_db_terminate();
|
||||
#endif
|
||||
|
||||
/* Now we can shutdown the OS-dependent layer */
|
||||
|
||||
status = acpi_os_terminate();
|
||||
|
@ -517,7 +510,8 @@ acpi_decode_pld_buffer(u8 *in_buffer,
|
|||
|
||||
/* Parameter validation */
|
||||
|
||||
if (!in_buffer || !return_buffer || (length < 16)) {
|
||||
if (!in_buffer || !return_buffer
|
||||
|| (length < ACPI_PLD_REV1_BUFFER_SIZE)) {
|
||||
return (AE_BAD_PARAMETER);
|
||||
}
|
||||
|
||||
|
@ -567,7 +561,7 @@ acpi_decode_pld_buffer(u8 *in_buffer,
|
|||
pld_info->rotation = ACPI_PLD_GET_ROTATION(&dword);
|
||||
pld_info->order = ACPI_PLD_GET_ORDER(&dword);
|
||||
|
||||
if (length >= ACPI_PLD_BUFFER_SIZE) {
|
||||
if (length >= ACPI_PLD_REV2_BUFFER_SIZE) {
|
||||
|
||||
/* Fifth 32-bit DWord (Revision 2 of _PLD) */
|
||||
|
||||
|
|
|
@ -124,17 +124,6 @@ acpi_status __init acpi_initialize_subsystem(void)
|
|||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* If configured, initialize the AML debugger */
|
||||
|
||||
#ifdef ACPI_DEBUGGER
|
||||
status = acpi_db_initialize();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During Debugger initialization"));
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
#endif
|
||||
|
||||
return_ACPI_STATUS(AE_OK);
|
||||
}
|
||||
|
||||
|
|
|
@ -147,6 +147,7 @@ struct acpi_pld_info {
|
|||
* (Intended for BIOS use only)
|
||||
*/
|
||||
#define ACPI_PLD_REV1_BUFFER_SIZE 16 /* For Revision 1 of the buffer (From ACPI spec) */
|
||||
#define ACPI_PLD_REV2_BUFFER_SIZE 20 /* For Revision 2 of the buffer (From ACPI spec) */
|
||||
#define ACPI_PLD_BUFFER_SIZE 20 /* For Revision 2 of the buffer (From ACPI spec) */
|
||||
|
||||
/* First 32-bit dword, bits 0:32 */
|
||||
|
|
|
@ -136,10 +136,6 @@
|
|||
|
||||
#define ACPI_ROOT_TABLE_SIZE_INCREMENT 4
|
||||
|
||||
/* Maximum number of While() loop iterations before forced abort */
|
||||
|
||||
#define ACPI_MAX_LOOP_ITERATIONS 0xFFFF
|
||||
|
||||
/* Maximum sleep allowed via Sleep() operator */
|
||||
|
||||
#define ACPI_MAX_SLEEP 2000 /* 2000 millisec == two seconds */
|
||||
|
|
|
@ -192,8 +192,9 @@ struct acpi_exception_info {
|
|||
#define AE_AML_BAD_RESOURCE_LENGTH EXCEP_AML (0x001F)
|
||||
#define AE_AML_ILLEGAL_ADDRESS EXCEP_AML (0x0020)
|
||||
#define AE_AML_INFINITE_LOOP EXCEP_AML (0x0021)
|
||||
#define AE_AML_UNINITIALIZED_NODE EXCEP_AML (0x0022)
|
||||
|
||||
#define AE_CODE_AML_MAX 0x0021
|
||||
#define AE_CODE_AML_MAX 0x0022
|
||||
|
||||
/*
|
||||
* Internal exceptions used for control
|
||||
|
@ -355,7 +356,9 @@ static const struct acpi_exception_info acpi_gbl_exception_names_aml[] = {
|
|||
EXCEP_TXT("AE_AML_ILLEGAL_ADDRESS",
|
||||
"A memory, I/O, or PCI configuration address is invalid"),
|
||||
EXCEP_TXT("AE_AML_INFINITE_LOOP",
|
||||
"An apparent infinite AML While loop, method was aborted")
|
||||
"An apparent infinite AML While loop, method was aborted"),
|
||||
EXCEP_TXT("AE_AML_UNINITIALIZED_NODE",
|
||||
"A namespace node is uninitialized or unresolved")
|
||||
};
|
||||
|
||||
static const struct acpi_exception_info acpi_gbl_exception_names_ctrl[] = {
|
||||
|
|
|
@ -88,7 +88,8 @@
|
|||
#define ACPI_LV_DEBUG_OBJECT 0x00000002
|
||||
#define ACPI_LV_INFO 0x00000004
|
||||
#define ACPI_LV_REPAIR 0x00000008
|
||||
#define ACPI_LV_ALL_EXCEPTIONS 0x0000000F
|
||||
#define ACPI_LV_TRACE_POINT 0x00000010
|
||||
#define ACPI_LV_ALL_EXCEPTIONS 0x0000001F
|
||||
|
||||
/* Trace verbosity level 1 [Standard Trace Level] */
|
||||
|
||||
|
@ -147,6 +148,7 @@
|
|||
#define ACPI_DB_DEBUG_OBJECT ACPI_DEBUG_LEVEL (ACPI_LV_DEBUG_OBJECT)
|
||||
#define ACPI_DB_INFO ACPI_DEBUG_LEVEL (ACPI_LV_INFO)
|
||||
#define ACPI_DB_REPAIR ACPI_DEBUG_LEVEL (ACPI_LV_REPAIR)
|
||||
#define ACPI_DB_TRACE_POINT ACPI_DEBUG_LEVEL (ACPI_LV_TRACE_POINT)
|
||||
#define ACPI_DB_ALL_EXCEPTIONS ACPI_DEBUG_LEVEL (ACPI_LV_ALL_EXCEPTIONS)
|
||||
|
||||
/* Trace level -- also used in the global "DebugLevel" */
|
||||
|
@ -182,6 +184,20 @@
|
|||
#define ACPI_NORMAL_DEFAULT (ACPI_LV_INIT | ACPI_LV_DEBUG_OBJECT | ACPI_LV_REPAIR)
|
||||
#define ACPI_DEBUG_ALL (ACPI_LV_AML_DISASSEMBLE | ACPI_LV_ALL_EXCEPTIONS | ACPI_LV_ALL)
|
||||
|
||||
/*
|
||||
* Global trace flags
|
||||
*/
|
||||
#define ACPI_TRACE_ENABLED ((u32) 4)
|
||||
#define ACPI_TRACE_ONESHOT ((u32) 2)
|
||||
#define ACPI_TRACE_OPCODE ((u32) 1)
|
||||
|
||||
/* Defaults for trace debugging level/layer */
|
||||
|
||||
#define ACPI_TRACE_LEVEL_ALL ACPI_LV_ALL
|
||||
#define ACPI_TRACE_LAYER_ALL 0x000001FF
|
||||
#define ACPI_TRACE_LEVEL_DEFAULT ACPI_LV_TRACE_POINT
|
||||
#define ACPI_TRACE_LAYER_DEFAULT ACPI_EXECUTER
|
||||
|
||||
#if defined (ACPI_DEBUG_OUTPUT) || !defined (ACPI_NO_ERROR_MESSAGES)
|
||||
/*
|
||||
* The module name is used primarily for error and debug messages.
|
||||
|
@ -432,6 +448,8 @@
|
|||
#define ACPI_DUMP_PATHNAME(a, b, c, d) acpi_ns_dump_pathname(a, b, c, d)
|
||||
#define ACPI_DUMP_BUFFER(a, b) acpi_ut_debug_dump_buffer((u8 *) a, b, DB_BYTE_DISPLAY, _COMPONENT)
|
||||
|
||||
#define ACPI_TRACE_POINT(a, b, c, d) acpi_trace_point (a, b, c, d)
|
||||
|
||||
#else /* ACPI_DEBUG_OUTPUT */
|
||||
/*
|
||||
* This is the non-debug case -- make everything go away,
|
||||
|
@ -453,6 +471,7 @@
|
|||
#define ACPI_DUMP_PATHNAME(a, b, c, d)
|
||||
#define ACPI_DUMP_BUFFER(a, b)
|
||||
#define ACPI_IS_DEBUG_ENABLED(level, component) 0
|
||||
#define ACPI_TRACE_POINT(a, b, c, d)
|
||||
|
||||
/* Return macros must have a return statement at the minimum */
|
||||
|
||||
|
|
|
@ -430,4 +430,10 @@ long acpi_os_get_file_offset(ACPI_FILE file);
|
|||
acpi_status acpi_os_set_file_offset(ACPI_FILE file, long offset, u8 from);
|
||||
#endif
|
||||
|
||||
#ifndef ACPI_USE_ALTERNATE_PROTOTYPE_acpi_os_trace_point
|
||||
void
|
||||
acpi_os_trace_point(acpi_trace_event_type type,
|
||||
u8 begin, u8 *aml, char *pathname);
|
||||
#endif
|
||||
|
||||
#endif /* __ACPIOSXF_H__ */
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
|
||||
/* Current ACPICA subsystem version in YYYYMMDD format */
|
||||
|
||||
#define ACPI_CA_VERSION 0x20150619
|
||||
#define ACPI_CA_VERSION 0x20150818
|
||||
|
||||
#include <acpi/acconfig.h>
|
||||
#include <acpi/actypes.h>
|
||||
|
@ -251,7 +251,9 @@ ACPI_INIT_GLOBAL(u8, acpi_gbl_reduced_hardware, FALSE);
|
|||
* traced each time it is executed.
|
||||
*/
|
||||
ACPI_INIT_GLOBAL(u32, acpi_gbl_trace_flags, 0);
|
||||
ACPI_INIT_GLOBAL(acpi_name, acpi_gbl_trace_method_name, 0);
|
||||
ACPI_INIT_GLOBAL(const char *, acpi_gbl_trace_method_name, NULL);
|
||||
ACPI_INIT_GLOBAL(u32, acpi_gbl_trace_dbg_level, ACPI_TRACE_LEVEL_DEFAULT);
|
||||
ACPI_INIT_GLOBAL(u32, acpi_gbl_trace_dbg_layer, ACPI_TRACE_LAYER_DEFAULT);
|
||||
|
||||
/*
|
||||
* Runtime configuration of debug output control masks. We want the debug
|
||||
|
@ -504,7 +506,7 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
|||
acpi_object_handler handler,
|
||||
void **data))
|
||||
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
|
||||
acpi_debug_trace(char *name, u32 debug_level,
|
||||
acpi_debug_trace(const char *name, u32 debug_level,
|
||||
u32 debug_layer, u32 flags))
|
||||
|
||||
/*
|
||||
|
@ -907,9 +909,17 @@ ACPI_DBG_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(6)
|
|||
const char *module_name,
|
||||
u32 component_id,
|
||||
const char *format, ...))
|
||||
|
||||
ACPI_DBG_DEPENDENT_RETURN_VOID(void
|
||||
acpi_trace_point(acpi_trace_event_type type,
|
||||
u8 begin,
|
||||
u8 *aml, char *pathname))
|
||||
ACPI_APP_DEPENDENT_RETURN_VOID(ACPI_PRINTF_LIKE(1)
|
||||
void ACPI_INTERNAL_VAR_XFACE
|
||||
acpi_log_error(const char *format, ...))
|
||||
acpi_status acpi_initialize_debugger(void);
|
||||
|
||||
void acpi_terminate_debugger(void);
|
||||
|
||||
/*
|
||||
* Divergences
|
||||
|
|
|
@ -1186,20 +1186,29 @@ enum acpi_spmi_interface_types {
|
|||
* December 19, 2014
|
||||
*
|
||||
* NOTE: There are two versions of the table with the same signature --
|
||||
* the client version and the server version.
|
||||
* the client version and the server version. The common platform_class
|
||||
* field is used to differentiate the two types of tables.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
struct acpi_table_tcpa_client {
|
||||
struct acpi_table_tcpa_hdr {
|
||||
struct acpi_table_header header; /* Common ACPI table header */
|
||||
u16 platform_class;
|
||||
};
|
||||
|
||||
/*
|
||||
* Values for platform_class above.
|
||||
* This is how the client and server subtables are differentiated
|
||||
*/
|
||||
#define ACPI_TCPA_CLIENT_TABLE 0
|
||||
#define ACPI_TCPA_SERVER_TABLE 1
|
||||
|
||||
struct acpi_table_tcpa_client {
|
||||
u32 minimum_log_length; /* Minimum length for the event log area */
|
||||
u64 log_address; /* Address of the event log area */
|
||||
};
|
||||
|
||||
struct acpi_table_tcpa_server {
|
||||
struct acpi_table_header header; /* Common ACPI table header */
|
||||
u16 platform_class;
|
||||
u16 reserved;
|
||||
u64 minimum_log_length; /* Minimum length for the event log area */
|
||||
u64 log_address; /* Address of the event log area */
|
||||
|
|
|
@ -662,6 +662,7 @@ typedef u32 acpi_object_type;
|
|||
#define ACPI_TYPE_DEBUG_OBJECT 0x10
|
||||
|
||||
#define ACPI_TYPE_EXTERNAL_MAX 0x10
|
||||
#define ACPI_NUM_TYPES (ACPI_TYPE_EXTERNAL_MAX + 1)
|
||||
|
||||
/*
|
||||
* These are object types that do not map directly to the ACPI
|
||||
|
@ -683,6 +684,7 @@ typedef u32 acpi_object_type;
|
|||
#define ACPI_TYPE_LOCAL_SCOPE 0x1B /* 1 Name, multiple object_list Nodes */
|
||||
|
||||
#define ACPI_TYPE_NS_NODE_MAX 0x1B /* Last typecode used within a NS Node */
|
||||
#define ACPI_TOTAL_TYPES (ACPI_TYPE_NS_NODE_MAX + 1)
|
||||
|
||||
/*
|
||||
* These are special object types that never appear in
|
||||
|
@ -985,7 +987,8 @@ struct acpi_buffer {
|
|||
*/
|
||||
#define ACPI_FULL_PATHNAME 0
|
||||
#define ACPI_SINGLE_NAME 1
|
||||
#define ACPI_NAME_TYPE_MAX 1
|
||||
#define ACPI_FULL_PATHNAME_NO_TRAILING 2
|
||||
#define ACPI_NAME_TYPE_MAX 2
|
||||
|
||||
/*
|
||||
* Predefined Namespace items
|
||||
|
@ -1246,6 +1249,14 @@ struct acpi_memory_list {
|
|||
#endif
|
||||
};
|
||||
|
||||
/* Definitions of trace event types */
|
||||
|
||||
typedef enum {
|
||||
ACPI_TRACE_AML_METHOD,
|
||||
ACPI_TRACE_AML_OPCODE,
|
||||
ACPI_TRACE_AML_REGION
|
||||
} acpi_trace_event_type;
|
||||
|
||||
/* Definitions of _OSI support */
|
||||
|
||||
#define ACPI_VENDOR_STRINGS 0x01
|
||||
|
|
|
@ -70,13 +70,14 @@
|
|||
|
||||
#ifdef ACPI_ASL_COMPILER
|
||||
#define ACPI_APPLICATION
|
||||
#define ACPI_DISASSEMBLER
|
||||
#define ACPI_DEBUG_OUTPUT
|
||||
#define ACPI_CONSTANT_EVAL_ONLY
|
||||
#define ACPI_LARGE_NAMESPACE_NODE
|
||||
#define ACPI_DATA_TABLE_DISASSEMBLY
|
||||
#define ACPI_SINGLE_THREADED
|
||||
#define ACPI_32BIT_PHYSICAL_ADDRESS
|
||||
|
||||
#define ACPI_DISASSEMBLER 1
|
||||
#endif
|
||||
|
||||
/* acpi_exec configuration. Multithreaded with full AML debugger */
|
||||
|
@ -89,8 +90,8 @@
|
|||
#endif
|
||||
|
||||
/*
|
||||
* acpi_bin/acpi_dump/acpi_help/acpi_names/acpi_src/acpi_xtract/Example configuration.
|
||||
* All single threaded.
|
||||
* acpi_bin/acpi_dump/acpi_help/acpi_names/acpi_src/acpi_xtract/Example
|
||||
* configuration. All single threaded.
|
||||
*/
|
||||
#if (defined ACPI_BIN_APP) || \
|
||||
(defined ACPI_DUMP_APP) || \
|
||||
|
@ -123,7 +124,7 @@
|
|||
#define ACPI_USE_NATIVE_RSDP_POINTER
|
||||
#endif
|
||||
|
||||
/* acpi_dump configuration. Native mapping used if provied by OSPMs */
|
||||
/* acpi_dump configuration. Native mapping used if provided by the host */
|
||||
|
||||
#ifdef ACPI_DUMP_APP
|
||||
#define ACPI_USE_NATIVE_MEMORY_MAPPING
|
||||
|
@ -151,12 +152,12 @@
|
|||
#define ACPI_USE_LOCAL_CACHE
|
||||
#endif
|
||||
|
||||
/* Common debug support */
|
||||
/* Common debug/disassembler support */
|
||||
|
||||
#ifdef ACPI_FULL_DEBUG
|
||||
#define ACPI_DEBUGGER
|
||||
#define ACPI_DEBUG_OUTPUT
|
||||
#define ACPI_DISASSEMBLER
|
||||
#define ACPI_DEBUGGER 1
|
||||
#define ACPI_DISASSEMBLER 1
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -323,8 +324,8 @@
|
|||
* ACPI_USE_STANDARD_HEADERS - Define this if linking to a C library and
|
||||
* the standard header files may be used.
|
||||
*
|
||||
* The ACPICA subsystem only uses low level C library functions that do not call
|
||||
* operating system services and may therefore be inlined in the code.
|
||||
* The ACPICA subsystem only uses low level C library functions that do not
|
||||
* call operating system services and may therefore be inlined in the code.
|
||||
*
|
||||
* It may be necessary to tailor these include files to the target
|
||||
* generation environment.
|
||||
|
|
|
@ -56,6 +56,9 @@
|
|||
#if defined(_LINUX) || defined(__linux__)
|
||||
#include <acpi/platform/aclinuxex.h>
|
||||
|
||||
#elif defined(WIN32)
|
||||
#include "acwinex.h"
|
||||
|
||||
#elif defined(_AED_EFI)
|
||||
#include "acefiex.h"
|
||||
|
||||
|
|
54
include/acpi/platform/acmsvcex.h
Normal file
54
include/acpi/platform/acmsvcex.h
Normal file
|
@ -0,0 +1,54 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Name: acmsvcex.h - Extra VC specific defines, etc.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2015, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#ifndef __ACMSVCEX_H__
|
||||
#define __ACMSVCEX_H__
|
||||
|
||||
/* Debug support. */
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define _CRTDBG_MAP_ALLOC /* Enables specific file/lineno for leaks */
|
||||
#include <crtdbg.h>
|
||||
#endif
|
||||
|
||||
#endif /* __ACMSVCEX_H__ */
|
49
include/acpi/platform/acwinex.h
Normal file
49
include/acpi/platform/acwinex.h
Normal file
|
@ -0,0 +1,49 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Name: acwinex.h - Extra OS specific defines, etc.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
* Copyright (C) 2000 - 2015, Intel Corp.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions, and the following disclaimer,
|
||||
* without modification.
|
||||
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
|
||||
* substantially similar to the "NO WARRANTY" disclaimer below
|
||||
* ("Disclaimer") and any redistribution must be conditioned upon
|
||||
* including a substantially similar Disclaimer requirement for further
|
||||
* binary redistribution.
|
||||
* 3. Neither the names of the above-listed copyright holders nor the names
|
||||
* of any contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* Alternatively, this software may be distributed under the terms of the
|
||||
* GNU General Public License ("GPL") version 2 as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* NO WARRANTY
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGES.
|
||||
*/
|
||||
|
||||
#ifndef __ACWINEX_H__
|
||||
#define __ACWINEX_H__
|
||||
|
||||
/* Windows uses VC */
|
||||
|
||||
#endif /* __ACWINEX_H__ */
|
Loading…
Reference in a new issue