diff options
Diffstat (limited to 'drivers/acpi/dispatcher/dsopcode.c')
-rw-r--r-- | drivers/acpi/dispatcher/dsopcode.c | 710 |
1 files changed, 344 insertions, 366 deletions
diff --git a/drivers/acpi/dispatcher/dsopcode.c b/drivers/acpi/dispatcher/dsopcode.c index 750bdb1ac344..939d167bf87b 100644 --- a/drivers/acpi/dispatcher/dsopcode.c +++ b/drivers/acpi/dispatcher/dsopcode.c | |||
@@ -42,7 +42,6 @@ | |||
42 | * POSSIBILITY OF SUCH DAMAGES. | 42 | * POSSIBILITY OF SUCH DAMAGES. |
43 | */ | 43 | */ |
44 | 44 | ||
45 | |||
46 | #include <acpi/acpi.h> | 45 | #include <acpi/acpi.h> |
47 | #include <acpi/acparser.h> | 46 | #include <acpi/acparser.h> |
48 | #include <acpi/amlcode.h> | 47 | #include <acpi/amlcode.h> |
@@ -52,26 +51,21 @@ | |||
52 | #include <acpi/acevents.h> | 51 | #include <acpi/acevents.h> |
53 | 52 | ||
54 | #define _COMPONENT ACPI_DISPATCHER | 53 | #define _COMPONENT ACPI_DISPATCHER |
55 | ACPI_MODULE_NAME ("dsopcode") | 54 | ACPI_MODULE_NAME("dsopcode") |
56 | 55 | ||
57 | /* Local prototypes */ | 56 | /* Local prototypes */ |
58 | |||
59 | static acpi_status | 57 | static acpi_status |
60 | acpi_ds_execute_arguments ( | 58 | acpi_ds_execute_arguments(struct acpi_namespace_node *node, |
61 | struct acpi_namespace_node *node, | 59 | struct acpi_namespace_node *scope_node, |
62 | struct acpi_namespace_node *scope_node, | 60 | u32 aml_length, u8 * aml_start); |
63 | u32 aml_length, | ||
64 | u8 *aml_start); | ||
65 | 61 | ||
66 | static acpi_status | 62 | static acpi_status |
67 | acpi_ds_init_buffer_field ( | 63 | acpi_ds_init_buffer_field(u16 aml_opcode, |
68 | u16 aml_opcode, | 64 | union acpi_operand_object *obj_desc, |
69 | union acpi_operand_object *obj_desc, | 65 | union acpi_operand_object *buffer_desc, |
70 | union acpi_operand_object *buffer_desc, | 66 | union acpi_operand_object *offset_desc, |
71 | union acpi_operand_object *offset_desc, | 67 | union acpi_operand_object *length_desc, |
72 | union acpi_operand_object *length_desc, | 68 | union acpi_operand_object *result_desc); |
73 | union acpi_operand_object *result_desc); | ||
74 | |||
75 | 69 | ||
76 | /******************************************************************************* | 70 | /******************************************************************************* |
77 | * | 71 | * |
@@ -89,26 +83,22 @@ acpi_ds_init_buffer_field ( | |||
89 | ******************************************************************************/ | 83 | ******************************************************************************/ |
90 | 84 | ||
91 | static acpi_status | 85 | static acpi_status |
92 | acpi_ds_execute_arguments ( | 86 | acpi_ds_execute_arguments(struct acpi_namespace_node *node, |
93 | struct acpi_namespace_node *node, | 87 | struct acpi_namespace_node *scope_node, |
94 | struct acpi_namespace_node *scope_node, | 88 | u32 aml_length, u8 * aml_start) |
95 | u32 aml_length, | ||
96 | u8 *aml_start) | ||
97 | { | 89 | { |
98 | acpi_status status; | 90 | acpi_status status; |
99 | union acpi_parse_object *op; | 91 | union acpi_parse_object *op; |
100 | struct acpi_walk_state *walk_state; | 92 | struct acpi_walk_state *walk_state; |
101 | |||
102 | |||
103 | ACPI_FUNCTION_TRACE ("ds_execute_arguments"); | ||
104 | 93 | ||
94 | ACPI_FUNCTION_TRACE("ds_execute_arguments"); | ||
105 | 95 | ||
106 | /* | 96 | /* |
107 | * Allocate a new parser op to be the root of the parsed tree | 97 | * Allocate a new parser op to be the root of the parsed tree |
108 | */ | 98 | */ |
109 | op = acpi_ps_alloc_op (AML_INT_EVAL_SUBTREE_OP); | 99 | op = acpi_ps_alloc_op(AML_INT_EVAL_SUBTREE_OP); |
110 | if (!op) { | 100 | if (!op) { |
111 | return_ACPI_STATUS (AE_NO_MEMORY); | 101 | return_ACPI_STATUS(AE_NO_MEMORY); |
112 | } | 102 | } |
113 | 103 | ||
114 | /* Save the Node for use in acpi_ps_parse_aml */ | 104 | /* Save the Node for use in acpi_ps_parse_aml */ |
@@ -117,16 +107,16 @@ acpi_ds_execute_arguments ( | |||
117 | 107 | ||
118 | /* Create and initialize a new parser state */ | 108 | /* Create and initialize a new parser state */ |
119 | 109 | ||
120 | walk_state = acpi_ds_create_walk_state (0, NULL, NULL, NULL); | 110 | walk_state = acpi_ds_create_walk_state(0, NULL, NULL, NULL); |
121 | if (!walk_state) { | 111 | if (!walk_state) { |
122 | status = AE_NO_MEMORY; | 112 | status = AE_NO_MEMORY; |
123 | goto cleanup; | 113 | goto cleanup; |
124 | } | 114 | } |
125 | 115 | ||
126 | status = acpi_ds_init_aml_walk (walk_state, op, NULL, aml_start, | 116 | status = acpi_ds_init_aml_walk(walk_state, op, NULL, aml_start, |
127 | aml_length, NULL, 1); | 117 | aml_length, NULL, 1); |
128 | if (ACPI_FAILURE (status)) { | 118 | if (ACPI_FAILURE(status)) { |
129 | acpi_ds_delete_walk_state (walk_state); | 119 | acpi_ds_delete_walk_state(walk_state); |
130 | goto cleanup; | 120 | goto cleanup; |
131 | } | 121 | } |
132 | 122 | ||
@@ -137,28 +127,28 @@ acpi_ds_execute_arguments ( | |||
137 | 127 | ||
138 | /* Pass1: Parse the entire declaration */ | 128 | /* Pass1: Parse the entire declaration */ |
139 | 129 | ||
140 | status = acpi_ps_parse_aml (walk_state); | 130 | status = acpi_ps_parse_aml(walk_state); |
141 | if (ACPI_FAILURE (status)) { | 131 | if (ACPI_FAILURE(status)) { |
142 | goto cleanup; | 132 | goto cleanup; |
143 | } | 133 | } |
144 | 134 | ||
145 | /* Get and init the Op created above */ | 135 | /* Get and init the Op created above */ |
146 | 136 | ||
147 | op->common.node = node; | 137 | op->common.node = node; |
148 | acpi_ps_delete_parse_tree (op); | 138 | acpi_ps_delete_parse_tree(op); |
149 | 139 | ||
150 | /* Evaluate the deferred arguments */ | 140 | /* Evaluate the deferred arguments */ |
151 | 141 | ||
152 | op = acpi_ps_alloc_op (AML_INT_EVAL_SUBTREE_OP); | 142 | op = acpi_ps_alloc_op(AML_INT_EVAL_SUBTREE_OP); |
153 | if (!op) { | 143 | if (!op) { |
154 | return_ACPI_STATUS (AE_NO_MEMORY); | 144 | return_ACPI_STATUS(AE_NO_MEMORY); |
155 | } | 145 | } |
156 | 146 | ||
157 | op->common.node = scope_node; | 147 | op->common.node = scope_node; |
158 | 148 | ||
159 | /* Create and initialize a new parser state */ | 149 | /* Create and initialize a new parser state */ |
160 | 150 | ||
161 | walk_state = acpi_ds_create_walk_state (0, NULL, NULL, NULL); | 151 | walk_state = acpi_ds_create_walk_state(0, NULL, NULL, NULL); |
162 | if (!walk_state) { | 152 | if (!walk_state) { |
163 | status = AE_NO_MEMORY; | 153 | status = AE_NO_MEMORY; |
164 | goto cleanup; | 154 | goto cleanup; |
@@ -166,24 +156,23 @@ acpi_ds_execute_arguments ( | |||
166 | 156 | ||
167 | /* Execute the opcode and arguments */ | 157 | /* Execute the opcode and arguments */ |
168 | 158 | ||
169 | status = acpi_ds_init_aml_walk (walk_state, op, NULL, aml_start, | 159 | status = acpi_ds_init_aml_walk(walk_state, op, NULL, aml_start, |
170 | aml_length, NULL, 3); | 160 | aml_length, NULL, 3); |
171 | if (ACPI_FAILURE (status)) { | 161 | if (ACPI_FAILURE(status)) { |
172 | acpi_ds_delete_walk_state (walk_state); | 162 | acpi_ds_delete_walk_state(walk_state); |
173 | goto cleanup; | 163 | goto cleanup; |
174 | } | 164 | } |
175 | 165 | ||
176 | /* Mark this execution as a deferred opcode */ | 166 | /* Mark this execution as a deferred opcode */ |
177 | 167 | ||
178 | walk_state->deferred_node = node; | 168 | walk_state->deferred_node = node; |
179 | status = acpi_ps_parse_aml (walk_state); | 169 | status = acpi_ps_parse_aml(walk_state); |
180 | 170 | ||
181 | cleanup: | 171 | cleanup: |
182 | acpi_ps_delete_parse_tree (op); | 172 | acpi_ps_delete_parse_tree(op); |
183 | return_ACPI_STATUS (status); | 173 | return_ACPI_STATUS(status); |
184 | } | 174 | } |
185 | 175 | ||
186 | |||
187 | /******************************************************************************* | 176 | /******************************************************************************* |
188 | * | 177 | * |
189 | * FUNCTION: acpi_ds_get_buffer_field_arguments | 178 | * FUNCTION: acpi_ds_get_buffer_field_arguments |
@@ -198,38 +187,36 @@ cleanup: | |||
198 | ******************************************************************************/ | 187 | ******************************************************************************/ |
199 | 188 | ||
200 | acpi_status | 189 | acpi_status |
201 | acpi_ds_get_buffer_field_arguments ( | 190 | acpi_ds_get_buffer_field_arguments(union acpi_operand_object *obj_desc) |
202 | union acpi_operand_object *obj_desc) | ||
203 | { | 191 | { |
204 | union acpi_operand_object *extra_desc; | 192 | union acpi_operand_object *extra_desc; |
205 | struct acpi_namespace_node *node; | 193 | struct acpi_namespace_node *node; |
206 | acpi_status status; | 194 | acpi_status status; |
207 | |||
208 | |||
209 | ACPI_FUNCTION_TRACE_PTR ("ds_get_buffer_field_arguments", obj_desc); | ||
210 | 195 | ||
196 | ACPI_FUNCTION_TRACE_PTR("ds_get_buffer_field_arguments", obj_desc); | ||
211 | 197 | ||
212 | if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { | 198 | if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { |
213 | return_ACPI_STATUS (AE_OK); | 199 | return_ACPI_STATUS(AE_OK); |
214 | } | 200 | } |
215 | 201 | ||
216 | /* Get the AML pointer (method object) and buffer_field node */ | 202 | /* Get the AML pointer (method object) and buffer_field node */ |
217 | 203 | ||
218 | extra_desc = acpi_ns_get_secondary_object (obj_desc); | 204 | extra_desc = acpi_ns_get_secondary_object(obj_desc); |
219 | node = obj_desc->buffer_field.node; | 205 | node = obj_desc->buffer_field.node; |
220 | 206 | ||
221 | ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname (ACPI_TYPE_BUFFER_FIELD, node, NULL)); | 207 | ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname |
222 | ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] buffer_field Arg Init\n", | 208 | (ACPI_TYPE_BUFFER_FIELD, node, NULL)); |
223 | acpi_ut_get_node_name (node))); | 209 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "[%4.4s] buffer_field Arg Init\n", |
210 | acpi_ut_get_node_name(node))); | ||
224 | 211 | ||
225 | /* Execute the AML code for the term_arg arguments */ | 212 | /* Execute the AML code for the term_arg arguments */ |
226 | 213 | ||
227 | status = acpi_ds_execute_arguments (node, acpi_ns_get_parent_node (node), | 214 | status = acpi_ds_execute_arguments(node, acpi_ns_get_parent_node(node), |
228 | extra_desc->extra.aml_length, extra_desc->extra.aml_start); | 215 | extra_desc->extra.aml_length, |
229 | return_ACPI_STATUS (status); | 216 | extra_desc->extra.aml_start); |
217 | return_ACPI_STATUS(status); | ||
230 | } | 218 | } |
231 | 219 | ||
232 | |||
233 | /******************************************************************************* | 220 | /******************************************************************************* |
234 | * | 221 | * |
235 | * FUNCTION: acpi_ds_get_buffer_arguments | 222 | * FUNCTION: acpi_ds_get_buffer_arguments |
@@ -243,40 +230,35 @@ acpi_ds_get_buffer_field_arguments ( | |||
243 | * | 230 | * |
244 | ******************************************************************************/ | 231 | ******************************************************************************/ |
245 | 232 | ||
246 | acpi_status | 233 | acpi_status acpi_ds_get_buffer_arguments(union acpi_operand_object *obj_desc) |
247 | acpi_ds_get_buffer_arguments ( | ||
248 | union acpi_operand_object *obj_desc) | ||
249 | { | 234 | { |
250 | struct acpi_namespace_node *node; | 235 | struct acpi_namespace_node *node; |
251 | acpi_status status; | 236 | acpi_status status; |
252 | |||
253 | |||
254 | ACPI_FUNCTION_TRACE_PTR ("ds_get_buffer_arguments", obj_desc); | ||
255 | 237 | ||
238 | ACPI_FUNCTION_TRACE_PTR("ds_get_buffer_arguments", obj_desc); | ||
256 | 239 | ||
257 | if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { | 240 | if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { |
258 | return_ACPI_STATUS (AE_OK); | 241 | return_ACPI_STATUS(AE_OK); |
259 | } | 242 | } |
260 | 243 | ||
261 | /* Get the Buffer node */ | 244 | /* Get the Buffer node */ |
262 | 245 | ||
263 | node = obj_desc->buffer.node; | 246 | node = obj_desc->buffer.node; |
264 | if (!node) { | 247 | if (!node) { |
265 | ACPI_REPORT_ERROR (( | 248 | ACPI_REPORT_ERROR(("No pointer back to NS node in buffer obj %p\n", obj_desc)); |
266 | "No pointer back to NS node in buffer obj %p\n", obj_desc)); | 249 | return_ACPI_STATUS(AE_AML_INTERNAL); |
267 | return_ACPI_STATUS (AE_AML_INTERNAL); | ||
268 | } | 250 | } |
269 | 251 | ||
270 | ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer Arg Init\n")); | 252 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Buffer Arg Init\n")); |
271 | 253 | ||
272 | /* Execute the AML code for the term_arg arguments */ | 254 | /* Execute the AML code for the term_arg arguments */ |
273 | 255 | ||
274 | status = acpi_ds_execute_arguments (node, node, | 256 | status = acpi_ds_execute_arguments(node, node, |
275 | obj_desc->buffer.aml_length, obj_desc->buffer.aml_start); | 257 | obj_desc->buffer.aml_length, |
276 | return_ACPI_STATUS (status); | 258 | obj_desc->buffer.aml_start); |
259 | return_ACPI_STATUS(status); | ||
277 | } | 260 | } |
278 | 261 | ||
279 | |||
280 | /******************************************************************************* | 262 | /******************************************************************************* |
281 | * | 263 | * |
282 | * FUNCTION: acpi_ds_get_package_arguments | 264 | * FUNCTION: acpi_ds_get_package_arguments |
@@ -290,40 +272,36 @@ acpi_ds_get_buffer_arguments ( | |||
290 | * | 272 | * |
291 | ******************************************************************************/ | 273 | ******************************************************************************/ |
292 | 274 | ||
293 | acpi_status | 275 | acpi_status acpi_ds_get_package_arguments(union acpi_operand_object *obj_desc) |
294 | acpi_ds_get_package_arguments ( | ||
295 | union acpi_operand_object *obj_desc) | ||
296 | { | 276 | { |
297 | struct acpi_namespace_node *node; | 277 | struct acpi_namespace_node *node; |
298 | acpi_status status; | 278 | acpi_status status; |
299 | |||
300 | |||
301 | ACPI_FUNCTION_TRACE_PTR ("ds_get_package_arguments", obj_desc); | ||
302 | 279 | ||
280 | ACPI_FUNCTION_TRACE_PTR("ds_get_package_arguments", obj_desc); | ||
303 | 281 | ||
304 | if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { | 282 | if (obj_desc->common.flags & AOPOBJ_DATA_VALID) { |
305 | return_ACPI_STATUS (AE_OK); | 283 | return_ACPI_STATUS(AE_OK); |
306 | } | 284 | } |
307 | 285 | ||
308 | /* Get the Package node */ | 286 | /* Get the Package node */ |
309 | 287 | ||
310 | node = obj_desc->package.node; | 288 | node = obj_desc->package.node; |
311 | if (!node) { | 289 | if (!node) { |
312 | ACPI_REPORT_ERROR (( | 290 | ACPI_REPORT_ERROR(("No pointer back to NS node in package %p\n", |
313 | "No pointer back to NS node in package %p\n", obj_desc)); | 291 | obj_desc)); |
314 | return_ACPI_STATUS (AE_AML_INTERNAL); | 292 | return_ACPI_STATUS(AE_AML_INTERNAL); |
315 | } | 293 | } |
316 | 294 | ||
317 | ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n")); | 295 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Package Arg Init\n")); |
318 | 296 | ||
319 | /* Execute the AML code for the term_arg arguments */ | 297 | /* Execute the AML code for the term_arg arguments */ |
320 | 298 | ||
321 | status = acpi_ds_execute_arguments (node, node, | 299 | status = acpi_ds_execute_arguments(node, node, |
322 | obj_desc->package.aml_length, obj_desc->package.aml_start); | 300 | obj_desc->package.aml_length, |
323 | return_ACPI_STATUS (status); | 301 | obj_desc->package.aml_start); |
302 | return_ACPI_STATUS(status); | ||
324 | } | 303 | } |
325 | 304 | ||
326 | |||
327 | /***************************************************************************** | 305 | /***************************************************************************** |
328 | * | 306 | * |
329 | * FUNCTION: acpi_ds_get_region_arguments | 307 | * FUNCTION: acpi_ds_get_region_arguments |
@@ -337,44 +315,43 @@ acpi_ds_get_package_arguments ( | |||
337 | * | 315 | * |
338 | ****************************************************************************/ | 316 | ****************************************************************************/ |
339 | 317 | ||
340 | acpi_status | 318 | acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc) |
341 | acpi_ds_get_region_arguments ( | ||
342 | union acpi_operand_object *obj_desc) | ||
343 | { | 319 | { |
344 | struct acpi_namespace_node *node; | 320 | struct acpi_namespace_node *node; |
345 | acpi_status status; | 321 | acpi_status status; |
346 | union acpi_operand_object *extra_desc; | 322 | union acpi_operand_object *extra_desc; |
347 | |||
348 | |||
349 | ACPI_FUNCTION_TRACE_PTR ("ds_get_region_arguments", obj_desc); | ||
350 | 323 | ||
324 | ACPI_FUNCTION_TRACE_PTR("ds_get_region_arguments", obj_desc); | ||
351 | 325 | ||
352 | if (obj_desc->region.flags & AOPOBJ_DATA_VALID) { | 326 | if (obj_desc->region.flags & AOPOBJ_DATA_VALID) { |
353 | return_ACPI_STATUS (AE_OK); | 327 | return_ACPI_STATUS(AE_OK); |
354 | } | 328 | } |
355 | 329 | ||
356 | extra_desc = acpi_ns_get_secondary_object (obj_desc); | 330 | extra_desc = acpi_ns_get_secondary_object(obj_desc); |
357 | if (!extra_desc) { | 331 | if (!extra_desc) { |
358 | return_ACPI_STATUS (AE_NOT_EXIST); | 332 | return_ACPI_STATUS(AE_NOT_EXIST); |
359 | } | 333 | } |
360 | 334 | ||
361 | /* Get the Region node */ | 335 | /* Get the Region node */ |
362 | 336 | ||
363 | node = obj_desc->region.node; | 337 | node = obj_desc->region.node; |
364 | 338 | ||
365 | ACPI_DEBUG_EXEC (acpi_ut_display_init_pathname (ACPI_TYPE_REGION, node, NULL)); | 339 | ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname |
340 | (ACPI_TYPE_REGION, node, NULL)); | ||
366 | 341 | ||
367 | ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] op_region Arg Init at AML %p\n", | 342 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, |
368 | acpi_ut_get_node_name (node), extra_desc->extra.aml_start)); | 343 | "[%4.4s] op_region Arg Init at AML %p\n", |
344 | acpi_ut_get_node_name(node), | ||
345 | extra_desc->extra.aml_start)); | ||
369 | 346 | ||
370 | /* Execute the argument AML */ | 347 | /* Execute the argument AML */ |
371 | 348 | ||
372 | status = acpi_ds_execute_arguments (node, acpi_ns_get_parent_node (node), | 349 | status = acpi_ds_execute_arguments(node, acpi_ns_get_parent_node(node), |
373 | extra_desc->extra.aml_length, extra_desc->extra.aml_start); | 350 | extra_desc->extra.aml_length, |
374 | return_ACPI_STATUS (status); | 351 | extra_desc->extra.aml_start); |
352 | return_ACPI_STATUS(status); | ||
375 | } | 353 | } |
376 | 354 | ||
377 | |||
378 | /******************************************************************************* | 355 | /******************************************************************************* |
379 | * | 356 | * |
380 | * FUNCTION: acpi_ds_initialize_region | 357 | * FUNCTION: acpi_ds_initialize_region |
@@ -387,23 +364,19 @@ acpi_ds_get_region_arguments ( | |||
387 | * | 364 | * |
388 | ******************************************************************************/ | 365 | ******************************************************************************/ |
389 | 366 | ||
390 | acpi_status | 367 | acpi_status acpi_ds_initialize_region(acpi_handle obj_handle) |
391 | acpi_ds_initialize_region ( | ||
392 | acpi_handle obj_handle) | ||
393 | { | 368 | { |
394 | union acpi_operand_object *obj_desc; | 369 | union acpi_operand_object *obj_desc; |
395 | acpi_status status; | 370 | acpi_status status; |
396 | 371 | ||
397 | 372 | obj_desc = acpi_ns_get_attached_object(obj_handle); | |
398 | obj_desc = acpi_ns_get_attached_object (obj_handle); | ||
399 | 373 | ||
400 | /* Namespace is NOT locked */ | 374 | /* Namespace is NOT locked */ |
401 | 375 | ||
402 | status = acpi_ev_initialize_region (obj_desc, FALSE); | 376 | status = acpi_ev_initialize_region(obj_desc, FALSE); |
403 | return (status); | 377 | return (status); |
404 | } | 378 | } |
405 | 379 | ||
406 | |||
407 | /******************************************************************************* | 380 | /******************************************************************************* |
408 | * | 381 | * |
409 | * FUNCTION: acpi_ds_init_buffer_field | 382 | * FUNCTION: acpi_ds_init_buffer_field |
@@ -422,30 +395,27 @@ acpi_ds_initialize_region ( | |||
422 | ******************************************************************************/ | 395 | ******************************************************************************/ |
423 | 396 | ||
424 | static acpi_status | 397 | static acpi_status |
425 | acpi_ds_init_buffer_field ( | 398 | acpi_ds_init_buffer_field(u16 aml_opcode, |
426 | u16 aml_opcode, | 399 | union acpi_operand_object *obj_desc, |
427 | union acpi_operand_object *obj_desc, | 400 | union acpi_operand_object *buffer_desc, |
428 | union acpi_operand_object *buffer_desc, | 401 | union acpi_operand_object *offset_desc, |
429 | union acpi_operand_object *offset_desc, | 402 | union acpi_operand_object *length_desc, |
430 | union acpi_operand_object *length_desc, | 403 | union acpi_operand_object *result_desc) |
431 | union acpi_operand_object *result_desc) | ||
432 | { | 404 | { |
433 | u32 offset; | 405 | u32 offset; |
434 | u32 bit_offset; | 406 | u32 bit_offset; |
435 | u32 bit_count; | 407 | u32 bit_count; |
436 | u8 field_flags; | 408 | u8 field_flags; |
437 | acpi_status status; | 409 | acpi_status status; |
438 | |||
439 | |||
440 | ACPI_FUNCTION_TRACE_PTR ("ds_init_buffer_field", obj_desc); | ||
441 | 410 | ||
411 | ACPI_FUNCTION_TRACE_PTR("ds_init_buffer_field", obj_desc); | ||
442 | 412 | ||
443 | /* Host object must be a Buffer */ | 413 | /* Host object must be a Buffer */ |
444 | 414 | ||
445 | if (ACPI_GET_OBJECT_TYPE (buffer_desc) != ACPI_TYPE_BUFFER) { | 415 | if (ACPI_GET_OBJECT_TYPE(buffer_desc) != ACPI_TYPE_BUFFER) { |
446 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | 416 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
447 | "Target of Create Field is not a Buffer object - %s\n", | 417 | "Target of Create Field is not a Buffer object - %s\n", |
448 | acpi_ut_get_object_type_name (buffer_desc))); | 418 | acpi_ut_get_object_type_name(buffer_desc))); |
449 | 419 | ||
450 | status = AE_AML_OPERAND_TYPE; | 420 | status = AE_AML_OPERAND_TYPE; |
451 | goto cleanup; | 421 | goto cleanup; |
@@ -456,11 +426,11 @@ acpi_ds_init_buffer_field ( | |||
456 | * out as a name_string, and should therefore now be a NS node | 426 | * out as a name_string, and should therefore now be a NS node |
457 | * after resolution in acpi_ex_resolve_operands(). | 427 | * after resolution in acpi_ex_resolve_operands(). |
458 | */ | 428 | */ |
459 | if (ACPI_GET_DESCRIPTOR_TYPE (result_desc) != ACPI_DESC_TYPE_NAMED) { | 429 | if (ACPI_GET_DESCRIPTOR_TYPE(result_desc) != ACPI_DESC_TYPE_NAMED) { |
460 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | 430 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
461 | "(%s) destination not a NS Node [%s]\n", | 431 | "(%s) destination not a NS Node [%s]\n", |
462 | acpi_ps_get_opcode_name (aml_opcode), | 432 | acpi_ps_get_opcode_name(aml_opcode), |
463 | acpi_ut_get_descriptor_name (result_desc))); | 433 | acpi_ut_get_descriptor_name(result_desc))); |
464 | 434 | ||
465 | status = AE_AML_OPERAND_TYPE; | 435 | status = AE_AML_OPERAND_TYPE; |
466 | goto cleanup; | 436 | goto cleanup; |
@@ -478,13 +448,13 @@ acpi_ds_init_buffer_field ( | |||
478 | 448 | ||
479 | field_flags = AML_FIELD_ACCESS_BYTE; | 449 | field_flags = AML_FIELD_ACCESS_BYTE; |
480 | bit_offset = offset; | 450 | bit_offset = offset; |
481 | bit_count = (u32) length_desc->integer.value; | 451 | bit_count = (u32) length_desc->integer.value; |
482 | 452 | ||
483 | /* Must have a valid (>0) bit count */ | 453 | /* Must have a valid (>0) bit count */ |
484 | 454 | ||
485 | if (bit_count == 0) { | 455 | if (bit_count == 0) { |
486 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | 456 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
487 | "Attempt to create_field of length 0\n")); | 457 | "Attempt to create_field of length 0\n")); |
488 | status = AE_AML_OPERAND_VALUE; | 458 | status = AE_AML_OPERAND_VALUE; |
489 | goto cleanup; | 459 | goto cleanup; |
490 | } | 460 | } |
@@ -495,7 +465,7 @@ acpi_ds_init_buffer_field ( | |||
495 | /* Offset is in bits, Field is one bit */ | 465 | /* Offset is in bits, Field is one bit */ |
496 | 466 | ||
497 | bit_offset = offset; | 467 | bit_offset = offset; |
498 | bit_count = 1; | 468 | bit_count = 1; |
499 | field_flags = AML_FIELD_ACCESS_BYTE; | 469 | field_flags = AML_FIELD_ACCESS_BYTE; |
500 | break; | 470 | break; |
501 | 471 | ||
@@ -504,7 +474,7 @@ acpi_ds_init_buffer_field ( | |||
504 | /* Offset is in bytes, field is one byte */ | 474 | /* Offset is in bytes, field is one byte */ |
505 | 475 | ||
506 | bit_offset = 8 * offset; | 476 | bit_offset = 8 * offset; |
507 | bit_count = 8; | 477 | bit_count = 8; |
508 | field_flags = AML_FIELD_ACCESS_BYTE; | 478 | field_flags = AML_FIELD_ACCESS_BYTE; |
509 | break; | 479 | break; |
510 | 480 | ||
@@ -513,7 +483,7 @@ acpi_ds_init_buffer_field ( | |||
513 | /* Offset is in bytes, field is one word */ | 483 | /* Offset is in bytes, field is one word */ |
514 | 484 | ||
515 | bit_offset = 8 * offset; | 485 | bit_offset = 8 * offset; |
516 | bit_count = 16; | 486 | bit_count = 16; |
517 | field_flags = AML_FIELD_ACCESS_WORD; | 487 | field_flags = AML_FIELD_ACCESS_WORD; |
518 | break; | 488 | break; |
519 | 489 | ||
@@ -522,7 +492,7 @@ acpi_ds_init_buffer_field ( | |||
522 | /* Offset is in bytes, field is one dword */ | 492 | /* Offset is in bytes, field is one dword */ |
523 | 493 | ||
524 | bit_offset = 8 * offset; | 494 | bit_offset = 8 * offset; |
525 | bit_count = 32; | 495 | bit_count = 32; |
526 | field_flags = AML_FIELD_ACCESS_DWORD; | 496 | field_flags = AML_FIELD_ACCESS_DWORD; |
527 | break; | 497 | break; |
528 | 498 | ||
@@ -531,29 +501,29 @@ acpi_ds_init_buffer_field ( | |||
531 | /* Offset is in bytes, field is one qword */ | 501 | /* Offset is in bytes, field is one qword */ |
532 | 502 | ||
533 | bit_offset = 8 * offset; | 503 | bit_offset = 8 * offset; |
534 | bit_count = 64; | 504 | bit_count = 64; |
535 | field_flags = AML_FIELD_ACCESS_QWORD; | 505 | field_flags = AML_FIELD_ACCESS_QWORD; |
536 | break; | 506 | break; |
537 | 507 | ||
538 | default: | 508 | default: |
539 | 509 | ||
540 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | 510 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
541 | "Unknown field creation opcode %02x\n", | 511 | "Unknown field creation opcode %02x\n", |
542 | aml_opcode)); | 512 | aml_opcode)); |
543 | status = AE_AML_BAD_OPCODE; | 513 | status = AE_AML_BAD_OPCODE; |
544 | goto cleanup; | 514 | goto cleanup; |
545 | } | 515 | } |
546 | 516 | ||
547 | /* Entire field must fit within the current length of the buffer */ | 517 | /* Entire field must fit within the current length of the buffer */ |
548 | 518 | ||
549 | if ((bit_offset + bit_count) > | 519 | if ((bit_offset + bit_count) > (8 * (u32) buffer_desc->buffer.length)) { |
550 | (8 * (u32) buffer_desc->buffer.length)) { | 520 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
551 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, | 521 | "Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n", |
552 | "Field [%4.4s] size %d exceeds Buffer [%4.4s] size %d (bits)\n", | 522 | acpi_ut_get_node_name(result_desc), |
553 | acpi_ut_get_node_name (result_desc), | 523 | bit_offset + bit_count, |
554 | bit_offset + bit_count, | 524 | acpi_ut_get_node_name(buffer_desc->buffer. |
555 | acpi_ut_get_node_name (buffer_desc->buffer.node), | 525 | node), |
556 | 8 * (u32) buffer_desc->buffer.length)); | 526 | 8 * (u32) buffer_desc->buffer.length)); |
557 | status = AE_AML_BUFFER_LIMIT; | 527 | status = AE_AML_BUFFER_LIMIT; |
558 | goto cleanup; | 528 | goto cleanup; |
559 | } | 529 | } |
@@ -563,9 +533,9 @@ acpi_ds_init_buffer_field ( | |||
563 | * For field_flags, use LOCK_RULE = 0 (NO_LOCK), | 533 | * For field_flags, use LOCK_RULE = 0 (NO_LOCK), |
564 | * UPDATE_RULE = 0 (UPDATE_PRESERVE) | 534 | * UPDATE_RULE = 0 (UPDATE_PRESERVE) |
565 | */ | 535 | */ |
566 | status = acpi_ex_prep_common_field_object (obj_desc, field_flags, 0, | 536 | status = acpi_ex_prep_common_field_object(obj_desc, field_flags, 0, |
567 | bit_offset, bit_count); | 537 | bit_offset, bit_count); |
568 | if (ACPI_FAILURE (status)) { | 538 | if (ACPI_FAILURE(status)) { |
569 | goto cleanup; | 539 | goto cleanup; |
570 | } | 540 | } |
571 | 541 | ||
@@ -574,35 +544,33 @@ acpi_ds_init_buffer_field ( | |||
574 | /* Reference count for buffer_desc inherits obj_desc count */ | 544 | /* Reference count for buffer_desc inherits obj_desc count */ |
575 | 545 | ||
576 | buffer_desc->common.reference_count = (u16) | 546 | buffer_desc->common.reference_count = (u16) |
577 | (buffer_desc->common.reference_count + obj_desc->common.reference_count); | 547 | (buffer_desc->common.reference_count + |
548 | obj_desc->common.reference_count); | ||
578 | 549 | ||
579 | 550 | cleanup: | |
580 | cleanup: | ||
581 | 551 | ||
582 | /* Always delete the operands */ | 552 | /* Always delete the operands */ |
583 | 553 | ||
584 | acpi_ut_remove_reference (offset_desc); | 554 | acpi_ut_remove_reference(offset_desc); |
585 | acpi_ut_remove_reference (buffer_desc); | 555 | acpi_ut_remove_reference(buffer_desc); |
586 | 556 | ||
587 | if (aml_opcode == AML_CREATE_FIELD_OP) { | 557 | if (aml_opcode == AML_CREATE_FIELD_OP) { |
588 | acpi_ut_remove_reference (length_desc); | 558 | acpi_ut_remove_reference(length_desc); |
589 | } | 559 | } |
590 | 560 | ||
591 | /* On failure, delete the result descriptor */ | 561 | /* On failure, delete the result descriptor */ |
592 | 562 | ||
593 | if (ACPI_FAILURE (status)) { | 563 | if (ACPI_FAILURE(status)) { |
594 | acpi_ut_remove_reference (result_desc); /* Result descriptor */ | 564 | acpi_ut_remove_reference(result_desc); /* Result descriptor */ |
595 | } | 565 | } else { |
596 | else { | ||
597 | /* Now the address and length are valid for this buffer_field */ | 566 | /* Now the address and length are valid for this buffer_field */ |
598 | 567 | ||
599 | obj_desc->buffer_field.flags |= AOPOBJ_DATA_VALID; | 568 | obj_desc->buffer_field.flags |= AOPOBJ_DATA_VALID; |
600 | } | 569 | } |
601 | 570 | ||
602 | return_ACPI_STATUS (status); | 571 | return_ACPI_STATUS(status); |
603 | } | 572 | } |
604 | 573 | ||
605 | |||
606 | /******************************************************************************* | 574 | /******************************************************************************* |
607 | * | 575 | * |
608 | * FUNCTION: acpi_ds_eval_buffer_field_operands | 576 | * FUNCTION: acpi_ds_eval_buffer_field_operands |
@@ -618,24 +586,21 @@ cleanup: | |||
618 | ******************************************************************************/ | 586 | ******************************************************************************/ |
619 | 587 | ||
620 | acpi_status | 588 | acpi_status |
621 | acpi_ds_eval_buffer_field_operands ( | 589 | acpi_ds_eval_buffer_field_operands(struct acpi_walk_state *walk_state, |
622 | struct acpi_walk_state *walk_state, | 590 | union acpi_parse_object *op) |
623 | union acpi_parse_object *op) | ||
624 | { | 591 | { |
625 | acpi_status status; | 592 | acpi_status status; |
626 | union acpi_operand_object *obj_desc; | 593 | union acpi_operand_object *obj_desc; |
627 | struct acpi_namespace_node *node; | 594 | struct acpi_namespace_node *node; |
628 | union acpi_parse_object *next_op; | 595 | union acpi_parse_object *next_op; |
629 | |||
630 | |||
631 | ACPI_FUNCTION_TRACE_PTR ("ds_eval_buffer_field_operands", op); | ||
632 | 596 | ||
597 | ACPI_FUNCTION_TRACE_PTR("ds_eval_buffer_field_operands", op); | ||
633 | 598 | ||
634 | /* | 599 | /* |
635 | * This is where we evaluate the address and length fields of the | 600 | * This is where we evaluate the address and length fields of the |
636 | * create_xxx_field declaration | 601 | * create_xxx_field declaration |
637 | */ | 602 | */ |
638 | node = op->common.node; | 603 | node = op->common.node; |
639 | 604 | ||
640 | /* next_op points to the op that holds the Buffer */ | 605 | /* next_op points to the op that holds the Buffer */ |
641 | 606 | ||
@@ -643,30 +608,32 @@ acpi_ds_eval_buffer_field_operands ( | |||
643 | 608 | ||
644 | /* Evaluate/create the address and length operands */ | 609 | /* Evaluate/create the address and length operands */ |
645 | 610 | ||
646 | status = acpi_ds_create_operands (walk_state, next_op); | 611 | status = acpi_ds_create_operands(walk_state, next_op); |
647 | if (ACPI_FAILURE (status)) { | 612 | if (ACPI_FAILURE(status)) { |
648 | return_ACPI_STATUS (status); | 613 | return_ACPI_STATUS(status); |
649 | } | 614 | } |
650 | 615 | ||
651 | obj_desc = acpi_ns_get_attached_object (node); | 616 | obj_desc = acpi_ns_get_attached_object(node); |
652 | if (!obj_desc) { | 617 | if (!obj_desc) { |
653 | return_ACPI_STATUS (AE_NOT_EXIST); | 618 | return_ACPI_STATUS(AE_NOT_EXIST); |
654 | } | 619 | } |
655 | 620 | ||
656 | /* Resolve the operands */ | 621 | /* Resolve the operands */ |
657 | 622 | ||
658 | status = acpi_ex_resolve_operands (op->common.aml_opcode, | 623 | status = acpi_ex_resolve_operands(op->common.aml_opcode, |
659 | ACPI_WALK_OPERANDS, walk_state); | 624 | ACPI_WALK_OPERANDS, walk_state); |
660 | 625 | ||
661 | ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE, | 626 | ACPI_DUMP_OPERANDS(ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE, |
662 | acpi_ps_get_opcode_name (op->common.aml_opcode), | 627 | acpi_ps_get_opcode_name(op->common.aml_opcode), |
663 | walk_state->num_operands, "after acpi_ex_resolve_operands"); | 628 | walk_state->num_operands, |
629 | "after acpi_ex_resolve_operands"); | ||
664 | 630 | ||
665 | if (ACPI_FAILURE (status)) { | 631 | if (ACPI_FAILURE(status)) { |
666 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "(%s) bad operand(s) (%X)\n", | 632 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "(%s) bad operand(s) (%X)\n", |
667 | acpi_ps_get_opcode_name (op->common.aml_opcode), status)); | 633 | acpi_ps_get_opcode_name(op->common. |
634 | aml_opcode), status)); | ||
668 | 635 | ||
669 | return_ACPI_STATUS (status); | 636 | return_ACPI_STATUS(status); |
670 | } | 637 | } |
671 | 638 | ||
672 | /* Initialize the Buffer Field */ | 639 | /* Initialize the Buffer Field */ |
@@ -674,22 +641,25 @@ acpi_ds_eval_buffer_field_operands ( | |||
674 | if (op->common.aml_opcode == AML_CREATE_FIELD_OP) { | 641 | if (op->common.aml_opcode == AML_CREATE_FIELD_OP) { |
675 | /* NOTE: Slightly different operands for this opcode */ | 642 | /* NOTE: Slightly different operands for this opcode */ |
676 | 643 | ||
677 | status = acpi_ds_init_buffer_field (op->common.aml_opcode, obj_desc, | 644 | status = |
678 | walk_state->operands[0], walk_state->operands[1], | 645 | acpi_ds_init_buffer_field(op->common.aml_opcode, obj_desc, |
679 | walk_state->operands[2], walk_state->operands[3]); | 646 | walk_state->operands[0], |
680 | } | 647 | walk_state->operands[1], |
681 | else { | 648 | walk_state->operands[2], |
649 | walk_state->operands[3]); | ||
650 | } else { | ||
682 | /* All other, create_xxx_field opcodes */ | 651 | /* All other, create_xxx_field opcodes */ |
683 | 652 | ||
684 | status = acpi_ds_init_buffer_field (op->common.aml_opcode, obj_desc, | 653 | status = |
685 | walk_state->operands[0], walk_state->operands[1], | 654 | acpi_ds_init_buffer_field(op->common.aml_opcode, obj_desc, |
686 | NULL, walk_state->operands[2]); | 655 | walk_state->operands[0], |
656 | walk_state->operands[1], NULL, | ||
657 | walk_state->operands[2]); | ||
687 | } | 658 | } |
688 | 659 | ||
689 | return_ACPI_STATUS (status); | 660 | return_ACPI_STATUS(status); |
690 | } | 661 | } |
691 | 662 | ||
692 | |||
693 | /******************************************************************************* | 663 | /******************************************************************************* |
694 | * | 664 | * |
695 | * FUNCTION: acpi_ds_eval_region_operands | 665 | * FUNCTION: acpi_ds_eval_region_operands |
@@ -705,25 +675,22 @@ acpi_ds_eval_buffer_field_operands ( | |||
705 | ******************************************************************************/ | 675 | ******************************************************************************/ |
706 | 676 | ||
707 | acpi_status | 677 | acpi_status |
708 | acpi_ds_eval_region_operands ( | 678 | acpi_ds_eval_region_operands(struct acpi_walk_state *walk_state, |
709 | struct acpi_walk_state *walk_state, | 679 | union acpi_parse_object *op) |
710 | union acpi_parse_object *op) | ||
711 | { | 680 | { |
712 | acpi_status status; | 681 | acpi_status status; |
713 | union acpi_operand_object *obj_desc; | 682 | union acpi_operand_object *obj_desc; |
714 | union acpi_operand_object *operand_desc; | 683 | union acpi_operand_object *operand_desc; |
715 | struct acpi_namespace_node *node; | 684 | struct acpi_namespace_node *node; |
716 | union acpi_parse_object *next_op; | 685 | union acpi_parse_object *next_op; |
717 | |||
718 | |||
719 | ACPI_FUNCTION_TRACE_PTR ("ds_eval_region_operands", op); | ||
720 | 686 | ||
687 | ACPI_FUNCTION_TRACE_PTR("ds_eval_region_operands", op); | ||
721 | 688 | ||
722 | /* | 689 | /* |
723 | * This is where we evaluate the address and length fields of the | 690 | * This is where we evaluate the address and length fields of the |
724 | * op_region declaration | 691 | * op_region declaration |
725 | */ | 692 | */ |
726 | node = op->common.node; | 693 | node = op->common.node; |
727 | 694 | ||
728 | /* next_op points to the op that holds the space_iD */ | 695 | /* next_op points to the op that holds the space_iD */ |
729 | 696 | ||
@@ -735,26 +702,26 @@ acpi_ds_eval_region_operands ( | |||
735 | 702 | ||
736 | /* Evaluate/create the address and length operands */ | 703 | /* Evaluate/create the address and length operands */ |
737 | 704 | ||
738 | status = acpi_ds_create_operands (walk_state, next_op); | 705 | status = acpi_ds_create_operands(walk_state, next_op); |
739 | if (ACPI_FAILURE (status)) { | 706 | if (ACPI_FAILURE(status)) { |
740 | return_ACPI_STATUS (status); | 707 | return_ACPI_STATUS(status); |
741 | } | 708 | } |
742 | 709 | ||
743 | /* Resolve the length and address operands to numbers */ | 710 | /* Resolve the length and address operands to numbers */ |
744 | 711 | ||
745 | status = acpi_ex_resolve_operands (op->common.aml_opcode, | 712 | status = acpi_ex_resolve_operands(op->common.aml_opcode, |
746 | ACPI_WALK_OPERANDS, walk_state); | 713 | ACPI_WALK_OPERANDS, walk_state); |
747 | if (ACPI_FAILURE (status)) { | 714 | if (ACPI_FAILURE(status)) { |
748 | return_ACPI_STATUS (status); | 715 | return_ACPI_STATUS(status); |
749 | } | 716 | } |
750 | 717 | ||
751 | ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE, | 718 | ACPI_DUMP_OPERANDS(ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE, |
752 | acpi_ps_get_opcode_name (op->common.aml_opcode), | 719 | acpi_ps_get_opcode_name(op->common.aml_opcode), |
753 | 1, "after acpi_ex_resolve_operands"); | 720 | 1, "after acpi_ex_resolve_operands"); |
754 | 721 | ||
755 | obj_desc = acpi_ns_get_attached_object (node); | 722 | obj_desc = acpi_ns_get_attached_object(node); |
756 | if (!obj_desc) { | 723 | if (!obj_desc) { |
757 | return_ACPI_STATUS (AE_NOT_EXIST); | 724 | return_ACPI_STATUS(AE_NOT_EXIST); |
758 | } | 725 | } |
759 | 726 | ||
760 | /* | 727 | /* |
@@ -764,7 +731,7 @@ acpi_ds_eval_region_operands ( | |||
764 | operand_desc = walk_state->operands[walk_state->num_operands - 1]; | 731 | operand_desc = walk_state->operands[walk_state->num_operands - 1]; |
765 | 732 | ||
766 | obj_desc->region.length = (u32) operand_desc->integer.value; | 733 | obj_desc->region.length = (u32) operand_desc->integer.value; |
767 | acpi_ut_remove_reference (operand_desc); | 734 | acpi_ut_remove_reference(operand_desc); |
768 | 735 | ||
769 | /* | 736 | /* |
770 | * Get the address and save it | 737 | * Get the address and save it |
@@ -773,22 +740,21 @@ acpi_ds_eval_region_operands ( | |||
773 | operand_desc = walk_state->operands[walk_state->num_operands - 2]; | 740 | operand_desc = walk_state->operands[walk_state->num_operands - 2]; |
774 | 741 | ||
775 | obj_desc->region.address = (acpi_physical_address) | 742 | obj_desc->region.address = (acpi_physical_address) |
776 | operand_desc->integer.value; | 743 | operand_desc->integer.value; |
777 | acpi_ut_remove_reference (operand_desc); | 744 | acpi_ut_remove_reference(operand_desc); |
778 | 745 | ||
779 | ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "rgn_obj %p Addr %8.8X%8.8X Len %X\n", | 746 | ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "rgn_obj %p Addr %8.8X%8.8X Len %X\n", |
780 | obj_desc, | 747 | obj_desc, |
781 | ACPI_FORMAT_UINT64 (obj_desc->region.address), | 748 | ACPI_FORMAT_UINT64(obj_desc->region.address), |
782 | obj_desc->region.length)); | 749 | obj_desc->region.length)); |
783 | 750 | ||
784 | /* Now the address and length are valid for this opregion */ | 751 | /* Now the address and length are valid for this opregion */ |
785 | 752 | ||
786 | obj_desc->region.flags |= AOPOBJ_DATA_VALID; | 753 | obj_desc->region.flags |= AOPOBJ_DATA_VALID; |
787 | 754 | ||
788 | return_ACPI_STATUS (status); | 755 | return_ACPI_STATUS(status); |
789 | } | 756 | } |
790 | 757 | ||
791 | |||
792 | /******************************************************************************* | 758 | /******************************************************************************* |
793 | * | 759 | * |
794 | * FUNCTION: acpi_ds_eval_data_object_operands | 760 | * FUNCTION: acpi_ds_eval_data_object_operands |
@@ -805,46 +771,44 @@ acpi_ds_eval_region_operands ( | |||
805 | ******************************************************************************/ | 771 | ******************************************************************************/ |
806 | 772 | ||
807 | acpi_status | 773 | acpi_status |
808 | acpi_ds_eval_data_object_operands ( | 774 | acpi_ds_eval_data_object_operands(struct acpi_walk_state *walk_state, |
809 | struct acpi_walk_state *walk_state, | 775 | union acpi_parse_object *op, |
810 | union acpi_parse_object *op, | 776 | union acpi_operand_object *obj_desc) |
811 | union acpi_operand_object *obj_desc) | ||
812 | { | 777 | { |
813 | acpi_status status; | 778 | acpi_status status; |
814 | union acpi_operand_object *arg_desc; | 779 | union acpi_operand_object *arg_desc; |
815 | u32 length; | 780 | u32 length; |
816 | |||
817 | |||
818 | ACPI_FUNCTION_TRACE ("ds_eval_data_object_operands"); | ||
819 | 781 | ||
782 | ACPI_FUNCTION_TRACE("ds_eval_data_object_operands"); | ||
820 | 783 | ||
821 | /* The first operand (for all of these data objects) is the length */ | 784 | /* The first operand (for all of these data objects) is the length */ |
822 | 785 | ||
823 | status = acpi_ds_create_operand (walk_state, op->common.value.arg, 1); | 786 | status = acpi_ds_create_operand(walk_state, op->common.value.arg, 1); |
824 | if (ACPI_FAILURE (status)) { | 787 | if (ACPI_FAILURE(status)) { |
825 | return_ACPI_STATUS (status); | 788 | return_ACPI_STATUS(status); |
826 | } | 789 | } |
827 | 790 | ||
828 | status = acpi_ex_resolve_operands (walk_state->opcode, | 791 | status = acpi_ex_resolve_operands(walk_state->opcode, |
829 | &(walk_state->operands [walk_state->num_operands -1]), | 792 | &(walk_state-> |
830 | walk_state); | 793 | operands[walk_state->num_operands - |
831 | if (ACPI_FAILURE (status)) { | 794 | 1]), walk_state); |
832 | return_ACPI_STATUS (status); | 795 | if (ACPI_FAILURE(status)) { |
796 | return_ACPI_STATUS(status); | ||
833 | } | 797 | } |
834 | 798 | ||
835 | /* Extract length operand */ | 799 | /* Extract length operand */ |
836 | 800 | ||
837 | arg_desc = walk_state->operands [walk_state->num_operands - 1]; | 801 | arg_desc = walk_state->operands[walk_state->num_operands - 1]; |
838 | length = (u32) arg_desc->integer.value; | 802 | length = (u32) arg_desc->integer.value; |
839 | 803 | ||
840 | /* Cleanup for length operand */ | 804 | /* Cleanup for length operand */ |
841 | 805 | ||
842 | status = acpi_ds_obj_stack_pop (1, walk_state); | 806 | status = acpi_ds_obj_stack_pop(1, walk_state); |
843 | if (ACPI_FAILURE (status)) { | 807 | if (ACPI_FAILURE(status)) { |
844 | return_ACPI_STATUS (status); | 808 | return_ACPI_STATUS(status); |
845 | } | 809 | } |
846 | 810 | ||
847 | acpi_ut_remove_reference (arg_desc); | 811 | acpi_ut_remove_reference(arg_desc); |
848 | 812 | ||
849 | /* | 813 | /* |
850 | * Create the actual data object | 814 | * Create the actual data object |
@@ -852,37 +816,42 @@ acpi_ds_eval_data_object_operands ( | |||
852 | switch (op->common.aml_opcode) { | 816 | switch (op->common.aml_opcode) { |
853 | case AML_BUFFER_OP: | 817 | case AML_BUFFER_OP: |
854 | 818 | ||
855 | status = acpi_ds_build_internal_buffer_obj (walk_state, op, length, &obj_desc); | 819 | status = |
820 | acpi_ds_build_internal_buffer_obj(walk_state, op, length, | ||
821 | &obj_desc); | ||
856 | break; | 822 | break; |
857 | 823 | ||
858 | case AML_PACKAGE_OP: | 824 | case AML_PACKAGE_OP: |
859 | case AML_VAR_PACKAGE_OP: | 825 | case AML_VAR_PACKAGE_OP: |
860 | 826 | ||
861 | status = acpi_ds_build_internal_package_obj (walk_state, op, length, &obj_desc); | 827 | status = |
828 | acpi_ds_build_internal_package_obj(walk_state, op, length, | ||
829 | &obj_desc); | ||
862 | break; | 830 | break; |
863 | 831 | ||
864 | default: | 832 | default: |
865 | return_ACPI_STATUS (AE_AML_BAD_OPCODE); | 833 | return_ACPI_STATUS(AE_AML_BAD_OPCODE); |
866 | } | 834 | } |
867 | 835 | ||
868 | if (ACPI_SUCCESS (status)) { | 836 | if (ACPI_SUCCESS(status)) { |
869 | /* | 837 | /* |
870 | * Return the object in the walk_state, unless the parent is a package - | 838 | * Return the object in the walk_state, unless the parent is a package - |
871 | * in this case, the return object will be stored in the parse tree | 839 | * in this case, the return object will be stored in the parse tree |
872 | * for the package. | 840 | * for the package. |
873 | */ | 841 | */ |
874 | if ((!op->common.parent) || | 842 | if ((!op->common.parent) || |
875 | ((op->common.parent->common.aml_opcode != AML_PACKAGE_OP) && | 843 | ((op->common.parent->common.aml_opcode != AML_PACKAGE_OP) && |
876 | (op->common.parent->common.aml_opcode != AML_VAR_PACKAGE_OP) && | 844 | (op->common.parent->common.aml_opcode != |
877 | (op->common.parent->common.aml_opcode != AML_NAME_OP))) { | 845 | AML_VAR_PACKAGE_OP) |
846 | && (op->common.parent->common.aml_opcode != | ||
847 | AML_NAME_OP))) { | ||
878 | walk_state->result_obj = obj_desc; | 848 | walk_state->result_obj = obj_desc; |
879 | } | 849 | } |
880 | } | 850 | } |
881 | 851 | ||
882 | return_ACPI_STATUS (status); | 852 | return_ACPI_STATUS(status); |
883 | } | 853 | } |
884 | 854 | ||
885 | |||
886 | /******************************************************************************* | 855 | /******************************************************************************* |
887 | * | 856 | * |
888 | * FUNCTION: acpi_ds_exec_begin_control_op | 857 | * FUNCTION: acpi_ds_exec_begin_control_op |
@@ -898,19 +867,16 @@ acpi_ds_eval_data_object_operands ( | |||
898 | ******************************************************************************/ | 867 | ******************************************************************************/ |
899 | 868 | ||
900 | acpi_status | 869 | acpi_status |
901 | acpi_ds_exec_begin_control_op ( | 870 | acpi_ds_exec_begin_control_op(struct acpi_walk_state *walk_state, |
902 | struct acpi_walk_state *walk_state, | 871 | union acpi_parse_object *op) |
903 | union acpi_parse_object *op) | ||
904 | { | 872 | { |
905 | acpi_status status = AE_OK; | 873 | acpi_status status = AE_OK; |
906 | union acpi_generic_state *control_state; | 874 | union acpi_generic_state *control_state; |
907 | |||
908 | |||
909 | ACPI_FUNCTION_NAME ("ds_exec_begin_control_op"); | ||
910 | 875 | ||
876 | ACPI_FUNCTION_NAME("ds_exec_begin_control_op"); | ||
911 | 877 | ||
912 | ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p Opcode=%2.2X State=%p\n", op, | 878 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p Opcode=%2.2X State=%p\n", op, |
913 | op->common.aml_opcode, walk_state)); | 879 | op->common.aml_opcode, walk_state)); |
914 | 880 | ||
915 | switch (op->common.aml_opcode) { | 881 | switch (op->common.aml_opcode) { |
916 | case AML_IF_OP: | 882 | case AML_IF_OP: |
@@ -921,7 +887,7 @@ acpi_ds_exec_begin_control_op ( | |||
921 | * constructs. We need to manage these as a stack, in order | 887 | * constructs. We need to manage these as a stack, in order |
922 | * to handle nesting. | 888 | * to handle nesting. |
923 | */ | 889 | */ |
924 | control_state = acpi_ut_create_control_state (); | 890 | control_state = acpi_ut_create_control_state(); |
925 | if (!control_state) { | 891 | if (!control_state) { |
926 | status = AE_NO_MEMORY; | 892 | status = AE_NO_MEMORY; |
927 | break; | 893 | break; |
@@ -930,14 +896,16 @@ acpi_ds_exec_begin_control_op ( | |||
930 | * Save a pointer to the predicate for multiple executions | 896 | * Save a pointer to the predicate for multiple executions |
931 | * of a loop | 897 | * of a loop |
932 | */ | 898 | */ |
933 | control_state->control.aml_predicate_start = walk_state->parser_state.aml - 1; | 899 | control_state->control.aml_predicate_start = |
934 | control_state->control.package_end = walk_state->parser_state.pkg_end; | 900 | walk_state->parser_state.aml - 1; |
901 | control_state->control.package_end = | ||
902 | walk_state->parser_state.pkg_end; | ||
935 | control_state->control.opcode = op->common.aml_opcode; | 903 | control_state->control.opcode = op->common.aml_opcode; |
936 | 904 | ||
937 | |||
938 | /* Push the control state on this walk's control stack */ | 905 | /* Push the control state on this walk's control stack */ |
939 | 906 | ||
940 | acpi_ut_push_generic_state (&walk_state->control_state, control_state); | 907 | acpi_ut_push_generic_state(&walk_state->control_state, |
908 | control_state); | ||
941 | break; | 909 | break; |
942 | 910 | ||
943 | case AML_ELSE_OP: | 911 | case AML_ELSE_OP: |
@@ -962,7 +930,6 @@ acpi_ds_exec_begin_control_op ( | |||
962 | return (status); | 930 | return (status); |
963 | } | 931 | } |
964 | 932 | ||
965 | |||
966 | /******************************************************************************* | 933 | /******************************************************************************* |
967 | * | 934 | * |
968 | * FUNCTION: acpi_ds_exec_end_control_op | 935 | * FUNCTION: acpi_ds_exec_end_control_op |
@@ -978,46 +945,42 @@ acpi_ds_exec_begin_control_op ( | |||
978 | ******************************************************************************/ | 945 | ******************************************************************************/ |
979 | 946 | ||
980 | acpi_status | 947 | acpi_status |
981 | acpi_ds_exec_end_control_op ( | 948 | acpi_ds_exec_end_control_op(struct acpi_walk_state * walk_state, |
982 | struct acpi_walk_state *walk_state, | 949 | union acpi_parse_object * op) |
983 | union acpi_parse_object *op) | ||
984 | { | 950 | { |
985 | acpi_status status = AE_OK; | 951 | acpi_status status = AE_OK; |
986 | union acpi_generic_state *control_state; | 952 | union acpi_generic_state *control_state; |
987 | |||
988 | |||
989 | ACPI_FUNCTION_NAME ("ds_exec_end_control_op"); | ||
990 | 953 | ||
954 | ACPI_FUNCTION_NAME("ds_exec_end_control_op"); | ||
991 | 955 | ||
992 | switch (op->common.aml_opcode) { | 956 | switch (op->common.aml_opcode) { |
993 | case AML_IF_OP: | 957 | case AML_IF_OP: |
994 | 958 | ||
995 | ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[IF_OP] Op=%p\n", op)); | 959 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "[IF_OP] Op=%p\n", op)); |
996 | 960 | ||
997 | /* | 961 | /* |
998 | * Save the result of the predicate in case there is an | 962 | * Save the result of the predicate in case there is an |
999 | * ELSE to come | 963 | * ELSE to come |
1000 | */ | 964 | */ |
1001 | walk_state->last_predicate = | 965 | walk_state->last_predicate = |
1002 | (u8) walk_state->control_state->common.value; | 966 | (u8) walk_state->control_state->common.value; |
1003 | 967 | ||
1004 | /* | 968 | /* |
1005 | * Pop the control state that was created at the start | 969 | * Pop the control state that was created at the start |
1006 | * of the IF and free it | 970 | * of the IF and free it |
1007 | */ | 971 | */ |
1008 | control_state = acpi_ut_pop_generic_state (&walk_state->control_state); | 972 | control_state = |
1009 | acpi_ut_delete_generic_state (control_state); | 973 | acpi_ut_pop_generic_state(&walk_state->control_state); |
974 | acpi_ut_delete_generic_state(control_state); | ||
1010 | break; | 975 | break; |
1011 | 976 | ||
1012 | |||
1013 | case AML_ELSE_OP: | 977 | case AML_ELSE_OP: |
1014 | 978 | ||
1015 | break; | 979 | break; |
1016 | 980 | ||
1017 | |||
1018 | case AML_WHILE_OP: | 981 | case AML_WHILE_OP: |
1019 | 982 | ||
1020 | ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", op)); | 983 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", op)); |
1021 | 984 | ||
1022 | if (walk_state->control_state->common.value) { | 985 | if (walk_state->control_state->common.value) { |
1023 | /* Predicate was true, go back and evaluate it again! */ | 986 | /* Predicate was true, go back and evaluate it again! */ |
@@ -1025,22 +988,24 @@ acpi_ds_exec_end_control_op ( | |||
1025 | status = AE_CTRL_PENDING; | 988 | status = AE_CTRL_PENDING; |
1026 | } | 989 | } |
1027 | 990 | ||
1028 | ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, | 991 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, |
1029 | "[WHILE_OP] termination! Op=%p\n",op)); | 992 | "[WHILE_OP] termination! Op=%p\n", op)); |
1030 | 993 | ||
1031 | /* Pop this control state and free it */ | 994 | /* Pop this control state and free it */ |
1032 | 995 | ||
1033 | control_state = acpi_ut_pop_generic_state (&walk_state->control_state); | 996 | control_state = |
997 | acpi_ut_pop_generic_state(&walk_state->control_state); | ||
1034 | 998 | ||
1035 | walk_state->aml_last_while = control_state->control.aml_predicate_start; | 999 | walk_state->aml_last_while = |
1036 | acpi_ut_delete_generic_state (control_state); | 1000 | control_state->control.aml_predicate_start; |
1001 | acpi_ut_delete_generic_state(control_state); | ||
1037 | break; | 1002 | break; |
1038 | 1003 | ||
1039 | |||
1040 | case AML_RETURN_OP: | 1004 | case AML_RETURN_OP: |
1041 | 1005 | ||
1042 | ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, | 1006 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, |
1043 | "[RETURN_OP] Op=%p Arg=%p\n",op, op->common.value.arg)); | 1007 | "[RETURN_OP] Op=%p Arg=%p\n", op, |
1008 | op->common.value.arg)); | ||
1044 | 1009 | ||
1045 | /* | 1010 | /* |
1046 | * One optional operand -- the return value | 1011 | * One optional operand -- the return value |
@@ -1050,12 +1015,14 @@ acpi_ds_exec_end_control_op ( | |||
1050 | if (op->common.value.arg) { | 1015 | if (op->common.value.arg) { |
1051 | /* Since we have a real Return(), delete any implicit return */ | 1016 | /* Since we have a real Return(), delete any implicit return */ |
1052 | 1017 | ||
1053 | acpi_ds_clear_implicit_return (walk_state); | 1018 | acpi_ds_clear_implicit_return(walk_state); |
1054 | 1019 | ||
1055 | /* Return statement has an immediate operand */ | 1020 | /* Return statement has an immediate operand */ |
1056 | 1021 | ||
1057 | status = acpi_ds_create_operands (walk_state, op->common.value.arg); | 1022 | status = |
1058 | if (ACPI_FAILURE (status)) { | 1023 | acpi_ds_create_operands(walk_state, |
1024 | op->common.value.arg); | ||
1025 | if (ACPI_FAILURE(status)) { | ||
1059 | return (status); | 1026 | return (status); |
1060 | } | 1027 | } |
1061 | 1028 | ||
@@ -1064,8 +1031,10 @@ acpi_ds_exec_end_control_op ( | |||
1064 | * an arg or local), resolve it now because it may | 1031 | * an arg or local), resolve it now because it may |
1065 | * cease to exist at the end of the method. | 1032 | * cease to exist at the end of the method. |
1066 | */ | 1033 | */ |
1067 | status = acpi_ex_resolve_to_value (&walk_state->operands [0], walk_state); | 1034 | status = |
1068 | if (ACPI_FAILURE (status)) { | 1035 | acpi_ex_resolve_to_value(&walk_state->operands[0], |
1036 | walk_state); | ||
1037 | if (ACPI_FAILURE(status)) { | ||
1069 | return (status); | 1038 | return (status); |
1070 | } | 1039 | } |
1071 | 1040 | ||
@@ -1075,12 +1044,11 @@ acpi_ds_exec_end_control_op ( | |||
1075 | * is set to anything other than zero! | 1044 | * is set to anything other than zero! |
1076 | */ | 1045 | */ |
1077 | walk_state->return_desc = walk_state->operands[0]; | 1046 | walk_state->return_desc = walk_state->operands[0]; |
1078 | } | 1047 | } else if ((walk_state->results) && |
1079 | else if ((walk_state->results) && | 1048 | (walk_state->results->results.num_results > 0)) { |
1080 | (walk_state->results->results.num_results > 0)) { | ||
1081 | /* Since we have a real Return(), delete any implicit return */ | 1049 | /* Since we have a real Return(), delete any implicit return */ |
1082 | 1050 | ||
1083 | acpi_ds_clear_implicit_return (walk_state); | 1051 | acpi_ds_clear_implicit_return(walk_state); |
1084 | 1052 | ||
1085 | /* | 1053 | /* |
1086 | * The return value has come from a previous calculation. | 1054 | * The return value has come from a previous calculation. |
@@ -1091,67 +1059,78 @@ acpi_ds_exec_end_control_op ( | |||
1091 | * | 1059 | * |
1092 | * Allow references created by the Index operator to return unchanged. | 1060 | * Allow references created by the Index operator to return unchanged. |
1093 | */ | 1061 | */ |
1094 | if ((ACPI_GET_DESCRIPTOR_TYPE (walk_state->results->results.obj_desc[0]) == ACPI_DESC_TYPE_OPERAND) && | 1062 | if ((ACPI_GET_DESCRIPTOR_TYPE |
1095 | (ACPI_GET_OBJECT_TYPE (walk_state->results->results.obj_desc [0]) == ACPI_TYPE_LOCAL_REFERENCE) && | 1063 | (walk_state->results->results.obj_desc[0]) == |
1096 | ((walk_state->results->results.obj_desc [0])->reference.opcode != AML_INDEX_OP)) { | 1064 | ACPI_DESC_TYPE_OPERAND) |
1097 | status = acpi_ex_resolve_to_value (&walk_state->results->results.obj_desc [0], walk_state); | 1065 | && |
1098 | if (ACPI_FAILURE (status)) { | 1066 | (ACPI_GET_OBJECT_TYPE |
1067 | (walk_state->results->results.obj_desc[0]) == | ||
1068 | ACPI_TYPE_LOCAL_REFERENCE) | ||
1069 | && ((walk_state->results->results.obj_desc[0])-> | ||
1070 | reference.opcode != AML_INDEX_OP)) { | ||
1071 | status = | ||
1072 | acpi_ex_resolve_to_value(&walk_state-> | ||
1073 | results->results. | ||
1074 | obj_desc[0], | ||
1075 | walk_state); | ||
1076 | if (ACPI_FAILURE(status)) { | ||
1099 | return (status); | 1077 | return (status); |
1100 | } | 1078 | } |
1101 | } | 1079 | } |
1102 | 1080 | ||
1103 | walk_state->return_desc = walk_state->results->results.obj_desc [0]; | 1081 | walk_state->return_desc = |
1104 | } | 1082 | walk_state->results->results.obj_desc[0]; |
1105 | else { | 1083 | } else { |
1106 | /* No return operand */ | 1084 | /* No return operand */ |
1107 | 1085 | ||
1108 | if (walk_state->num_operands) { | 1086 | if (walk_state->num_operands) { |
1109 | acpi_ut_remove_reference (walk_state->operands [0]); | 1087 | acpi_ut_remove_reference(walk_state-> |
1088 | operands[0]); | ||
1110 | } | 1089 | } |
1111 | 1090 | ||
1112 | walk_state->operands [0] = NULL; | 1091 | walk_state->operands[0] = NULL; |
1113 | walk_state->num_operands = 0; | 1092 | walk_state->num_operands = 0; |
1114 | walk_state->return_desc = NULL; | 1093 | walk_state->return_desc = NULL; |
1115 | } | 1094 | } |
1116 | 1095 | ||
1117 | 1096 | ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, | |
1118 | ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, | 1097 | "Completed RETURN_OP State=%p, ret_val=%p\n", |
1119 | "Completed RETURN_OP State=%p, ret_val=%p\n", | 1098 | walk_state, walk_state->return_desc)); |
1120 | walk_state, walk_state->return_desc)); | ||
1121 | 1099 | ||
1122 | /* End the control method execution right now */ | 1100 | /* End the control method execution right now */ |
1123 | 1101 | ||
1124 | status = AE_CTRL_TERMINATE; | 1102 | status = AE_CTRL_TERMINATE; |
1125 | break; | 1103 | break; |
1126 | 1104 | ||
1127 | |||
1128 | case AML_NOOP_OP: | 1105 | case AML_NOOP_OP: |
1129 | 1106 | ||
1130 | /* Just do nothing! */ | 1107 | /* Just do nothing! */ |
1131 | break; | 1108 | break; |
1132 | 1109 | ||
1133 | |||
1134 | case AML_BREAK_POINT_OP: | 1110 | case AML_BREAK_POINT_OP: |
1135 | 1111 | ||
1136 | /* Call up to the OS service layer to handle this */ | 1112 | /* Call up to the OS service layer to handle this */ |
1137 | 1113 | ||
1138 | status = acpi_os_signal (ACPI_SIGNAL_BREAKPOINT, "Executed AML Breakpoint opcode"); | 1114 | status = |
1115 | acpi_os_signal(ACPI_SIGNAL_BREAKPOINT, | ||
1116 | "Executed AML Breakpoint opcode"); | ||
1139 | 1117 | ||
1140 | /* If and when it returns, all done. */ | 1118 | /* If and when it returns, all done. */ |
1141 | 1119 | ||
1142 | break; | 1120 | break; |
1143 | 1121 | ||
1144 | |||
1145 | case AML_BREAK_OP: | 1122 | case AML_BREAK_OP: |
1146 | case AML_CONTINUE_OP: /* ACPI 2.0 */ | 1123 | case AML_CONTINUE_OP: /* ACPI 2.0 */ |
1147 | |||
1148 | 1124 | ||
1149 | /* Pop and delete control states until we find a while */ | 1125 | /* Pop and delete control states until we find a while */ |
1150 | 1126 | ||
1151 | while (walk_state->control_state && | 1127 | while (walk_state->control_state && |
1152 | (walk_state->control_state->control.opcode != AML_WHILE_OP)) { | 1128 | (walk_state->control_state->control.opcode != |
1153 | control_state = acpi_ut_pop_generic_state (&walk_state->control_state); | 1129 | AML_WHILE_OP)) { |
1154 | acpi_ut_delete_generic_state (control_state); | 1130 | control_state = |
1131 | acpi_ut_pop_generic_state(&walk_state-> | ||
1132 | control_state); | ||
1133 | acpi_ut_delete_generic_state(control_state); | ||
1155 | } | 1134 | } |
1156 | 1135 | ||
1157 | /* No while found? */ | 1136 | /* No while found? */ |
@@ -1162,23 +1141,23 @@ acpi_ds_exec_end_control_op ( | |||
1162 | 1141 | ||
1163 | /* Was: walk_state->aml_last_while = walk_state->control_state->Control.aml_predicate_start; */ | 1142 | /* Was: walk_state->aml_last_while = walk_state->control_state->Control.aml_predicate_start; */ |
1164 | 1143 | ||
1165 | walk_state->aml_last_while = walk_state->control_state->control.package_end; | 1144 | walk_state->aml_last_while = |
1145 | walk_state->control_state->control.package_end; | ||
1166 | 1146 | ||
1167 | /* Return status depending on opcode */ | 1147 | /* Return status depending on opcode */ |
1168 | 1148 | ||
1169 | if (op->common.aml_opcode == AML_BREAK_OP) { | 1149 | if (op->common.aml_opcode == AML_BREAK_OP) { |
1170 | status = AE_CTRL_BREAK; | 1150 | status = AE_CTRL_BREAK; |
1171 | } | 1151 | } else { |
1172 | else { | ||
1173 | status = AE_CTRL_CONTINUE; | 1152 | status = AE_CTRL_CONTINUE; |
1174 | } | 1153 | } |
1175 | break; | 1154 | break; |
1176 | 1155 | ||
1177 | |||
1178 | default: | 1156 | default: |
1179 | 1157 | ||
1180 | ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Unknown control opcode=%X Op=%p\n", | 1158 | ACPI_DEBUG_PRINT((ACPI_DB_ERROR, |
1181 | op->common.aml_opcode, op)); | 1159 | "Unknown control opcode=%X Op=%p\n", |
1160 | op->common.aml_opcode, op)); | ||
1182 | 1161 | ||
1183 | status = AE_AML_BAD_OPCODE; | 1162 | status = AE_AML_BAD_OPCODE; |
1184 | break; | 1163 | break; |
@@ -1186,4 +1165,3 @@ acpi_ds_exec_end_control_op ( | |||
1186 | 1165 | ||
1187 | return (status); | 1166 | return (status); |
1188 | } | 1167 | } |
1189 | |||