utmisc.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:27k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*******************************************************************************
  2.  *
  3.  * Module Name: utmisc - common utility procedures
  4.  *              $Revision: 52 $
  5.  *
  6.  ******************************************************************************/
  7. /*
  8.  *  Copyright (C) 2000, 2001 R. Byron Moore
  9.  *
  10.  *  This program is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2 of the License, or
  13.  *  (at your option) any later version.
  14.  *
  15.  *  This program is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with this program; if not, write to the Free Software
  22.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  23.  */
  24. #include "acpi.h"
  25. #include "acevents.h"
  26. #include "achware.h"
  27. #include "acnamesp.h"
  28. #include "acinterp.h"
  29. #include "amlcode.h"
  30. #include "acdebug.h"
  31. #define _COMPONENT          ACPI_UTILITIES
  32.  MODULE_NAME         ("utmisc")
  33. /*******************************************************************************
  34.  *
  35.  * FUNCTION:    Acpi_ut_valid_acpi_name
  36.  *
  37.  * PARAMETERS:  Character           - The character to be examined
  38.  *
  39.  * RETURN:      1 if Character may appear in a name, else 0
  40.  *
  41.  * DESCRIPTION: Check for a valid ACPI name.  Each character must be one of:
  42.  *              1) Upper case alpha
  43.  *              2) numeric
  44.  *              3) underscore
  45.  *
  46.  ******************************************************************************/
  47. u8
  48. acpi_ut_valid_acpi_name (
  49. u32                     name)
  50. {
  51. NATIVE_CHAR             *name_ptr = (NATIVE_CHAR *) &name;
  52. u32                     i;
  53. FUNCTION_ENTRY ();
  54. for (i = 0; i < ACPI_NAME_SIZE; i++) {
  55. if (!((name_ptr[i] == '_') ||
  56.   (name_ptr[i] >= 'A' && name_ptr[i] <= 'Z') ||
  57.   (name_ptr[i] >= '0' && name_ptr[i] <= '9'))) {
  58. return (FALSE);
  59. }
  60. }
  61. return (TRUE);
  62. }
  63. /*******************************************************************************
  64.  *
  65.  * FUNCTION:    Acpi_ut_valid_acpi_character
  66.  *
  67.  * PARAMETERS:  Character           - The character to be examined
  68.  *
  69.  * RETURN:      1 if Character may appear in a name, else 0
  70.  *
  71.  * DESCRIPTION: Check for a printable character
  72.  *
  73.  ******************************************************************************/
  74. u8
  75. acpi_ut_valid_acpi_character (
  76. NATIVE_CHAR             character)
  77. {
  78. FUNCTION_ENTRY ();
  79. return ((u8)   ((character == '_') ||
  80.    (character >= 'A' && character <= 'Z') ||
  81.    (character >= '0' && character <= '9')));
  82. }
  83. /*******************************************************************************
  84.  *
  85.  * FUNCTION:    Acpi_ut_strupr
  86.  *
  87.  * PARAMETERS:  Src_string      - The source string to convert to
  88.  *
  89.  * RETURN:      Src_string
  90.  *
  91.  * DESCRIPTION: Convert string to uppercase
  92.  *
  93.  ******************************************************************************/
  94. NATIVE_CHAR *
  95. acpi_ut_strupr (
  96. NATIVE_CHAR             *src_string)
  97. {
  98. NATIVE_CHAR             *string;
  99. FUNCTION_ENTRY ();
  100. /* Walk entire string, uppercasing the letters */
  101. for (string = src_string; *string; ) {
  102. *string = (char) TOUPPER (*string);
  103. string++;
  104. }
  105. return (src_string);
  106. }
  107. /*******************************************************************************
  108.  *
  109.  * FUNCTION:    Acpi_ut_mutex_initialize
  110.  *
  111.  * PARAMETERS:  None.
  112.  *
  113.  * RETURN:      Status
  114.  *
  115.  * DESCRIPTION: Create the system mutex objects.
  116.  *
  117.  ******************************************************************************/
  118. acpi_status
  119. acpi_ut_mutex_initialize (
  120. void)
  121. {
  122. u32                     i;
  123. acpi_status             status;
  124. FUNCTION_TRACE ("Ut_mutex_initialize");
  125. /*
  126.  * Create each of the predefined mutex objects
  127.  */
  128. for (i = 0; i < NUM_MTX; i++) {
  129. status = acpi_ut_create_mutex (i);
  130. if (ACPI_FAILURE (status)) {
  131. return_ACPI_STATUS (status);
  132. }
  133. }
  134. return_ACPI_STATUS (AE_OK);
  135. }
  136. /*******************************************************************************
  137.  *
  138.  * FUNCTION:    Acpi_ut_mutex_terminate
  139.  *
  140.  * PARAMETERS:  None.
  141.  *
  142.  * RETURN:      None.
  143.  *
  144.  * DESCRIPTION: Delete all of the system mutex objects.
  145.  *
  146.  ******************************************************************************/
  147. void
  148. acpi_ut_mutex_terminate (
  149. void)
  150. {
  151. u32                     i;
  152. FUNCTION_TRACE ("Ut_mutex_terminate");
  153. /*
  154.  * Delete each predefined mutex object
  155.  */
  156. for (i = 0; i < NUM_MTX; i++) {
  157. acpi_ut_delete_mutex (i);
  158. }
  159. return_VOID;
  160. }
  161. /*******************************************************************************
  162.  *
  163.  * FUNCTION:    Acpi_ut_create_mutex
  164.  *
  165.  * PARAMETERS:  Mutex_iD        - ID of the mutex to be created
  166.  *
  167.  * RETURN:      Status
  168.  *
  169.  * DESCRIPTION: Create a mutex object.
  170.  *
  171.  ******************************************************************************/
  172. acpi_status
  173. acpi_ut_create_mutex (
  174. ACPI_MUTEX_HANDLE       mutex_id)
  175. {
  176. acpi_status             status = AE_OK;
  177. FUNCTION_TRACE_U32 ("Ut_create_mutex", mutex_id);
  178. if (mutex_id > MAX_MTX) {
  179. return_ACPI_STATUS (AE_BAD_PARAMETER);
  180. }
  181. if (!acpi_gbl_acpi_mutex_info[mutex_id].mutex) {
  182. status = acpi_os_create_semaphore (1, 1,
  183.   &acpi_gbl_acpi_mutex_info[mutex_id].mutex);
  184. acpi_gbl_acpi_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
  185. acpi_gbl_acpi_mutex_info[mutex_id].use_count = 0;
  186. }
  187. return_ACPI_STATUS (status);
  188. }
  189. /*******************************************************************************
  190.  *
  191.  * FUNCTION:    Acpi_ut_delete_mutex
  192.  *
  193.  * PARAMETERS:  Mutex_iD        - ID of the mutex to be deleted
  194.  *
  195.  * RETURN:      Status
  196.  *
  197.  * DESCRIPTION: Delete a mutex object.
  198.  *
  199.  ******************************************************************************/
  200. acpi_status
  201. acpi_ut_delete_mutex (
  202. ACPI_MUTEX_HANDLE       mutex_id)
  203. {
  204. acpi_status             status;
  205. FUNCTION_TRACE_U32 ("Ut_delete_mutex", mutex_id);
  206. if (mutex_id > MAX_MTX) {
  207. return_ACPI_STATUS (AE_BAD_PARAMETER);
  208. }
  209. status = acpi_os_delete_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex);
  210. acpi_gbl_acpi_mutex_info[mutex_id].mutex = NULL;
  211. acpi_gbl_acpi_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
  212. return_ACPI_STATUS (status);
  213. }
  214. /*******************************************************************************
  215.  *
  216.  * FUNCTION:    Acpi_ut_acquire_mutex
  217.  *
  218.  * PARAMETERS:  Mutex_iD        - ID of the mutex to be acquired
  219.  *
  220.  * RETURN:      Status
  221.  *
  222.  * DESCRIPTION: Acquire a mutex object.
  223.  *
  224.  ******************************************************************************/
  225. acpi_status
  226. acpi_ut_acquire_mutex (
  227. ACPI_MUTEX_HANDLE       mutex_id)
  228. {
  229. acpi_status             status;
  230. u32                     i;
  231. u32                     this_thread_id;
  232. PROC_NAME ("Ut_acquire_mutex");
  233. if (mutex_id > MAX_MTX) {
  234. return (AE_BAD_PARAMETER);
  235. }
  236. this_thread_id = acpi_os_get_thread_id ();
  237. /*
  238.  * Deadlock prevention.  Check if this thread owns any mutexes of value
  239.  * greater than or equal to this one.  If so, the thread has violated
  240.  * the mutex ordering rule.  This indicates a coding error somewhere in
  241.  * the ACPI subsystem code.
  242.  */
  243. for (i = mutex_id; i < MAX_MTX; i++) {
  244. if (acpi_gbl_acpi_mutex_info[i].owner_id == this_thread_id) {
  245. if (i == mutex_id) {
  246. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  247. "Mutex [%s] already acquired by this thread [%X]n",
  248. acpi_ut_get_mutex_name (mutex_id), this_thread_id));
  249. return (AE_ALREADY_ACQUIRED);
  250. }
  251. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  252. "Invalid acquire order: Thread %X owns [%s], wants [%s]n",
  253. this_thread_id, acpi_ut_get_mutex_name (i),
  254. acpi_ut_get_mutex_name (mutex_id)));
  255. return (AE_ACQUIRE_DEADLOCK);
  256. }
  257. }
  258. ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX,
  259.  "Thread %X attempting to acquire Mutex [%s]n",
  260.  this_thread_id, acpi_ut_get_mutex_name (mutex_id)));
  261. status = acpi_os_wait_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex,
  262.    1, WAIT_FOREVER);
  263. if (ACPI_SUCCESS (status)) {
  264. ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Thread %X acquired Mutex [%s]n",
  265.  this_thread_id, acpi_ut_get_mutex_name (mutex_id)));
  266. acpi_gbl_acpi_mutex_info[mutex_id].use_count++;
  267. acpi_gbl_acpi_mutex_info[mutex_id].owner_id = this_thread_id;
  268. }
  269. else {
  270. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Thread %X could not acquire Mutex [%s] %sn",
  271.  this_thread_id, acpi_ut_get_mutex_name (mutex_id),
  272.  acpi_format_exception (status)));
  273. }
  274. return (status);
  275. }
  276. /*******************************************************************************
  277.  *
  278.  * FUNCTION:    Acpi_ut_release_mutex
  279.  *
  280.  * PARAMETERS:  Mutex_iD        - ID of the mutex to be released
  281.  *
  282.  * RETURN:      Status
  283.  *
  284.  * DESCRIPTION: Release a mutex object.
  285.  *
  286.  ******************************************************************************/
  287. acpi_status
  288. acpi_ut_release_mutex (
  289. ACPI_MUTEX_HANDLE       mutex_id)
  290. {
  291. acpi_status             status;
  292. u32                     i;
  293. u32                     this_thread_id;
  294. PROC_NAME ("Ut_release_mutex");
  295. this_thread_id = acpi_os_get_thread_id ();
  296. ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX,
  297. "Thread %X releasing Mutex [%s]n", this_thread_id,
  298. acpi_ut_get_mutex_name (mutex_id)));
  299. if (mutex_id > MAX_MTX) {
  300. return (AE_BAD_PARAMETER);
  301. }
  302. /*
  303.  * Mutex must be acquired in order to release it!
  304.  */
  305. if (acpi_gbl_acpi_mutex_info[mutex_id].owner_id == ACPI_MUTEX_NOT_ACQUIRED) {
  306. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  307. "Mutex [%s] is not acquired, cannot releasen",
  308. acpi_ut_get_mutex_name (mutex_id)));
  309. return (AE_NOT_ACQUIRED);
  310. }
  311. /*
  312.  * Deadlock prevention.  Check if this thread owns any mutexes of value
  313.  * greater than this one.  If so, the thread has violated the mutex
  314.  * ordering rule.  This indicates a coding error somewhere in
  315.  * the ACPI subsystem code.
  316.  */
  317. for (i = mutex_id; i < MAX_MTX; i++) {
  318. if (acpi_gbl_acpi_mutex_info[i].owner_id == this_thread_id) {
  319. if (i == mutex_id) {
  320. continue;
  321. }
  322. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR,
  323. "Invalid release order: owns [%s], releasing [%s]n",
  324. acpi_ut_get_mutex_name (i), acpi_ut_get_mutex_name (mutex_id)));
  325. return (AE_RELEASE_DEADLOCK);
  326. }
  327. }
  328. /* Mark unlocked FIRST */
  329. acpi_gbl_acpi_mutex_info[mutex_id].owner_id = ACPI_MUTEX_NOT_ACQUIRED;
  330. status = acpi_os_signal_semaphore (acpi_gbl_acpi_mutex_info[mutex_id].mutex, 1);
  331. if (ACPI_FAILURE (status)) {
  332. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Thread %X could not release Mutex [%s] %sn",
  333.  this_thread_id, acpi_ut_get_mutex_name (mutex_id),
  334.  acpi_format_exception (status)));
  335. }
  336. else {
  337. ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Thread %X released Mutex [%s]n",
  338.  this_thread_id, acpi_ut_get_mutex_name (mutex_id)));
  339. }
  340. return (status);
  341. }
  342. /*******************************************************************************
  343.  *
  344.  * FUNCTION:    Acpi_ut_create_update_state_and_push
  345.  *
  346.  * PARAMETERS:  *Object         - Object to be added to the new state
  347.  *              Action          - Increment/Decrement
  348.  *              State_list      - List the state will be added to
  349.  *
  350.  * RETURN:      None
  351.  *
  352.  * DESCRIPTION: Create a new state and push it
  353.  *
  354.  ******************************************************************************/
  355. acpi_status
  356. acpi_ut_create_update_state_and_push (
  357. acpi_operand_object     *object,
  358. u16                     action,
  359. acpi_generic_state      **state_list)
  360. {
  361. acpi_generic_state       *state;
  362. FUNCTION_ENTRY ();
  363. /* Ignore null objects; these are expected */
  364. if (!object) {
  365. return (AE_OK);
  366. }
  367. state = acpi_ut_create_update_state (object, action);
  368. if (!state) {
  369. return (AE_NO_MEMORY);
  370. }
  371. acpi_ut_push_generic_state (state_list, state);
  372. return (AE_OK);
  373. }
  374. /*******************************************************************************
  375.  *
  376.  * FUNCTION:    Acpi_ut_create_pkg_state_and_push
  377.  *
  378.  * PARAMETERS:  *Object         - Object to be added to the new state
  379.  *              Action          - Increment/Decrement
  380.  *              State_list      - List the state will be added to
  381.  *
  382.  * RETURN:      None
  383.  *
  384.  * DESCRIPTION: Create a new state and push it
  385.  *
  386.  ******************************************************************************/
  387. acpi_status
  388. acpi_ut_create_pkg_state_and_push (
  389. void                    *internal_object,
  390. void                    *external_object,
  391. u16                     index,
  392. acpi_generic_state      **state_list)
  393. {
  394. acpi_generic_state       *state;
  395. FUNCTION_ENTRY ();
  396. state = acpi_ut_create_pkg_state (internal_object, external_object, index);
  397. if (!state) {
  398. return (AE_NO_MEMORY);
  399. }
  400. acpi_ut_push_generic_state (state_list, state);
  401. return (AE_OK);
  402. }
  403. /*******************************************************************************
  404.  *
  405.  * FUNCTION:    Acpi_ut_push_generic_state
  406.  *
  407.  * PARAMETERS:  List_head           - Head of the state stack
  408.  *              State               - State object to push
  409.  *
  410.  * RETURN:      Status
  411.  *
  412.  * DESCRIPTION: Push a state object onto a state stack
  413.  *
  414.  ******************************************************************************/
  415. void
  416. acpi_ut_push_generic_state (
  417. acpi_generic_state      **list_head,
  418. acpi_generic_state      *state)
  419. {
  420. FUNCTION_TRACE ("Ut_push_generic_state");
  421. /* Push the state object onto the front of the list (stack) */
  422. state->common.next = *list_head;
  423. *list_head = state;
  424. return_VOID;
  425. }
  426. /*******************************************************************************
  427.  *
  428.  * FUNCTION:    Acpi_ut_pop_generic_state
  429.  *
  430.  * PARAMETERS:  List_head           - Head of the state stack
  431.  *
  432.  * RETURN:      Status
  433.  *
  434.  * DESCRIPTION: Pop a state object from a state stack
  435.  *
  436.  ******************************************************************************/
  437. acpi_generic_state *
  438. acpi_ut_pop_generic_state (
  439. acpi_generic_state      **list_head)
  440. {
  441. acpi_generic_state      *state;
  442. FUNCTION_TRACE ("Ut_pop_generic_state");
  443. /* Remove the state object at the head of the list (stack) */
  444. state = *list_head;
  445. if (state) {
  446. /* Update the list head */
  447. *list_head = state->common.next;
  448. }
  449. return_PTR (state);
  450. }
  451. /*******************************************************************************
  452.  *
  453.  * FUNCTION:    Acpi_ut_create_generic_state
  454.  *
  455.  * PARAMETERS:  None
  456.  *
  457.  * RETURN:      Status
  458.  *
  459.  * DESCRIPTION: Create a generic state object.  Attempt to obtain one from
  460.  *              the global state cache;  If none available, create a new one.
  461.  *
  462.  ******************************************************************************/
  463. acpi_generic_state *
  464. acpi_ut_create_generic_state (void)
  465. {
  466. acpi_generic_state      *state;
  467. FUNCTION_ENTRY ();
  468. state = acpi_ut_acquire_from_cache (ACPI_MEM_LIST_STATE);
  469. /* Initialize */
  470. if (state) {
  471. state->common.data_type = ACPI_DESC_TYPE_STATE;
  472. }
  473. return (state);
  474. }
  475. /*******************************************************************************
  476.  *
  477.  * FUNCTION:    Acpi_ut_create_update_state
  478.  *
  479.  * PARAMETERS:  Object              - Initial Object to be installed in the
  480.  *                                    state
  481.  *              Action              - Update action to be performed
  482.  *
  483.  * RETURN:      Status
  484.  *
  485.  * DESCRIPTION: Create an "Update State" - a flavor of the generic state used
  486.  *              to update reference counts and delete complex objects such
  487.  *              as packages.
  488.  *
  489.  ******************************************************************************/
  490. acpi_generic_state *
  491. acpi_ut_create_update_state (
  492. acpi_operand_object     *object,
  493. u16                     action)
  494. {
  495. acpi_generic_state      *state;
  496. FUNCTION_TRACE_PTR ("Ut_create_update_state", object);
  497. /* Create the generic state object */
  498. state = acpi_ut_create_generic_state ();
  499. if (!state) {
  500. return (NULL);
  501. }
  502. /* Init fields specific to the update struct */
  503. state->common.data_type = ACPI_DESC_TYPE_STATE_UPDATE;
  504. state->update.object = object;
  505. state->update.value  = action;
  506. return_PTR (state);
  507. }
  508. /*******************************************************************************
  509.  *
  510.  * FUNCTION:    Acpi_ut_create_pkg_state
  511.  *
  512.  * PARAMETERS:  Object              - Initial Object to be installed in the
  513.  *                                    state
  514.  *              Action              - Update action to be performed
  515.  *
  516.  * RETURN:      Status
  517.  *
  518.  * DESCRIPTION: Create a "Package State"
  519.  *
  520.  ******************************************************************************/
  521. acpi_generic_state *
  522. acpi_ut_create_pkg_state (
  523. void                    *internal_object,
  524. void                    *external_object,
  525. u16                     index)
  526. {
  527. acpi_generic_state      *state;
  528. FUNCTION_TRACE_PTR ("Ut_create_pkg_state", internal_object);
  529. /* Create the generic state object */
  530. state = acpi_ut_create_generic_state ();
  531. if (!state) {
  532. return (NULL);
  533. }
  534. /* Init fields specific to the update struct */
  535. state->common.data_type = ACPI_DESC_TYPE_STATE_PACKAGE;
  536. state->pkg.source_object = (acpi_operand_object *) internal_object;
  537. state->pkg.dest_object  = external_object;
  538. state->pkg.index        = index;
  539. state->pkg.num_packages = 1;
  540. return_PTR (state);
  541. }
  542. /*******************************************************************************
  543.  *
  544.  * FUNCTION:    Acpi_ut_create_control_state
  545.  *
  546.  * PARAMETERS:  None
  547.  *
  548.  * RETURN:      Status
  549.  *
  550.  * DESCRIPTION: Create a "Control State" - a flavor of the generic state used
  551.  *              to support nested IF/WHILE constructs in the AML.
  552.  *
  553.  ******************************************************************************/
  554. acpi_generic_state *
  555. acpi_ut_create_control_state (
  556. void)
  557. {
  558. acpi_generic_state      *state;
  559. FUNCTION_TRACE ("Ut_create_control_state");
  560. /* Create the generic state object */
  561. state = acpi_ut_create_generic_state ();
  562. if (!state) {
  563. return (NULL);
  564. }
  565. /* Init fields specific to the control struct */
  566. state->common.data_type = ACPI_DESC_TYPE_STATE_CONTROL;
  567. state->common.state     = CONTROL_CONDITIONAL_EXECUTING;
  568. return_PTR (state);
  569. }
  570. /*******************************************************************************
  571.  *
  572.  * FUNCTION:    Acpi_ut_delete_generic_state
  573.  *
  574.  * PARAMETERS:  State               - The state object to be deleted
  575.  *
  576.  * RETURN:      Status
  577.  *
  578.  * DESCRIPTION: Put a state object back into the global state cache.  The object
  579.  *              is not actually freed at this time.
  580.  *
  581.  ******************************************************************************/
  582. void
  583. acpi_ut_delete_generic_state (
  584. acpi_generic_state      *state)
  585. {
  586. FUNCTION_TRACE ("Ut_delete_generic_state");
  587. acpi_ut_release_to_cache (ACPI_MEM_LIST_STATE, state);
  588. return_VOID;
  589. }
  590. /*******************************************************************************
  591.  *
  592.  * FUNCTION:    Acpi_ut_delete_generic_state_cache
  593.  *
  594.  * PARAMETERS:  None
  595.  *
  596.  * RETURN:      Status
  597.  *
  598.  * DESCRIPTION: Purge the global state object cache.  Used during subsystem
  599.  *              termination.
  600.  *
  601.  ******************************************************************************/
  602. void
  603. acpi_ut_delete_generic_state_cache (
  604. void)
  605. {
  606. FUNCTION_TRACE ("Ut_delete_generic_state_cache");
  607. acpi_ut_delete_generic_cache (ACPI_MEM_LIST_STATE);
  608. return_VOID;
  609. }
  610. /*******************************************************************************
  611.  *
  612.  * FUNCTION:    Acpi_ut_resolve_package_references
  613.  *
  614.  * PARAMETERS:  Obj_desc        - The Package object on which to resolve refs
  615.  *
  616.  * RETURN:      Status
  617.  *
  618.  * DESCRIPTION: Walk through a package and turn internal references into values
  619.  *
  620.  ******************************************************************************/
  621. acpi_status
  622. acpi_ut_resolve_package_references (
  623. acpi_operand_object     *obj_desc)
  624. {
  625. u32                     count;
  626. acpi_operand_object     *sub_object;
  627. FUNCTION_TRACE ("Ut_resolve_package_references");
  628. if (obj_desc->common.type != ACPI_TYPE_PACKAGE) {
  629. /* The object must be a package */
  630. REPORT_ERROR (("Must resolve Package Refs on a Packagen"));
  631. return_ACPI_STATUS(AE_ERROR);
  632. }
  633. /*
  634.  * TBD: what about nested packages? */
  635. for (count = 0; count < obj_desc->package.count; count++) {
  636. sub_object = obj_desc->package.elements[count];
  637. if (sub_object->common.type == INTERNAL_TYPE_REFERENCE) {
  638. if (sub_object->reference.opcode == AML_ZERO_OP) {
  639. sub_object->common.type = ACPI_TYPE_INTEGER;
  640. sub_object->integer.value = 0;
  641. }
  642. else if (sub_object->reference.opcode == AML_ONE_OP) {
  643. sub_object->common.type = ACPI_TYPE_INTEGER;
  644. sub_object->integer.value = 1;
  645. }
  646. else if (sub_object->reference.opcode == AML_ONES_OP) {
  647. sub_object->common.type = ACPI_TYPE_INTEGER;
  648. sub_object->integer.value = ACPI_INTEGER_MAX;
  649. }
  650. }
  651. }
  652. return_ACPI_STATUS(AE_OK);
  653. }
  654. #ifdef ACPI_DEBUG
  655. /*******************************************************************************
  656.  *
  657.  * FUNCTION:    Acpi_ut_display_init_pathname
  658.  *
  659.  * PARAMETERS:  Obj_handle          - Handle whose pathname will be displayed
  660.  *              Path                - Additional path string to be appended
  661.  *
  662.  * RETURN:      acpi_status
  663.  *
  664.  * DESCRIPTION: Display full pathnbame of an object, DEBUG ONLY
  665.  *
  666.  ******************************************************************************/
  667. void
  668. acpi_ut_display_init_pathname (
  669. acpi_handle             obj_handle,
  670. char                    *path)
  671. {
  672. acpi_status             status;
  673. u32                     length = 128;
  674. char                    buffer[128];
  675. PROC_NAME ("Ut_display_init_pathname");
  676. status = acpi_ns_handle_to_pathname (obj_handle, &length, buffer);
  677. if (ACPI_SUCCESS (status)) {
  678. if (path) {
  679. ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "%s.%sn", buffer, path));
  680. }
  681. else {
  682. ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "%sn", buffer));
  683. }
  684. }
  685. }
  686. #endif
  687. /*******************************************************************************
  688.  *
  689.  * FUNCTION:    Acpi_ut_walk_package_tree
  690.  *
  691.  * PARAMETERS:  Obj_desc        - The Package object on which to resolve refs
  692.  *
  693.  * RETURN:      Status
  694.  *
  695.  * DESCRIPTION: Walk through a package
  696.  *
  697.  ******************************************************************************/
  698. acpi_status
  699. acpi_ut_walk_package_tree (
  700. acpi_operand_object     *source_object,
  701. void                    *target_object,
  702. ACPI_PKG_CALLBACK       walk_callback,
  703. void                    *context)
  704. {
  705. acpi_status             status = AE_OK;
  706. acpi_generic_state      *state_list = NULL;
  707. acpi_generic_state      *state;
  708. u32                     this_index;
  709. acpi_operand_object     *this_source_obj;
  710. FUNCTION_TRACE ("Ut_walk_package_tree");
  711. state = acpi_ut_create_pkg_state (source_object, target_object, 0);
  712. if (!state) {
  713. return_ACPI_STATUS (AE_NO_MEMORY);
  714. }
  715. while (state) {
  716. this_index    = state->pkg.index;
  717. this_source_obj = (acpi_operand_object *)
  718.   state->pkg.source_object->package.elements[this_index];
  719. /*
  720.  * Check for
  721.  * 1) An uninitialized package element.  It is completely
  722.  *      legal to declare a package and leave it uninitialized
  723.  * 2) Not an internal object - can be a namespace node instead
  724.  * 3) Any type other than a package.  Packages are handled in else
  725.  *      case below.
  726.  */
  727. if ((!this_source_obj) ||
  728. (!VALID_DESCRIPTOR_TYPE (
  729. this_source_obj, ACPI_DESC_TYPE_INTERNAL)) ||
  730. (!IS_THIS_OBJECT_TYPE (
  731. this_source_obj, ACPI_TYPE_PACKAGE))) {
  732. status = walk_callback (ACPI_COPY_TYPE_SIMPLE, this_source_obj,
  733.  state, context);
  734. if (ACPI_FAILURE (status)) {
  735. /* TBD: must delete package created up to this point */
  736. return_ACPI_STATUS (status);
  737. }
  738. state->pkg.index++;
  739. while (state->pkg.index >= state->pkg.source_object->package.count) {
  740. /*
  741.  * We've handled all of the objects at this level,  This means
  742.  * that we have just completed a package.  That package may
  743.  * have contained one or more packages itself.
  744.  *
  745.  * Delete this state and pop the previous state (package).
  746.  */
  747. acpi_ut_delete_generic_state (state);
  748. state = acpi_ut_pop_generic_state (&state_list);
  749. /* Finished when there are no more states */
  750. if (!state) {
  751. /*
  752.  * We have handled all of the objects in the top level
  753.  * package just add the length of the package objects
  754.  * and exit
  755.  */
  756. return_ACPI_STATUS (AE_OK);
  757. }
  758. /*
  759.  * Go back up a level and move the index past the just
  760.  * completed package object.
  761.  */
  762. state->pkg.index++;
  763. }
  764. }
  765. else {
  766. /* This is a sub-object of type package */
  767. status = walk_callback (ACPI_COPY_TYPE_PACKAGE, this_source_obj,
  768.   state, context);
  769. if (ACPI_FAILURE (status)) {
  770. /* TBD: must delete package created up to this point */
  771. return_ACPI_STATUS (status);
  772. }
  773. /*
  774.  * The callback above returned a new target package object.
  775.  */
  776. /*
  777.  * Push the current state and create a new one
  778.  */
  779. acpi_ut_push_generic_state (&state_list, state);
  780. state = acpi_ut_create_pkg_state (this_source_obj,
  781.    state->pkg.this_target_obj, 0);
  782. if (!state) {
  783. /* TBD: must delete package created up to this point */
  784. return_ACPI_STATUS (AE_NO_MEMORY);
  785. }
  786. }
  787. }
  788. /* We should never get here */
  789. return (AE_AML_INTERNAL);
  790. }
  791. /*******************************************************************************
  792.  *
  793.  * FUNCTION:    Acpi_ut_report_error
  794.  *
  795.  * PARAMETERS:  Module_name         - Caller's module name (for error output)
  796.  *              Line_number         - Caller's line number (for error output)
  797.  *              Component_id        - Caller's component ID (for error output)
  798.  *              Message             - Error message to use on failure
  799.  *
  800.  * RETURN:      None
  801.  *
  802.  * DESCRIPTION: Print error message
  803.  *
  804.  ******************************************************************************/
  805. void
  806. acpi_ut_report_error (
  807. NATIVE_CHAR             *module_name,
  808. u32                     line_number,
  809. u32                     component_id)
  810. {
  811. acpi_os_printf ("%8s-%04d: *** Error: ", module_name, line_number);
  812. }
  813. /*******************************************************************************
  814.  *
  815.  * FUNCTION:    Acpi_ut_report_warning
  816.  *
  817.  * PARAMETERS:  Module_name         - Caller's module name (for error output)
  818.  *              Line_number         - Caller's line number (for error output)
  819.  *              Component_id        - Caller's component ID (for error output)
  820.  *              Message             - Error message to use on failure
  821.  *
  822.  * RETURN:      None
  823.  *
  824.  * DESCRIPTION: Print warning message
  825.  *
  826.  ******************************************************************************/
  827. void
  828. acpi_ut_report_warning (
  829. NATIVE_CHAR             *module_name,
  830. u32                     line_number,
  831. u32                     component_id)
  832. {
  833. acpi_os_printf ("%8s-%04d: *** Warning: ", module_name, line_number);
  834. }
  835. /*******************************************************************************
  836.  *
  837.  * FUNCTION:    Acpi_ut_report_info
  838.  *
  839.  * PARAMETERS:  Module_name         - Caller's module name (for error output)
  840.  *              Line_number         - Caller's line number (for error output)
  841.  *              Component_id        - Caller's component ID (for error output)
  842.  *              Message             - Error message to use on failure
  843.  *
  844.  * RETURN:      None
  845.  *
  846.  * DESCRIPTION: Print information message
  847.  *
  848.  ******************************************************************************/
  849. void
  850. acpi_ut_report_info (
  851. NATIVE_CHAR             *module_name,
  852. u32                     line_number,
  853. u32                     component_id)
  854. {
  855. acpi_os_printf ("%8s-%04d: *** Info: ", module_name, line_number);
  856. }