OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [acpi/] [tables/] [tbutils.c] - Blame information for rev 1774

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/******************************************************************************
2
 *
3
 * Module Name: tbutils - Table manipulation utilities
4
 *
5
 *****************************************************************************/
6
 
7
/*
8
 * Copyright (C) 2000 - 2004, R. Byron Moore
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
 
45
#include <acpi/acpi.h>
46
#include <acpi/actables.h>
47
 
48
 
49
#define _COMPONENT          ACPI_TABLES
50
         ACPI_MODULE_NAME    ("tbutils")
51
 
52
 
53
/*******************************************************************************
54
 *
55
 * FUNCTION:    acpi_tb_handle_to_object
56
 *
57
 * PARAMETERS:  table_id            - Id for which the function is searching
58
 *              table_desc          - Pointer to return the matching table
59
 *                                      descriptor.
60
 *
61
 * RETURN:      Search the tables to find one with a matching table_id and
62
 *              return a pointer to that table descriptor.
63
 *
64
 ******************************************************************************/
65
 
66
acpi_status
67
acpi_tb_handle_to_object (
68
        u16                             table_id,
69
        struct acpi_table_desc          **return_table_desc)
70
{
71
        u32                             i;
72
        struct acpi_table_desc          *table_desc;
73
 
74
 
75
        ACPI_FUNCTION_NAME ("tb_handle_to_object");
76
 
77
 
78
        for (i = 0; i < ACPI_TABLE_MAX; i++) {
79
                table_desc = acpi_gbl_table_lists[i].next;
80
                while (table_desc) {
81
                        if (table_desc->table_id == table_id) {
82
                                *return_table_desc = table_desc;
83
                                return (AE_OK);
84
                        }
85
 
86
                        table_desc = table_desc->next;
87
                }
88
        }
89
 
90
        ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "table_id=%X does not exist\n", table_id));
91
        return (AE_BAD_PARAMETER);
92
}
93
 
94
 
95
/*******************************************************************************
96
 *
97
 * FUNCTION:    acpi_tb_validate_table_header
98
 *
99
 * PARAMETERS:  table_header        - Logical pointer to the table
100
 *
101
 * RETURN:      Status
102
 *
103
 * DESCRIPTION: Check an ACPI table header for validity
104
 *
105
 * NOTE:  Table pointers are validated as follows:
106
 *          1) Table pointer must point to valid physical memory
107
 *          2) Signature must be 4 ASCII chars, even if we don't recognize the
108
 *             name
109
 *          3) Table must be readable for length specified in the header
110
 *          4) Table checksum must be valid (with the exception of the FACS
111
 *              which has no checksum because it contains variable fields)
112
 *
113
 ******************************************************************************/
114
 
115
acpi_status
116
acpi_tb_validate_table_header (
117
        struct acpi_table_header        *table_header)
118
{
119
        acpi_name                       signature;
120
 
121
 
122
        ACPI_FUNCTION_NAME ("tb_validate_table_header");
123
 
124
 
125
        /* Verify that this is a valid address */
126
 
127
        if (!acpi_os_readable (table_header, sizeof (struct acpi_table_header))) {
128
                ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
129
                        "Cannot read table header at %p\n", table_header));
130
                return (AE_BAD_ADDRESS);
131
        }
132
 
133
        /* Ensure that the signature is 4 ASCII characters */
134
 
135
        ACPI_MOVE_32_TO_32 (&signature, table_header->signature);
136
        if (!acpi_ut_valid_acpi_name (signature)) {
137
                ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
138
                        "Table signature at %p [%p] has invalid characters\n",
139
                        table_header, &signature));
140
 
141
                ACPI_REPORT_WARNING (("Invalid table signature found: [%4.4s]\n",
142
                        (char *) &signature));
143
                ACPI_DUMP_BUFFER (table_header, sizeof (struct acpi_table_header));
144
                return (AE_BAD_SIGNATURE);
145
        }
146
 
147
        /* Validate the table length */
148
 
149
        if (table_header->length < sizeof (struct acpi_table_header)) {
150
                ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
151
                        "Invalid length in table header %p name %4.4s\n",
152
                        table_header, (char *) &signature));
153
 
154
                ACPI_REPORT_WARNING (("Invalid table header length (0x%X) found\n",
155
                        (u32) table_header->length));
156
                ACPI_DUMP_BUFFER (table_header, sizeof (struct acpi_table_header));
157
                return (AE_BAD_HEADER);
158
        }
159
 
160
        return (AE_OK);
161
}
162
 
163
 
164
/*******************************************************************************
165
 *
166
 * FUNCTION:    acpi_tb_verify_table_checksum
167
 *
168
 * PARAMETERS:  *table_header           - ACPI table to verify
169
 *
170
 * RETURN:      8 bit checksum of table
171
 *
172
 * DESCRIPTION: Does an 8 bit checksum of table and returns status.  A correct
173
 *              table should have a checksum of 0.
174
 *
175
 ******************************************************************************/
176
 
177
acpi_status
178
acpi_tb_verify_table_checksum (
179
        struct acpi_table_header        *table_header)
180
{
181
        u8                              checksum;
182
        acpi_status                     status = AE_OK;
183
 
184
 
185
        ACPI_FUNCTION_TRACE ("tb_verify_table_checksum");
186
 
187
 
188
        /* Compute the checksum on the table */
189
 
190
        checksum = acpi_tb_checksum (table_header, table_header->length);
191
 
192
        /* Return the appropriate exception */
193
 
194
        if (checksum) {
195
                ACPI_REPORT_WARNING (("Invalid checksum in table [%4.4s] (%02X, sum %02X is not zero)\n",
196
                        table_header->signature, (u32) table_header->checksum, (u32) checksum));
197
 
198
                status = AE_BAD_CHECKSUM;
199
        }
200
        return_ACPI_STATUS (status);
201
}
202
 
203
 
204
/*******************************************************************************
205
 *
206
 * FUNCTION:    acpi_tb_checksum
207
 *
208
 * PARAMETERS:  Buffer              - Buffer to checksum
209
 *              Length              - Size of the buffer
210
 *
211
 * RETURNS      8 bit checksum of buffer
212
 *
213
 * DESCRIPTION: Computes an 8 bit checksum of the buffer(length) and returns it.
214
 *
215
 ******************************************************************************/
216
 
217
u8
218
acpi_tb_checksum (
219
        void                            *buffer,
220
        u32                             length)
221
{
222
        const u8                        *limit;
223
        const u8                        *rover;
224
        u8                              sum = 0;
225
 
226
 
227
        if (buffer && length) {
228
                /*  Buffer and Length are valid   */
229
 
230
                limit = (u8 *) buffer + length;
231
 
232
                for (rover = buffer; rover < limit; rover++) {
233
                        sum = (u8) (sum + *rover);
234
                }
235
        }
236
        return (sum);
237
}
238
 
239
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.