aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2005-08-15 07:42:00 -0400
committerLen Brown <len.brown@intel.com>2005-08-29 23:44:25 -0400
commita18ecf413ca9846becb760f7f990c2c62c15965e (patch)
treecbcb4e7c8818e3e57f07c9104d5a74e3d6b30565
parent27a639a92d3289c4851105efcbc2f8b88969194f (diff)
[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 <robert.moore@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
-rw-r--r--drivers/acpi/tables/tbutils.c24
-rw-r--r--drivers/acpi/utilities/utdebug.c4
-rw-r--r--drivers/acpi/utilities/utmisc.c6
-rw-r--r--include/acpi/acconfig.h2
-rw-r--r--include/acpi/acnames.h13
5 files changed, 30 insertions, 19 deletions
diff --git a/drivers/acpi/tables/tbutils.c b/drivers/acpi/tables/tbutils.c
index 5bcafebb9ddf..4b2fbb592f49 100644
--- a/drivers/acpi/tables/tbutils.c
+++ b/drivers/acpi/tables/tbutils.c
@@ -80,14 +80,24 @@ acpi_status acpi_tb_is_table_installed(struct acpi_table_desc *new_table_desc)
80 /* Examine all installed tables of this type */ 80 /* Examine all installed tables of this type */
81 81
82 while (table_desc) { 82 while (table_desc) {
83 /* Compare Revision and oem_table_id */ 83 /*
84 84 * If the table lengths match, perform a full bytewise compare. This
85 * means that we will allow tables with duplicate oem_table_id(s), as
86 * long as the tables are different in some way.
87 *
88 * Checking if the table has been loaded into the namespace means that
89 * we don't check for duplicate tables during the initial installation
90 * of tables within the RSDT/XSDT.
91 */
85 if ((table_desc->loaded_into_namespace) && 92 if ((table_desc->loaded_into_namespace) &&
86 (table_desc->pointer->revision == 93 (table_desc->pointer->length ==
87 new_table_desc->pointer->revision) && 94 new_table_desc->pointer->length)
88 (!ACPI_MEMCMP(table_desc->pointer->oem_table_id, 95 &&
89 new_table_desc->pointer->oem_table_id, 8))) { 96 (!ACPI_MEMCMP
90 /* This table is already installed */ 97 ((const char *)table_desc->pointer,
98 (const char *)new_table_desc->pointer,
99 (acpi_size) new_table_desc->pointer->length))) {
100 /* Match: this table is already installed */
91 101
92 ACPI_DEBUG_PRINT((ACPI_DB_TABLES, 102 ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
93 "Table [%4.4s] already installed: Rev %X oem_table_id [%8.8s]\n", 103 "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
index 081a778aba88..d80e92639932 100644
--- a/drivers/acpi/utilities/utdebug.c
+++ b/drivers/acpi/utilities/utdebug.c
@@ -122,13 +122,13 @@ static const char *acpi_ut_trim_function_name(const char *function_name)
122 122
123 /* All Function names are longer than 4 chars, check is safe */ 123 /* All Function names are longer than 4 chars, check is safe */
124 124
125 if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_FUNCTION_PREFIX1) { 125 if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_MIXED) {
126 /* This is the case where the original source has not been modified */ 126 /* This is the case where the original source has not been modified */
127 127
128 return (function_name + 4); 128 return (function_name + 4);
129 } 129 }
130 130
131 if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_FUNCTION_PREFIX2) { 131 if (*(ACPI_CAST_PTR(u32, function_name)) == ACPI_PREFIX_LOWER) {
132 /* This is the case where the source has been 'linuxized' */ 132 /* This is the case where the source has been 'linuxized' */
133 133
134 return (function_name + 5); 134 return (function_name + 5);
diff --git a/drivers/acpi/utilities/utmisc.c b/drivers/acpi/utilities/utmisc.c
index 474fe7cb6c09..f0275025b718 100644
--- a/drivers/acpi/utilities/utmisc.c
+++ b/drivers/acpi/utilities/utmisc.c
@@ -78,6 +78,10 @@ acpi_status acpi_ut_allocate_owner_id(acpi_owner_id * owner_id)
78 78
79 for (i = 0; i < 32; i++) { 79 for (i = 0; i < 32; i++) {
80 if (!(acpi_gbl_owner_id_mask & (1 << i))) { 80 if (!(acpi_gbl_owner_id_mask & (1 << i))) {
81 ACPI_DEBUG_PRINT((ACPI_DB_VALUES,
82 "Current owner_id mask: %8.8X New ID: %2.2X\n",
83 acpi_gbl_owner_id_mask, (i + 1)));
84
81 acpi_gbl_owner_id_mask |= (1 << i); 85 acpi_gbl_owner_id_mask |= (1 << i);
82 *owner_id = (acpi_owner_id) (i + 1); 86 *owner_id = (acpi_owner_id) (i + 1);
83 goto exit; 87 goto exit;
@@ -119,7 +123,7 @@ void acpi_ut_release_owner_id(acpi_owner_id * owner_id_ptr)
119 acpi_owner_id owner_id = *owner_id_ptr; 123 acpi_owner_id owner_id = *owner_id_ptr;
120 acpi_status status; 124 acpi_status status;
121 125
122 ACPI_FUNCTION_TRACE("ut_release_owner_id"); 126 ACPI_FUNCTION_TRACE_U32("ut_release_owner_id", owner_id);
123 127
124 /* Always clear the input owner_id (zero is an invalid ID) */ 128 /* Always clear the input owner_id (zero is an invalid ID) */
125 129
diff --git a/include/acpi/acconfig.h b/include/acpi/acconfig.h
index f3810cc5d48e..73c43a39663b 100644
--- a/include/acpi/acconfig.h
+++ b/include/acpi/acconfig.h
@@ -63,7 +63,7 @@
63 63
64/* Version string */ 64/* Version string */
65 65
66#define ACPI_CA_VERSION 0x20050729 66#define ACPI_CA_VERSION 0x20050815
67 67
68/* 68/*
69 * OS name, used for the _OS object. The _OS object is essentially obsolete, 69 * 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
index 79152fbc8f8c..4f9063f3e951 100644
--- a/include/acpi/acnames.h
+++ b/include/acpi/acnames.h
@@ -71,16 +71,13 @@
71 71
72/* Definitions of the predefined namespace names */ 72/* Definitions of the predefined namespace names */
73 73
74#define ACPI_UNKNOWN_NAME (u32) 0x3F3F3F3F /* Unknown name is "????" */ 74#define ACPI_UNKNOWN_NAME (u32) 0x3F3F3F3F /* Unknown name is "????" */
75#define ACPI_ROOT_NAME (u32) 0x5F5F5F5C /* Root name is "\___" */ 75#define ACPI_ROOT_NAME (u32) 0x5F5F5F5C /* Root name is "\___" */
76#define ACPI_SYS_BUS_NAME (u32) 0x5F53425F /* Sys bus name is "_SB_" */ 76
77#define ACPI_PREFIX_MIXED (u32) 0x69706341 /* "Acpi" */
78#define ACPI_PREFIX_LOWER (u32) 0x69706361 /* "acpi" */
77 79
78#define ACPI_NS_ROOT_PATH "\\" 80#define ACPI_NS_ROOT_PATH "\\"
79#define ACPI_NS_SYSTEM_BUS "_SB_" 81#define ACPI_NS_SYSTEM_BUS "_SB_"
80 82
81/*! [Begin] no source code translation (not handled by acpisrc) */
82#define ACPI_FUNCTION_PREFIX1 'ipcA'
83#define ACPI_FUNCTION_PREFIX2 'ipca'
84/*! [End] no source code translation !*/
85
86#endif /* __ACNAMES_H__ */ 83#endif /* __ACNAMES_H__ */