diff options
Diffstat (limited to 'drivers/acpi/utilities/utcopy.c')
-rw-r--r-- | drivers/acpi/utilities/utcopy.c | 126 |
1 files changed, 91 insertions, 35 deletions
diff --git a/drivers/acpi/utilities/utcopy.c b/drivers/acpi/utilities/utcopy.c index 0fcd98bde0d1..11e884957162 100644 --- a/drivers/acpi/utilities/utcopy.c +++ b/drivers/acpi/utilities/utcopy.c | |||
@@ -49,21 +49,69 @@ | |||
49 | #define _COMPONENT ACPI_UTILITIES | 49 | #define _COMPONENT ACPI_UTILITIES |
50 | ACPI_MODULE_NAME ("utcopy") | 50 | ACPI_MODULE_NAME ("utcopy") |
51 | 51 | ||
52 | /* Local prototypes */ | ||
53 | |||
54 | static acpi_status | ||
55 | acpi_ut_copy_isimple_to_esimple ( | ||
56 | union acpi_operand_object *internal_object, | ||
57 | union acpi_object *external_object, | ||
58 | u8 *data_space, | ||
59 | acpi_size *buffer_space_used); | ||
60 | |||
61 | static acpi_status | ||
62 | acpi_ut_copy_ielement_to_ielement ( | ||
63 | u8 object_type, | ||
64 | union acpi_operand_object *source_object, | ||
65 | union acpi_generic_state *state, | ||
66 | void *context); | ||
67 | |||
68 | static acpi_status | ||
69 | acpi_ut_copy_ipackage_to_epackage ( | ||
70 | union acpi_operand_object *internal_object, | ||
71 | u8 *buffer, | ||
72 | acpi_size *space_used); | ||
73 | |||
74 | static acpi_status | ||
75 | acpi_ut_copy_esimple_to_isimple( | ||
76 | union acpi_object *user_obj, | ||
77 | union acpi_operand_object **return_obj); | ||
78 | |||
79 | static acpi_status | ||
80 | acpi_ut_copy_simple_object ( | ||
81 | union acpi_operand_object *source_desc, | ||
82 | union acpi_operand_object *dest_desc); | ||
83 | |||
84 | static acpi_status | ||
85 | acpi_ut_copy_ielement_to_eelement ( | ||
86 | u8 object_type, | ||
87 | union acpi_operand_object *source_object, | ||
88 | union acpi_generic_state *state, | ||
89 | void *context); | ||
90 | |||
91 | static acpi_status | ||
92 | acpi_ut_copy_ipackage_to_ipackage ( | ||
93 | union acpi_operand_object *source_obj, | ||
94 | union acpi_operand_object *dest_obj, | ||
95 | struct acpi_walk_state *walk_state); | ||
96 | |||
52 | 97 | ||
53 | /******************************************************************************* | 98 | /******************************************************************************* |
54 | * | 99 | * |
55 | * FUNCTION: acpi_ut_copy_isimple_to_esimple | 100 | * FUNCTION: acpi_ut_copy_isimple_to_esimple |
56 | * | 101 | * |
57 | * PARAMETERS: *internal_object - Pointer to the object we are examining | 102 | * PARAMETERS: internal_object - Source object to be copied |
58 | * *Buffer - Where the object is returned | 103 | * external_object - Where to return the copied object |
59 | * *space_used - Where the data length is returned | 104 | * data_space - Where object data is returned (such as |
105 | * buffer and string data) | ||
106 | * buffer_space_used - Length of data_space that was used | ||
60 | * | 107 | * |
61 | * RETURN: Status | 108 | * RETURN: Status |
62 | * | 109 | * |
63 | * DESCRIPTION: This function is called to place a simple object in a user | 110 | * DESCRIPTION: This function is called to copy a simple internal object to |
64 | * buffer. | 111 | * an external object. |
65 | * | 112 | * |
66 | * The buffer is assumed to have sufficient space for the object. | 113 | * The data_space buffer is assumed to have sufficient space for |
114 | * the object. | ||
67 | * | 115 | * |
68 | ******************************************************************************/ | 116 | ******************************************************************************/ |
69 | 117 | ||
@@ -107,10 +155,12 @@ acpi_ut_copy_isimple_to_esimple ( | |||
107 | 155 | ||
108 | external_object->string.pointer = (char *) data_space; | 156 | external_object->string.pointer = (char *) data_space; |
109 | external_object->string.length = internal_object->string.length; | 157 | external_object->string.length = internal_object->string.length; |
110 | *buffer_space_used = ACPI_ROUND_UP_TO_NATIVE_WORD ((acpi_size) internal_object->string.length + 1); | 158 | *buffer_space_used = ACPI_ROUND_UP_TO_NATIVE_WORD ( |
159 | (acpi_size) internal_object->string.length + 1); | ||
111 | 160 | ||
112 | ACPI_MEMCPY ((void *) data_space, (void *) internal_object->string.pointer, | 161 | ACPI_MEMCPY ((void *) data_space, |
113 | (acpi_size) internal_object->string.length + 1); | 162 | (void *) internal_object->string.pointer, |
163 | (acpi_size) internal_object->string.length + 1); | ||
114 | break; | 164 | break; |
115 | 165 | ||
116 | 166 | ||
@@ -118,10 +168,12 @@ acpi_ut_copy_isimple_to_esimple ( | |||
118 | 168 | ||
119 | external_object->buffer.pointer = data_space; | 169 | external_object->buffer.pointer = data_space; |
120 | external_object->buffer.length = internal_object->buffer.length; | 170 | external_object->buffer.length = internal_object->buffer.length; |
121 | *buffer_space_used = ACPI_ROUND_UP_TO_NATIVE_WORD (internal_object->string.length); | 171 | *buffer_space_used = ACPI_ROUND_UP_TO_NATIVE_WORD ( |
172 | internal_object->string.length); | ||
122 | 173 | ||
123 | ACPI_MEMCPY ((void *) data_space, (void *) internal_object->buffer.pointer, | 174 | ACPI_MEMCPY ((void *) data_space, |
124 | internal_object->buffer.length); | 175 | (void *) internal_object->buffer.pointer, |
176 | internal_object->buffer.length); | ||
125 | break; | 177 | break; |
126 | 178 | ||
127 | 179 | ||
@@ -194,7 +246,7 @@ acpi_ut_copy_isimple_to_esimple ( | |||
194 | * | 246 | * |
195 | ******************************************************************************/ | 247 | ******************************************************************************/ |
196 | 248 | ||
197 | acpi_status | 249 | static acpi_status |
198 | acpi_ut_copy_ielement_to_eelement ( | 250 | acpi_ut_copy_ielement_to_eelement ( |
199 | u8 object_type, | 251 | u8 object_type, |
200 | union acpi_operand_object *source_object, | 252 | union acpi_operand_object *source_object, |
@@ -213,7 +265,7 @@ acpi_ut_copy_ielement_to_eelement ( | |||
213 | 265 | ||
214 | this_index = state->pkg.index; | 266 | this_index = state->pkg.index; |
215 | target_object = (union acpi_object *) | 267 | target_object = (union acpi_object *) |
216 | &((union acpi_object *)(state->pkg.dest_object))->package.elements[this_index]; | 268 | &((union acpi_object *)(state->pkg.dest_object))->package.elements[this_index]; |
217 | 269 | ||
218 | switch (object_type) { | 270 | switch (object_type) { |
219 | case ACPI_COPY_TYPE_SIMPLE: | 271 | case ACPI_COPY_TYPE_SIMPLE: |
@@ -236,7 +288,8 @@ acpi_ut_copy_ielement_to_eelement ( | |||
236 | */ | 288 | */ |
237 | target_object->type = ACPI_TYPE_PACKAGE; | 289 | target_object->type = ACPI_TYPE_PACKAGE; |
238 | target_object->package.count = source_object->package.count; | 290 | target_object->package.count = source_object->package.count; |
239 | target_object->package.elements = ACPI_CAST_PTR (union acpi_object, info->free_space); | 291 | target_object->package.elements = |
292 | ACPI_CAST_PTR (union acpi_object, info->free_space); | ||
240 | 293 | ||
241 | /* | 294 | /* |
242 | * Pass the new package object back to the package walk routine | 295 | * Pass the new package object back to the package walk routine |
@@ -248,7 +301,8 @@ acpi_ut_copy_ielement_to_eelement ( | |||
248 | * update the buffer length counter | 301 | * update the buffer length counter |
249 | */ | 302 | */ |
250 | object_space = ACPI_ROUND_UP_TO_NATIVE_WORD ( | 303 | object_space = ACPI_ROUND_UP_TO_NATIVE_WORD ( |
251 | (acpi_size) target_object->package.count * sizeof (union acpi_object)); | 304 | (acpi_size) target_object->package.count * |
305 | sizeof (union acpi_object)); | ||
252 | break; | 306 | break; |
253 | 307 | ||
254 | 308 | ||
@@ -266,9 +320,9 @@ acpi_ut_copy_ielement_to_eelement ( | |||
266 | * | 320 | * |
267 | * FUNCTION: acpi_ut_copy_ipackage_to_epackage | 321 | * FUNCTION: acpi_ut_copy_ipackage_to_epackage |
268 | * | 322 | * |
269 | * PARAMETERS: *internal_object - Pointer to the object we are returning | 323 | * PARAMETERS: internal_object - Pointer to the object we are returning |
270 | * *Buffer - Where the object is returned | 324 | * Buffer - Where the object is returned |
271 | * *space_used - Where the object length is returned | 325 | * space_used - Where the object length is returned |
272 | * | 326 | * |
273 | * RETURN: Status | 327 | * RETURN: Status |
274 | * | 328 | * |
@@ -304,13 +358,15 @@ acpi_ut_copy_ipackage_to_epackage ( | |||
304 | * Free space begins right after the first package | 358 | * Free space begins right after the first package |
305 | */ | 359 | */ |
306 | info.length = ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (union acpi_object)); | 360 | info.length = ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (union acpi_object)); |
307 | info.free_space = buffer + ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (union acpi_object)); | 361 | info.free_space = buffer + ACPI_ROUND_UP_TO_NATIVE_WORD ( |
362 | sizeof (union acpi_object)); | ||
308 | info.object_space = 0; | 363 | info.object_space = 0; |
309 | info.num_packages = 1; | 364 | info.num_packages = 1; |
310 | 365 | ||
311 | external_object->type = ACPI_GET_OBJECT_TYPE (internal_object); | 366 | external_object->type = ACPI_GET_OBJECT_TYPE (internal_object); |
312 | external_object->package.count = internal_object->package.count; | 367 | external_object->package.count = internal_object->package.count; |
313 | external_object->package.elements = ACPI_CAST_PTR (union acpi_object, info.free_space); | 368 | external_object->package.elements = ACPI_CAST_PTR (union acpi_object, |
369 | info.free_space); | ||
314 | 370 | ||
315 | /* | 371 | /* |
316 | * Leave room for an array of ACPI_OBJECTS in the buffer | 372 | * Leave room for an array of ACPI_OBJECTS in the buffer |
@@ -333,8 +389,8 @@ acpi_ut_copy_ipackage_to_epackage ( | |||
333 | * | 389 | * |
334 | * FUNCTION: acpi_ut_copy_iobject_to_eobject | 390 | * FUNCTION: acpi_ut_copy_iobject_to_eobject |
335 | * | 391 | * |
336 | * PARAMETERS: *internal_object - The internal object to be converted | 392 | * PARAMETERS: internal_object - The internal object to be converted |
337 | * *buffer_ptr - Where the object is returned | 393 | * buffer_ptr - Where the object is returned |
338 | * | 394 | * |
339 | * RETURN: Status | 395 | * RETURN: Status |
340 | * | 396 | * |
@@ -367,10 +423,10 @@ acpi_ut_copy_iobject_to_eobject ( | |||
367 | * Build a simple object (no nested objects) | 423 | * Build a simple object (no nested objects) |
368 | */ | 424 | */ |
369 | status = acpi_ut_copy_isimple_to_esimple (internal_object, | 425 | status = acpi_ut_copy_isimple_to_esimple (internal_object, |
370 | (union acpi_object *) ret_buffer->pointer, | 426 | (union acpi_object *) ret_buffer->pointer, |
371 | ((u8 *) ret_buffer->pointer + | 427 | ((u8 *) ret_buffer->pointer + |
372 | ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (union acpi_object))), | 428 | ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (union acpi_object))), |
373 | &ret_buffer->length); | 429 | &ret_buffer->length); |
374 | /* | 430 | /* |
375 | * build simple does not include the object size in the length | 431 | * build simple does not include the object size in the length |
376 | * so we add it in here | 432 | * so we add it in here |
@@ -386,8 +442,8 @@ acpi_ut_copy_iobject_to_eobject ( | |||
386 | * | 442 | * |
387 | * FUNCTION: acpi_ut_copy_esimple_to_isimple | 443 | * FUNCTION: acpi_ut_copy_esimple_to_isimple |
388 | * | 444 | * |
389 | * PARAMETERS: *external_object - The external object to be converted | 445 | * PARAMETERS: external_object - The external object to be converted |
390 | * *internal_object - Where the internal object is returned | 446 | * ret_internal_object - Where the internal object is returned |
391 | * | 447 | * |
392 | * RETURN: Status | 448 | * RETURN: Status |
393 | * | 449 | * |
@@ -398,7 +454,7 @@ acpi_ut_copy_iobject_to_eobject ( | |||
398 | * | 454 | * |
399 | ******************************************************************************/ | 455 | ******************************************************************************/ |
400 | 456 | ||
401 | acpi_status | 457 | static acpi_status |
402 | acpi_ut_copy_esimple_to_isimple ( | 458 | acpi_ut_copy_esimple_to_isimple ( |
403 | union acpi_object *external_object, | 459 | union acpi_object *external_object, |
404 | union acpi_operand_object **ret_internal_object) | 460 | union acpi_operand_object **ret_internal_object) |
@@ -417,7 +473,8 @@ acpi_ut_copy_esimple_to_isimple ( | |||
417 | case ACPI_TYPE_BUFFER: | 473 | case ACPI_TYPE_BUFFER: |
418 | case ACPI_TYPE_INTEGER: | 474 | case ACPI_TYPE_INTEGER: |
419 | 475 | ||
420 | internal_object = acpi_ut_create_internal_object ((u8) external_object->type); | 476 | internal_object = acpi_ut_create_internal_object ( |
477 | (u8) external_object->type); | ||
421 | if (!internal_object) { | 478 | if (!internal_object) { |
422 | return_ACPI_STATUS (AE_NO_MEMORY); | 479 | return_ACPI_STATUS (AE_NO_MEMORY); |
423 | } | 480 | } |
@@ -486,7 +543,6 @@ error_exit: | |||
486 | 543 | ||
487 | 544 | ||
488 | #ifdef ACPI_FUTURE_IMPLEMENTATION | 545 | #ifdef ACPI_FUTURE_IMPLEMENTATION |
489 | |||
490 | /* Code to convert packages that are parameters to control methods */ | 546 | /* Code to convert packages that are parameters to control methods */ |
491 | 547 | ||
492 | /******************************************************************************* | 548 | /******************************************************************************* |
@@ -614,7 +670,7 @@ acpi_ut_copy_eobject_to_iobject ( | |||
614 | * | 670 | * |
615 | ******************************************************************************/ | 671 | ******************************************************************************/ |
616 | 672 | ||
617 | acpi_status | 673 | static acpi_status |
618 | acpi_ut_copy_simple_object ( | 674 | acpi_ut_copy_simple_object ( |
619 | union acpi_operand_object *source_desc, | 675 | union acpi_operand_object *source_desc, |
620 | union acpi_operand_object *dest_desc) | 676 | union acpi_operand_object *dest_desc) |
@@ -724,7 +780,7 @@ acpi_ut_copy_simple_object ( | |||
724 | * | 780 | * |
725 | ******************************************************************************/ | 781 | ******************************************************************************/ |
726 | 782 | ||
727 | acpi_status | 783 | static acpi_status |
728 | acpi_ut_copy_ielement_to_ielement ( | 784 | acpi_ut_copy_ielement_to_ielement ( |
729 | u8 object_type, | 785 | u8 object_type, |
730 | union acpi_operand_object *source_object, | 786 | union acpi_operand_object *source_object, |
@@ -837,7 +893,7 @@ error_exit: | |||
837 | * | 893 | * |
838 | ******************************************************************************/ | 894 | ******************************************************************************/ |
839 | 895 | ||
840 | acpi_status | 896 | static acpi_status |
841 | acpi_ut_copy_ipackage_to_ipackage ( | 897 | acpi_ut_copy_ipackage_to_ipackage ( |
842 | union acpi_operand_object *source_obj, | 898 | union acpi_operand_object *source_obj, |
843 | union acpi_operand_object *dest_obj, | 899 | union acpi_operand_object *dest_obj, |