OSDN Git Service

Merge branch 'acpica'
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 1 Sep 2015 01:37:30 +0000 (03:37 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 1 Sep 2015 01:37:30 +0000 (03:37 +0200)
* 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
  ...

68 files changed:
drivers/acpi/acpica/Makefile
drivers/acpi/acpica/acdebug.h
drivers/acpi/acpica/acdispat.h
drivers/acpi/acpica/acglobal.h
drivers/acpi/acpica/acinterp.h
drivers/acpi/acpica/aclocal.h
drivers/acpi/acpica/acmacros.h
drivers/acpi/acpica/acnamesp.h
drivers/acpi/acpica/acobject.h
drivers/acpi/acpica/acparser.h
drivers/acpi/acpica/acstruct.h
drivers/acpi/acpica/actables.h
drivers/acpi/acpica/acutils.h
drivers/acpi/acpica/dsargs.c
drivers/acpi/acpica/dscontrol.c
drivers/acpi/acpica/dsdebug.c [new file with mode: 0644]
drivers/acpi/acpica/dsinit.c
drivers/acpi/acpica/dsmethod.c
drivers/acpi/acpica/dsopcode.c
drivers/acpi/acpica/dswload.c
drivers/acpi/acpica/dswload2.c
drivers/acpi/acpica/evregion.c
drivers/acpi/acpica/exconfig.c
drivers/acpi/acpica/excreate.c
drivers/acpi/acpica/exdebug.c
drivers/acpi/acpica/exdump.c
drivers/acpi/acpica/exresnte.c
drivers/acpi/acpica/exresolv.c
drivers/acpi/acpica/hwxfsleep.c
drivers/acpi/acpica/nseval.c
drivers/acpi/acpica/nsload.c
drivers/acpi/acpica/nsnames.c
drivers/acpi/acpica/nsparse.c
drivers/acpi/acpica/nsutils.c
drivers/acpi/acpica/nsxfname.c
drivers/acpi/acpica/psargs.c
drivers/acpi/acpica/psloop.c
drivers/acpi/acpica/psobject.c
drivers/acpi/acpica/psparse.c
drivers/acpi/acpica/psutils.c
drivers/acpi/acpica/psxface.c
drivers/acpi/acpica/rscreate.c
drivers/acpi/acpica/tbfadt.c
drivers/acpi/acpica/tbfind.c
drivers/acpi/acpica/tbinstal.c
drivers/acpi/acpica/tbutils.c
drivers/acpi/acpica/tbxfload.c
drivers/acpi/acpica/utdebug.c
drivers/acpi/acpica/utdelete.c
drivers/acpi/acpica/utfileio.c
drivers/acpi/acpica/utinit.c
drivers/acpi/acpica/utmisc.c
drivers/acpi/acpica/utnonansi.c [new file with mode: 0644]
drivers/acpi/acpica/utstring.c
drivers/acpi/acpica/utxface.c
drivers/acpi/acpica/utxfinit.c
include/acpi/acbuffer.h
include/acpi/acconfig.h
include/acpi/acexcep.h
include/acpi/acoutput.h
include/acpi/acpiosxf.h
include/acpi/acpixf.h
include/acpi/actbl2.h
include/acpi/actypes.h
include/acpi/platform/acenv.h
include/acpi/platform/acenvex.h
include/acpi/platform/acmsvcex.h [new file with mode: 0644]
include/acpi/platform/acwinex.h [new file with mode: 0644]

index c1a9635..fedcc16 100644 (file)
@@ -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     \
index 43685dd..eb2e926 100644 (file)
@@ -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);
@@ -262,6 +257,23 @@ 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
  */
 void acpi_db_generate_statistics(union acpi_parse_object *root, u8 is_method);
index 408f04b..7094dc8 100644 (file)
@@ -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_ */
index 53f96a3..09f37b5 100644 (file)
@@ -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);
index 7ac9800..e820ed8 100644 (file)
@@ -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
  */
index bc60096..6f70826 100644 (file)
@@ -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
index c240bdf..e85366c 100644 (file)
 #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)
  */
index 0dd0882..ea0d907 100644 (file)
@@ -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);
index c81d98d..0bd02c4 100644 (file)
@@ -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;
index 0cdd2fc..6021ccf 100644 (file)
@@ -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);
 
index 44997ca..f9992dc 100644 (file)
@@ -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 */
index 7e0b6f1..f7731f2 100644 (file)
@@ -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__ */
index 6de0d35..fb2aa50 100644 (file)
@@ -167,6 +167,17 @@ struct acpi_pkg_info {
 #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
  */
 acpi_status acpi_ut_init_globals(void);
@@ -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
index 3e69897..e2ab59e 100644 (file)
@@ -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);
        }
index 39da9da..435fc16 100644 (file)
@@ -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;
                        }
