tbget.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:18k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Module Name: tbget - ACPI Table get* routines
  4.  *              $Revision: 56 $
  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 "achware.h"
  26. #include "actables.h"
  27. #define _COMPONENT          ACPI_TABLES
  28.  MODULE_NAME         ("tbget")
  29. #define RSDP_CHECKSUM_LENGTH 20
  30. /*******************************************************************************
  31.  *
  32.  * FUNCTION:    Acpi_tb_get_table_ptr
  33.  *
  34.  * PARAMETERS:  Table_type      - one of the defined table types
  35.  *              Instance        - Which table of this type
  36.  *              Table_ptr_loc   - pointer to location to place the pointer for
  37.  *                                return
  38.  *
  39.  * RETURN:      Status
  40.  *
  41.  * DESCRIPTION: This function is called to get the pointer to an ACPI table.
  42.  *
  43.  ******************************************************************************/
  44. acpi_status
  45. acpi_tb_get_table_ptr (
  46. acpi_table_type         table_type,
  47. u32                     instance,
  48. acpi_table_header       **table_ptr_loc)
  49. {
  50. acpi_table_desc         *table_desc;
  51. u32                     i;
  52. FUNCTION_TRACE ("Tb_get_table_ptr");
  53. if (!acpi_gbl_DSDT) {
  54. return_ACPI_STATUS (AE_NO_ACPI_TABLES);
  55. }
  56. if (table_type > ACPI_TABLE_MAX) {
  57. return_ACPI_STATUS (AE_BAD_PARAMETER);
  58. }
  59. /*
  60.  * For all table types (Single/Multiple), the first
  61.  * instance is always in the list head.
  62.  */
  63. if (instance == 1) {
  64. /*
  65.  * Just pluck the pointer out of the global table!
  66.  * Will be null if no table is present
  67.  */
  68. *table_ptr_loc = acpi_gbl_acpi_tables[table_type].pointer;
  69. return_ACPI_STATUS (AE_OK);
  70. }
  71. /*
  72.  * Check for instance out of range
  73.  */
  74. if (instance > acpi_gbl_acpi_tables[table_type].count) {
  75. return_ACPI_STATUS (AE_NOT_EXIST);
  76. }
  77. /* Walk the list to get the desired table
  78.  * Since the if (Instance == 1) check above checked for the
  79.  * first table, setting Table_desc equal to the .Next member
  80.  * is actually pointing to the second table.  Therefore, we
  81.  * need to walk from the 2nd table until we reach the Instance
  82.  * that the user is looking for and return its table pointer.
  83.  */
  84. table_desc = acpi_gbl_acpi_tables[table_type].next;
  85. for (i = 2; i < instance; i++) {
  86. table_desc = table_desc->next;
  87. }
  88. /* We are now pointing to the requested table's descriptor */
  89. *table_ptr_loc = table_desc->pointer;
  90. return_ACPI_STATUS (AE_OK);
  91. }
  92. /*******************************************************************************
  93.  *
  94.  * FUNCTION:    Acpi_tb_get_table
  95.  *
  96.  * PARAMETERS:  Physical_address        - Physical address of table to retrieve
  97.  *              *Buffer_ptr             - If Buffer_ptr is valid, read data from
  98.  *                                         buffer rather than searching memory
  99.  *              *Table_info             - Where the table info is returned
  100.  *
  101.  * RETURN:      Status
  102.  *
  103.  * DESCRIPTION: Maps the physical address of table into a logical address
  104.  *
  105.  ******************************************************************************/
  106. acpi_status
  107. acpi_tb_get_table (
  108. ACPI_PHYSICAL_ADDRESS   physical_address,
  109. acpi_table_header       *buffer_ptr,
  110. acpi_table_desc         *table_info)
  111. {
  112. acpi_table_header       *table_header = NULL;
  113. acpi_table_header       *full_table = NULL;
  114. u32                     size;
  115. u8                      allocation;
  116. acpi_status             status = AE_OK;
  117. FUNCTION_TRACE ("Tb_get_table");
  118. if (!table_info) {
  119. return_ACPI_STATUS (AE_BAD_PARAMETER);
  120. }
  121. if (buffer_ptr) {
  122. /*
  123.  * Getting data from a buffer, not BIOS tables
  124.  */
  125. table_header = buffer_ptr;
  126. status = acpi_tb_validate_table_header (table_header);
  127. if (ACPI_FAILURE (status)) {
  128. /* Table failed verification, map all errors to BAD_DATA */
  129. return_ACPI_STATUS (AE_BAD_DATA);
  130. }
  131. /* Allocate buffer for the entire table */
  132. full_table = ACPI_MEM_ALLOCATE (table_header->length);
  133. if (!full_table) {
  134. return_ACPI_STATUS (AE_NO_MEMORY);
  135. }
  136. /* Copy the entire table (including header) to the local buffer */
  137. size = table_header->length;
  138. MEMCPY (full_table, buffer_ptr, size);
  139. /* Save allocation type */
  140. allocation = ACPI_MEM_ALLOCATED;
  141. }
  142. /*
  143.  * Not reading from a buffer, just map the table's physical memory
  144.  * into our address space.
  145.  */
  146. else {
  147. size = SIZE_IN_HEADER;
  148. status = acpi_tb_map_acpi_table (physical_address, &size, &full_table);
  149. if (ACPI_FAILURE (status)) {
  150. return_ACPI_STATUS (status);
  151. }
  152. /* Save allocation type */
  153. allocation = ACPI_MEM_MAPPED;
  154. }
  155. /* Return values */
  156. table_info->pointer     = full_table;
  157. table_info->length      = size;
  158. table_info->allocation  = allocation;
  159. table_info->base_pointer = full_table;
  160. return_ACPI_STATUS (status);
  161. }
  162. /*******************************************************************************
  163.  *
  164.  * FUNCTION:    Acpi_tb_get_all_tables
  165.  *
  166.  * PARAMETERS:  Number_of_tables    - Number of tables to get
  167.  *              Table_ptr           - Input buffer pointer, optional
  168.  *
  169.  * RETURN:      Status
  170.  *
  171.  * DESCRIPTION: Load and validate all tables other than the RSDT.  The RSDT must
  172.  *              already be loaded and validated.
  173.  *
  174.  ******************************************************************************/
  175. acpi_status
  176. acpi_tb_get_all_tables (
  177. u32                     number_of_tables,
  178. acpi_table_header       *table_ptr)
  179. {
  180. acpi_status             status = AE_OK;
  181. u32                     index;
  182. acpi_table_desc         table_info;
  183. FUNCTION_TRACE ("Tb_get_all_tables");
  184. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Number of tables: %dn", number_of_tables));
  185. /*
  186.  * Loop through all table pointers found in RSDT.
  187.  * This will NOT include the FACS and DSDT - we must get
  188.  * them after the loop
  189.  */
  190. for (index = 0; index < number_of_tables; index++) {
  191. /* Clear the Table_info each time */
  192. MEMSET (&table_info, 0, sizeof (acpi_table_desc));
  193. /* Get the table via the XSDT */
  194. status = acpi_tb_get_table ((ACPI_PHYSICAL_ADDRESS)
  195.  ACPI_GET_ADDRESS (acpi_gbl_XSDT->table_offset_entry[index]),
  196.  table_ptr, &table_info);
  197. /* Ignore a table that failed verification */
  198. if (status == AE_BAD_DATA) {
  199. continue;
  200. }
  201. /* However, abort on serious errors */
  202. if (ACPI_FAILURE (status)) {
  203. return_ACPI_STATUS (status);
  204. }
  205. /* Recognize and install the table */
  206. status = acpi_tb_install_table (table_ptr, &table_info);
  207. if (ACPI_FAILURE (status)) {
  208. /*
  209.  * Unrecognized or unsupported table, delete it and ignore the
  210.  * error.  Just get as many tables as we can, later we will
  211.  * determine if there are enough tables to continue.
  212.  */
  213. acpi_tb_uninstall_table (&table_info);
  214. }
  215. }
  216. /*
  217.  * Convert the FADT to a common format.  This allows earlier revisions of the
  218.  * table to coexist with newer versions, using common access code.
  219.  */
  220. status = acpi_tb_convert_table_fadt ();
  221. if (ACPI_FAILURE (status)) {
  222. return_ACPI_STATUS (status);
  223. }
  224. /*
  225.  * Get the minimum set of ACPI tables, namely:
  226.  *
  227.  * 1) FADT (via RSDT in loop above)
  228.  * 2) FACS
  229.  * 3) DSDT
  230.  *
  231.  */
  232. /*
  233.  * Get the FACS (must have the FADT first, from loop above)
  234.  * Acpi_tb_get_table_facs will fail if FADT pointer is not valid
  235.  */
  236. status = acpi_tb_get_table_facs (table_ptr, &table_info);
  237. if (ACPI_FAILURE (status)) {
  238. return_ACPI_STATUS (status);
  239. }
  240. /* Install the FACS */
  241. status = acpi_tb_install_table (table_ptr, &table_info);
  242. if (ACPI_FAILURE (status)) {
  243. return_ACPI_STATUS (status);
  244. }
  245. /*
  246.  * Create the common FACS pointer table
  247.  * (Contains pointers to the original table)
  248.  */
  249. status = acpi_tb_build_common_facs (&table_info);
  250. if (ACPI_FAILURE (status)) {
  251. return_ACPI_STATUS (status);
  252. }
  253. /*
  254.  * Get the DSDT (We know that the FADT is valid now)
  255.  */
  256. status = acpi_tb_get_table ((ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (acpi_gbl_FADT->Xdsdt),
  257.   table_ptr, &table_info);
  258. if (ACPI_FAILURE (status)) {
  259. return_ACPI_STATUS (status);
  260. }
  261. /* Install the DSDT */
  262. status = acpi_tb_install_table (table_ptr, &table_info);
  263. if (ACPI_FAILURE (status)) {
  264. return_ACPI_STATUS (status);
  265. }
  266. /* Dump the DSDT Header */
  267. ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Hex dump of DSDT Header:n"));
  268. DUMP_BUFFER ((u8 *) acpi_gbl_DSDT, sizeof (acpi_table_header));
  269. /* Dump the entire DSDT */
  270. ACPI_DEBUG_PRINT ((ACPI_DB_TABLES,
  271. "Hex dump of DSDT (After header), size %d (%x)n",
  272. acpi_gbl_DSDT->length, acpi_gbl_DSDT->length));
  273. DUMP_BUFFER ((u8 *) (acpi_gbl_DSDT + 1), acpi_gbl_DSDT->length);
  274. /*
  275.  * Initialize the capabilities flags.
  276.  * Assumes that platform supports ACPI_MODE since we have tables!
  277.  */
  278. acpi_gbl_system_flags |= acpi_hw_get_mode_capabilities ();
  279. /* Always delete the RSDP mapping, we are done with it */
  280. acpi_tb_delete_acpi_table (ACPI_TABLE_RSDP);
  281. return_ACPI_STATUS (status);
  282. }
  283. /*******************************************************************************
  284.  *
  285.  * FUNCTION:    Acpi_tb_verify_rsdp
  286.  *
  287.  * PARAMETERS:  Number_of_tables    - Where the table count is placed
  288.  *
  289.  * RETURN:      Status
  290.  *
  291.  * DESCRIPTION: Load and validate the RSDP (ptr) and RSDT (table)
  292.  *
  293.  ******************************************************************************/
  294. acpi_status
  295. acpi_tb_verify_rsdp (
  296. ACPI_PHYSICAL_ADDRESS   rsdp_physical_address)
  297. {
  298. acpi_table_desc         table_info;
  299. acpi_status             status;
  300. u8                      *table_ptr;
  301. FUNCTION_TRACE ("Tb_verify_rsdp");
  302. /*
  303.  * Obtain access to the RSDP structure
  304.  */
  305. status = acpi_os_map_memory (rsdp_physical_address, sizeof (RSDP_DESCRIPTOR),
  306.   (void **) &table_ptr);
  307. if (ACPI_FAILURE (status)) {
  308. return_ACPI_STATUS (status);
  309. }
  310. /*
  311.  *  The signature and checksum must both be correct
  312.  */
  313. if (STRNCMP ((NATIVE_CHAR *) table_ptr, RSDP_SIG, sizeof (RSDP_SIG)-1) != 0) {
  314. /* Nope, BAD Signature */
  315. status = AE_BAD_SIGNATURE;
  316. goto cleanup;
  317. }
  318. if (acpi_tb_checksum (table_ptr, RSDP_CHECKSUM_LENGTH) != 0) {
  319. /* Nope, BAD Checksum */
  320. status = AE_BAD_CHECKSUM;
  321. goto cleanup;
  322. }
  323. /* TBD: Check extended checksum if table version >= 2 */
  324. /* The RSDP supplied is OK */
  325. table_info.pointer     = (acpi_table_header *) table_ptr;
  326. table_info.length      = sizeof (RSDP_DESCRIPTOR);
  327. table_info.allocation  = ACPI_MEM_MAPPED;
  328. table_info.base_pointer = table_ptr;
  329. /* Save the table pointers and allocation info */
  330. status = acpi_tb_init_table_descriptor (ACPI_TABLE_RSDP, &table_info);
  331. if (ACPI_FAILURE (status)) {
  332. goto cleanup;
  333. }
  334. /* Save the RSDP in a global for easy access */
  335. acpi_gbl_RSDP = (RSDP_DESCRIPTOR *) table_info.pointer;
  336. return_ACPI_STATUS (status);
  337. /* Error exit */
  338. cleanup:
  339. acpi_os_unmap_memory (table_ptr, sizeof (RSDP_DESCRIPTOR));
  340. return_ACPI_STATUS (status);
  341. }
  342. /*******************************************************************************
  343.  *
  344.  * FUNCTION:    Acpi_tb_get_rsdt_address
  345.  *
  346.  * PARAMETERS:  None
  347.  *
  348.  * RETURN:      RSDT physical address
  349.  *
  350.  * DESCRIPTION: Extract the address of the RSDT or XSDT, depending on the
  351.  *              version of the RSDP
  352.  *
  353.  ******************************************************************************/
  354. ACPI_PHYSICAL_ADDRESS
  355. acpi_tb_get_rsdt_address (void)
  356. {
  357. ACPI_PHYSICAL_ADDRESS   physical_address;
  358. FUNCTION_ENTRY ();
  359. /*
  360.  * For RSDP revision 0 or 1, we use the RSDT.
  361.  * For RSDP revision 2 (and above), we use the XSDT
  362.  */
  363. if (acpi_gbl_RSDP->revision < 2) {
  364. #ifdef _IA64
  365. /* 0.71 RSDP has 64bit Rsdt address field */
  366. physical_address = ((RSDP_DESCRIPTOR_REV071 *)acpi_gbl_RSDP)->rsdt_physical_address;
  367. #else
  368. physical_address = (ACPI_PHYSICAL_ADDRESS) acpi_gbl_RSDP->rsdt_physical_address;
  369. #endif
  370. }
  371. else {
  372. physical_address = (ACPI_PHYSICAL_ADDRESS)
  373.    ACPI_GET_ADDRESS (acpi_gbl_RSDP->xsdt_physical_address);
  374. }
  375. return (physical_address);
  376. }
  377. /*******************************************************************************
  378.  *
  379.  * FUNCTION:    Acpi_tb_validate_rsdt
  380.  *
  381.  * PARAMETERS:  Table_ptr       - Addressable pointer to the RSDT.
  382.  *
  383.  * RETURN:      Status
  384.  *
  385.  * DESCRIPTION: Validate signature for the RSDT or XSDT
  386.  *
  387.  ******************************************************************************/
  388. acpi_status
  389. acpi_tb_validate_rsdt (
  390. acpi_table_header       *table_ptr)
  391. {
  392. u32                     no_match;
  393. PROC_NAME ("Tb_validate_rsdt");
  394. /*
  395.  * For RSDP revision 0 or 1, we use the RSDT.
  396.  * For RSDP revision 2 (and above), we use the XSDT
  397.  */
  398. if (acpi_gbl_RSDP->revision < 2) {
  399. no_match = STRNCMP ((char *) table_ptr, RSDT_SIG,
  400.   sizeof (RSDT_SIG) -1);
  401. }
  402. else {
  403. no_match = STRNCMP ((char *) table_ptr, XSDT_SIG,
  404.   sizeof (XSDT_SIG) -1);
  405. }
  406. if (no_match) {
  407. /* Invalid RSDT or XSDT signature */
  408. REPORT_ERROR (("Invalid signature where RSDP indicates RSDT/XSDT should be locatedn"));
  409. DUMP_BUFFER (acpi_gbl_RSDP, 20);
  410. ACPI_DEBUG_PRINT_RAW ((ACPI_DB_ERROR,
  411. "RSDT/XSDT signature at %X is invalidn",
  412. acpi_gbl_RSDP->rsdt_physical_address));
  413. return (AE_BAD_SIGNATURE);
  414. }
  415. return (AE_OK);
  416. }
  417. /*******************************************************************************
  418.  *
  419.  * FUNCTION:    Acpi_tb_get_table_pointer
  420.  *
  421.  * PARAMETERS:  Physical_address    - Address from RSDT
  422.  *              Flags               - virtual or physical addressing
  423.  *              Table_ptr           - Addressable address (output)
  424.  *
  425.  * RETURN:      Status
  426.  *
  427.  * DESCRIPTION: Create an addressable pointer to an ACPI table
  428.  *
  429.  ******************************************************************************/
  430. acpi_status
  431. acpi_tb_get_table_pointer (
  432. ACPI_PHYSICAL_ADDRESS   physical_address,
  433. u32                     flags,
  434. u32                     *size,
  435. acpi_table_header       **table_ptr)
  436. {
  437. acpi_status             status;
  438. FUNCTION_ENTRY ();
  439. if ((flags & ACPI_MEMORY_MODE) == ACPI_LOGICAL_ADDRESSING) {
  440. *size = SIZE_IN_HEADER;
  441. status = acpi_tb_map_acpi_table (physical_address, size, table_ptr);
  442. }
  443. else {
  444. *size = 0;
  445. *table_ptr = (acpi_table_header *) (ACPI_TBLPTR) physical_address;
  446. status = AE_OK;
  447. }
  448. return (status);
  449. }
  450. /*******************************************************************************
  451.  *
  452.  * FUNCTION:    Acpi_tb_get_table_rsdt
  453.  *
  454.  * PARAMETERS:  Number_of_tables    - Where the table count is placed
  455.  *
  456.  * RETURN:      Status
  457.  *
  458.  * DESCRIPTION: Load and validate the RSDP (ptr) and RSDT (table)
  459.  *
  460.  ******************************************************************************/
  461. acpi_status
  462. acpi_tb_get_table_rsdt (
  463. u32                     *number_of_tables)
  464. {
  465. acpi_table_desc         table_info;
  466. acpi_status             status;
  467. ACPI_PHYSICAL_ADDRESS   physical_address;
  468. FUNCTION_TRACE ("Tb_get_table_rsdt");
  469. /*
  470.  * Get the RSDT from the RSDP
  471.  */
  472. ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
  473. "RSDP located at %p, RSDT physical=%8.8X%8.8X n",
  474. acpi_gbl_RSDP, HIDWORD(acpi_gbl_RSDP->rsdt_physical_address),
  475. LODWORD(acpi_gbl_RSDP->rsdt_physical_address)));
  476. physical_address = acpi_tb_get_rsdt_address ();
  477. /* Get the RSDT/XSDT */
  478. status = acpi_tb_get_table (physical_address, NULL, &table_info);
  479. if (ACPI_FAILURE (status)) {
  480. ACPI_DEBUG_PRINT ((ACPI_DB_ERROR, "Could not get the RSDT, %sn",
  481. acpi_format_exception (status)));
  482. return_ACPI_STATUS (status);
  483. }
  484. /* Check the RSDT or XSDT signature */
  485. status = acpi_tb_validate_rsdt (table_info.pointer);
  486. if (ACPI_FAILURE (status)) {
  487. return_ACPI_STATUS (status);
  488. }
  489. /*
  490.  * Valid RSDT signature, verify the checksum.  If it fails, just
  491.  * print a warning and ignore it.
  492.  */
  493. status = acpi_tb_verify_table_checksum (table_info.pointer);
  494. /* Convert and/or copy to an XSDT structure */
  495. status = acpi_tb_convert_to_xsdt (&table_info, number_of_tables);
  496. if (ACPI_FAILURE (status)) {
  497. return_ACPI_STATUS (status);
  498. }
  499. /* Save the table pointers and allocation info */
  500. status = acpi_tb_init_table_descriptor (ACPI_TABLE_XSDT, &table_info);
  501. if (ACPI_FAILURE (status)) {
  502. return_ACPI_STATUS (status);
  503. }
  504. acpi_gbl_XSDT = (xsdt_descriptor *) table_info.pointer;
  505. ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "XSDT located at %pn", acpi_gbl_XSDT));
  506. return_ACPI_STATUS (status);
  507. }
  508. /******************************************************************************
  509.  *
  510.  * FUNCTION:    Acpi_tb_get_table_facs
  511.  *
  512.  * PARAMETERS:  *Buffer_ptr             - If Buffer_ptr is valid, read data from
  513.  *                                        buffer rather than searching memory
  514.  *              *Table_info             - Where the table info is returned
  515.  *
  516.  * RETURN:      Status
  517.  *
  518.  * DESCRIPTION: Returns a pointer to the FACS as defined in FADT.  This
  519.  *              function assumes the global variable FADT has been
  520.  *              correctly initialized.  The value of FADT->Firmware_ctrl
  521.  *              into a far pointer which is returned.
  522.  *
  523.  *****************************************************************************/
  524. acpi_status
  525. acpi_tb_get_table_facs (
  526. acpi_table_header       *buffer_ptr,
  527. acpi_table_desc         *table_info)
  528. {
  529. acpi_table_header       *table_ptr = NULL;
  530. u32                     size;
  531. u8                      allocation;
  532. acpi_status             status = AE_OK;
  533. FUNCTION_TRACE ("Tb_get_table_facs");
  534. /* Must have a valid FADT pointer */
  535. if (!acpi_gbl_FADT) {
  536. return_ACPI_STATUS (AE_NO_ACPI_TABLES);
  537. }
  538. size = sizeof (FACS_DESCRIPTOR);
  539. if (buffer_ptr) {
  540. /*
  541.  * Getting table from a file -- allocate a buffer and
  542.  * read the table.
  543.  */
  544. table_ptr = ACPI_MEM_ALLOCATE (size);
  545. if(!table_ptr) {
  546. return_ACPI_STATUS (AE_NO_MEMORY);
  547. }
  548. MEMCPY (table_ptr, buffer_ptr, size);
  549. /* Save allocation type */
  550. allocation = ACPI_MEM_ALLOCATED;
  551. }
  552. else {
  553. /* Just map the physical memory to our address space */
  554. status = acpi_tb_map_acpi_table ((ACPI_PHYSICAL_ADDRESS) ACPI_GET_ADDRESS (acpi_gbl_FADT->Xfirmware_ctrl),
  555.    &size, &table_ptr);
  556. if (ACPI_FAILURE (status)) {
  557. return_ACPI_STATUS (status);
  558. }
  559. /* Save allocation type */
  560. allocation = ACPI_MEM_MAPPED;
  561. }
  562. /* Return values */
  563. table_info->pointer     = table_ptr;
  564. table_info->length      = size;
  565. table_info->allocation  = allocation;
  566. table_info->base_pointer = table_ptr;
  567. return_ACPI_STATUS (status);
  568. }