1 | /****************************************************************************** |
2 | * |
3 | * Module Name: tbfind - find table |
4 | * |
5 | *****************************************************************************/ |
6 | |
7 | /* |
8 | * Copyright (C) 2000 - 2016, Intel Corp. |
9 | * All rights reserved. |
10 | * |
11 | * Redistribution and use in source and binary forms, with or without |
12 | * modification, are permitted provided that the following conditions |
13 | * are met: |
14 | * 1. Redistributions of source code must retain the above copyright |
15 | * notice, this list of conditions, and the following disclaimer, |
16 | * without modification. |
17 | * 2. Redistributions in binary form must reproduce at minimum a disclaimer |
18 | * substantially similar to the "NO WARRANTY" disclaimer below |
19 | * ("Disclaimer") and any redistribution must be conditioned upon |
20 | * including a substantially similar Disclaimer requirement for further |
21 | * binary redistribution. |
22 | * 3. Neither the names of the above-listed copyright holders nor the names |
23 | * of any contributors may be used to endorse or promote products derived |
24 | * from this software without specific prior written permission. |
25 | * |
26 | * Alternatively, this software may be distributed under the terms of the |
27 | * GNU General Public License ("GPL") version 2 as published by the Free |
28 | * Software Foundation. |
29 | * |
30 | * NO WARRANTY |
31 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
32 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
33 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR |
34 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
35 | * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
36 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
37 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
38 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, |
39 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING |
40 | * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
41 | * POSSIBILITY OF SUCH DAMAGES. |
42 | */ |
43 | |
44 | #include "acpi.h" |
45 | #include "accommon.h" |
46 | #include "actables.h" |
47 | |
48 | #define _COMPONENT ACPI_TABLES |
49 | ACPI_MODULE_NAME ("tbfind" ) |
50 | |
51 | |
52 | /******************************************************************************* |
53 | * |
54 | * FUNCTION: AcpiTbFindTable |
55 | * |
56 | * PARAMETERS: Signature - String with ACPI table signature |
57 | * OemId - String with the table OEM ID |
58 | * OemTableId - String with the OEM Table ID |
59 | * TableIndex - Where the table index is returned |
60 | * |
61 | * RETURN: Status and table index |
62 | * |
63 | * DESCRIPTION: Find an ACPI table (in the RSDT/XSDT) that matches the |
64 | * Signature, OEM ID and OEM Table ID. Returns an index that can |
65 | * be used to get the table header or entire table. |
66 | * |
67 | ******************************************************************************/ |
68 | |
69 | ACPI_STATUS |
70 | AcpiTbFindTable ( |
71 | char *Signature, |
72 | char *OemId, |
73 | char *OemTableId, |
74 | UINT32 *TableIndex) |
75 | { |
76 | ACPI_STATUS Status = AE_OK; |
77 | ACPI_TABLE_HEADER ; |
78 | UINT32 i; |
79 | |
80 | |
81 | ACPI_FUNCTION_TRACE (TbFindTable); |
82 | |
83 | |
84 | /* Validate the input table signature */ |
85 | |
86 | if (!AcpiUtValidNameseg (Signature)) |
87 | { |
88 | return_ACPI_STATUS (AE_BAD_SIGNATURE); |
89 | } |
90 | |
91 | /* Don't allow the OEM strings to be too long */ |
92 | |
93 | if ((strlen (OemId) > ACPI_OEM_ID_SIZE) || |
94 | (strlen (OemTableId) > ACPI_OEM_TABLE_ID_SIZE)) |
95 | { |
96 | return_ACPI_STATUS (AE_AML_STRING_LIMIT); |
97 | } |
98 | |
99 | /* Normalize the input strings */ |
100 | |
101 | memset (&Header, 0, sizeof (ACPI_TABLE_HEADER)); |
102 | ACPI_MOVE_NAME (Header.Signature, Signature); |
103 | strncpy (Header.OemId, OemId, ACPI_OEM_ID_SIZE); |
104 | strncpy (Header.OemTableId, OemTableId, ACPI_OEM_TABLE_ID_SIZE); |
105 | |
106 | /* Search for the table */ |
107 | |
108 | (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES); |
109 | for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i) |
110 | { |
111 | if (memcmp (&(AcpiGbl_RootTableList.Tables[i].Signature), |
112 | Header.Signature, ACPI_NAME_SIZE)) |
113 | { |
114 | /* Not the requested table */ |
115 | |
116 | continue; |
117 | } |
118 | |
119 | /* Table with matching signature has been found */ |
120 | |
121 | if (!AcpiGbl_RootTableList.Tables[i].Pointer) |
122 | { |
123 | /* Table is not currently mapped, map it */ |
124 | |
125 | Status = AcpiTbValidateTable (&AcpiGbl_RootTableList.Tables[i]); |
126 | if (ACPI_FAILURE (Status)) |
127 | { |
128 | goto UnlockAndExit; |
129 | } |
130 | |
131 | if (!AcpiGbl_RootTableList.Tables[i].Pointer) |
132 | { |
133 | continue; |
134 | } |
135 | } |
136 | |
137 | /* Check for table match on all IDs */ |
138 | |
139 | if (!memcmp (AcpiGbl_RootTableList.Tables[i].Pointer->Signature, |
140 | Header.Signature, ACPI_NAME_SIZE) && |
141 | (!OemId[0] || |
142 | !memcmp (AcpiGbl_RootTableList.Tables[i].Pointer->OemId, |
143 | Header.OemId, ACPI_OEM_ID_SIZE)) && |
144 | (!OemTableId[0] || |
145 | !memcmp (AcpiGbl_RootTableList.Tables[i].Pointer->OemTableId, |
146 | Header.OemTableId, ACPI_OEM_TABLE_ID_SIZE))) |
147 | { |
148 | *TableIndex = i; |
149 | |
150 | ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Found table [%4.4s]\n" , |
151 | Header.Signature)); |
152 | goto UnlockAndExit; |
153 | } |
154 | } |
155 | Status = AE_NOT_FOUND; |
156 | |
157 | UnlockAndExit: |
158 | (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES); |
159 | return_ACPI_STATUS (Status); |
160 | } |
161 | |