ACPICA 20050708 from Bob Moore <robert.moore@intel.com>
authorRobert Moore <robert.moore@intel.com>
Fri, 8 Jul 2005 04:00:00 +0000 (00:00 -0400)
committerLen Brown <len.brown@intel.com>
Thu, 14 Jul 2005 04:42:23 +0000 (00:42 -0400)
The use of the CPU stack in the debug version of the
subsystem has been considerably reduced.  Previously, a
debug structure was declared in every function that used
the debug macros.  This structure has been removed in
favor of declaring the individual elements as parameters
to the debug functions.  This reduces the cumulative stack
use during nested execution of ACPI function calls at the
cost of a small increase in the code size of the debug
version of the subsystem.  With assistance from Alexey
Starikovskiy and Len Brown.

Added the ACPI_GET_FUNCTION_NAME macro to enable the
compiler-dependent headers to define a macro that will
return the current function name at runtime (such as
__FUNCTION__ or _func_, etc.) The function name is used
by the debug trace output.  If ACPI_GET_FUNCTION_NAME
is not defined in the compiler-dependent header, the
function name is saved on the CPU stack (one pointer per
function.) This mechanism is used because apparently there
exists no standard ANSI-C defined macro that that returns
the function name.

Alexey Starikovskiy redesigned and reimplemented the
"Owner ID" mechanism used to track namespace objects
created/deleted by ACPI tables and control method
execution.  A bitmap is now used to allocate and free the
IDs, thus solving the wraparound problem present in the
previous implementation.  The size of the namespace node
descriptor was reduced by 2 bytes as a result.

Removed the UINT32_BIT and UINT16_BIT types that were used
for the bitfield flag definitions within the headers for
the predefined ACPI tables.  These have been replaced by
UINT8_BIT in order to increase the code portability of
the subsystem.  If the use of UINT8 remains a problem,
we may be forced to eliminate bitfields entirely because
of a lack of portability.

Alexey Starikovksiy enhanced the performance of
acpi_ut_update_object_reference.  This is a frequently used
function and this improvement increases the performance
of the entire subsystem.

Alexey Starikovskiy fixed several possible memory leaks
and the inverse - premature object deletion.

Signed-off-by: Len Brown <len.brown@intel.com>
39 files changed:
drivers/acpi/dispatcher/dsinit.c
drivers/acpi/dispatcher/dsmethod.c
drivers/acpi/executer/exconfig.c
drivers/acpi/executer/exdump.c
drivers/acpi/executer/exoparg1.c
drivers/acpi/executer/exresop.c
drivers/acpi/namespace/nsaccess.c
drivers/acpi/namespace/nsalloc.c
drivers/acpi/namespace/nsdump.c
drivers/acpi/namespace/nsparse.c
drivers/acpi/parser/psloop.c
drivers/acpi/parser/psxface.c
drivers/acpi/tables/tbinstal.c
drivers/acpi/tables/tbrsdt.c
drivers/acpi/tables/tbxface.c
drivers/acpi/tables/tbxfroot.c
drivers/acpi/utilities/utcache.c
drivers/acpi/utilities/utdebug.c
drivers/acpi/utilities/utdelete.c
drivers/acpi/utilities/utglobal.c
drivers/acpi/utilities/utmisc.c
drivers/acpi/utilities/utmutex.c
include/acpi/acconfig.h
include/acpi/acdisasm.h
include/acpi/acexcep.h
include/acpi/acglobal.h
include/acpi/aclocal.h
include/acpi/acmacros.h
include/acpi/acnamesp.h
include/acpi/acobject.h
include/acpi/acoutput.h
include/acpi/acstruct.h
include/acpi/actables.h
include/acpi/actbl.h
include/acpi/actbl1.h
include/acpi/actbl2.h
include/acpi/actypes.h
include/acpi/acutils.h
include/acpi/platform/acgcc.h

index d7790db50178a2a8c29b31b7da2fcef0a65abe56..ebc07aab710cb8585c1fa909c76c54e38c154d23 100644 (file)
@@ -99,7 +99,7 @@ acpi_ds_init_one_object (
         * was just loaded
         */
        if (((struct acpi_namespace_node *) obj_handle)->owner_id !=
-                       info->table_desc->table_id) {
+                       info->table_desc->owner_id) {
                return (AE_OK);
        }
 
@@ -168,7 +168,7 @@ acpi_ds_init_one_object (
                 */
                acpi_ns_delete_namespace_subtree (obj_handle);
                acpi_ns_delete_namespace_by_owner (
-                       ((struct acpi_namespace_node *) obj_handle)->object->method.owning_id);
+                       ((struct acpi_namespace_node *) obj_handle)->object->method.owner_id);
                break;
 
 
@@ -237,7 +237,7 @@ acpi_ds_initialize_objects (
 
        ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
                "\nTable [%4.4s](id %4.4X) - %hd Objects with %hd Devices %hd Methods %hd Regions\n",
-               table_desc->pointer->signature, table_desc->table_id, info.object_count,
+               table_desc->pointer->signature, table_desc->owner_id, info.object_count,
                info.device_count, info.method_count, info.op_region_count));
 
        ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
