aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/executer/exmisc.c
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2006-01-27 16:43:00 -0500
committerLen Brown <len.brown@intel.com>2006-01-31 03:25:09 -0500
commitb8e4d89357fc434618a59c1047cac72641191805 (patch)
treeac97fcc6fdc277c682365900663872c96f2420bd /drivers/acpi/executer/exmisc.c
parent292dd876ee765c478b27c93cc51e93a558ed58bf (diff)
[ACPI] ACPICA 20060127
Implemented support in the Resource Manager to allow unresolved namestring references within resource package objects for the _PRT method. This support is in addition to the previously implemented unresolved reference support within the AML parser. If the interpreter slack mode is enabled (true on Linux unless acpi=strict), these unresolved references will be passed through to the caller as a NULL package entry. http://bugzilla.kernel.org/show_bug.cgi?id=5741 Implemented and deployed new macros and functions for error and warning messages across the subsystem. These macros are simpler and generate less code than their predecessors. The new macros ACPI_ERROR, ACPI_EXCEPTION, ACPI_WARNING, and ACPI_INFO replace the ACPI_REPORT_* macros. Implemented the acpi_cpu_flags type to simplify host OS integration of the Acquire/Release Lock OSL interfaces. Suggested by Steven Rostedt and Andrew Morton. Fixed a problem where Alias ASL operators are sometimes not correctly resolved. causing AE_AML_INTERNAL http://bugzilla.kernel.org/show_bug.cgi?id=5189 http://bugzilla.kernel.org/show_bug.cgi?id=5674 Fixed several problems with the implementation of the ConcatenateResTemplate ASL operator. As per the ACPI specification, zero length buffers are now treated as a single EndTag. One-length buffers always cause a fatal exception. Non-zero length buffers that do not end with a full 2-byte EndTag cause a fatal exception. Fixed a possible structure overwrite in the AcpiGetObjectInfo external interface. (With assistance from Thomas Renninger) Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/executer/exmisc.c')
-rw-r--r--drivers/acpi/executer/exmisc.c43
1 files changed, 25 insertions, 18 deletions
diff --git a/drivers/acpi/executer/exmisc.c b/drivers/acpi/executer/exmisc.c
index 5ad34566738c..48c18d29222a 100644
--- a/drivers/acpi/executer/exmisc.c
+++ b/drivers/acpi/executer/exmisc.c
@@ -98,8 +98,8 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
98 98
99 default: 99 default:
100 100
101 ACPI_REPORT_ERROR(("Unknown Reference opcode %X\n", 101 ACPI_ERROR((AE_INFO, "Unknown Reference opcode %X",
102 obj_desc->reference.opcode)); 102 obj_desc->reference.opcode));
103 return_ACPI_STATUS(AE_AML_INTERNAL); 103 return_ACPI_STATUS(AE_AML_INTERNAL);
104 } 104 }
105 break; 105 break;
@@ -114,8 +114,8 @@ acpi_ex_get_object_reference(union acpi_operand_object *obj_desc,
114 114
115 default: 115 default:
116 116
117 ACPI_REPORT_ERROR(("Invalid descriptor type %X\n", 117 ACPI_ERROR((AE_INFO, "Invalid descriptor type %X",
118 ACPI_GET_DESCRIPTOR_TYPE(obj_desc))); 118 ACPI_GET_DESCRIPTOR_TYPE(obj_desc)));
119 return_ACPI_STATUS(AE_TYPE); 119 return_ACPI_STATUS(AE_TYPE);
120 } 120 }
121 121
@@ -166,15 +166,18 @@ acpi_ex_concat_template(union acpi_operand_object *operand0,
166 u8 *end_tag; 166 u8 *end_tag;
167 acpi_size length0; 167 acpi_size length0;
168 acpi_size length1; 168 acpi_size length1;
169 acpi_size new_length;
169 170
170 ACPI_FUNCTION_TRACE("ex_concat_template"); 171 ACPI_FUNCTION_TRACE("ex_concat_template");
171 172
172 /* 173 /*
173 * Find the end_tag descriptor in each resource template. 174 * Find the end_tag descriptor in each resource template.
174 * Note: returned pointers point TO the end_tag, not past it. 175 * Note1: returned pointers point TO the end_tag, not past it.
175 * 176 * Note2: zero-length buffers are allowed; treated like one end_tag
176 * Compute the length of each resource template
177 */ 177 */
178
179 /* Get the length of the first resource template */
180
178 status = acpi_ut_get_resource_end_tag(operand0, &end_tag); 181 status = acpi_ut_get_resource_end_tag(operand0, &end_tag);
179 if (ACPI_FAILURE(status)) { 182 if (ACPI_FAILURE(status)) {
180 return_ACPI_STATUS(status); 183 return_ACPI_STATUS(status);
@@ -182,19 +185,22 @@ acpi_ex_concat_template(union acpi_operand_object *operand0,
182 185
183 length0 = ACPI_PTR_DIFF(end_tag, operand0->buffer.pointer); 186 length0 = ACPI_PTR_DIFF(end_tag, operand0->buffer.pointer);
184 187
188 /* Get the length of the second resource template */
189
185 status = acpi_ut_get_resource_end_tag(operand1, &end_tag); 190 status = acpi_ut_get_resource_end_tag(operand1, &end_tag);
186 if (ACPI_FAILURE(status)) { 191 if (ACPI_FAILURE(status)) {
187 return_ACPI_STATUS(status); 192 return_ACPI_STATUS(status);
188 } 193 }
189 194
190 /* Include the end_tag in the second template length */ 195 length1 = ACPI_PTR_DIFF(end_tag, operand1->buffer.pointer);
196
197 /* Combine both lengths, minimum size will be 2 for end_tag */
191 198
192 length1 = ACPI_PTR_DIFF(end_tag, operand1->buffer.pointer) + 199 new_length = length0 + length1 + sizeof(struct aml_resource_end_tag);
193 sizeof(struct aml_resource_end_tag);
194 200
195 /* Create a new buffer object for the result */ 201 /* Create a new buffer object for the result (with one end_tag) */
196 202
197 return_desc = acpi_ut_create_buffer_object(length0 + length1); 203 return_desc = acpi_ut_create_buffer_object(new_length);
198 if (!return_desc) { 204 if (!return_desc) {
199 return_ACPI_STATUS(AE_NO_MEMORY); 205 return_ACPI_STATUS(AE_NO_MEMORY);
200 } 206 }
@@ -207,9 +213,10 @@ acpi_ex_concat_template(union acpi_operand_object *operand0,
207 ACPI_MEMCPY(new_buf, operand0->buffer.pointer, length0); 213 ACPI_MEMCPY(new_buf, operand0->buffer.pointer, length0);
208 ACPI_MEMCPY(new_buf + length0, operand1->buffer.pointer, length1); 214 ACPI_MEMCPY(new_buf + length0, operand1->buffer.pointer, length1);
209 215
210 /* Set the end_tag checksum to zero, means "ignore checksum" */ 216 /* Insert end_tag and set the checksum to zero, means "ignore checksum" */
211 217
212 new_buf[return_desc->buffer.length - 1] = 0; 218 new_buf[new_length - 1] = 0;
219 new_buf[new_length - 2] = ACPI_RESOURCE_NAME_END_TAG | 1;
213 220
214 /* Return the completed resource template */ 221 /* Return the completed resource template */
215 222
@@ -268,8 +275,8 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
268 break; 275 break;
269 276
270 default: 277 default:
271 ACPI_REPORT_ERROR(("Invalid object type: %X\n", 278 ACPI_ERROR((AE_INFO, "Invalid object type: %X",
272 ACPI_GET_OBJECT_TYPE(operand0))); 279 ACPI_GET_OBJECT_TYPE(operand0)));
273 status = AE_AML_INTERNAL; 280 status = AE_AML_INTERNAL;
274 } 281 }
275 282
@@ -370,8 +377,8 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
370 377
371 /* Invalid object type, should not happen here */ 378 /* Invalid object type, should not happen here */
372 379
373 ACPI_REPORT_ERROR(("Invalid object type: %X\n", 380 ACPI_ERROR((AE_INFO, "Invalid object type: %X",
374 ACPI_GET_OBJECT_TYPE(operand0))); 381 ACPI_GET_OBJECT_TYPE(operand0)));
375 status = AE_AML_INTERNAL; 382 status = AE_AML_INTERNAL;
376 goto cleanup; 383 goto cleanup;
377 } 384 }