Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6595 serge 1
/******************************************************************************
2
 *
3
 * Module Name: tbprint - Table output utilities
4
 *
5
 *****************************************************************************/
6
 
7
/*
8
 * Copyright (C) 2000 - 2015, 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 
45
#include "accommon.h"
46
#include "actables.h"
47
 
48
#define _COMPONENT          ACPI_TABLES
49
ACPI_MODULE_NAME("tbprint")
50
 
51
/* Local prototypes */
52
static void acpi_tb_fix_string(char *string, acpi_size length);
53
 
54
static void
55
acpi_tb_cleanup_table_header(struct acpi_table_header *out_header,
56
			     struct acpi_table_header *header);
57
 
58
/*******************************************************************************
59
 *
60
 * FUNCTION:    acpi_tb_fix_string
61
 *
62
 * PARAMETERS:  string              - String to be repaired
63
 *              length              - Maximum length
64
 *
65
 * RETURN:      None
66
 *
67
 * DESCRIPTION: Replace every non-printable or non-ascii byte in the string
68
 *              with a question mark '?'.
69
 *
70
 ******************************************************************************/
71
 
72
static void acpi_tb_fix_string(char *string, acpi_size length)
73
{
74
 
75
	while (length && *string) {
76
		if (!isprint((int)*string)) {
77
			*string = '?';
78
		}
79
		string++;
80
		length--;
81
	}
82
}
83
 
84
/*******************************************************************************
85
 *
86
 * FUNCTION:    acpi_tb_cleanup_table_header
87
 *
88
 * PARAMETERS:  out_header          - Where the cleaned header is returned
89
 *              header              - Input ACPI table header
90
 *
91
 * RETURN:      Returns the cleaned header in out_header
92
 *
93
 * DESCRIPTION: Copy the table header and ensure that all "string" fields in
94
 *              the header consist of printable characters.
95
 *
96
 ******************************************************************************/
97
 
98
static void
99
acpi_tb_cleanup_table_header(struct acpi_table_header *out_header,
100
			     struct acpi_table_header *header)
101
{
102
 
103
	memcpy(out_header, header, sizeof(struct acpi_table_header));
104
 
105
	acpi_tb_fix_string(out_header->signature, ACPI_NAME_SIZE);
106
	acpi_tb_fix_string(out_header->oem_id, ACPI_OEM_ID_SIZE);
107
	acpi_tb_fix_string(out_header->oem_table_id, ACPI_OEM_TABLE_ID_SIZE);
108
	acpi_tb_fix_string(out_header->asl_compiler_id, ACPI_NAME_SIZE);
109
}
110
 
111
/*******************************************************************************
112
 *
113
 * FUNCTION:    acpi_tb_print_table_header
114
 *
115
 * PARAMETERS:  address             - Table physical address
116
 *              header              - Table header
117
 *
118
 * RETURN:      None
119
 *
120
 * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP.
121
 *
122
 ******************************************************************************/
123
 
124
void
125
acpi_tb_print_table_header(acpi_physical_address address,
126
			   struct acpi_table_header *header)
127
{
128
	struct acpi_table_header local_header;
129
 
130
	if (ACPI_COMPARE_NAME(header->signature, ACPI_SIG_FACS)) {
131
 
132
		/* FACS only has signature and length fields */
133
 
134
		ACPI_INFO((AE_INFO, "%-4.4s 0x%8.8X%8.8X %06X",
135
			   header->signature, ACPI_FORMAT_UINT64(address),
136
			   header->length));
137
	} else if (ACPI_VALIDATE_RSDP_SIG(header->signature)) {
138
 
139
		/* RSDP has no common fields */
140
 
141
		memcpy(local_header.oem_id,
142
		       ACPI_CAST_PTR(struct acpi_table_rsdp, header)->oem_id,
143
		       ACPI_OEM_ID_SIZE);
144
		acpi_tb_fix_string(local_header.oem_id, ACPI_OEM_ID_SIZE);
145
 
146
		ACPI_INFO((AE_INFO, "RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)",
147
			   ACPI_FORMAT_UINT64(address),
148
			   (ACPI_CAST_PTR(struct acpi_table_rsdp, header)->
149
			    revision >
150
			    0) ? ACPI_CAST_PTR(struct acpi_table_rsdp,
151
					       header)->length : 20,
152
			   ACPI_CAST_PTR(struct acpi_table_rsdp,
153
					 header)->revision,
154
			   local_header.oem_id));
155
	} else {
156
		/* Standard ACPI table with full common header */
157
 
158
		acpi_tb_cleanup_table_header(&local_header, header);
159
 
160
		ACPI_INFO((AE_INFO,
161
			   "%-4.4s 0x%8.8X%8.8X"
162
			   " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)",
163
			   local_header.signature, ACPI_FORMAT_UINT64(address),
164
			   local_header.length, local_header.revision,
165
			   local_header.oem_id, local_header.oem_table_id,
166
			   local_header.oem_revision,
167
			   local_header.asl_compiler_id,
168
			   local_header.asl_compiler_revision));
169
	}
170
}
171
 
172
/*******************************************************************************
173
 *
174
 * FUNCTION:    acpi_tb_validate_checksum
175
 *
176
 * PARAMETERS:  table               - ACPI table to verify
177
 *              length              - Length of entire table
178
 *
179
 * RETURN:      Status
180
 *
181
 * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns
182
 *              exception on bad checksum.
183
 *
184
 ******************************************************************************/
185
 
186
acpi_status acpi_tb_verify_checksum(struct acpi_table_header *table, u32 length)
187
{
188
	u8 checksum;
189
 
190
	/*
191
	 * FACS/S3PT:
192
	 * They are the odd tables, have no standard ACPI header and no checksum
193
	 */
194
 
195
	if (ACPI_COMPARE_NAME(table->signature, ACPI_SIG_S3PT) ||
196
	    ACPI_COMPARE_NAME(table->signature, ACPI_SIG_FACS)) {
197
		return (AE_OK);
198
	}
199
 
200
	/* Compute the checksum on the table */
201
 
202
	checksum = acpi_tb_checksum(ACPI_CAST_PTR(u8, table), length);
203
 
204
	/* Checksum ok? (should be zero) */
205
 
206
	if (checksum) {
207
		ACPI_BIOS_WARNING((AE_INFO,
208
				   "Incorrect checksum in table [%4.4s] - 0x%2.2X, "
209
				   "should be 0x%2.2X",
210
				   table->signature, table->checksum,
211
				   (u8)(table->checksum - checksum)));
212
 
213
#if (ACPI_CHECKSUM_ABORT)
214
		return (AE_BAD_CHECKSUM);
215
#endif
216
	}
217
 
218
	return (AE_OK);
219
}
220
 
221
/*******************************************************************************
222
 *
223
 * FUNCTION:    acpi_tb_checksum
224
 *
225
 * PARAMETERS:  buffer          - Pointer to memory region to be checked
226
 *              length          - Length of this memory region
227
 *
228
 * RETURN:      Checksum (u8)
229
 *
230
 * DESCRIPTION: Calculates circular checksum of memory region.
231
 *
232
 ******************************************************************************/
233
 
234
u8 acpi_tb_checksum(u8 *buffer, u32 length)
235
{
236
	u8 sum = 0;
237
	u8 *end = buffer + length;
238
 
239
	while (buffer < end) {
240
		sum = (u8)(sum + *(buffer++));
241
	}
242
 
243
	return (sum);
244
}