index c9d9a6c45ae3f89066dade9fb356f1c01ceed44f..1b90813cbde1faec5a4382d00f92374b694e018b 100644 (file)
@@ -77,7 +77,6 @@ acpi_ds_parse_method (
        union acpi_operand_object       *obj_desc;
        union acpi_parse_object         *op;
        struct acpi_namespace_node      *node;
-       acpi_owner_id                   owner_id;
        struct acpi_walk_state          *walk_state;
 
 
@@ -132,15 +131,18 @@ acpi_ds_parse_method (
         * objects (such as Operation Regions) can be created during the
         * first pass parse.
         */
-       owner_id = acpi_ut_allocate_owner_id (ACPI_OWNER_TYPE_METHOD);
-       obj_desc->method.owning_id = owner_id;
+       status = acpi_ut_allocate_owner_id (&obj_desc->method.owner_id);
+       if (ACPI_FAILURE (status)) {
+               goto cleanup;
+       }
 
        /* Create and initialize a new walk state */
 
-       walk_state = acpi_ds_create_walk_state (owner_id, NULL, NULL, NULL);
+       walk_state = acpi_ds_create_walk_state (
+                         obj_desc->method.owner_id, NULL, NULL, NULL);
        if (!walk_state) {
                status = AE_NO_MEMORY;
-               goto cleanup;
+               goto cleanup2;
        }
 
        status = acpi_ds_init_aml_walk (walk_state, op, node,
@@ -148,7 +150,7 @@ acpi_ds_parse_method (
                          obj_desc->method.aml_length, NULL, 1);
        if (ACPI_FAILURE (status)) {
                acpi_ds_delete_walk_state (walk_state);
-               goto cleanup;
+               goto cleanup2;
        }
 
        /*
@@ -162,13 +164,16 @@ acpi_ds_parse_method (
         */
        status = acpi_ps_parse_aml (walk_state);
        if (ACPI_FAILURE (status)) {
-               goto cleanup;
+               goto cleanup2;
        }
 
        ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
                "**** [%4.4s] Parsed **** named_obj=%p Op=%p\n",
                acpi_ut_get_node_name (obj_handle), obj_handle, op));
 
+cleanup2:
+       (void) acpi_ut_release_owner_id (obj_desc->method.owner_id);
+
 cleanup:
        acpi_ps_delete_parse_tree (op);
        return_ACPI_STATUS (status);
@@ -265,7 +270,7 @@ acpi_ds_call_control_method (
 {
        acpi_status                     status;
        struct acpi_namespace_node      *method_node;
-       struct acpi_walk_state          *next_walk_state;
+       struct acpi_walk_state          *next_walk_state = NULL;
        union acpi_operand_object       *obj_desc;
        struct acpi_parameter_info      info;
        u32                             i;
@@ -289,20 +294,23 @@ acpi_ds_call_control_method (
                return_ACPI_STATUS (AE_NULL_OBJECT);
        }
 
-       obj_desc->method.owning_id = acpi_ut_allocate_owner_id (ACPI_OWNER_TYPE_METHOD);
+       status = acpi_ut_allocate_owner_id (&obj_desc->method.owner_id);
+       if (ACPI_FAILURE (status)) {
+               return_ACPI_STATUS (status);
+       }
 
        /* Init for new method, wait on concurrency semaphore */
 
        status = acpi_ds_begin_method_execution (method_node, obj_desc,
                          this_walk_state->method_node);
        if (ACPI_FAILURE (status)) {
-               return_ACPI_STATUS (status);
+               goto cleanup;
        }
 
        if (!(obj_desc->method.method_flags & AML_METHOD_INTERNAL_ONLY)) {
                /* 1) Parse: Create a new walk state for the preempting walk */
 
-               next_walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id,
+               next_walk_state = acpi_ds_create_walk_state (obj_desc->method.owner_id,
                                  op, obj_desc, NULL);
                if (!next_walk_state) {
                        return_ACPI_STATUS (AE_NO_MEMORY);
@@ -332,7 +340,7 @@ acpi_ds_call_control_method (
 
        /* 2) Execute: Create a new state for the preempting walk */
 
-       next_walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id,
+       next_walk_state = acpi_ds_create_walk_state (obj_desc->method.owner_id,
                          NULL, obj_desc, thread);
        if (!next_walk_state) {
                status = AE_NO_MEMORY;
@@ -383,6 +391,7 @@ acpi_ds_call_control_method (
        /* On error, we must delete the new walk state */
 
 cleanup:
+       (void) acpi_ut_release_owner_id (obj_desc->method.owner_id);
        if (next_walk_state && (next_walk_state->method_desc)) {
                /* Decrement the thread count on the method parse tree */
 
@@ -584,7 +593,7 @@ acpi_ds_terminate_control_method (
                 * Delete any namespace entries created anywhere else within
                 * the namespace
                 */
-               acpi_ns_delete_namespace_by_owner (walk_state->method_desc->method.owning_id);
+               acpi_ns_delete_namespace_by_owner (walk_state->method_desc->method.owner_id);
                status = acpi_ut_release_mutex (ACPI_MTX_NAMESPACE);
                if (ACPI_FAILURE (status)) {
                        return_ACPI_STATUS (status);
index 8bfa6effaa0c3eff101de0986878458c4757a81e..76c6ebd0231f2936336cfd70ac91bb1bd804bbfe 100644 (file)
@@ -487,7 +487,7 @@ acpi_ex_unload_table (
         * Delete the entire namespace under this table Node
         * (Offset contains the table_id)
         */
-       acpi_ns_delete_namespace_by_owner (table_info->table_id);
+       acpi_ns_delete_namespace_by_owner (table_info->owner_id);
 
        /* Delete the table itself */
 
index 7007abb6051e07388f76237b0885ac2240d55225..6158f5193f4af03367177a7ba020b9f2736737fa 100644 (file)
@@ -819,7 +819,7 @@ acpi_ex_dump_object_descriptor (
                acpi_ex_out_integer ("param_count", obj_desc->method.param_count);
                acpi_ex_out_integer ("Concurrency", obj_desc->method.concurrency);
                acpi_ex_out_pointer ("Semaphore",   obj_desc->method.semaphore);
-               acpi_ex_out_integer ("owning_id",   obj_desc->method.owning_id);
+               acpi_ex_out_integer ("owner_id",    obj_desc->method.owner_id);
                acpi_ex_out_integer ("aml_length",  obj_desc->method.aml_length);
                acpi_ex_out_pointer ("aml_start",   obj_desc->method.aml_start);
                break;
index 131f49acb1df50a3fdbd6237f267350bdbd50997..c1ba8b48228e7c9aad1bf3674160cf13373a7f3a 100644 (file)
@@ -904,6 +904,7 @@ acpi_ex_opcode_1A_0T_1R (
                         */
                        return_desc = acpi_ns_get_attached_object (
                                          (struct acpi_namespace_node *) operand[0]);
+                       acpi_ut_add_reference (return_desc);
                }
                else {
                        /*
@@ -953,20 +954,10 @@ acpi_ex_opcode_1A_0T_1R (
                                         * add another reference to the referenced object, however.
                                         */
                                        return_desc = *(operand[0]->reference.where);
-                                       if (!return_desc) {
-                                               /*
-                                                * We can't return a NULL dereferenced value.  This is
-                                                * an uninitialized package element and is thus a
-                                                * severe error.
-                                                */
-                                               ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
-                                                       "NULL package element obj %p\n",
-                                                       operand[0]));
-                                               status = AE_AML_UNINITIALIZED_ELEMENT;
-                                               goto cleanup;
+                                       if (return_desc) {
+                           acpi_ut_add_reference (return_desc);
                                        }
 
-                                       acpi_ut_add_reference (return_desc);
                                        break;
 
 
index d8b470eefe7a5832cd0eec7d66bab5794338d892..aaba7abcb52db92a038ad718075dd3c75aa9fc7d 100644 (file)
@@ -426,6 +426,10 @@ acpi_ex_resolve_operands (
 
                                return_ACPI_STATUS (status);
                        }
+
+                       if (obj_desc != *stack_ptr) {
+                               acpi_ut_remove_reference (obj_desc);
+                       }
                        goto next_operand;
 
 
@@ -448,6 +452,10 @@ acpi_ex_resolve_operands (
 
                                return_ACPI_STATUS (status);
                        }
+
+                       if (obj_desc != *stack_ptr) {
+                               acpi_ut_remove_reference (obj_desc);
+                       }
                        goto next_operand;
 
 
@@ -471,6 +479,10 @@ acpi_ex_resolve_operands (
 
                                return_ACPI_STATUS (status);
                        }
+
+                       if (obj_desc != *stack_ptr) {
+                               acpi_ut_remove_reference (obj_desc);
+                       }
                        goto next_operand;
 
 
@@ -515,6 +527,10 @@ acpi_ex_resolve_operands (
                                if (ACPI_FAILURE (status)) {
                                        return_ACPI_STATUS (status);
                                }
+
+                               if (obj_desc != *stack_ptr) {
+                                       acpi_ut_remove_reference (obj_desc);
+                               }
                                break;
 
                        default:
index 9df0a64ba9e99a91459bf00e591a6a354308082f..0bda88d18685ccc5c994c60c44543ef694d27dd4 100644 (file)
@@ -163,7 +163,7 @@ acpi_ns_root_initialize (
 
                                /*
                                 * i_aSL Compiler cheats by putting parameter count
-                                * in the owner_iD
+                                * in the owner_iD (param_count max is 7)
                                 */
                                new_node->owner_id = obj_desc->method.param_count;
 #else
index 3f94b0806ecf6d7a92f95074c9469288fd56d635..edbf1db36b6876099f26d71a0b3e25c5abb58865 100644 (file)
@@ -190,7 +190,7 @@ acpi_ns_install_node (
        struct acpi_namespace_node      *node,          /* New Child*/
        acpi_object_type                type)
 {
-       u16                             owner_id = 0;
+       acpi_owner_id                   owner_id = 0;
        struct acpi_namespace_node      *child_node;
 #ifdef ACPI_ALPHABETIC_NAMESPACE
 
@@ -559,7 +559,7 @@ acpi_ns_remove_reference (
 
 void
 acpi_ns_delete_namespace_by_owner (
-       u16                             owner_id)
+       acpi_owner_id                    owner_id)
 {
        struct acpi_namespace_node      *child_node;
        struct acpi_namespace_node      *deletion_node;
@@ -635,6 +635,7 @@ acpi_ns_delete_namespace_by_owner (
                }
        }
 
+       (void) acpi_ut_release_owner_id (owner_id);
        return_VOID;
 }
 
index c9f35dd7a4317fd84d26ea2bfd7b34bbcb69fa52..d86ccbc8a1346579ad6bb5655a8df7759c76af79 100644 (file)
@@ -203,7 +203,7 @@ acpi_ns_dump_one_object (
 
        /* Check if the owner matches */
 
-       if ((info->owner_id != ACPI_UINT32_MAX) &&
+       if ((info->owner_id != ACPI_OWNER_ID_MAX) &&
                (info->owner_id != this_node->owner_id)) {
                return (AE_OK);
        }
@@ -598,7 +598,7 @@ acpi_ns_dump_objects (
        acpi_object_type                type,
        u8                              display_type,
        u32                             max_depth,
-       u32                             owner_id,
+       acpi_owner_id                   owner_id,
        acpi_handle                     start_handle)
 {
        struct acpi_walk_info           info;
@@ -643,7 +643,7 @@ acpi_ns_dump_entry (
 
 
        info.debug_level = debug_level;
-       info.owner_id = ACPI_UINT32_MAX;
+       info.owner_id = ACPI_OWNER_ID_MAX;
        info.display_type = ACPI_DISPLAY_SUMMARY;
 
        (void) acpi_ns_dump_one_object (handle, 1, &info, NULL);
@@ -694,7 +694,7 @@ acpi_ns_dump_tables (
        }
 
        acpi_ns_dump_objects (ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, max_depth,
-                       ACPI_UINT32_MAX, search_handle);
+                       ACPI_OWNER_ID_MAX, search_handle);
        return_VOID;
 }
 #endif /* _ACPI_ASL_COMPILER */
index f81b836e77f11e6ff4adb67e1daf621d0f7b854e..64e0b2b9f55c19ab492896b9fcbf4f8e62ba2662 100644 (file)
@@ -87,7 +87,7 @@ acpi_ns_one_complete_parse (
 
        /* Create and initialize a new walk state */
 
-       walk_state = acpi_ds_create_walk_state (table_desc->table_id,
+       walk_state = acpi_ds_create_walk_state (table_desc->owner_id,
                           NULL, NULL, NULL);
        if (!walk_state) {
                acpi_ps_free_op (parse_root);
index decb2e9a049d229d256cfea0ecd3068596a5fb4d..095672a1a722a483825b48e063467d7c77be25d7 100644 (file)
@@ -407,9 +407,14 @@ acpi_ps_parse_loop (
                                        INCREMENT_ARG_LIST (walk_state->arg_types);
                                }
 
+
                                /* Special processing for certain opcodes */
 
-                               if ((walk_state->pass_number <= ACPI_IMODE_LOAD_PASS1) &&
+       /* TBD (remove): Temporary mechanism to disable this code if needed */
+
+#ifndef ACPI_NO_MODULE_LEVEL_CODE
+
+                        if ((walk_state->pass_number <= ACPI_IMODE_LOAD_PASS1) &&
                                   ((walk_state->parse_flags & ACPI_PARSE_DISASSEMBLE) == 0)) {
                                        /*
                                         * We want to skip If/Else/While constructs during Pass1
@@ -434,7 +439,7 @@ acpi_ps_parse_loop (
                                                break;
                                        }
                                }
-
+#endif
                                switch (op->common.aml_opcode) {
                                case AML_METHOD_OP:
 
index dba893648e84b762cba90073ba1b5df05b29bd5f..5279b51e77874d7693fe8d276a1c5a3fbe4bd796 100644 (file)
@@ -138,11 +138,14 @@ acpi_psx_execute (
         * objects (such as Operation Regions) can be created during the
         * first pass parse.
         */
-       obj_desc->method.owning_id = acpi_ut_allocate_owner_id (ACPI_OWNER_TYPE_METHOD);
+       status = acpi_ut_allocate_owner_id (&obj_desc->method.owner_id);
+       if (ACPI_FAILURE (status)) {
+               goto cleanup2;
+       }
 
        /* Create and initialize a new walk state */
 
-       walk_state = acpi_ds_create_walk_state (obj_desc->method.owning_id,
+       walk_state = acpi_ds_create_walk_state (obj_desc->method.owner_id,
                           NULL, NULL, NULL);
        if (!walk_state) {
                status = AE_NO_MEMORY;
index 629b64c8193da1858a69b54f68a64f07f22ab528..2ad72f20455123c178769a74cb82cba7ade45540 100644 (file)
@@ -251,6 +251,7 @@ acpi_tb_init_table_descriptor (
 {
        struct acpi_table_list          *list_head;
        struct acpi_table_desc          *table_desc;
+       acpi_status                     status;
 
 
        ACPI_FUNCTION_TRACE_U32 ("tb_init_table_descriptor", table_type);
@@ -263,6 +264,13 @@ acpi_tb_init_table_descriptor (
                return_ACPI_STATUS (AE_NO_MEMORY);
        }
 
+       /* Get a new owner ID for the table */
+
+       status = acpi_ut_allocate_owner_id (&table_desc->owner_id);
+       if (ACPI_FAILURE (status)) {
+               return_ACPI_STATUS (status);
+       }
+
        /* Install the table into the global data structure */
 
        list_head = &acpi_gbl_table_lists[table_type];
@@ -325,8 +333,6 @@ acpi_tb_init_table_descriptor (
        table_desc->aml_start           = (u8 *) (table_desc->pointer + 1),
        table_desc->aml_length          = (u32) (table_desc->length -
                         (u32) sizeof (struct acpi_table_header));
-       table_desc->table_id            = acpi_ut_allocate_owner_id (
-                        ACPI_OWNER_TYPE_TABLE);
        table_desc->loaded_into_namespace = FALSE;
 
        /*
@@ -339,7 +345,7 @@ acpi_tb_init_table_descriptor (
 
        /* Return Data */
 
-       table_info->table_id        = table_desc->table_id;
+       table_info->owner_id        = table_desc->owner_id;
        table_info->installed_desc  = table_desc;
 
        return_ACPI_STATUS (AE_OK);
index 13c6ddb2f5466c048ab984c0b1bc7b973bb68e22..069d498465d0a1221012ec7a190cf93ac82a69c5 100644 (file)
@@ -96,32 +96,13 @@ acpi_tb_verify_rsdp (
                return_ACPI_STATUS (AE_BAD_PARAMETER);
        }
 
-       /*
-        *  The signature and checksum must both be correct
-        */
-       if (ACPI_STRNCMP ((char *) rsdp, RSDP_SIG, sizeof (RSDP_SIG)-1) != 0) {
-               /* Nope, BAD Signature */
-
-               status = AE_BAD_SIGNATURE;
-               goto cleanup;
-       }
-
-       /* Check the standard checksum */
+       /* Verify RSDP signature and checksum */
 
-       if (acpi_tb_checksum (rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) {
-               status = AE_BAD_CHECKSUM;
+       status = acpi_tb_validate_rsdp (rsdp);
+       if (ACPI_FAILURE (status)) {
                goto cleanup;
        }
 
-       /* Check extended checksum if table version >= 2 */
-
-       if (rsdp->revision >= 2) {
-               if (acpi_tb_checksum (rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0) {
-                       status = AE_BAD_CHECKSUM;
-                       goto cleanup;
-               }
-       }
-
        /* The RSDP supplied is OK */
 
        table_info.pointer     = ACPI_CAST_PTR (struct acpi_table_header, rsdp);
index 0c0b9085dbeb954843881f6bd865f85118191585..ca2dbdd23ed3053b47fc35239dc9654fcc5c60c7 100644 (file)
@@ -260,8 +260,7 @@ acpi_unload_table (
                 * "Scope" operator.  Thus, we need to track ownership by an ID, not
                 * simply a position within the hierarchy
                 */
-               acpi_ns_delete_namespace_by_owner (table_desc->table_id);
-
+               acpi_ns_delete_namespace_by_owner (table_desc->owner_id);
                table_desc = table_desc->next;
        }
 
index fe9c8317df465e2f762335b7006dca215fd5439a..abb4c934656049360163c09c54037392975f0ab6 100644 (file)
@@ -63,6 +63,51 @@ acpi_tb_scan_memory_for_rsdp (
        u32                             length);
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_tb_validate_rsdp
+ *
+ * PARAMETERS:  Rsdp        - Pointer to unvalidated RSDP
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Validate the RSDP (ptr)
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_tb_validate_rsdp (
+       struct rsdp_descriptor          *rsdp)
+{
+       ACPI_FUNCTION_ENTRY ();
+
+
+       /*
+        *  The signature and checksum must both be correct
+        */
+       if (ACPI_STRNCMP ((char *) rsdp, RSDP_SIG, sizeof (RSDP_SIG)-1) != 0) {
+               /* Nope, BAD Signature */
+
+               return (AE_BAD_SIGNATURE);
+       }
+
+       /* Check the standard checksum */
+
+       if (acpi_tb_checksum (rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0) {
+               return (AE_BAD_CHECKSUM);
+       }
+
+       /* Check extended checksum if table version >= 2 */
+
+       if ((rsdp->revision >= 2) &&
+               (acpi_tb_checksum (rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0)) {
+               return (AE_BAD_CHECKSUM);
+       }
+
+       return (AE_OK);
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_tb_find_table
@@ -218,19 +263,11 @@ acpi_get_firmware_table (
                        acpi_gbl_RSDP = address.pointer.logical;
                }
 
-               /* The signature and checksum must both be correct */
-
-               if (ACPI_STRNCMP ((char *) acpi_gbl_RSDP, RSDP_SIG,
-                               sizeof (RSDP_SIG)-1) != 0) {
-                       /* Nope, BAD Signature */
+               /* The RDSP signature and checksum must both be correct */
 
-                       return_ACPI_STATUS (AE_BAD_SIGNATURE);
-               }
-
-               if (acpi_tb_checksum (acpi_gbl_RSDP, ACPI_RSDP_CHECKSUM_LENGTH) != 0) {
-                       /* Nope, BAD Checksum */
-
-                       return_ACPI_STATUS (AE_BAD_CHECKSUM);
+               status = acpi_tb_validate_rsdp (acpi_gbl_RSDP);
+               if (ACPI_FAILURE (status)) {
+                       return_ACPI_STATUS (status);
                }
        }
 
@@ -414,9 +451,9 @@ acpi_tb_scan_memory_for_rsdp (
        u8                              *start_address,
        u32                             length)
 {
+       acpi_status                     status;
        u8                              *mem_rover;
        u8                              *end_address;
-       u8                              checksum;
 
 
        ACPI_FUNCTION_TRACE ("tb_scan_memory_for_rsdp");
@@ -428,45 +465,25 @@ acpi_tb_scan_memory_for_rsdp (
 
        for (mem_rover = start_address; mem_rover < end_address;
                 mem_rover += ACPI_RSDP_SCAN_STEP) {
-               /* The signature and checksum must both be correct */
+               /* The RSDP signature and checksum must both be correct */
 
-               if (ACPI_STRNCMP ((char *) mem_rover,
-                               RSDP_SIG, sizeof (RSDP_SIG) - 1) != 0) {
-                       /* No signature match, keep looking */
-
-                       continue;
-               }
-
-               /* Signature matches, check the appropriate checksum */
-
-               if ((ACPI_CAST_PTR (struct rsdp_descriptor, mem_rover))->revision < 2) {
-                       /* ACPI version 1.0 */
-
-                       checksum = acpi_tb_checksum (mem_rover, ACPI_RSDP_CHECKSUM_LENGTH);
-               }
-               else {
-                       /* Post ACPI 1.0, use extended_checksum */
-
-                       checksum = acpi_tb_checksum (mem_rover, ACPI_RSDP_XCHECKSUM_LENGTH);
-               }
-
-               if (checksum == 0) {
-                       /* Checksum valid, we have found a valid RSDP */
+               status = acpi_tb_validate_rsdp (ACPI_CAST_PTR (struct rsdp_descriptor, mem_rover));
+               if (ACPI_SUCCESS (status)) {
+                       /* Sig and checksum valid, we have found a real RSDP */
 
                        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
                                "RSDP located at physical address %p\n", mem_rover));
                        return_PTR (mem_rover);
                }
 
-               ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-                       "Found an RSDP at physical address %p, but it has a bad checksum\n",
-                       mem_rover));
+               /* No sig match or bad checksum, keep searching */
        }
 
        /* Searched entire block, no RSDP was found */
 
        ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
-               "Searched entire block, no valid RSDP was found.\n"));
+               "Searched entire block from %p, valid RSDP was not found\n",
+               start_address));
        return_PTR (NULL);
 }
 
@@ -554,7 +571,7 @@ acpi_tb_find_rsdp (
                        acpi_os_unmap_memory (table_ptr, ACPI_EBDA_WINDOW_SIZE);
 
                        if (mem_rover) {
-                               /* Found it, return the physical address */
+                               /* Return the physical address */
 
                                physical_address += ACPI_PTR_DIFF (mem_rover, table_ptr);
 
@@ -583,7 +600,7 @@ acpi_tb_find_rsdp (
                acpi_os_unmap_memory (table_ptr, ACPI_HI_RSDP_WINDOW_SIZE);
 
                if (mem_rover) {
-                       /* Found it, return the physical address */
+                       /* Return the physical address */
 
                        physical_address =
                                ACPI_HI_RSDP_WINDOW_BASE + ACPI_PTR_DIFF (mem_rover, table_ptr);
@@ -614,7 +631,7 @@ acpi_tb_find_rsdp (
                                          ACPI_PHYSADDR_TO_PTR (physical_address),
                                          ACPI_EBDA_WINDOW_SIZE);
                        if (mem_rover) {
-                               /* Found it, return the physical address */
+                               /* Return the physical address */
 
                                table_info->physical_address = ACPI_TO_INTEGER (mem_rover);
                                return_ACPI_STATUS (AE_OK);
@@ -634,8 +651,9 @@ acpi_tb_find_rsdp (
                }
        }
 
-       /* RSDP signature was not found */
+       /* A valid RSDP was not found */
 
+       ACPI_REPORT_ERROR (("No valid RSDP was found\n"));
        return_ACPI_STATUS (AE_NOT_FOUND);
 }
 
index 07588812e72dc59d0d9ef3d5f83c2ee0fe0f0cdd..c0df0585c68344b742a7c810567ec37b206f6bc1 100644 (file)
@@ -74,6 +74,9 @@ acpi_os_create_cache (
        struct acpi_memory_list         *cache;
 
 
+       ACPI_FUNCTION_ENTRY ();
+
+
        if (!cache_name || !return_cache || (object_size < 16)) {
                return (AE_BAD_PARAMETER);
        }
@@ -161,7 +164,10 @@ acpi_os_delete_cache (
        acpi_status                     status;
 
 
-       /* Purge all objects in the cache */
+       ACPI_FUNCTION_ENTRY ();
+
+
+   /* Purge all objects in the cache */
 
        status = acpi_os_purge_cache (cache);
        if (ACPI_FAILURE (status)) {
@@ -259,7 +265,7 @@ acpi_os_acquire_object (
        void                            *object;
 
 
-       ACPI_FUNCTION_NAME ("ut_acquire_from_cache");
+       ACPI_FUNCTION_NAME ("os_acquire_object");
 
 
        if (!cache) {
@@ -286,7 +292,7 @@ acpi_os_acquire_object (
 
                ACPI_MEM_TRACKING (cache->hits++);
                ACPI_MEM_TRACKING (ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
-                       "Object %p from %s\n", object, cache->list_name)));
+                       "Object %p from %s cache\n", object, cache->list_name)));
 
                status = acpi_ut_release_mutex (ACPI_MTX_CACHES);
                if (ACPI_FAILURE (status)) {
index 08362f686ec14191bbf51759166cb5213e2f7fc8..3d5fbc810b0ba30ecfc12dcb80f7d982fd58a8f4 100644 (file)
@@ -116,10 +116,9 @@ acpi_ut_track_stack_ptr (
  *
  * PARAMETERS:  requested_debug_level - Requested debug print level
  *              line_number         - Caller's line number (for error output)
- *              dbg_info            - Contains:
- *                  proc_name           - Caller's procedure name
- *                  module_name         - Caller's module name
- *                  component_id        - Caller's component ID
+ *              function_name       - Caller's procedure name
+ *              module_name         - Caller's module name
+ *              component_id        - Caller's component ID
  *              Format              - Printf format field
  *              ...                 - Optional printf arguments
  *
@@ -134,7 +133,9 @@ void  ACPI_INTERNAL_VAR_XFACE
 acpi_ut_debug_print (
        u32                             requested_debug_level,
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        char                            *format,
        ...)
 {
@@ -146,7 +147,7 @@ acpi_ut_debug_print (
         * Stay silent if the debug level or component ID is disabled
         */
        if (!(requested_debug_level & acpi_dbg_level) ||
-               !(dbg_info->component_id & acpi_dbg_layer)) {
+               !(component_id & acpi_dbg_layer)) {
                return;
        }
 
@@ -169,14 +170,14 @@ acpi_ut_debug_print (
         * Display the module name, current line number, thread ID (if requested),
         * current procedure nesting level, and the current procedure name
         */
-       acpi_os_printf ("%8s-%04ld ", dbg_info->module_name, line_number);
+       acpi_os_printf ("%8s-%04ld ", module_name, line_number);
 
        if (ACPI_LV_THREADS & acpi_dbg_level) {
                acpi_os_printf ("[%04lX] ", thread_id);
        }
 
        acpi_os_printf ("[%02ld] %-22.22s: ",
-               acpi_gbl_nesting_level, dbg_info->proc_name);
+               acpi_gbl_nesting_level, function_name);
 
        va_start (args, format);
        acpi_os_vprintf (format, args);
@@ -190,10 +191,9 @@ EXPORT_SYMBOL(acpi_ut_debug_print);
  *
  * PARAMETERS:  requested_debug_level - Requested debug print level
  *              line_number         - Caller's line number
- *              dbg_info            - Contains:
- *                  proc_name           - Caller's procedure name
- *                  module_name         - Caller's module name
- *                  component_id        - Caller's component ID
+ *              function_name       - Caller's procedure name
+ *              module_name         - Caller's module name
+ *              component_id        - Caller's component ID
  *              Format              - Printf format field
  *              ...                 - Optional printf arguments
  *
@@ -208,7 +208,9 @@ void  ACPI_INTERNAL_VAR_XFACE
 acpi_ut_debug_print_raw (
        u32                             requested_debug_level,
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        char                            *format,
        ...)
 {
@@ -216,7 +218,7 @@ acpi_ut_debug_print_raw (
 
 
        if (!(requested_debug_level & acpi_dbg_level) ||
-               !(dbg_info->component_id & acpi_dbg_layer)) {
+               !(component_id & acpi_dbg_layer)) {
                return;
        }
 
@@ -231,10 +233,9 @@ EXPORT_SYMBOL(acpi_ut_debug_print_raw);
  * FUNCTION:    acpi_ut_trace
  *
  * PARAMETERS:  line_number         - Caller's line number
- *              dbg_info            - Contains:
- *                  proc_name           - Caller's procedure name
- *                  module_name         - Caller's module name
- *                  component_id        - Caller's component ID
+ *              function_name       - Caller's procedure name
+ *              module_name         - Caller's module name
+ *              component_id        - Caller's component ID
  *
  * RETURN:      None
  *
@@ -246,14 +247,17 @@ EXPORT_SYMBOL(acpi_ut_debug_print_raw);
 void
 acpi_ut_trace (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info)
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id)
 {
 
        acpi_gbl_nesting_level++;
        acpi_ut_track_stack_ptr ();
 
-       acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
-                       "%s\n", acpi_gbl_fn_entry_str);
+       acpi_ut_debug_print (ACPI_LV_FUNCTIONS,
+               line_number, function_name, module_name, component_id,
+               "%s\n", acpi_gbl_fn_entry_str);
 }
 EXPORT_SYMBOL(acpi_ut_trace);
 
@@ -263,10 +267,9 @@ EXPORT_SYMBOL(acpi_ut_trace);
  * FUNCTION:    acpi_ut_trace_ptr
  *
  * PARAMETERS:  line_number         - Caller's line number
- *              dbg_info            - Contains:
- *                  proc_name           - Caller's procedure name
- *                  module_name         - Caller's module name
- *                  component_id        - Caller's component ID
+ *              function_name       - Caller's procedure name
+ *              module_name         - Caller's module name
+ *              component_id        - Caller's component ID
  *              Pointer             - Pointer to display
  *
  * RETURN:      None
@@ -279,14 +282,17 @@ EXPORT_SYMBOL(acpi_ut_trace);
 void
 acpi_ut_trace_ptr (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        void                            *pointer)
 {
        acpi_gbl_nesting_level++;
        acpi_ut_track_stack_ptr ();
 
-       acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
-                       "%s %p\n", acpi_gbl_fn_entry_str, pointer);
+       acpi_ut_debug_print (ACPI_LV_FUNCTIONS,
+               line_number, function_name, module_name, component_id,
+               "%s %p\n", acpi_gbl_fn_entry_str, pointer);
 }
 
 
@@ -295,10 +301,9 @@ acpi_ut_trace_ptr (
  * FUNCTION:    acpi_ut_trace_str
  *
  * PARAMETERS:  line_number         - Caller's line number
- *              dbg_info            - Contains:
- *                  proc_name           - Caller's procedure name
- *                  module_name         - Caller's module name
- *                  component_id        - Caller's component ID
+ *              function_name       - Caller's procedure name
+ *              module_name         - Caller's module name
+ *              component_id        - Caller's component ID
  *              String              - Additional string to display
  *
  * RETURN:      None
@@ -311,15 +316,18 @@ acpi_ut_trace_ptr (
 void
 acpi_ut_trace_str (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        char                            *string)
 {
 
        acpi_gbl_nesting_level++;
        acpi_ut_track_stack_ptr ();
 
-       acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
-                       "%s %s\n", acpi_gbl_fn_entry_str, string);
+       acpi_ut_debug_print (ACPI_LV_FUNCTIONS,
+               line_number, function_name, module_name, component_id,
+               "%s %s\n", acpi_gbl_fn_entry_str, string);
 }
 
 
@@ -328,10 +336,9 @@ acpi_ut_trace_str (
  * FUNCTION:    acpi_ut_trace_u32
  *
  * PARAMETERS:  line_number         - Caller's line number
- *              dbg_info            - Contains:
- *                  proc_name           - Caller's procedure name
- *                  module_name         - Caller's module name
- *                  component_id        - Caller's component ID
+ *              function_name       - Caller's procedure name
+ *              module_name         - Caller's module name
+ *              component_id        - Caller's component ID
  *              Integer             - Integer to display
  *
  * RETURN:      None
@@ -344,15 +351,18 @@ acpi_ut_trace_str (
 void
 acpi_ut_trace_u32 (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        u32                             integer)
 {
 
        acpi_gbl_nesting_level++;
        acpi_ut_track_stack_ptr ();
 
-       acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
-                       "%s %08X\n", acpi_gbl_fn_entry_str, integer);
+       acpi_ut_debug_print (ACPI_LV_FUNCTIONS,
+               line_number, function_name, module_name, component_id,
+               "%s %08X\n", acpi_gbl_fn_entry_str, integer);
 }
 
 
@@ -361,10 +371,9 @@ acpi_ut_trace_u32 (
  * FUNCTION:    acpi_ut_exit
  *
  * PARAMETERS:  line_number         - Caller's line number
- *              dbg_info            - Contains:
- *                  proc_name           - Caller's procedure name
- *                  module_name         - Caller's module name
- *                  component_id        - Caller's component ID
+ *              function_name       - Caller's procedure name
+ *              module_name         - Caller's module name
+ *              component_id        - Caller's component ID
  *
  * RETURN:      None
  *
@@ -376,11 +385,14 @@ acpi_ut_trace_u32 (
 void
 acpi_ut_exit (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info)
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id)
 {
 
-       acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
-                       "%s\n", acpi_gbl_fn_exit_str);
+       acpi_ut_debug_print (ACPI_LV_FUNCTIONS,
+               line_number, function_name, module_name, component_id,
+               "%s\n", acpi_gbl_fn_exit_str);
 
        acpi_gbl_nesting_level--;
 }
@@ -392,10 +404,9 @@ EXPORT_SYMBOL(acpi_ut_exit);
  * FUNCTION:    acpi_ut_status_exit
  *
  * PARAMETERS:  line_number         - Caller's line number
- *              dbg_info            - Contains:
- *                  proc_name           - Caller's procedure name
- *                  module_name         - Caller's module name
- *                  component_id        - Caller's component ID
+ *              function_name       - Caller's procedure name
+ *              module_name         - Caller's module name
+ *              component_id        - Caller's component ID
  *              Status              - Exit status code
  *
  * RETURN:      None
@@ -408,19 +419,23 @@ EXPORT_SYMBOL(acpi_ut_exit);
 void
 acpi_ut_status_exit (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        acpi_status                     status)
 {
 
        if (ACPI_SUCCESS (status)) {
-               acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
-                               "%s %s\n", acpi_gbl_fn_exit_str,
-                               acpi_format_exception (status));
+               acpi_ut_debug_print (ACPI_LV_FUNCTIONS,
+                       line_number, function_name, module_name, component_id,
+                       "%s %s\n", acpi_gbl_fn_exit_str,
+                       acpi_format_exception (status));
        }
        else {
-               acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
-                               "%s ****Exception****: %s\n", acpi_gbl_fn_exit_str,
-                               acpi_format_exception (status));
+               acpi_ut_debug_print (ACPI_LV_FUNCTIONS,
+                       line_number, function_name, module_name, component_id,
+                       "%s ****Exception****: %s\n", acpi_gbl_fn_exit_str,
+                       acpi_format_exception (status));
        }
 
        acpi_gbl_nesting_level--;
@@ -433,10 +448,9 @@ EXPORT_SYMBOL(acpi_ut_status_exit);
  * FUNCTION:    acpi_ut_value_exit
  *
  * PARAMETERS:  line_number         - Caller's line number
- *              dbg_info            - Contains:
- *                  proc_name           - Caller's procedure name
- *                  module_name         - Caller's module name
- *                  component_id        - Caller's component ID
+ *              function_name       - Caller's procedure name
+ *              module_name         - Caller's module name
+ *              component_id        - Caller's component ID
  *              Value               - Value to be printed with exit msg
  *
  * RETURN:      None
@@ -449,13 +463,16 @@ EXPORT_SYMBOL(acpi_ut_status_exit);
 void
 acpi_ut_value_exit (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        acpi_integer                    value)
 {
 
-       acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
-                       "%s %8.8X%8.8X\n", acpi_gbl_fn_exit_str,
-                       ACPI_FORMAT_UINT64 (value));
+       acpi_ut_debug_print (ACPI_LV_FUNCTIONS,
+               line_number, function_name, module_name, component_id,
+               "%s %8.8X%8.8X\n", acpi_gbl_fn_exit_str,
+               ACPI_FORMAT_UINT64 (value));
 
        acpi_gbl_nesting_level--;
 }
@@ -467,10 +484,9 @@ EXPORT_SYMBOL(acpi_ut_value_exit);
  * FUNCTION:    acpi_ut_ptr_exit
  *
  * PARAMETERS:  line_number         - Caller's line number
- *              dbg_info            - Contains:
- *                  proc_name           - Caller's procedure name
- *                  module_name         - Caller's module name
- *                  component_id        - Caller's component ID
+ *              function_name       - Caller's procedure name
+ *              module_name         - Caller's module name
+ *              component_id        - Caller's component ID
  *              Ptr                 - Pointer to display
  *
  * RETURN:      None
@@ -483,12 +499,15 @@ EXPORT_SYMBOL(acpi_ut_value_exit);
 void
 acpi_ut_ptr_exit (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        u8                              *ptr)
 {
 
-       acpi_ut_debug_print (ACPI_LV_FUNCTIONS, line_number, dbg_info,
-                       "%s %p\n", acpi_gbl_fn_exit_str, ptr);
+       acpi_ut_debug_print (ACPI_LV_FUNCTIONS,
+               line_number, function_name, module_name, component_id,
+               "%s %p\n", acpi_gbl_fn_exit_str, ptr);
 
        acpi_gbl_nesting_level--;
 }
index be97ada23c3d29d8cbc41d5858a9eb98fb96c31a..eeafb324c504534d07da092675afc02a73b2b6ad 100644 (file)
@@ -435,35 +435,24 @@ acpi_ut_update_object_reference (
        union acpi_operand_object       *object,
        u16                             action)
 {
-       acpi_status                     status;
-       u32                             i;
-       union acpi_generic_state         *state_list = NULL;
-       union acpi_generic_state         *state;
+       acpi_status                     status = AE_OK;
+       union acpi_generic_state        *state_list = NULL;
+       union acpi_operand_object       *next_object = NULL;
+       union acpi_generic_state        *state;
+       acpi_native_uint                i;
 
 
        ACPI_FUNCTION_TRACE_PTR ("ut_update_object_reference", object);
 
 
-       /* Ignore a null object ptr */
+       while (object) {
+               /* Make sure that this isn't a namespace handle */
 
-       if (!object) {
-               return_ACPI_STATUS (AE_OK);
-       }
-
-       /* Make sure that this isn't a namespace handle */
-
-       if (ACPI_GET_DESCRIPTOR_TYPE (object) == ACPI_DESC_TYPE_NAMED) {
-               ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
-                       "Object %p is NS handle\n", object));
-               return_ACPI_STATUS (AE_OK);
-       }
-
-       state = acpi_ut_create_update_state (object, action);
-
-       while (state) {
-               object = state->update.object;
-               action = state->update.value;
-               acpi_ut_delete_generic_state (state);
+               if (ACPI_GET_DESCRIPTOR_TYPE (object) == ACPI_DESC_TYPE_NAMED) {
+                       ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+                               "Object %p is NS handle\n", object));
+                       return_ACPI_STATUS (AE_OK);
+               }
 
                /*
                 * All sub-objects must have their reference count incremented also.
@@ -476,12 +465,10 @@ acpi_ut_update_object_reference (
                        acpi_ut_update_ref_count (object->device.device_notify, action);
                        break;
 
-
                case ACPI_TYPE_PACKAGE:
-
                        /*
-                        * We must update all the sub-objects of the package
-                        * (Each of whom may have their own sub-objects, etc.
+                        * We must update all the sub-objects of the package,
+                        * each of whom may have their own sub-objects.
                         */
                        for (i = 0; i < object->package.count; i++) {
                                /*
@@ -497,35 +484,19 @@ acpi_ut_update_object_reference (
                        }
                        break;
 
-
                case ACPI_TYPE_BUFFER_FIELD:
 
-                       status = acpi_ut_create_update_state_and_push (
-                                        object->buffer_field.buffer_obj, action, &state_list);
-                       if (ACPI_FAILURE (status)) {
-                               goto error_exit;
-                       }
+                       next_object = object->buffer_field.buffer_obj;
                        break;
 
-
                case ACPI_TYPE_LOCAL_REGION_FIELD:
 
-                       status = acpi_ut_create_update_state_and_push (
-                                        object->field.region_obj, action, &state_list);
-                       if (ACPI_FAILURE (status)) {
-                               goto error_exit;
-                       }
-                  break;
-
+                       next_object = object->field.region_obj;
+                       break;
 
                case ACPI_TYPE_LOCAL_BANK_FIELD:
 
-                       status = acpi_ut_create_update_state_and_push (
-                                        object->bank_field.bank_obj, action, &state_list);
-                       if (ACPI_FAILURE (status)) {
-                               goto error_exit;
-                       }
-
+                       next_object = object->bank_field.bank_obj;
                        status = acpi_ut_create_update_state_and_push (
                                         object->bank_field.region_obj, action, &state_list);
                        if (ACPI_FAILURE (status)) {
@@ -533,15 +504,9 @@ acpi_ut_update_object_reference (
                        }
                        break;
 
-
                case ACPI_TYPE_LOCAL_INDEX_FIELD:
 
-                       status = acpi_ut_create_update_state_and_push (
-                                        object->index_field.index_obj, action, &state_list);
-                       if (ACPI_FAILURE (status)) {
-                               goto error_exit;
-                       }
-
+                       next_object = object->index_field.index_obj;
                        status = acpi_ut_create_update_state_and_push (
                                         object->index_field.data_obj, action, &state_list);
                        if (ACPI_FAILURE (status)) {
@@ -549,28 +514,19 @@ acpi_ut_update_object_reference (
                        }
                        break;
 
-
                case ACPI_TYPE_LOCAL_REFERENCE:
-
                        /*
                         * The target of an Index (a package, string, or buffer) must track
                         * changes to the ref count of the index.
                         */
                        if (object->reference.opcode == AML_INDEX_OP) {
-                               status = acpi_ut_create_update_state_and_push (
-                                                object->reference.object, action, &state_list);
-                               if (ACPI_FAILURE (status)) {
-                                       goto error_exit;
-                               }
+                               next_object = object->reference.object;
                        }
                        break;
 
-
                case ACPI_TYPE_REGION:
                default:
-
-                       /* No subobjects */
-                       break;
+                       break;/* No subobjects */
                }
 
                /*
@@ -579,15 +535,23 @@ acpi_ut_update_object_reference (
                 * main object to be deleted.
                 */
                acpi_ut_update_ref_count (object, action);
+               object = NULL;
 
                /* Move on to the next object to be updated */
 
-               state = acpi_ut_pop_generic_state (&state_list);
+               if (next_object) {
+                       object = next_object;
+                       next_object = NULL;
+               }
+               else if (state_list) {
+                       state = acpi_ut_pop_generic_state (&state_list);
+                       object = state->update.object;
+                       acpi_ut_delete_generic_state (state);
+               }
        }
 
        return_ACPI_STATUS (AE_OK);
 
-
 error_exit:
 
        ACPI_REPORT_ERROR (("Could not update object reference count, %s\n",
index 8653dda4f813cb50ecc270a91151392a7f3d9a23..0e4161c810766e481033567bc7140b70b9c41537 100644 (file)
@@ -736,73 +736,6 @@ acpi_ut_valid_object_type (
 }
 
 
-/*******************************************************************************
- *
- * FUNCTION:    acpi_ut_allocate_owner_id
- *
- * PARAMETERS:  id_type         - Type of ID (method or table)
- *
- * DESCRIPTION: Allocate a table or method owner id
- *
- * NOTE: this algorithm has a wraparound problem at 64_k method invocations, and
- *       should be revisited (TBD)
- *
- ******************************************************************************/
-
-acpi_owner_id
-acpi_ut_allocate_owner_id (
-       u32                             id_type)
-{
-       acpi_owner_id                   owner_id = 0xFFFF;
-
-
-       ACPI_FUNCTION_TRACE ("ut_allocate_owner_id");
-
-
-       if (ACPI_FAILURE (acpi_ut_acquire_mutex (ACPI_MTX_CACHES)))
-       {
-               return (0);
-       }
-
-       switch (id_type)
-       {
-       case ACPI_OWNER_TYPE_TABLE:
-
-               owner_id = acpi_gbl_next_table_owner_id;
-               acpi_gbl_next_table_owner_id++;
-
-               /* Check for wraparound */
-
-               if (acpi_gbl_next_table_owner_id == ACPI_FIRST_METHOD_ID)
-               {
-                       acpi_gbl_next_table_owner_id = ACPI_FIRST_TABLE_ID;
-                       ACPI_REPORT_WARNING (("Table owner ID wraparound\n"));
-               }
-               break;
-
-
-       case ACPI_OWNER_TYPE_METHOD:
-
-               owner_id = acpi_gbl_next_method_owner_id;
-               acpi_gbl_next_method_owner_id++;
-
-               if (acpi_gbl_next_method_owner_id == ACPI_FIRST_TABLE_ID)
-               {
-                       /* Check for wraparound */
-
-                       acpi_gbl_next_method_owner_id = ACPI_FIRST_METHOD_ID;
-               }
-               break;
-
-       default:
-               break;
-       }
-
-       (void) acpi_ut_release_mutex (ACPI_MTX_CACHES);
-       return_VALUE (owner_id);
-}
-
-
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_init_globals
@@ -848,7 +781,7 @@ acpi_ut_init_globals (
        for (i = 0; i < NUM_MUTEX; i++)
        {
                acpi_gbl_mutex_info[i].mutex        = NULL;
-               acpi_gbl_mutex_info[i].owner_id     = ACPI_MUTEX_NOT_ACQUIRED;
+               acpi_gbl_mutex_info[i].thread_id    = ACPI_MUTEX_NOT_ACQUIRED;
                acpi_gbl_mutex_info[i].use_count    = 0;
        }
 
@@ -889,8 +822,7 @@ acpi_ut_init_globals (
        acpi_gbl_ns_lookup_count            = 0;
        acpi_gbl_ps_find_count              = 0;
        acpi_gbl_acpi_hardware_present      = TRUE;
-       acpi_gbl_next_table_owner_id        = ACPI_FIRST_TABLE_ID;
-       acpi_gbl_next_method_owner_id       = ACPI_FIRST_METHOD_ID;
+       acpi_gbl_owner_id_mask              = 0;
        acpi_gbl_debugger_configuration     = DEBUGGER_THREADING;
        acpi_gbl_db_output_flags            = ACPI_DB_CONSOLE_OUTPUT;
 
index 207c836aec6467ef67300ac2180b5f89b615bd19..df715cd89105ca5e4805209f3b65c99990fb2fa1 100644 (file)
         ACPI_MODULE_NAME    ("utmisc")
 
 
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_allocate_owner_id
+ *
+ * PARAMETERS:  owner_id        - Where the new owner ID is returned
+ *
+ * DESCRIPTION: Allocate a table or method owner id
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_ut_allocate_owner_id (
+       acpi_owner_id                   *owner_id)
+{
+       acpi_native_uint                i;
+       acpi_status                     status;
+
+
+       ACPI_FUNCTION_TRACE ("ut_allocate_owner_id");
+
+
+       status = acpi_ut_acquire_mutex (ACPI_MTX_CACHES);
+       if (ACPI_FAILURE (status)) {
+               return_ACPI_STATUS (status);
+       }
+
+       /* Find a free owner ID */
+
+       for (i = 0; i < 32; i++) {
+               if (!(acpi_gbl_owner_id_mask & (1 << i))) {
+                       acpi_gbl_owner_id_mask |= (1 << i);
+                       *owner_id = (acpi_owner_id) i;
+                       goto exit;
+               }
+       }
+
+       /*
+        * If we are here, all owner_ids have been allocated. This probably should
+        * not happen since the IDs are reused after deallocation. The IDs are
+        * allocated upon table load (one per table) and method execution, and
+        * they are released when a table is unloaded or a method completes
+        * execution.
+        */
+       status = AE_OWNER_ID_LIMIT;
+       ACPI_REPORT_ERROR ((
+               "Could not allocate new owner_id (32 max), AE_OWNER_ID_LIMIT\n"));
+
+exit:
+       (void) acpi_ut_release_mutex (ACPI_MTX_CACHES);
+       return_ACPI_STATUS (status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_ut_release_owner_id
+ *
+ * PARAMETERS:  owner_id        - A previously allocated owner ID
+ *
+ * DESCRIPTION: Release a table or method owner id
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_ut_release_owner_id (
+       acpi_owner_id                   owner_id)
+{
+       acpi_status                     status;
+
+
+       ACPI_FUNCTION_TRACE ("ut_release_owner_id");
+
+
+       status = acpi_ut_acquire_mutex (ACPI_MTX_CACHES);
+       if (ACPI_FAILURE (status)) {
+               return_ACPI_STATUS (status);
+       }
+
+       /* Free the owner ID */
+
+       if (acpi_gbl_owner_id_mask & (1 << owner_id)) {
+               acpi_gbl_owner_id_mask ^= (1 << owner_id);
+       }
+       else {
+               /* This owner_id has not been allocated */
+
+               status = AE_NOT_EXIST;
+       }
+
+       (void) acpi_ut_release_mutex (ACPI_MTX_CACHES);
+       return_ACPI_STATUS (status);
+}
+
+
 /*******************************************************************************
  *
  * FUNCTION:    acpi_ut_strupr (strupr)
index a80b97cb2e56c2706cc3be775140dad9a3b785a0..0699b6be62b6716a55699fbc32f13cebbb4d36df 100644 (file)
@@ -159,7 +159,7 @@ acpi_ut_create_mutex (
        if (!acpi_gbl_mutex_info[mutex_id].mutex) {
                status = acpi_os_create_semaphore (1, 1,
                                  &acpi_gbl_mutex_info[mutex_id].mutex);
-               acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
+               acpi_gbl_mutex_info[mutex_id].thread_id = ACPI_MUTEX_NOT_ACQUIRED;
                acpi_gbl_mutex_info[mutex_id].use_count = 0;
        }
 
@@ -196,7 +196,7 @@ acpi_ut_delete_mutex (
        status = acpi_os_delete_semaphore (acpi_gbl_mutex_info[mutex_id].mutex);
 
        acpi_gbl_mutex_info[mutex_id].mutex = NULL;
-       acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
+       acpi_gbl_mutex_info[mutex_id].thread_id = ACPI_MUTEX_NOT_ACQUIRED;
 
        return_ACPI_STATUS (status);
 }
@@ -274,7 +274,7 @@ acpi_ut_acquire_mutex (
                        this_thread_id, acpi_ut_get_mutex_name (mutex_id)));
 
                acpi_gbl_mutex_info[mutex_id].use_count++;
-               acpi_gbl_mutex_info[mutex_id].owner_id = this_thread_id;
+               acpi_gbl_mutex_info[mutex_id].thread_id = this_thread_id;
        }
        else {
                ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
@@ -322,7 +322,7 @@ acpi_ut_release_mutex (
        /*
         * Mutex must be acquired in order to release it!
         */
-       if (acpi_gbl_mutex_info[mutex_id].owner_id == ACPI_MUTEX_NOT_ACQUIRED) {
+       if (acpi_gbl_mutex_info[mutex_id].thread_id == ACPI_MUTEX_NOT_ACQUIRED) {
                ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
                        "Mutex [%s] is not acquired, cannot release\n",
                        acpi_ut_get_mutex_name (mutex_id)));
@@ -359,7 +359,7 @@ acpi_ut_release_mutex (
 
        /* Mark unlocked FIRST */
 
-       acpi_gbl_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
+       acpi_gbl_mutex_info[mutex_id].thread_id = ACPI_MUTEX_NOT_ACQUIRED;
 
        status = acpi_os_signal_semaphore (acpi_gbl_mutex_info[mutex_id].mutex, 1);
 
index dd9b70cc96343c13491ed4f60c9451dbeea89187..aa3c08c6da41cb34d4ea0499c76d79307fd48022 100644 (file)
@@ -64,7 +64,7 @@
 
 /* Version string */
 
-#define ACPI_CA_VERSION                 0x20050624
+#define ACPI_CA_VERSION                 0x20050708
 
 /*
  * OS name, used for the _OS object.  The _OS object is essentially obsolete,
index fcc2d507faca8afba717dc79ad0c1abd183a3ec0..26325430db80020f2b1501ac5747a2c2796082ef 100644 (file)
@@ -211,7 +211,7 @@ acpi_dm_byte_list (
        union acpi_parse_object         *op);
 
 void
-acpi_is_eisa_id (
+acpi_dm_is_eisa_id (
        union acpi_parse_object         *op);
 
 void
index 60d737b2d70f2dde682c7ea9a5f1202ede670be5..0a6f492f3c8e0bf568e825ee765b954350d26a03 100644 (file)
@@ -95,8 +95,9 @@
 #define AE_ABORT_METHOD                 (acpi_status) (0x001C | AE_CODE_ENVIRONMENTAL)
 #define AE_SAME_HANDLER                 (acpi_status) (0x001D | AE_CODE_ENVIRONMENTAL)
 #define AE_WAKE_ONLY_GPE                (acpi_status) (0x001E | AE_CODE_ENVIRONMENTAL)
+#define AE_OWNER_ID_LIMIT               (acpi_status) (0x001F | AE_CODE_ENVIRONMENTAL)
 
-#define AE_CODE_ENV_MAX                 0x001E
+#define AE_CODE_ENV_MAX                 0x001F
 
 
 /*
@@ -226,7 +227,8 @@ char const   *acpi_gbl_exception_names_env[] =
        "AE_LOGICAL_ADDRESS",
        "AE_ABORT_METHOD",
        "AE_SAME_HANDLER",
-       "AE_WAKE_ONLY_GPE"
+       "AE_WAKE_ONLY_GPE",
+       "AE_OWNER_ID_LIMIT"
 };
 
 char const   *acpi_gbl_exception_names_pgm[] =
index 8d5a397abd6ba91358857eb02ea7147a0a13d05d..e3cf16eadbed8a2b6ada61ffcffb73acc81c5839 100644 (file)
@@ -218,9 +218,8 @@ ACPI_EXTERN u32                                 acpi_gbl_original_mode;
 ACPI_EXTERN u32                                 acpi_gbl_rsdp_original_location;
 ACPI_EXTERN u32                                 acpi_gbl_ns_lookup_count;
 ACPI_EXTERN u32                                 acpi_gbl_ps_find_count;
+ACPI_EXTERN u32                                 acpi_gbl_owner_id_mask;
 ACPI_EXTERN u16                                 acpi_gbl_pm1_enable_register_save;
-ACPI_EXTERN u16                                 acpi_gbl_next_table_owner_id;
-ACPI_EXTERN u16                                 acpi_gbl_next_method_owner_id;
 ACPI_EXTERN u16                                 acpi_gbl_global_lock_handle;
 ACPI_EXTERN u8                                  acpi_gbl_debugger_configuration;
 ACPI_EXTERN u8                                  acpi_gbl_global_lock_acquired;
index 58f9ba1a34e736f64822019cfc81f3a4febe470d..4d2635698e104a70091eb6dbb0b1c15daf68fb14 100644 (file)
@@ -56,6 +56,13 @@ typedef u32                                     acpi_mutex_handle;
 #define AML_NUM_OPCODES                 0x7F
 
 
+/* Forward declarations */
+
+struct acpi_walk_state        ;
+struct acpi_obj_mutex;
+union acpi_parse_object        ;
+
+
 /*****************************************************************************
  *
  * Mutex typedefs and structs
@@ -116,19 +123,24 @@ static char                         *acpi_gbl_mutex_names[] =
 #endif
 
 
+/* Owner IDs are used to track namespace nodes for selective deletion */
+
+typedef u8                                      acpi_owner_id;
+#define ACPI_OWNER_ID_MAX               0xFF
+
+/* This Thread ID means that the mutex is not in use (unlocked) */
+
+#define ACPI_MUTEX_NOT_ACQUIRED         (u32) -1
+
 /* Table for the global mutexes */
 
 struct acpi_mutex_info
 {
        acpi_mutex                          mutex;
        u32                                 use_count;
-       u32                                 owner_id;
+       u32                                 thread_id;
 };
 
-/* This owner ID means that the mutex is not in use (unlocked) */
-
-#define ACPI_MUTEX_NOT_ACQUIRED         (u32) (-1)
-
 
 /* Lock flag parameter for various interfaces */
 
@@ -136,13 +148,6 @@ struct acpi_mutex_info
 #define ACPI_MTX_LOCK                   1
 
 
-typedef u16                                     acpi_owner_id;
-#define ACPI_OWNER_TYPE_TABLE           0x0
-#define ACPI_OWNER_TYPE_METHOD          0x1
-#define ACPI_FIRST_METHOD_ID            0x0001
-#define ACPI_FIRST_TABLE_ID             0xF000
-
-
 /* Field access granularities */
 
 #define ACPI_FIELD_BYTE_GRANULARITY     1
@@ -185,13 +190,20 @@ struct acpi_namespace_node
 {
        u8                                  descriptor;     /* Used to differentiate object descriptor types */
        u8                                  type;           /* Type associated with this name */
-       u16                                 owner_id;
+       u16                                 reference_count; /* Current count of references and children */
        union acpi_name_union               name;           /* ACPI Name, always 4 chars per ACPI spec */
        union acpi_operand_object           *object;        /* Pointer to attached ACPI object (optional) */
        struct acpi_namespace_node          *child;         /* First child */
        struct acpi_namespace_node          *peer;          /* Next peer*/
-       u16                                 reference_count; /* Current count of references and children */
+       u8                                  owner_id;       /* Who created this node */
        u8                                  flags;
+
+       /* Fields used by the ASL compiler only */
+
+#ifdef ACPI_ASL_COMPILER
+       u32                                 value;
+       union acpi_parse_object             *op;
+#endif
 };
 
 
@@ -222,7 +234,7 @@ struct acpi_table_desc
        u64                             physical_address;
        u32                             aml_length;
        acpi_size                       length;
-       acpi_owner_id                   table_id;
+       acpi_owner_id                   owner_id;
        u8                              type;
        u8                              allocation;
        u8                              loaded_into_namespace;
@@ -420,13 +432,6 @@ struct acpi_field_info
 #define ACPI_CONTROL_PREDICATE_TRUE          0xC4
 
 
-/* Forward declarations */
-
-struct acpi_walk_state        ;
-struct acpi_obj_mutex;
-union acpi_parse_object        ;
-
-
 #define ACPI_STATE_COMMON                  /* Two 32-bit fields and a pointer */\
        u8                                  data_type;          /* To differentiate various internal objs */\
        u8                                  flags;      \
@@ -916,14 +921,6 @@ struct acpi_integrity_info
  *
  ****************************************************************************/
 
-struct acpi_debug_print_info
-{
-       u32                             component_id;
-       char                            *proc_name;
-       char                            *module_name;
-};
-
-
 /* Entry for a memory allocation (debug only) */
 
 #define ACPI_MEM_MALLOC                      0
index 09be937d2c3916217bd501a89dac5f1dc74159be..5b100cef8dfcf2ea5c8d5599df85640eab6f4657 100644 (file)
 #define ACPI_PARAM_LIST(pl)                 pl
 
 /*
- * Error reporting.  These versions add callers module and line#.  Since
- * _THIS_MODULE gets compiled out when ACPI_DEBUG_OUTPUT isn't defined, only
- * use it in debug mode.
+ * Error reporting.  These versions add callers module and line#.
+ *
+ * Since _acpi_module_name gets compiled out when ACPI_DEBUG_OUTPUT
+ * isn't defined, only use it in debug mode.
  */
 #ifdef ACPI_DEBUG_OUTPUT
 
-#define ACPI_REPORT_INFO(fp)                {acpi_ut_report_info(_THIS_MODULE,__LINE__,_COMPONENT); \
+#define ACPI_REPORT_INFO(fp)                {acpi_ut_report_info(_acpi_module_name,__LINE__,_COMPONENT); \
                                                                                                acpi_os_printf ACPI_PARAM_LIST(fp);}
-#define ACPI_REPORT_ERROR(fp)               {acpi_ut_report_error(_THIS_MODULE,__LINE__,_COMPONENT); \
+#define ACPI_REPORT_ERROR(fp)               {acpi_ut_report_error(_acpi_module_name,__LINE__,_COMPONENT); \
                                                                                                acpi_os_printf ACPI_PARAM_LIST(fp);}
-#define ACPI_REPORT_WARNING(fp)             {acpi_ut_report_warning(_THIS_MODULE,__LINE__,_COMPONENT); \
+#define ACPI_REPORT_WARNING(fp)             {acpi_ut_report_warning(_acpi_module_name,__LINE__,_COMPONENT); \
                                                                                                acpi_os_printf ACPI_PARAM_LIST(fp);}
-#define ACPI_REPORT_NSERROR(s,e)            acpi_ns_report_error(_THIS_MODULE,__LINE__,_COMPONENT, s, e);
+#define ACPI_REPORT_NSERROR(s,e)            acpi_ns_report_error(_acpi_module_name,__LINE__,_COMPONENT, s, e);
 
-#define ACPI_REPORT_METHOD_ERROR(s,n,p,e)   acpi_ns_report_method_error(_THIS_MODULE,__LINE__,_COMPONENT, s, n, p, e);
+#define ACPI_REPORT_METHOD_ERROR(s,n,p,e)   acpi_ns_report_method_error(_acpi_module_name,__LINE__,_COMPONENT, s, n, p, e);
 
 #else
 
  * Debug macros that are conditionally compiled
  */
 #ifdef ACPI_DEBUG_OUTPUT
+#define ACPI_MODULE_NAME(name)          static char ACPI_UNUSED_VAR *_acpi_module_name = name;
 
-#define ACPI_MODULE_NAME(name)               static char ACPI_UNUSED_VAR *_THIS_MODULE = name;
+/*
+ * Common parameters used for debug output functions:
+ * line number, function name, module(file) name, component ID
+ */
+#define ACPI_DEBUG_PARAMETERS           __LINE__, ACPI_GET_FUNCTION_NAME, _acpi_module_name, _COMPONENT
 
 /*
- * Function entry tracing.
- * The first parameter should be the procedure name as a quoted string.  This is declared
- * as a local string ("_proc_name) so that it can be also used by the function exit macros below.
+ * Function entry tracing
  */
-#define ACPI_FUNCTION_NAME(a)               struct acpi_debug_print_info _debug_info; \
-                                                                                               _debug_info.component_id = _COMPONENT; \
-                                                                                               _debug_info.proc_name  = a; \
-                                                                                               _debug_info.module_name = _THIS_MODULE;
-
-#define ACPI_FUNCTION_TRACE(a)              ACPI_FUNCTION_NAME(a) \
-                                                                                               acpi_ut_trace(__LINE__,&_debug_info)
-#define ACPI_FUNCTION_TRACE_PTR(a,b)        ACPI_FUNCTION_NAME(a) \
-                                                                                               acpi_ut_trace_ptr(__LINE__,&_debug_info,(void *)b)
-#define ACPI_FUNCTION_TRACE_U32(a,b)        ACPI_FUNCTION_NAME(a) \
-                                                                                               acpi_ut_trace_u32(__LINE__,&_debug_info,(u32)b)
-#define ACPI_FUNCTION_TRACE_STR(a,b)        ACPI_FUNCTION_NAME(a) \
-                                                                                               acpi_ut_trace_str(__LINE__,&_debug_info,(char *)b)
-
-#define ACPI_FUNCTION_ENTRY()               acpi_ut_track_stack_ptr()
+
+/*
+ * If ACPI_GET_FUNCTION_NAME was not defined in the compiler-dependent header,
+ * define it now. This is the case where there the compiler does not support
+ * a __FUNCTION__ macro or equivalent. We save the function name on the
+ * local stack.
+ */
+#ifndef ACPI_GET_FUNCTION_NAME
+#define ACPI_GET_FUNCTION_NAME          _acpi_function_name
+/*
+ * The Name parameter should be the procedure name as a quoted string.
+ * This is declared as a local string ("my_function_name") so that it can
+ * be also used by the function exit macros below.
+ */
+#define ACPI_FUNCTION_NAME(name)        char *_acpi_function_name = name;
+
+#else
+/* Compiler supports __FUNCTION__ (or equivalent) -- Ignore this macro */
+
+#define ACPI_FUNCTION_NAME(name)
+#endif
+
+#define ACPI_FUNCTION_TRACE(a)          ACPI_FUNCTION_NAME(a) \
+                                                                                       acpi_ut_trace(ACPI_DEBUG_PARAMETERS)
+#define ACPI_FUNCTION_TRACE_PTR(a,b)    ACPI_FUNCTION_NAME(a) \
+                                                                                       acpi_ut_trace_ptr(ACPI_DEBUG_PARAMETERS,(void *)b)
+#define ACPI_FUNCTION_TRACE_U32(a,b)    ACPI_FUNCTION_NAME(a) \
+                                                                                       acpi_ut_trace_u32(ACPI_DEBUG_PARAMETERS,(u32)b)
+#define ACPI_FUNCTION_TRACE_STR(a,b)    ACPI_FUNCTION_NAME(a) \
+                                                                                       acpi_ut_trace_str(ACPI_DEBUG_PARAMETERS,(char *)b)
+
+#define ACPI_FUNCTION_ENTRY()           acpi_ut_track_stack_ptr()
 
 /*
  * Function exit tracing.
  * WARNING: These macros include a return statement.  This is usually considered
  * bad form, but having a separate exit macro is very ugly and difficult to maintain.
  * One of the FUNCTION_TRACE macros above must be used in conjunction with these macros
- * so that "_proc_name" is defined.
+ * so that "_acpi_function_name" is defined.
  */
 #ifdef ACPI_USE_DO_WHILE_0
 #define ACPI_DO_WHILE0(a)               do a while(0)
 #define ACPI_DO_WHILE0(a)               a
 #endif
 
-#define return_VOID                     ACPI_DO_WHILE0 ({acpi_ut_exit(__LINE__,&_debug_info);return;})
-#define return_ACPI_STATUS(s)           ACPI_DO_WHILE0 ({acpi_ut_status_exit(__LINE__,&_debug_info,(s));return((s));})
-#define return_VALUE(s)                 ACPI_DO_WHILE0 ({acpi_ut_value_exit(__LINE__,&_debug_info,(acpi_integer)(s));return((s));})
-#define return_PTR(s)                   ACPI_DO_WHILE0 ({acpi_ut_ptr_exit(__LINE__,&_debug_info,(u8 *)(s));return((s));})
+#define return_VOID                     ACPI_DO_WHILE0 ({acpi_ut_exit(ACPI_DEBUG_PARAMETERS);return;})
+#define return_ACPI_STATUS(s)           ACPI_DO_WHILE0 ({acpi_ut_status_exit(ACPI_DEBUG_PARAMETERS,(s));return((s));})
+#define return_VALUE(s)                 ACPI_DO_WHILE0 ({acpi_ut_value_exit(ACPI_DEBUG_PARAMETERS,(acpi_integer)(s));return((s));})
+#define return_PTR(s)                   ACPI_DO_WHILE0 ({acpi_ut_ptr_exit(ACPI_DEBUG_PARAMETERS,(u8 *)(s));return((s));})
 
 /* Conditional execution */
 
 /* Stack and buffer dumping */
 
 #define ACPI_DUMP_STACK_ENTRY(a)        acpi_ex_dump_operand((a),0)
-#define ACPI_DUMP_OPERANDS(a,b,c,d,e)   acpi_ex_dump_operands(a,b,c,d,e,_THIS_MODULE,__LINE__)
+#define ACPI_DUMP_OPERANDS(a,b,c,d,e)   acpi_ex_dump_operands(a,b,c,d,e,_acpi_module_name,__LINE__)
 
 
 #define ACPI_DUMP_ENTRY(a,b)            acpi_ns_dump_entry (a,b)
  * leaving no executable debug code!
  */
 #define ACPI_MODULE_NAME(name)
-#define _THIS_MODULE ""
+#define _acpi_module_name ""
 
 #define ACPI_DEBUG_EXEC(a)
 #define ACPI_NORMAL_EXEC(a)             a;
 
 /* Memory allocation */
 
-#define ACPI_MEM_ALLOCATE(a)            acpi_ut_allocate((acpi_size)(a),_COMPONENT,_THIS_MODULE,__LINE__)
-#define ACPI_MEM_CALLOCATE(a)           acpi_ut_callocate((acpi_size)(a), _COMPONENT,_THIS_MODULE,__LINE__)
+#define ACPI_MEM_ALLOCATE(a)            acpi_ut_allocate((acpi_size)(a),_COMPONENT,_acpi_module_name,__LINE__)
+#define ACPI_MEM_CALLOCATE(a)           acpi_ut_callocate((acpi_size)(a), _COMPONENT,_acpi_module_name,__LINE__)
 #define ACPI_MEM_FREE(a)                acpi_os_free(a)
 #define ACPI_MEM_TRACKING(a)
 
-
 #else
 
 /* Memory allocation */
 
-#define ACPI_MEM_ALLOCATE(a)            acpi_ut_allocate_and_track((acpi_size)(a),_COMPONENT,_THIS_MODULE,__LINE__)
-#define ACPI_MEM_CALLOCATE(a)           acpi_ut_callocate_and_track((acpi_size)(a), _COMPONENT,_THIS_MODULE,__LINE__)
-#define ACPI_MEM_FREE(a)                acpi_ut_free_and_track(a,_COMPONENT,_THIS_MODULE,__LINE__)
+#define ACPI_MEM_ALLOCATE(a)            acpi_ut_allocate_and_track((acpi_size)(a),_COMPONENT,_acpi_module_name,__LINE__)
+#define ACPI_MEM_CALLOCATE(a)           acpi_ut_callocate_and_track((acpi_size)(a), _COMPONENT,_acpi_module_name,__LINE__)
+#define ACPI_MEM_FREE(a)                acpi_ut_free_and_track(a,_COMPONENT,_acpi_module_name,__LINE__)
 #define ACPI_MEM_TRACKING(a)            a
 
 #endif /* ACPI_DBG_TRACK_ALLOCATIONS */
index d1b3ce80056f44f878dc53111c37c1768ae5318a..870e2544bd9b61cc8f31a6ad81fd35b698d4e0fd 100644 (file)
@@ -163,7 +163,7 @@ acpi_ns_delete_namespace_subtree (
 
 void
 acpi_ns_delete_namespace_by_owner (
-       u16                             table_id);
+       acpi_owner_id                   owner_id);
 
 void
 acpi_ns_detach_object (
@@ -219,7 +219,7 @@ acpi_ns_dump_objects (
        acpi_object_type                type,
        u8                              display_type,
        u32                             max_depth,
-       u32                             ownder_id,
+       acpi_owner_id                   owner_id,
        acpi_handle                     start_handle);
 #endif /* ACPI_FUTURE_USAGE */
 
index e079b94e4fce4d5933d72cee885e9c2bdfbf45e2..34f9d1f1f79be969f2ccedc75a0d0325e65e5120 100644 (file)
@@ -199,7 +199,7 @@ struct acpi_object_method
        ACPI_INTERNAL_METHOD            implementation;
        u8                                      concurrency;
        u8                                      thread_count;
-       acpi_owner_id                           owning_id;
+       acpi_owner_id                           owner_id;
 };
 
 
index 2fbe180fee6b47841c515d1893847523ea54757e..d7e828cb84b3b81613cce8d47c3dbc7360f99a03 100644 (file)
 /*
  * Debug level macros that are used in the DEBUG_PRINT macros
  */
-#define ACPI_DEBUG_LEVEL(dl)        (u32) dl,__LINE__,&_debug_info
+#define ACPI_DEBUG_LEVEL(dl)        (u32) dl,ACPI_DEBUG_PARAMETERS
 
 /* Exception level -- used in the global "debug_level" */
 
index a2025a8da008bf77367515d5e73b5fadc138e59e..f375c17ad0b60bc2e91130c371918d1c51b26104 100644 (file)
@@ -71,7 +71,6 @@ struct acpi_walk_state
        u8                                  walk_type;
        acpi_owner_id                       owner_id;                           /* Owner of objects created during the walk */
        u8                                  last_predicate;                     /* Result of last predicate */
-       u8                                  reserved;                           /* For alignment */
        u8                                  current_result;                     /* */
        u8                                  next_op_info;                       /* Info about next_op */
        u8                                  num_operands;                       /* Stack pointer for Operands[] array */
@@ -154,17 +153,17 @@ struct acpi_device_walk_info
 struct acpi_walk_info
 {
        u32                             debug_level;
-       u32                             owner_id;
+       acpi_owner_id                   owner_id;
        u8                              display_type;
 };
 
 /* Display Types */
 
-#define ACPI_DISPLAY_SUMMARY    0
-#define ACPI_DISPLAY_OBJECTS    1
-#define ACPI_DISPLAY_MASK       1
+#define ACPI_DISPLAY_SUMMARY    (u8) 0
+#define ACPI_DISPLAY_OBJECTS    (u8) 1
+#define ACPI_DISPLAY_MASK       (u8) 1
 
-#define ACPI_DISPLAY_SHORT      2
+#define ACPI_DISPLAY_SHORT      (u8) 2
 
 struct acpi_get_devices_info
 {
index 39df92e21a0d9f72e05ad0e2e66c410875f62c27..97e6f12da5275960808776e2c53d77aa71ec0ddb 100644 (file)
@@ -169,6 +169,10 @@ acpi_status
 acpi_tb_get_table_rsdt (
        void);
 
+acpi_status
+acpi_tb_validate_rsdp (
+       struct rsdp_descriptor          *rsdp);
+
 
 /*
  * tbutils - common table utilities
index b5cdcca444c812a75434d8d9c22d06db8518613b..c1e9110c36615d5af5c477ec7126f76d0b335610 100644 (file)
  */
 struct rsdp_descriptor         /* Root System Descriptor Pointer */
 {
-       char                            signature [8];          /* ACPI signature, contains "RSD PTR " */
-       u8                              checksum;               /* To make sum of struct == 0 */
-       char                            oem_id [6];             /* OEM identification */
-       u8                              revision;               /* Must be 0 for 1.0, 2 for 2.0 */
-       u32                             rsdt_physical_address;  /* 32-bit physical address of RSDT */
-       u32                             length;                 /* XSDT Length in bytes including hdr */
-       u64                             xsdt_physical_address;  /* 64-bit physical address of XSDT */
-       u8                              extended_checksum;      /* Checksum of entire table */
-       char                            reserved [3];           /* Reserved field must be 0 */
+       char                            signature[8];           /* ACPI signature, contains "RSD PTR " */
+       u8                              checksum;               /* ACPI 1.0 checksum */
+       char                            oem_id[6];              /* OEM identification */
+       u8                              revision;               /* Must be (0) for ACPI 1.0 or (2) for ACPI 2.0+ */
+       u32                             rsdt_physical_address;  /* 32-bit physical address of the RSDT */
+       u32                             length;                 /* XSDT Length in bytes, including header */
+       u64                             xsdt_physical_address;  /* 64-bit physical address of the XSDT */
+       u8                              extended_checksum;      /* Checksum of entire table (ACPI 2.0) */
+       char                            reserved[3];            /* Reserved, must be zero */
 };
 
 
@@ -107,15 +107,15 @@ struct acpi_common_facs          /* Common FACS for internal use */
 
 
 #define ACPI_TABLE_HEADER_DEF   /* ACPI common table header */ \
-       char                            signature [4];          /* ACPI signature (4 ASCII characters) */\
-       u32                             length;                 /* Length of table, in bytes, including header */\
+       char                            signature[4];           /* ASCII table signature */\
+       u32                             length;                 /* Length of table in bytes, including this header */\
        u8                              revision;               /* ACPI Specification minor version # */\
        u8                              checksum;               /* To make sum of entire table == 0 */\
-       char                            oem_id [6];             /* OEM identification */\
-       char                            oem_table_id [8];       /* OEM table identification */\
+       char                            oem_id[6];              /* ASCII OEM identification */\
+       char                            oem_table_id[8];        /* ASCII OEM table identification */\
        u32                             oem_revision;           /* OEM revision number */\
-       char                            asl_compiler_id [4];    /* ASL compiler vendor ID */\
-       u32                             asl_compiler_revision;  /* ASL compiler revision number */
+       char                            asl_compiler_id [4];    /* ASCII ASL compiler vendor ID */\
+       u32                             asl_compiler_revision;  /* ASL compiler version */
 
 
 struct acpi_table_header         /* ACPI common table header */
@@ -139,8 +139,12 @@ struct multiple_apic_table
 {
        ACPI_TABLE_HEADER_DEF                           /* ACPI common table header */
        u32                             local_apic_address;     /* Physical address of local APIC */
-       u32                             PCATcompat      : 1;    /* A one indicates system also has dual 8259s */
-       u32                             reserved1       : 31;
+
+       /* Flags (32 bits) */
+
+       u8                              PCATcompat      : 1;    /* 00:    System also has dual 8259s */
+       u8                                              : 7;    /* 01-07: Reserved, must be zero */
+       u8                              reserved1[3];           /* 08-31: Reserved, must be zero */
 };
 
 /* Values for Type in APIC_HEADER_DEF */
@@ -180,16 +184,18 @@ struct apic_header
 #define TRIGGER_RESERVED        2
 #define TRIGGER_LEVEL           3
 
-/* Common flag definitions */
+/* Common flag definitions (16 bits each) */
 
 #define MPS_INTI_FLAGS \
-       u16                             polarity        : 2;    /* Polarity of APIC I/O input signals */\
-       u16                             trigger_mode    : 2;    /* Trigger mode of APIC input signals */\
-       u16                             reserved1       : 12;   /* Reserved, must be zero */
+       u8                              polarity        : 2;    /* 00-01: Polarity of APIC I/O input signals */\
+       u8                              trigger_mode    : 2;    /* 02-03: Trigger mode of APIC input signals */\
+       u8                                              : 4;    /* 04-07: Reserved, must be zero */\
+       u8                              reserved1;              /* 08-15: Reserved, must be zero */
 
 #define LOCAL_APIC_FLAGS \
-       u32                             processor_enabled: 1;   /* Processor is usable if set */\
-       u32                             reserved2       : 31;   /* Reserved, must be zero */
+       u8                              processor_enabled: 1;   /* 00:    Processor is usable if set */\
+       u8                                              : 7;    /* 01-07: Reserved, must be zero */\
+       u8                              reserved2;              /* 08-15: Reserved, must be zero */
 
 /* Sub-structures for MADT */
 
@@ -238,7 +244,7 @@ struct madt_local_apic_nmi
 struct madt_address_override
 {
        APIC_HEADER_DEF
-       u16                             reserved;               /* Reserved - must be zero */
+       u16                             reserved;               /* Reserved, must be zero */
        u64                             address;                /* APIC physical address */
 };
 
@@ -246,7 +252,7 @@ struct madt_io_sapic
 {
        APIC_HEADER_DEF
        u8                              io_sapic_id;            /* I/O SAPIC ID */
-       u8                              reserved;               /* Reserved - must be zero */
+       u8                              reserved;               /* Reserved, must be zero */
        u32                             interrupt_base;         /* Glocal interrupt for SAPIC start */
        u64                             address;                /* SAPIC physical address */
 };
@@ -257,7 +263,7 @@ struct madt_local_sapic
        u8                              processor_id;           /* ACPI processor id */
        u8                              local_sapic_id;         /* SAPIC ID */
        u8                              local_sapic_eid;        /* SAPIC EID */
-       u8                              reserved [3];           /* Reserved - must be zero */
+       u8                              reserved[3];            /* Reserved, must be zero */
        LOCAL_APIC_FLAGS
        u32                             processor_uID;          /* Numeric UID - ACPI 3.0 */
        char                            processor_uIDstring[1]; /* String UID  - ACPI 3.0 */
index 33de5f4d2cccc8afdf31ea889ab14dc6c19bb0fd..93c175a4f446cef6a9751c0451fc4d4ba50aa4df 100644 (file)
@@ -52,8 +52,7 @@
 struct rsdt_descriptor_rev1
 {
        ACPI_TABLE_HEADER_DEF                           /* ACPI common table header */
-       u32                             table_offset_entry [1]; /* Array of pointers to other */
-                        /* ACPI tables */
+       u32                             table_offset_entry[1];  /* Array of pointers to ACPI tables */
 };
 
 
@@ -62,14 +61,19 @@ struct rsdt_descriptor_rev1
  */
 struct facs_descriptor_rev1
 {
-       char                            signature[4];           /* ACPI Signature */
-       u32                             length;                 /* Length of structure, in bytes */
+       char                            signature[4];           /* ASCII table signature */
+       u32                             length;                 /* Length of structure in bytes */
        u32                             hardware_signature;     /* Hardware configuration signature */
        u32                             firmware_waking_vector; /* ACPI OS waking vector */
        u32                             global_lock;            /* Global Lock */
-       u32                             S4bios_f        : 1;    /* Indicates if S4BIOS support is present */
-       u32                             reserved1       : 31;   /* Must be 0 */
-       u8                              resverved3 [40];        /* Reserved - must be zero */
+
+       /* Flags (32 bits) */
+
+       u8                              S4bios_f        : 1;    /* 00:    S4BIOS support is present */
+       u8                                              : 7;    /* 01-07: Reserved, must be zero */
+       u8                              reserved1[3];           /* 08-31: Reserved, must be zero */
+
+       u8                              reserved2[40];          /* Reserved, must be zero */
 };
 
 
@@ -82,13 +86,13 @@ struct fadt_descriptor_rev1
        u32                             firmware_ctrl;          /* Physical address of FACS */
        u32                             dsdt;                   /* Physical address of DSDT */
        u8                              model;                  /* System Interrupt Model */
-       u8                              reserved1;              /* Reserved */
+       u8                              reserved1;              /* Reserved, must be zero */
        u16                             sci_int;                /* System vector of SCI interrupt */
        u32                             smi_cmd;                /* Port address of SMI command port */
        u8                              acpi_enable;            /* Value to write to smi_cmd to enable ACPI */
        u8                              acpi_disable;           /* Value to write to smi_cmd to disable ACPI */
        u8                              S4bios_req;             /* Value to write to SMI CMD to enter S4BIOS state */
-       u8                              reserved2;              /* Reserved - must be zero */
+       u8                              reserved2;              /* Reserved, must be zero */
        u32                             pm1a_evt_blk;           /* Port address of Power Mgt 1a acpi_event Reg Blk */
        u32                             pm1b_evt_blk;           /* Port address of Power Mgt 1b acpi_event Reg Blk */
        u32                             pm1a_cnt_blk;           /* Port address of Power Mgt 1a Control Reg Blk */
@@ -104,7 +108,7 @@ struct fadt_descriptor_rev1
        u8                              gpe0_blk_len;           /* Byte Length of ports at gpe0_blk */
        u8                              gpe1_blk_len;           /* Byte Length of ports at gpe1_blk */
        u8                              gpe1_base;              /* Offset in gpe model where gpe1 events start */
-       u8                              reserved3;              /* Reserved */
+       u8                              reserved3;              /* Reserved, must be zero */
        u16                             plvl2_lat;              /* Worst case HW latency to enter/exit C2 state */
        u16                             plvl3_lat;              /* Worst case HW latency to enter/exit C3 state */
        u16                             flush_size;             /* Size of area read to flush caches */
@@ -114,19 +118,21 @@ struct fadt_descriptor_rev1
        u8                              day_alrm;               /* Index to day-of-month alarm in RTC CMOS RAM */
        u8                              mon_alrm;               /* Index to month-of-year alarm in RTC CMOS RAM */
        u8                              century;                /* Index to century in RTC CMOS RAM */
-       u8                              reserved4;              /* Reserved */
-       u8                              reserved4a;             /* Reserved */
-       u8                              reserved4b;             /* Reserved */
-       u32                             wb_invd         : 1;    /* The wbinvd instruction works properly */
-       u32                             wb_invd_flush   : 1;    /* The wbinvd flushes but does not invalidate */
-       u32                             proc_c1         : 1;    /* All processors support C1 state */
-       u32                             plvl2_up        : 1;    /* C2 state works on MP system */
-       u32                             pwr_button      : 1;    /* Power button is handled as a generic feature */
-       u32                             sleep_button    : 1;    /* Sleep button is handled as a generic feature, or not present */
-       u32                             fixed_rTC       : 1;    /* RTC wakeup stat not in fixed register space */
-       u32                             rtcs4           : 1;    /* RTC wakeup stat not possible from S4 */
-       u32                             tmr_val_ext     : 1;    /* The tmr_val width is 32 bits (0 = 24 bits) */
-       u32                             reserved5       : 23;   /* Reserved - must be zero */
+       u8                              reserved4[3];           /* Reserved, must be zero */
+
+       /* Flags (32 bits) */
+
+       u8                              wb_invd         : 1;    /* 00:    The wbinvd instruction works properly */
+       u8                              wb_invd_flush   : 1;    /* 01:    The wbinvd flushes but does not invalidate */
+       u8                              proc_c1         : 1;    /* 02:    All processors support C1 state */
+       u8                              plvl2_up        : 1;    /* 03:    C2 state works on MP system */
+       u8                              pwr_button      : 1;    /* 04:    Power button is handled as a generic feature */
+       u8                              sleep_button    : 1;    /* 05:    Sleep button is handled as a generic feature, or not present */
+       u8                              fixed_rTC       : 1;    /* 06:    RTC wakeup stat not in fixed register space */
+       u8                              rtcs4           : 1;    /* 07:    RTC wakeup stat not possible from S4 */
+       u8                              tmr_val_ext     : 1;    /* 08:    tmr_val width is 32 bits (0 = 24 bits) */
+       u8                                              : 7;    /* 09-15: Reserved, must be zero */
+       u8                              reserved5[2];           /* 16-31: Reserved, must be zero */
 };
 
 #pragma pack()
index e1729c967e052af28f7c0b884207e454a953dd1b..84ce5abbd6f62149ff54cac5e734d3e43687405b 100644 (file)
@@ -73,8 +73,7 @@
 struct rsdt_descriptor_rev2
 {
        ACPI_TABLE_HEADER_DEF                           /* ACPI common table header */
-       u32                             table_offset_entry [1]; /* Array of pointers to  */
-                        /* ACPI table headers */
+       u32                             table_offset_entry[1];  /* Array of pointers to ACPI tables */
 };
 
 
@@ -84,8 +83,7 @@ struct rsdt_descriptor_rev2
 struct xsdt_descriptor_rev2
 {
        ACPI_TABLE_HEADER_DEF                           /* ACPI common table header */
-       u64                             table_offset_entry [1]; /* Array of pointers to  */
-                        /* ACPI table headers */
+       u64                             table_offset_entry[1];  /* Array of pointers to ACPI tables */
 };
 
 
@@ -94,16 +92,21 @@ struct xsdt_descriptor_rev2
  */
 struct facs_descriptor_rev2
 {
-       char                            signature[4];           /* ACPI signature */
+       char                            signature[4];           /* ASCII table signature */
        u32                             length;                 /* Length of structure, in bytes */
        u32                             hardware_signature;     /* Hardware configuration signature */
-       u32                             firmware_waking_vector; /* 32bit physical address of the Firmware Waking Vector. */
+       u32                             firmware_waking_vector; /* 32-bit physical address of the Firmware Waking Vector. */
        u32                             global_lock;            /* Global Lock used to synchronize access to shared hardware resources */
-       u32                             S4bios_f        : 1;    /* S4Bios_f - Indicates if S4BIOS support is present */
-       u32                             reserved1       : 31;   /* Must be 0 */
-       u64                             xfirmware_waking_vector; /* 64bit physical address of the Firmware Waking Vector. */
+
+       /* Flags (32 bits) */
+
+       u8                              S4bios_f        : 1;    /* 00:    S4BIOS support is present */
+       u8                                              : 7;    /* 01-07: Reserved, must be zero */
+       u8                              reserved1[3];           /* 08-31: Reserved, must be zero */
+
+       u64                             xfirmware_waking_vector; /* 64-bit physical address of the Firmware Waking Vector. */
        u8                              version;                /* Version of this table */
-       u8                              reserved3 [31];         /* Reserved - must be zero */
+       u8                              reserved3[31];          /* Reserved, must be zero */
 };
 
 
@@ -165,35 +168,37 @@ struct fadt_descriptor_rev2
 {
        ACPI_TABLE_HEADER_DEF                       /* ACPI common table header */
        FADT_REV2_COMMON
-       u8                              reserved2;          /* Reserved */
-       u32                             wb_invd     : 1;    /* The wbinvd instruction works properly */
-       u32                             wb_invd_flush : 1;  /* The wbinvd flushes but does not invalidate */
-       u32                             proc_c1     : 1;    /* All processors support C1 state */
-       u32                             plvl2_up    : 1;    /* C2 state works on MP system */
-       u32                             pwr_button  : 1;    /* Power button is handled as a generic feature */
-       u32                             sleep_button : 1;   /* Sleep button is handled as a generic feature, or not present */
-       u32                             fixed_rTC   : 1;    /* RTC wakeup stat not in fixed register space */
-       u32                             rtcs4       : 1;    /* RTC wakeup stat not possible from S4 */
-       u32                             tmr_val_ext : 1;    /* Indicates tmr_val is 32 bits 0=24-bits */
-       u32                             dock_cap    : 1;    /* Supports Docking */
-       u32                             reset_reg_sup : 1;  /* Indicates system supports system reset via the FADT RESET_REG */
-       u32                             sealed_case : 1;    /* Indicates system has no internal expansion capabilities and case is sealed */
-       u32                             headless    : 1;    /* Indicates system does not have local video capabilities or local input devices */
-       u32                             cpu_sw_sleep : 1;   /* Indicates to OSPM that a processor native instruction */
-                          /* must be executed after writing the SLP_TYPx register */
-       /* ACPI 3.0 flag bits */
-
-       u32                             pci_exp_wak                         : 1; /* System supports PCIEXP_WAKE (STS/EN) bits */
-       u32                             use_platform_clock                  : 1; /* OSPM should use platform-provided timer */
-       u32                             S4rtc_sts_valid                     : 1; /* Contents of RTC_STS valid after S4 wake */
-       u32                             remote_power_on_capable             : 1; /* System is compatible with remote power on */
-       u32                             force_apic_cluster_model            : 1; /* All local APICs must use cluster model */
-       u32                             force_apic_physical_destination_mode : 1; /* all local x_aPICs must use physical dest mode */
-       u32                             reserved6                           : 12;/* Reserved - must be zero */
+       u8                              reserved2;          /* Reserved, must be zero */
+
+       /* Flags (32 bits) */
+
+       u8                              wb_invd     : 1;    /* 00:    The wbinvd instruction works properly */
+       u8                              wb_invd_flush : 1;  /* 01:    The wbinvd flushes but does not invalidate */
+       u8                              proc_c1     : 1;    /* 02:    All processors support C1 state */
+       u8                              plvl2_up    : 1;    /* 03:    C2 state works on MP system */
+       u8                              pwr_button  : 1;    /* 04:    Power button is handled as a generic feature */
+       u8                              sleep_button : 1;   /* 05:    Sleep button is handled as a generic feature, or not present */
+       u8                              fixed_rTC   : 1;    /* 06:    RTC wakeup stat not in fixed register space */
+       u8                              rtcs4       : 1;    /* 07:    RTC wakeup stat not possible from S4 */
+       u8                              tmr_val_ext : 1;    /* 08:    tmr_val is 32 bits 0=24-bits */
+       u8                              dock_cap    : 1;    /* 09:    Docking supported */
+       u8                              reset_reg_sup : 1;  /* 10:    System reset via the FADT RESET_REG supported */
+       u8                              sealed_case : 1;    /* 11:    No internal expansion capabilities and case is sealed */
+       u8                              headless    : 1;    /* 12:    No local video capabilities or local input devices */
+       u8                              cpu_sw_sleep : 1;   /* 13:    Must execute native instruction after writing SLP_TYPx register */
+
+       u8                              pci_exp_wak                         : 1; /* 14:    System supports PCIEXP_WAKE (STS/EN) bits (ACPI 3.0) */
+       u8                              use_platform_clock                  : 1; /* 15:    OSPM should use platform-provided timer (ACPI 3.0) */
+       u8                              S4rtc_sts_valid                     : 1; /* 16:    Contents of RTC_STS valid after S4 wake (ACPI 3.0) */
+       u8                              remote_power_on_capable             : 1; /* 17:    System is compatible with remote power on (ACPI 3.0) */
+       u8                              force_apic_cluster_model            : 1; /* 18:    All local APICs must use cluster model (ACPI 3.0) */
+       u8                              force_apic_physical_destination_mode : 1; /* 19:   all local x_aPICs must use physical dest mode (ACPI 3.0) */
+       u8                                                                  : 4; /* 20-23: Reserved, must be zero */
+       u8                              reserved3;                               /* 24-31: Reserved, must be zero */
 
        struct acpi_generic_address     reset_register;     /* Reset register address in GAS format */
        u8                              reset_value;        /* Value to write to the reset_register port to reset the system */
-       u8                              reserved7[3];       /* These three bytes must be zero */
+       u8                              reserved4[3];       /* These three bytes must be zero */
        u64                             xfirmware_ctrl;     /* 64-bit physical address of FACS */
        u64                             Xdsdt;              /* 64-bit physical address of DSDT */
        struct acpi_generic_address     xpm1a_evt_blk;      /* Extended Power Mgt 1a acpi_event Reg Blk address */
@@ -213,11 +218,11 @@ struct fadt_descriptor_rev2_minus
 {
        ACPI_TABLE_HEADER_DEF                       /* ACPI common table header */
        FADT_REV2_COMMON
-       u8                              reserved2;          /* Reserved */
+       u8                              reserved2;          /* Reserved, must be zero */
        u32                             flags;
        struct acpi_generic_address     reset_register;     /* Reset register address in GAS format */
        u8                              reset_value;        /* Value to write to the reset_register port to reset the system. */
-       u8                              reserved7[3];       /* These three bytes must be zero */
+       u8                              reserved7[3];       /* Reserved, must be zero */
 };
 
 
@@ -242,11 +247,16 @@ struct static_resource_alloc
        u8                              length;
        u8                              proximity_domain_lo;
        u8                              apic_id;
-       u32                             enabled         :1;
-       u32                             reserved3       :31;
+
+       /* Flags (32 bits) */
+
+       u8                              enabled         :1; /* 00:    Use affinity structure */
+       u8                                              :7; /* 01-07: Reserved, must be zero */
+       u8                              reserved3[3];       /* 08-31: Reserved, must be zero */
+
        u8                              local_sapic_eid;
        u8                              proximity_domain_hi[3];
-       u32                             reserved4;
+       u32                             reserved4;          /* Reserved, must be zero */
 };
 
 struct memory_affinity
@@ -258,18 +268,23 @@ struct memory_affinity
        u64                             base_address;
        u64                             address_length;
        u32                             reserved4;
-       u32                             enabled         :1;
-       u32                             hot_pluggable   :1;
-       u32                             non_volatile    :1;
-       u32                             reserved5       :29;
-       u64                             reserved6;
+
+       /* Flags (32 bits) */
+
+       u8                              enabled         :1; /* 00:    Use affinity structure */
+       u8                              hot_pluggable   :1; /* 01:    Memory region is hot pluggable */
+       u8                              non_volatile    :1; /* 02:    Memory is non-volatile */
+       u8                                              :5; /* 03-07: Reserved, must be zero */
+       u8                              reserved5[3];       /* 08-31: Reserved, must be zero */
+
+       u64                             reserved6;          /* Reserved, must be zero */
 };
 
 struct system_resource_affinity
 {
        ACPI_TABLE_HEADER_DEF
        u32                             reserved1;          /* Must be value '1' */
-       u64                             reserved2;
+       u64                             reserved2;          /* Reserved, must be zero */
 };
 
 
index 8cd774a20c67b67762bde9fa71233035ec44501f..1895b862ce0da8b6a9fcf77bc3c6f80e4a11a784 100644 (file)
@@ -205,10 +205,11 @@ typedef u32                                     acpi_size;
 
 
 /*
- * Miscellaneous common types
+ * This type is used for bitfields in ACPI tables. The only type that is
+ * even remotely portable is u8. Anything else is not portable, so
+ * do not add any more bitfield types.
  */
-typedef u16                                     UINT16_BIT;
-typedef u32                                     UINT32_BIT;
+typedef u8                                      UINT8_BIT;
 typedef acpi_native_uint                        ACPI_PTRDIFF;
 
 /*
@@ -243,10 +244,13 @@ struct acpi_pointer
 #define ACPI_LOGMODE_PHYSPTR            ACPI_LOGICAL_ADDRESSING  | ACPI_PHYSICAL_POINTER
 #define ACPI_LOGMODE_LOGPTR             ACPI_LOGICAL_ADDRESSING  | ACPI_LOGICAL_POINTER
 
-/* Types for the OS interface layer (OSL) */
-
-#ifdef ACPI_USE_LOCAL_CACHE
-#define acpi_cache_t                struct acpi_memory_list
+/*
+ * If acpi_cache_t was not defined in the OS-dependent header,
+ * define it now. This is typically the case where the local cache
+ * manager implementation is to be used (ACPI_USE_LOCAL_CACHE)
+ */
+#ifndef acpi_cache_t
+#define acpi_cache_t                            struct acpi_memory_list
 #endif
 
 /*
index e9c1584dd7856af78c47ba5edf94a942b0984e44..9c05c10e379aac1f99a01b7d8b6f4d51d0c2ec22 100644 (file)
@@ -120,10 +120,6 @@ u8
 acpi_ut_valid_object_type (
        acpi_object_type                type);
 
-acpi_owner_id
-acpi_ut_allocate_owner_id (
-       u32                             id_type);
-
 
 /*
  * utinit - miscellaneous initialization and shutdown
@@ -306,47 +302,63 @@ acpi_ut_track_stack_ptr (
 void
 acpi_ut_trace (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info);
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id);
 
 void
 acpi_ut_trace_ptr (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        void                            *pointer);
 
 void
 acpi_ut_trace_u32 (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        u32                             integer);
 
 void
 acpi_ut_trace_str (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        char                            *string);
 
 void
 acpi_ut_exit (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info);
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id);
 
 void
 acpi_ut_status_exit (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        acpi_status                     status);
 
 void
 acpi_ut_value_exit (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        acpi_integer                    value);
 
 void
 acpi_ut_ptr_exit (
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        u8                              *ptr);
 
 void
@@ -378,7 +390,9 @@ void ACPI_INTERNAL_VAR_XFACE
 acpi_ut_debug_print (
        u32                             requested_debug_level,
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        char                            *format,
        ...) ACPI_PRINTF_LIKE_FUNC;
 
@@ -386,7 +400,9 @@ void ACPI_INTERNAL_VAR_XFACE
 acpi_ut_debug_print_raw (
        u32                             requested_debug_level,
        u32                             line_number,
-       struct acpi_debug_print_info    *dbg_info,
+       char                            *function_name,
+       char                            *module_name,
+       u32                             component_id,
        char                            *format,
        ...) ACPI_PRINTF_LIKE_FUNC;
 
@@ -477,8 +493,8 @@ acpi_ut_allocate_object_desc_dbg (
        u32                             line_number,
        u32                             component_id);
 
-#define acpi_ut_create_internal_object(t) acpi_ut_create_internal_object_dbg (_THIS_MODULE,__LINE__,_COMPONENT,t)
-#define acpi_ut_allocate_object_desc()  acpi_ut_allocate_object_desc_dbg (_THIS_MODULE,__LINE__,_COMPONENT)
+#define acpi_ut_create_internal_object(t) acpi_ut_create_internal_object_dbg (_acpi_module_name,__LINE__,_COMPONENT,t)
+#define acpi_ut_allocate_object_desc()  acpi_ut_allocate_object_desc_dbg (_acpi_module_name,__LINE__,_COMPONENT)
 
 void
 acpi_ut_delete_object_desc (
@@ -579,6 +595,14 @@ acpi_ut_short_divide (
  * utmisc
  */
 acpi_status
+acpi_ut_allocate_owner_id (
+       acpi_owner_id                   *owner_id);
+
+acpi_status
+acpi_ut_release_owner_id (
+       acpi_owner_id                   owner_id);
+
+acpi_status
 acpi_ut_walk_package_tree (
        union acpi_operand_object       *source_object,
        void                            *target_object,
index 91fda36b042bad6a0177dd4bab9e87206b18f30f..39264127574ccdb403c5122090f6fecaa6543d26 100644 (file)
 #ifndef __ACGCC_H__
 #define __ACGCC_H__
 
+/* Function name is used for debug output. Non-ANSI, compiler-dependent */
+
+#define ACPI_GET_FUNCTION_NAME          __FUNCTION__
+
 /* This macro is used to tag functions as "printf-like" because
  * some compilers (like GCC) can catch printf format string problems.
  */
-#define ACPI_PRINTF_LIKE_FUNC __attribute__ ((__format__ (__printf__, 4, 5)))
+#define ACPI_PRINTF_LIKE_FUNC __attribute__ ((__format__ (__printf__, 6, 7)))
 
 /* Some compilers complain about unused variables. Sometimes we don't want to
- * use all the variables (most specifically for _THIS_MODULE). This allow us
+ * use all the variables (for example, _acpi_module_name). This allows us
  * to to tell the compiler warning in a per-variable manner that a variable
  * is unused.
  */