diff --git a/drivers/acpi/acpica/dsdebug.c b/drivers/acpi/acpica/dsdebug.c
new file mode 100644 (file)
index 0000000..309556e
--- /dev/null
@@ -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
index 95779e8..920f1b1 100644 (file)
@@ -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));
 
index 85bb951..bc32f31 100644 (file)
 #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 @@ cleanup:
        /* 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;
 }
index ea0cc4e..81d7b98 100644 (file)
@@ -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);
 }
 
index 845ff44..097188a 100644 (file)
@@ -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);
                }
index fcaa30c..e2c08cd 100644 (file)
@@ -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);
                }
index 2ba28a6..5ee79a1 100644 (file)
@@ -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);
 }
index 24a4c5c..b540913 100644 (file)
@@ -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,
index aaeea48..ccb7219 100644 (file)
@@ -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
index 815442b..de92458 100644 (file)
 
 #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);
+       }
+}
index 401e7ed..d836f88 100644 (file)
@@ -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 {
index c7e3b92..1b372ef 100644 (file)
@@ -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);
        }
 
        /*
index b6b7f3a..7b10912 100644 (file)
@@ -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:
index 52dfd0d..d62a616 100644 (file)
@@ -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);
        }
index 80670cb..7eba578 100644 (file)
@@ -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) */
index bd6cd4a..14ab836 100644 (file)
@@ -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:
index d293d97..8934b4e 100644 (file)
@@ -51,73 +51,6 @@ 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
  *
  * PARAMETERS:  node            - Namespace node whose pathname is needed
@@ -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);
+}
index 57a4cfe..3736d43 100644 (file)
@@ -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) {
index 8d8104b..de325ae 100644 (file)
@@ -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
index 9ff643b..4b4d2f4 100644 (file)
@@ -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);
        }
 
index 6d03877..29d8b7b 100644 (file)
@@ -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);
                        }
index 9043722..03ac8c9 100644 (file)
@@ -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);
                }
 
                /*
index 2f5ddd8..e54bc2a 100644 (file)
@@ -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);
        }
index a555f7f..98001d7 100644 (file)
@@ -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;
                        }
index 3244091..183cc1e 100644 (file)
@@ -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;
        }
 
index 841a5ea..4254805 100644 (file)
 #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 @@ exit:
  *
  ******************************************************************************/
 
-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);
index 3fa829e..a534442 100644 (file)
@@ -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 */
 
index 6253001..455a070 100644 (file)
@@ -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);
                }
        }
 }
index 119c84a..405529d 100644 (file)
@@ -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));
index 15ea98e..6319b42 100644 (file)
@@ -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:
 
index 568ac0e..4337990 100644 (file)
@@ -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 @@ next_table:
 
        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);
+}
index 9682d40..55ee14c 100644 (file)
@@ -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);
index cd02693..4146229 100644 (file)
@@ -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,
        }
 }
 
+/*******************************************************************************
+ *
+ * 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;
index 71fce38..1638312 100644 (file)
@@ -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:
index 857af82..75a94f5 100644 (file)
@@ -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);
index e402e07..28ab3a1 100644 (file)
@@ -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 */
 
index 71b6653..bd4443b 100644 (file)
@@ -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;
        }
diff --git a/drivers/acpi/acpica/utnonansi.c b/drivers/acpi/acpica/utnonansi.c
new file mode 100644 (file)
index 0000000..1d5f6b1
--- /dev/null
@@ -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, &quotient, 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
index 8f3c883..4ddd105 100644 (file)
 #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, &quotient, 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 @@ error_exit:
  *              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
index 51cf52d..4f33281 100644 (file)
@@ -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) */
 
index 42a32a6..a7137ec 100644 (file)
@@ -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);
 }
 
index 6b040f4..fcf9080 100644 (file)
@@ -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 */
index 03aacfb..e11611c 100644 (file)
 
 #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 */
index 11c3a01..9f20eb4 100644 (file)
@@ -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[] = {
index f56de8c..908d4f9 100644 (file)
@@ -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] */
 
 #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" */
 #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.
 #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,
 #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 */
 
index d02df0a..a54ad1c 100644 (file)
@@ -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__ */
index e8ec18a..c33eeab 100644 (file)
@@ -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
index a948fc5..6e28f54 100644 (file)
@@ -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 */
index c2a41d2..f914958 100644 (file)
@@ -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
index 3cedd43..ec00e2b 100644 (file)
 
 #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)     || \
 #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
 #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
 
 
  * 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.
index 0a7dc8e..2f296cb 100644 (file)
@@ -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"
 
diff --git a/include/acpi/platform/acmsvcex.h b/include/acpi/platform/acmsvcex.h
new file mode 100644 (file)
index 0000000..b647974
--- /dev/null
@@ -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__ */
diff --git a/include/acpi/platform/acwinex.h b/include/acpi/platform/acwinex.h
new file mode 100644 (file)
index 0000000..6ed1d71
--- /dev/null
@@ -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__ */