aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/executer
diff options
context:
space:
mode:
authorBob Moore <robert.moore@intel.com>2005-11-17 13:07:00 -0500
committerLen Brown <len.brown@intel.com>2005-12-10 00:27:56 -0500
commitc51a4de85de720670f2fbc592a6f8040af72ad87 (patch)
treeccaa60c483fcc904abd63d936ff7dc380bf28e7b /drivers/acpi/executer
parent96db255c8f014ae3497507104e8df809785a619f (diff)
[ACPI] ACPICA 20051117
Fixed a problem in the AML parser where the method thread count could be decremented below zero if any errors occurred during the method parse phase. This should eliminate AE_AML_METHOD_LIMIT exceptions seen on some machines. This also fixed a related regression with the mechanism that detects and corrects methods that cannot properly handle reentrancy (related to the deployment of the new OwnerId mechanism.) Eliminated the pre-parsing of control methods (to detect errors) during table load. Related to the problem above, this was causing unwind issues if any errors occurred during the parse, and it seemed to be overkill. A table load should not be aborted if there are problems with any single control method, thus rendering this feature rather pointless. Fixed a problem with the new table-driven resource manager where an internal buffer overflow could occur for small resource templates. Implemented a new external interface, acpi_get_vendor_resource() This interface will find and return a vendor-defined resource descriptor within a _CRS or _PRS method via an ACPI 3.0 UUID match. (from Bjorn Helgaas) Removed the length limit (200) on string objects as per the upcoming ACPI 3.0A specification. This affects the following areas of the interpreter: 1) any implicit conversion of a Buffer to a String, 2) a String object result of the ASL Concatentate operator, 3) the String object result of the ASL ToString operator. Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/executer')
-rw-r--r--drivers/acpi/executer/exconvrt.c12
-rw-r--r--drivers/acpi/executer/exdump.c15
-rw-r--r--drivers/acpi/executer/exmisc.c38
-rw-r--r--drivers/acpi/executer/exnames.c2
-rw-r--r--drivers/acpi/executer/exoparg2.c10
-rw-r--r--drivers/acpi/executer/exregion.c16
-rw-r--r--drivers/acpi/executer/exstorob.c4
7 files changed, 41 insertions, 56 deletions
diff --git a/drivers/acpi/executer/exconvrt.c b/drivers/acpi/executer/exconvrt.c
index 04e5194989a6..fa9e75d4ec65 100644
--- a/drivers/acpi/executer/exconvrt.c
+++ b/drivers/acpi/executer/exconvrt.c
@@ -504,18 +504,12 @@ acpi_ex_convert_to_string(union acpi_operand_object * obj_desc,
504 } 504 }
505 505
506 /* 506 /*
507 * Perform the conversion. 507 * Create a new string object and string buffer
508 * (-1 because of extra separator included in string_length from above) 508 * (-1 because of extra separator included in string_length from above)
509 */ 509 */
510 string_length--;
511 if (string_length > ACPI_MAX_STRING_CONVERSION) { /* ACPI limit */
512 return_ACPI_STATUS(AE_AML_STRING_LIMIT);
513 }
514
515 /* Create a new string object and string buffer */
516
517 return_desc = 510 return_desc =
518 acpi_ut_create_string_object((acpi_size) string_length); 511 acpi_ut_create_string_object((acpi_size)
512 (string_length - 1));
519 if (!return_desc) { 513 if (!return_desc) {
520 return_ACPI_STATUS(AE_NO_MEMORY); 514 return_ACPI_STATUS(AE_NO_MEMORY);
521 } 515 }
diff --git a/drivers/acpi/executer/exdump.c b/drivers/acpi/executer/exdump.c
index 5a4cca171af6..17c79cd91b31 100644
--- a/drivers/acpi/executer/exdump.c
+++ b/drivers/acpi/executer/exdump.c
@@ -117,12 +117,13 @@ static struct acpi_exdump_info acpi_ex_dump_event[2] = {
117 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(event.semaphore), "Semaphore"} 117 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(event.semaphore), "Semaphore"}
118}; 118};
119 119
120static struct acpi_exdump_info acpi_ex_dump_method[7] = { 120static struct acpi_exdump_info acpi_ex_dump_method[8] = {
121 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_method), NULL}, 121 {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE(acpi_ex_dump_method), NULL},
122 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.param_count), "param_count"}, 122 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.param_count), "param_count"},
123 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.concurrency), "Concurrency"}, 123 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.concurrency), "Concurrency"},
124 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.semaphore), "Semaphore"}, 124 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.semaphore), "Semaphore"},
125 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.owner_id), "Owner Id"}, 125 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.owner_id), "Owner Id"},
126 {ACPI_EXD_UINT8, ACPI_EXD_OFFSET(method.thread_count), "Thread Count"},
126 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(method.aml_length), "Aml Length"}, 127 {ACPI_EXD_UINT32, ACPI_EXD_OFFSET(method.aml_length), "Aml Length"},
127 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.aml_start), "Aml Start"} 128 {ACPI_EXD_POINTER, ACPI_EXD_OFFSET(method.aml_start), "Aml Start"}
128}; 129};
@@ -339,7 +340,7 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
339 count = info->offset; 340 count = info->offset;
340 341
341 while (count) { 342 while (count) {
342 target = ((u8 *) obj_desc) + info->offset; 343 target = ACPI_ADD_PTR(u8, obj_desc, info->offset);
343 name = info->name; 344 name = info->name;
344 345
345 switch (info->opcode) { 346 switch (info->opcode) {
@@ -360,20 +361,19 @@ acpi_ex_dump_object(union acpi_operand_object *obj_desc,
360 case ACPI_EXD_UINT16: 361 case ACPI_EXD_UINT16:
361 362
362 acpi_os_printf("%20s : %4.4X\n", name, 363 acpi_os_printf("%20s : %4.4X\n", name,
363 *ACPI_CAST_PTR(u16, target)); 364 ACPI_GET16(target));
364 break; 365 break;
365 366
366 case ACPI_EXD_UINT32: 367 case ACPI_EXD_UINT32:
367 368
368 acpi_os_printf("%20s : %8.8X\n", name, 369 acpi_os_printf("%20s : %8.8X\n", name,
369 *ACPI_CAST_PTR(u32, target)); 370 ACPI_GET32(target));
370 break; 371 break;
371 372
372 case ACPI_EXD_UINT64: 373 case ACPI_EXD_UINT64:
373 374
374 acpi_os_printf("%20s : %8.8X%8.8X\n", "Value", 375 acpi_os_printf("%20s : %8.8X%8.8X\n", "Value",
375 ACPI_FORMAT_UINT64(*ACPI_CAST_PTR 376 ACPI_FORMAT_UINT64(ACPI_GET64(target)));
376 (u64, target)));
377 break; 377 break;
378 378
379 case ACPI_EXD_POINTER: 379 case ACPI_EXD_POINTER:
@@ -969,7 +969,8 @@ acpi_ex_dump_package_obj(union acpi_operand_object *obj_desc,
969 acpi_os_printf("[Buffer] Length %.2X = ", 969 acpi_os_printf("[Buffer] Length %.2X = ",
970 obj_desc->buffer.length); 970 obj_desc->buffer.length);
971 if (obj_desc->buffer.length) { 971 if (obj_desc->buffer.length) {
972 acpi_ut_dump_buffer((u8 *) obj_desc->buffer.pointer, 972 acpi_ut_dump_buffer(ACPI_CAST_PTR
973 (u8, obj_desc->buffer.pointer),
973 obj_desc->buffer.length, 974 obj_desc->buffer.length,
974 DB_DWORD_DISPLAY, _COMPONENT); 975 DB_DWORD_DISPLAY, _COMPONENT);
975 } else { 976 } else {
diff --git a/drivers/acpi/executer/exmisc.c b/drivers/acpi/executer/exmisc.c
index 00a25f8188f4..0778bff632bf 100644
--- a/drivers/acpi/executer/exmisc.c
+++ b/drivers/acpi/executer/exmisc.c
@@ -205,11 +205,9 @@ acpi_ex_concat_template(union acpi_operand_object *operand0,
205 ACPI_MEMCPY(new_buf, operand0->buffer.pointer, length0); 205 ACPI_MEMCPY(new_buf, operand0->buffer.pointer, length0);
206 ACPI_MEMCPY(new_buf + length0, operand1->buffer.pointer, length1); 206 ACPI_MEMCPY(new_buf + length0, operand1->buffer.pointer, length1);
207 207
208 /* Compute the new checksum */ 208 /* Set the end_tag checksum to zero, means "ignore checksum" */
209 209
210 new_buf[return_desc->buffer.length - 1] = 210 new_buf[return_desc->buffer.length - 1] = 0;
211 acpi_ut_generate_checksum(return_desc->buffer.pointer,
212 (return_desc->buffer.length - 1));
213 211
214 /* Return the completed resource template */ 212 /* Return the completed resource template */
215 213
@@ -242,7 +240,6 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
242 union acpi_operand_object *return_desc; 240 union acpi_operand_object *return_desc;
243 char *new_buf; 241 char *new_buf;
244 acpi_status status; 242 acpi_status status;
245 acpi_size new_length;
246 243
247 ACPI_FUNCTION_TRACE("ex_do_concatenate"); 244 ACPI_FUNCTION_TRACE("ex_do_concatenate");
248 245
@@ -269,7 +266,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
269 break; 266 break;
270 267
271 default: 268 default:
272 ACPI_REPORT_ERROR(("Concat - invalid obj type: %X\n", 269 ACPI_REPORT_ERROR(("Concatanate - invalid object type: %X\n",
273 ACPI_GET_OBJECT_TYPE(operand0))); 270 ACPI_GET_OBJECT_TYPE(operand0)));
274 status = AE_AML_INTERNAL; 271 status = AE_AML_INTERNAL;
275 } 272 }
@@ -309,8 +306,7 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
309 306
310 /* Copy the first integer, LSB first */ 307 /* Copy the first integer, LSB first */
311 308
312 ACPI_MEMCPY(new_buf, 309 ACPI_MEMCPY(new_buf, &operand0->integer.value,
313 &operand0->integer.value,
314 acpi_gbl_integer_byte_width); 310 acpi_gbl_integer_byte_width);
315 311
316 /* Copy the second integer (LSB first) after the first */ 312 /* Copy the second integer (LSB first) after the first */
@@ -324,14 +320,11 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
324 320
325 /* Result of two Strings is a String */ 321 /* Result of two Strings is a String */
326 322
327 new_length = (acpi_size) operand0->string.length + 323 return_desc = acpi_ut_create_string_object((acpi_size)
328 (acpi_size) local_operand1->string.length; 324 (operand0->string.
329 if (new_length > ACPI_MAX_STRING_CONVERSION) { 325 length +
330 status = AE_AML_STRING_LIMIT; 326 local_operand1->
331 goto cleanup; 327 string.length));
332 }
333
334 return_desc = acpi_ut_create_string_object(new_length);
335 if (!return_desc) { 328 if (!return_desc) {
336 status = AE_NO_MEMORY; 329 status = AE_NO_MEMORY;
337 goto cleanup; 330 goto cleanup;
@@ -351,11 +344,10 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
351 /* Result of two Buffers is a Buffer */ 344 /* Result of two Buffers is a Buffer */
352 345
353 return_desc = acpi_ut_create_buffer_object((acpi_size) 346 return_desc = acpi_ut_create_buffer_object((acpi_size)
354 operand0->buffer. 347 (operand0->buffer.
355 length + 348 length +
356 (acpi_size) 349 local_operand1->
357 local_operand1-> 350 buffer.length));
358 buffer.length);
359 if (!return_desc) { 351 if (!return_desc) {
360 status = AE_NO_MEMORY; 352 status = AE_NO_MEMORY;
361 goto cleanup; 353 goto cleanup;
@@ -365,8 +357,8 @@ acpi_ex_do_concatenate(union acpi_operand_object *operand0,
365 357
366 /* Concatenate the buffers */ 358 /* Concatenate the buffers */
367 359
368 ACPI_MEMCPY(new_buf, 360 ACPI_MEMCPY(new_buf, operand0->buffer.pointer,
369 operand0->buffer.pointer, operand0->buffer.length); 361 operand0->buffer.length);
370 ACPI_MEMCPY(new_buf + operand0->buffer.length, 362 ACPI_MEMCPY(new_buf + operand0->buffer.length,
371 local_operand1->buffer.pointer, 363 local_operand1->buffer.pointer,
372 local_operand1->buffer.length); 364 local_operand1->buffer.length);
diff --git a/drivers/acpi/executer/exnames.c b/drivers/acpi/executer/exnames.c
index dff41121a304..7bb5e17b5680 100644
--- a/drivers/acpi/executer/exnames.c
+++ b/drivers/acpi/executer/exnames.c
@@ -216,7 +216,7 @@ static acpi_status acpi_ex_name_segment(u8 ** in_aml_address, char *name_string)
216 *aml_address, aml_address)); 216 *aml_address, aml_address));
217 } 217 }
218 218
219 *in_aml_address = (u8 *) aml_address; 219 *in_aml_address = ACPI_CAST_PTR(u8, aml_address);
220 return_ACPI_STATUS(status); 220 return_ACPI_STATUS(status);
221} 221}
222 222
diff --git a/drivers/acpi/executer/exoparg2.c b/drivers/acpi/executer/exoparg2.c
index 8d70c6beef00..d8472842c1fd 100644
--- a/drivers/acpi/executer/exoparg2.c
+++ b/drivers/acpi/executer/exoparg2.c
@@ -344,10 +344,6 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
344 (length < operand[1]->integer.value) && 344 (length < operand[1]->integer.value) &&
345 (operand[0]->buffer.pointer[length])) { 345 (operand[0]->buffer.pointer[length])) {
346 length++; 346 length++;
347 if (length > ACPI_MAX_STRING_CONVERSION) {
348 status = AE_AML_STRING_LIMIT;
349 goto cleanup;
350 }
351 } 347 }
352 348
353 /* Allocate a new string object */ 349 /* Allocate a new string object */
@@ -358,8 +354,10 @@ acpi_status acpi_ex_opcode_2A_1T_1R(struct acpi_walk_state *walk_state)
358 goto cleanup; 354 goto cleanup;
359 } 355 }
360 356
361 /* Copy the raw buffer data with no transform. NULL terminated already */ 357 /*
362 358 * Copy the raw buffer data with no transform.
359 * (NULL terminated already)
360 */
363 ACPI_MEMCPY(return_desc->string.pointer, 361 ACPI_MEMCPY(return_desc->string.pointer,
364 operand[0]->buffer.pointer, length); 362 operand[0]->buffer.pointer, length);
365 break; 363 break;
diff --git a/drivers/acpi/executer/exregion.c b/drivers/acpi/executer/exregion.c
index 1897379b5f90..80118be3f544 100644
--- a/drivers/acpi/executer/exregion.c
+++ b/drivers/acpi/executer/exregion.c
@@ -199,20 +199,20 @@ acpi_ex_system_memory_space_handler(u32 function,
199 *value = 0; 199 *value = 0;
200 switch (bit_width) { 200 switch (bit_width) {
201 case 8: 201 case 8:
202 *value = (acpi_integer) * ((u8 *) logical_addr_ptr); 202 *value = (acpi_integer) ACPI_GET8(logical_addr_ptr);
203 break; 203 break;
204 204
205 case 16: 205 case 16:
206 *value = (acpi_integer) * ((u16 *) logical_addr_ptr); 206 *value = (acpi_integer) ACPI_GET16(logical_addr_ptr);
207 break; 207 break;
208 208
209 case 32: 209 case 32:
210 *value = (acpi_integer) * ((u32 *) logical_addr_ptr); 210 *value = (acpi_integer) ACPI_GET32(logical_addr_ptr);
211 break; 211 break;
212 212
213#if ACPI_MACHINE_WIDTH != 16 213#if ACPI_MACHINE_WIDTH != 16
214 case 64: 214 case 64:
215 *value = (acpi_integer) * ((u64 *) logical_addr_ptr); 215 *value = (acpi_integer) ACPI_GET64(logical_addr_ptr);
216 break; 216 break;
217#endif 217#endif
218 default: 218 default:
@@ -225,20 +225,20 @@ acpi_ex_system_memory_space_handler(u32 function,
225 225
226 switch (bit_width) { 226 switch (bit_width) {
227 case 8: 227 case 8:
228 *(u8 *) logical_addr_ptr = (u8) * value; 228 ACPI_SET8(logical_addr_ptr) = (u8) * value;
229 break; 229 break;
230 230
231 case 16: 231 case 16:
232 *(u16 *) logical_addr_ptr = (u16) * value; 232 ACPI_SET16(logical_addr_ptr) = (u16) * value;
233 break; 233 break;
234 234
235 case 32: 235 case 32:
236 *(u32 *) logical_addr_ptr = (u32) * value; 236 ACPI_SET32(logical_addr_ptr) = (u32) * value;
237 break; 237 break;
238 238
239#if ACPI_MACHINE_WIDTH != 16 239#if ACPI_MACHINE_WIDTH != 16
240 case 64: 240 case 64:
241 *(u64 *) logical_addr_ptr = (u64) * value; 241 ACPI_SET64(logical_addr_ptr) = (u64) * value;
242 break; 242 break;
243#endif 243#endif
244 244
diff --git a/drivers/acpi/executer/exstorob.c b/drivers/acpi/executer/exstorob.c
index c4ff654a6697..855db7130751 100644
--- a/drivers/acpi/executer/exstorob.c
+++ b/drivers/acpi/executer/exstorob.c
@@ -71,7 +71,7 @@ acpi_ex_store_buffer_to_buffer(union acpi_operand_object *source_desc,
71 71
72 /* We know that source_desc is a buffer by now */ 72 /* We know that source_desc is a buffer by now */
73 73
74 buffer = (u8 *) source_desc->buffer.pointer; 74 buffer = ACPI_CAST_PTR(u8, source_desc->buffer.pointer);
75 length = source_desc->buffer.length; 75 length = source_desc->buffer.length;
76 76
77 /* 77 /*
@@ -160,7 +160,7 @@ acpi_ex_store_string_to_string(union acpi_operand_object *source_desc,
160 160
161 /* We know that source_desc is a string by now */ 161 /* We know that source_desc is a string by now */
162 162
163 buffer = (u8 *) source_desc->string.pointer; 163 buffer = ACPI_CAST_PTR(u8, source_desc->string.pointer);
164 length = source_desc->string.length; 164 length = source_desc->string.length;
165 165
166 /* 166 /*