Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
exconfig.c
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * Module Name: exconfig - Namespace reconfiguration (Load/Unload opcodes)
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2012, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  * notice, this list of conditions, and the following disclaimer,
16  * without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  * substantially similar to the "NO WARRANTY" disclaimer below
19  * ("Disclaimer") and any redistribution must be conditioned upon
20  * including a substantially similar Disclaimer requirement for further
21  * binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  * of any contributors may be used to endorse or promote products derived
24  * from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #include <acpi/acpi.h>
45 #include "accommon.h"
46 #include "acinterp.h"
47 #include "acnamesp.h"
48 #include "actables.h"
49 #include "acdispat.h"
50 #include "acevents.h"
51 
52 #define _COMPONENT ACPI_EXECUTER
53 ACPI_MODULE_NAME("exconfig")
54 
55 /* Local prototypes */
56 static acpi_status
57 acpi_ex_add_table(u32 table_index,
59  union acpi_operand_object **ddb_handle);
60 
61 static acpi_status
62 acpi_ex_region_read(union acpi_operand_object *obj_desc,
63  u32 length, u8 *buffer);
64 
65 /*******************************************************************************
66  *
67  * FUNCTION: acpi_ex_add_table
68  *
69  * PARAMETERS: table - Pointer to raw table
70  * parent_node - Where to load the table (scope)
71  * ddb_handle - Where to return the table handle.
72  *
73  * RETURN: Status
74  *
75  * DESCRIPTION: Common function to Install and Load an ACPI table with a
76  * returned table handle.
77  *
78  ******************************************************************************/
79 
80 static acpi_status
81 acpi_ex_add_table(u32 table_index,
82  struct acpi_namespace_node *parent_node,
83  union acpi_operand_object **ddb_handle)
84 {
85  union acpi_operand_object *obj_desc;
88 
89  ACPI_FUNCTION_TRACE(ex_add_table);
90 
91  /* Create an object to be the table handle */
92 
94  if (!obj_desc) {
96  }
97 
98  /* Init the table handle */
99 
100  obj_desc->common.flags |= AOPOBJ_DATA_VALID;
101  obj_desc->reference.class = ACPI_REFCLASS_TABLE;
102  *ddb_handle = obj_desc;
103 
104  /* Install the new table into the local data structures */
105 
106  obj_desc->reference.value = table_index;
107 
108  /* Add the table to the namespace */
109 
110  status = acpi_ns_load_table(table_index, parent_node);
111  if (ACPI_FAILURE(status)) {
112  acpi_ut_remove_reference(obj_desc);
113  *ddb_handle = NULL;
114  return_ACPI_STATUS(status);
115  }
116 
117  /* Execute any module-level code that was found in the table */
118 
122 
123  /* Update GPEs for any new _Lxx/_Exx methods. Ignore errors */
124 
125  status = acpi_tb_get_owner_id(table_index, &owner_id);
126  if (ACPI_SUCCESS(status)) {
127  acpi_ev_update_gpes(owner_id);
128  }
129 
131 }
132 
133 /*******************************************************************************
134  *
135  * FUNCTION: acpi_ex_load_table_op
136  *
137  * PARAMETERS: walk_state - Current state with operands
138  * return_desc - Where to store the return object
139  *
140  * RETURN: Status
141  *
142  * DESCRIPTION: Load an ACPI table from the RSDT/XSDT
143  *
144  ******************************************************************************/
145 
148  union acpi_operand_object **return_desc)
149 {
151  union acpi_operand_object **operand = &walk_state->operands[0];
153  struct acpi_namespace_node *start_node;
154  struct acpi_namespace_node *parameter_node = NULL;
155  union acpi_operand_object *ddb_handle;
156  struct acpi_table_header *table;
157  u32 table_index;
158 
159  ACPI_FUNCTION_TRACE(ex_load_table_op);
160 
161  /* Validate lengths for the signature_string, OEMIDString, OEMtable_iD */
162 
163  if ((operand[0]->string.length > ACPI_NAME_SIZE) ||
164  (operand[1]->string.length > ACPI_OEM_ID_SIZE) ||
165  (operand[2]->string.length > ACPI_OEM_TABLE_ID_SIZE)) {
167  }
168 
169  /* Find the ACPI table in the RSDT/XSDT */
170 
171  status = acpi_tb_find_table(operand[0]->string.pointer,
172  operand[1]->string.pointer,
173  operand[2]->string.pointer, &table_index);
174  if (ACPI_FAILURE(status)) {
175  if (status != AE_NOT_FOUND) {
176  return_ACPI_STATUS(status);
177  }
178 
179  /* Table not found, return an Integer=0 and AE_OK */
180 
181  ddb_handle = acpi_ut_create_integer_object((u64) 0);
182  if (!ddb_handle) {
184  }
185 
186  *return_desc = ddb_handle;
188  }
189 
190  /* Default nodes */
191 
192  start_node = walk_state->scope_info->scope.node;
193  parent_node = acpi_gbl_root_node;
194 
195  /* root_path (optional parameter) */
196 
197  if (operand[3]->string.length > 0) {
198  /*
199  * Find the node referenced by the root_path_string. This is the
200  * location within the namespace where the table will be loaded.
201  */
202  status =
203  acpi_ns_get_node(start_node, operand[3]->string.pointer,
204  ACPI_NS_SEARCH_PARENT, &parent_node);
205  if (ACPI_FAILURE(status)) {
206  return_ACPI_STATUS(status);
207  }
208  }
209 
210  /* parameter_path (optional parameter) */
211 
212  if (operand[4]->string.length > 0) {
213  if ((operand[4]->string.pointer[0] != '\\') &&
214  (operand[4]->string.pointer[0] != '^')) {
215  /*
216  * Path is not absolute, so it will be relative to the node
217  * referenced by the root_path_string (or the NS root if omitted)
218  */
219  start_node = parent_node;
220  }
221 
222  /* Find the node referenced by the parameter_path_string */
223 
224  status =
225  acpi_ns_get_node(start_node, operand[4]->string.pointer,
226  ACPI_NS_SEARCH_PARENT, &parameter_node);
227  if (ACPI_FAILURE(status)) {
228  return_ACPI_STATUS(status);
229  }
230  }
231 
232  /* Load the table into the namespace */
233 
234  status = acpi_ex_add_table(table_index, parent_node, &ddb_handle);
235  if (ACPI_FAILURE(status)) {
236  return_ACPI_STATUS(status);
237  }
238 
239  /* Parameter Data (optional) */
240 
241  if (parameter_node) {
242 
243  /* Store the parameter data into the optional parameter object */
244 
245  status = acpi_ex_store(operand[5],
247  parameter_node),
248  walk_state);
249  if (ACPI_FAILURE(status)) {
250  (void)acpi_ex_unload_table(ddb_handle);
251 
252  acpi_ut_remove_reference(ddb_handle);
253  return_ACPI_STATUS(status);
254  }
255  }
256 
257  status = acpi_get_table_by_index(table_index, &table);
258  if (ACPI_SUCCESS(status)) {
259  ACPI_INFO((AE_INFO, "Dynamic OEM Table Load:"));
260  acpi_tb_print_table_header(0, table);
261  }
262 
263  /* Invoke table handler if present */
264 
268  }
269 
270  *return_desc = ddb_handle;
271  return_ACPI_STATUS(status);
272 }
273 
274 /*******************************************************************************
275  *
276  * FUNCTION: acpi_ex_region_read
277  *
278  * PARAMETERS: obj_desc - Region descriptor
279  * length - Number of bytes to read
280  * buffer - Pointer to where to put the data
281  *
282  * RETURN: Status
283  *
284  * DESCRIPTION: Read data from an operation region. The read starts from the
285  * beginning of the region.
286  *
287  ******************************************************************************/
288 
289 static acpi_status
290 acpi_ex_region_read(union acpi_operand_object *obj_desc, u32 length, u8 *buffer)
291 {
293  u64 value;
294  u32 region_offset = 0;
295  u32 i;
296 
297  /* Bytewise reads */
298 
299  for (i = 0; i < length; i++) {
300  status =
302  region_offset, 8, &value);
303  if (ACPI_FAILURE(status)) {
304  return status;
305  }
306 
307  *buffer = (u8)value;
308  buffer++;
309  region_offset++;
310  }
311 
312  return AE_OK;
313 }
314 
315 /*******************************************************************************
316  *
317  * FUNCTION: acpi_ex_load_op
318  *
319  * PARAMETERS: obj_desc - Region or Buffer/Field where the table will be
320  * obtained
321  * target - Where a handle to the table will be stored
322  * walk_state - Current state
323  *
324  * RETURN: Status
325  *
326  * DESCRIPTION: Load an ACPI table from a field or operation region
327  *
328  * NOTE: Region Fields (Field, bank_field, index_fields) are resolved to buffer
329  * objects before this code is reached.
330  *
331  * If source is an operation region, it must refer to system_memory, as
332  * per the ACPI specification.
333  *
334  ******************************************************************************/
335 
339  struct acpi_walk_state *walk_state)
340 {
341  union acpi_operand_object *ddb_handle;
342  struct acpi_table_header *table;
343  struct acpi_table_desc table_desc;
344  u32 table_index;
346  u32 length;
347 
348  ACPI_FUNCTION_TRACE(ex_load_op);
349 
350  ACPI_MEMSET(&table_desc, 0, sizeof(struct acpi_table_desc));
351 
352  /* Source Object can be either an op_region or a Buffer/Field */
353 
354  switch (obj_desc->common.type) {
355  case ACPI_TYPE_REGION:
356 
358  "Load table from Region %p\n", obj_desc));
359 
360  /* Region must be system_memory (from ACPI spec) */
361 
362  if (obj_desc->region.space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) {
364  }
365 
366  /*
367  * If the Region Address and Length have not been previously evaluated,
368  * evaluate them now and save the results.
369  */
370  if (!(obj_desc->common.flags & AOPOBJ_DATA_VALID)) {
371  status = acpi_ds_get_region_arguments(obj_desc);
372  if (ACPI_FAILURE(status)) {
373  return_ACPI_STATUS(status);
374  }
375  }
376 
377  /* Get the table header first so we can get the table length */
378 
379  table = ACPI_ALLOCATE(sizeof(struct acpi_table_header));
380  if (!table) {
382  }
383 
384  status =
385  acpi_ex_region_read(obj_desc,
386  sizeof(struct acpi_table_header),
387  ACPI_CAST_PTR(u8, table));
388  length = table->length;
389  ACPI_FREE(table);
390 
391  if (ACPI_FAILURE(status)) {
392  return_ACPI_STATUS(status);
393  }
394 
395  /* Must have at least an ACPI table header */
396 
397  if (length < sizeof(struct acpi_table_header)) {
399  }
400 
401  /*
402  * The original implementation simply mapped the table, with no copy.
403  * However, the memory region is not guaranteed to remain stable and
404  * we must copy the table to a local buffer. For example, the memory
405  * region is corrupted after suspend on some machines. Dynamically
406  * loaded tables are usually small, so this overhead is minimal.
407  *
408  * The latest implementation (5/2009) does not use a mapping at all.
409  * We use the low-level operation region interface to read the table
410  * instead of the obvious optimization of using a direct mapping.
411  * This maintains a consistent use of operation regions across the
412  * entire subsystem. This is important if additional processing must
413  * be performed in the (possibly user-installed) operation region
414  * handler. For example, acpi_exec and ASLTS depend on this.
415  */
416 
417  /* Allocate a buffer for the table */
418 
419  table_desc.pointer = ACPI_ALLOCATE(length);
420  if (!table_desc.pointer) {
422  }
423 
424  /* Read the entire table */
425 
426  status = acpi_ex_region_read(obj_desc, length,
428  table_desc.pointer));
429  if (ACPI_FAILURE(status)) {
430  ACPI_FREE(table_desc.pointer);
431  return_ACPI_STATUS(status);
432  }
433 
434  table_desc.address = obj_desc->region.address;
435  break;
436 
437  case ACPI_TYPE_BUFFER: /* Buffer or resolved region_field */
438 
440  "Load table from Buffer or Field %p\n",
441  obj_desc));
442 
443  /* Must have at least an ACPI table header */
444 
445  if (obj_desc->buffer.length < sizeof(struct acpi_table_header)) {
447  }
448 
449  /* Get the actual table length from the table header */
450 
451  table =
453  obj_desc->buffer.pointer);
454  length = table->length;
455 
456  /* Table cannot extend beyond the buffer */
457 
458  if (length > obj_desc->buffer.length) {
460  }
461  if (length < sizeof(struct acpi_table_header)) {
463  }
464 
465  /*
466  * Copy the table from the buffer because the buffer could be modified
467  * or even deleted in the future
468  */
469  table_desc.pointer = ACPI_ALLOCATE(length);
470  if (!table_desc.pointer) {
472  }
473 
474  ACPI_MEMCPY(table_desc.pointer, table, length);
475  table_desc.address = ACPI_TO_INTEGER(table_desc.pointer);
476  break;
477 
478  default:
480  }
481 
482  /* Validate table checksum (will not get validated in tb_add_table) */
483 
484  status = acpi_tb_verify_checksum(table_desc.pointer, length);
485  if (ACPI_FAILURE(status)) {
486  ACPI_FREE(table_desc.pointer);
487  return_ACPI_STATUS(status);
488  }
489 
490  /* Complete the table descriptor */
491 
492  table_desc.length = length;
493  table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED;
494 
495  /* Install the new table into the local data structures */
496 
497  status = acpi_tb_add_table(&table_desc, &table_index);
498  if (ACPI_FAILURE(status)) {
499 
500  /* Delete allocated table buffer */
501 
502  acpi_tb_delete_table(&table_desc);
503  return_ACPI_STATUS(status);
504  }
505 
506  /*
507  * Add the table to the namespace.
508  *
509  * Note: Load the table objects relative to the root of the namespace.
510  * This appears to go against the ACPI specification, but we do it for
511  * compatibility with other ACPI implementations.
512  */
513  status =
514  acpi_ex_add_table(table_index, acpi_gbl_root_node, &ddb_handle);
515  if (ACPI_FAILURE(status)) {
516 
517  /* On error, table_ptr was deallocated above */
518 
519  return_ACPI_STATUS(status);
520  }
521 
522  /* Store the ddb_handle into the Target operand */
523 
524  status = acpi_ex_store(ddb_handle, target, walk_state);
525  if (ACPI_FAILURE(status)) {
526  (void)acpi_ex_unload_table(ddb_handle);
527 
528  /* table_ptr was deallocated above */
529 
530  acpi_ut_remove_reference(ddb_handle);
531  return_ACPI_STATUS(status);
532  }
533 
534  ACPI_INFO((AE_INFO, "Dynamic OEM Table Load:"));
535  acpi_tb_print_table_header(0, table_desc.pointer);
536 
537  /* Remove the reference by added by acpi_ex_store above */
538 
539  acpi_ut_remove_reference(ddb_handle);
540 
541  /* Invoke table handler if present */
542 
545  table_desc.pointer,
547  }
548 
549  return_ACPI_STATUS(status);
550 }
551 
552 /*******************************************************************************
553  *
554  * FUNCTION: acpi_ex_unload_table
555  *
556  * PARAMETERS: ddb_handle - Handle to a previously loaded table
557  *
558  * RETURN: Status
559  *
560  * DESCRIPTION: Unload an ACPI table
561  *
562  ******************************************************************************/
563 
565 {
566  acpi_status status = AE_OK;
567  union acpi_operand_object *table_desc = ddb_handle;
568  u32 table_index;
569  struct acpi_table_header *table;
570 
571  ACPI_FUNCTION_TRACE(ex_unload_table);
572 
573  /*
574  * Validate the handle
575  * Although the handle is partially validated in acpi_ex_reconfiguration()
576  * when it calls acpi_ex_resolve_operands(), the handle is more completely
577  * validated here.
578  *
579  * Handle must be a valid operand object of type reference. Also, the
580  * ddb_handle must still be marked valid (table has not been previously
581  * unloaded)
582  */
583  if ((!ddb_handle) ||
585  (ddb_handle->common.type != ACPI_TYPE_LOCAL_REFERENCE) ||
586  (!(ddb_handle->common.flags & AOPOBJ_DATA_VALID))) {
588  }
589 
590  /* Get the table index from the ddb_handle */
591 
592  table_index = table_desc->reference.value;
593 
594  /* Ensure the table is still loaded */
595 
596  if (!acpi_tb_is_table_loaded(table_index)) {
598  }
599 
600  /* Invoke table handler if present */
601 
603  status = acpi_get_table_by_index(table_index, &table);
604  if (ACPI_SUCCESS(status)) {
606  table,
608  }
609  }
610 
611  /* Delete the portion of the namespace owned by this table */
612 
613  status = acpi_tb_delete_namespace_by_owner(table_index);
614  if (ACPI_FAILURE(status)) {
615  return_ACPI_STATUS(status);
616  }
617 
618  (void)acpi_tb_release_owner_id(table_index);
619  acpi_tb_set_table_loaded_flag(table_index, FALSE);
620 
621  /*
622  * Invalidate the handle. We do this because the handle may be stored
623  * in a named object and may not be actually deleted until much later.
624  */
625  ddb_handle->common.flags &= ~AOPOBJ_DATA_VALID;
627 }