tree cbcb4e7c8818e3e57f07c9104d5a74e3d6b30565
parent 27a639a92d3289c4851105efcbc2f8b88969194f
author Bob Moore <[EMAIL PROTECTED]> Mon, 15 Aug 2005 19:42:00 -0800
committer Len Brown <[EMAIL PROTECTED]> Tue, 30 Aug 2005 07:44:25 -0400

[ACPI] ACPICA 20050815

Implemented a full bytewise compare to determine if a table load
request is attempting to load a duplicate table. The compare is
performed if the table signatures and table lengths match. This
will allow different tables with the same OEM Table ID and
revision to be loaded.

Although the BIOS is technically violating the ACPI spec when
this happens -- it does happen -- so Linux must handle it.

Signed-off-by: Robert Moore <[EMAIL PROTECTED]>
Signed-off-by: Len Brown <[EMAIL PROTECTED]>

 drivers/acpi/tables/tbutils.c    |   24 +++++++++++++++++-------
 drivers/acpi/utilities/utdebug.c |    4 ++--
 drivers/acpi/utilities/utmisc.c  |    6 +++++-
 include/acpi/acconfig.h          |    2 +-
 include/acpi/acnames.h           |   13 +++++--------
 5 files changed, 30 insertions(+), 19 deletions(-)

diff --git a/drivers/acpi/tables/tbutils.c b/drivers/acpi/tables/tbutils.c
--- a/drivers/acpi/tables/tbutils.c
+++ b/drivers/acpi/tables/tbutils.c
@@ -80,14 +80,24 @@ acpi_status acpi_tb_is_table_installed(s
        /* Examine all installed tables of this type */
 
        while (table_desc) {
-               /* Compare Revision and oem_table_id */
-
+               /*
+                * If the table lengths match, perform a full bytewise compare. 
This
+                * means that we will allow tables with duplicate 
oem_table_id(s), as
+                * long as the tables are different in some way.
+                *
+                * Checking if the table has been loaded into the namespace 
means that
+                * we don't check for duplicate tables during the initial 
installation
+                * of tables within the RSDT/XSDT.
+                */
                if ((table_desc->loaded_into_namespace) &&
-                   (table_desc->pointer->revision ==
-                    new_table_desc->pointer->revision) &&
-                   (!ACPI_MEMCMP(table_desc->pointer->oem_table_id,
-                                 new_table_desc->pointer->oem_table_id, 8))) {
-                       /* This table is already installed */
+                   (table_desc->pointer->length ==
+                    new_table_desc->pointer->length)
+                   &&
+                   (!ACPI_MEMCMP
+                    ((const char *)table_desc->pointer,
+                     (const char *)new_table_desc->pointer,
+                     (acpi_size) new_table_desc->pointer->length))) {
+                       /* Match: this table is already installed */
 
                        ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
                                          "Table [%4.4s] already installed: Rev 
%X oem_table_id [%8.8s]\n",
diff --git a/drivers/acpi/utilities/utdebug.c b/drivers/acpi/utilities/utdebug.c
--- a/drivers/acpi/utilities/utdebug.c
+++ b/drivers/acpi/utilities/utdebug.c
@@ -122,13 +122,13 @@ static const char *acpi_ut_trim_function
 
        /* All Function names are longer than 4 chars, check is safe */
 
-       if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_FUNCTION_PREFIX1) {
+       if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_MIXED) {
                /* This is the case where the original source has not been 
modified */
 
                return (function_name + 4);
        }
 
-       if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_FUNCTION_PREFIX2) {
+       if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_LOWER) {
                /* This is the case where the source has been 'linuxized' */
 
                return (function_name + 5);
diff --git a/drivers/acpi/utilities/utmisc.c b/drivers/acpi/utilities/utmisc.c
--- a/drivers/acpi/utilities/utmisc.c
+++ b/drivers/acpi/utilities/utmisc.c
@@ -78,6 +78,10 @@ acpi_status acpi_ut_allocate_owner_id(ac
 
        for (i = 0; i < 32; i++) {
                if (!(acpi_gbl_owner_id_mask & (1 << i))) {
+                       ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
+                                         "Current owner_id mask: %8.8X New ID: 
%2.2X\n",
+                                         acpi_gbl_owner_id_mask, (i + 1)));
+
                        acpi_gbl_owner_id_mask |= (1 << i);
                        *owner_id = (acpi_owner_id) (i + 1);
                        goto exit;
@@ -119,7 +123,7 @@ void acpi_ut_release_owner_id(acpi_owner
        acpi_owner_id owner_id = *owner_id_ptr;
        acpi_status status;
 
-       ACPI_FUNCTION_TRACE("ut_release_owner_id");
+       ACPI_FUNCTION_TRACE_U32("ut_release_owner_id", owner_id);
 
        /* Always clear the input owner_id (zero is an invalid ID) */
 
diff --git a/include/acpi/acconfig.h b/include/acpi/acconfig.h
--- a/include/acpi/acconfig.h
+++ b/include/acpi/acconfig.h
@@ -63,7 +63,7 @@
 
 /* Version string */
 
-#define ACPI_CA_VERSION                 0x20050729
+#define ACPI_CA_VERSION                 0x20050815
 
 /*
  * OS name, used for the _OS object.  The _OS object is essentially obsolete,
diff --git a/include/acpi/acnames.h b/include/acpi/acnames.h
--- a/include/acpi/acnames.h
+++ b/include/acpi/acnames.h
@@ -71,16 +71,13 @@
 
 /* Definitions of the predefined namespace names  */
 
-#define ACPI_UNKNOWN_NAME       (u32) 0x3F3F3F3F       /* Unknown name is  
"????" */
-#define ACPI_ROOT_NAME          (u32) 0x5F5F5F5C       /* Root name is     
"\___" */
-#define ACPI_SYS_BUS_NAME       (u32) 0x5F53425F       /* Sys bus name is  
"_SB_" */
+#define ACPI_UNKNOWN_NAME       (u32) 0x3F3F3F3F       /* Unknown name is 
"????" */
+#define ACPI_ROOT_NAME          (u32) 0x5F5F5F5C       /* Root name is    
"\___" */
+
+#define ACPI_PREFIX_MIXED       (u32) 0x69706341       /* "Acpi" */
+#define ACPI_PREFIX_LOWER       (u32) 0x69706361       /* "acpi" */
 
 #define ACPI_NS_ROOT_PATH       "\\"
 #define ACPI_NS_SYSTEM_BUS      "_SB_"
 
-/*! [Begin] no source code translation (not handled by acpisrc) */
-#define ACPI_FUNCTION_PREFIX1   'ipcA'
-#define ACPI_FUNCTION_PREFIX2   'ipca'
-/*! [End] no source code translation !*/
-
 #endif                         /* __ACNAMES_H__  */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to