1 /******************************************************************************
3 * Module Name: aetables - ACPI table setup/install for acpiexec utility
5 *****************************************************************************/
7 /******************************************************************************
11 * Some or all of this work - Copyright (c) 1999 - 2021, Intel Corp.
12 * All rights reserved.
16 * 2.1. This is your license from Intel Corp. under its intellectual property
17 * rights. You may have additional license terms from the party that provided
18 * you this software, covering your right to use that party's intellectual
21 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22 * copy of the source code appearing in this file ("Covered Code") an
23 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24 * base code distributed originally by Intel ("Original Intel Code") to copy,
25 * make derivatives, distribute, use and display any portion of the Covered
26 * Code in any form, with the right to sublicense such rights; and
28 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29 * license (with the right to sublicense), under only those claims of Intel
30 * patents that are infringed by the Original Intel Code, to make, use, sell,
31 * offer to sell, and import the Covered Code and derivative works thereof
32 * solely to the minimum extent necessary to exercise the above copyright
33 * license, and in no event shall the patent license extend to any additions
34 * to or modifications of the Original Intel Code. No other license or right
35 * is granted directly or by implication, estoppel or otherwise;
37 * The above copyright and patent license is granted only if the following
42 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43 * Redistribution of source code of any substantial portion of the Covered
44 * Code or modification with rights to further distribute source must include
45 * the above Copyright Notice, the above License, this list of Conditions,
46 * and the following Disclaimer and Export Compliance provision. In addition,
47 * Licensee must cause all Covered Code to which Licensee contributes to
48 * contain a file documenting the changes Licensee made to create that Covered
49 * Code and the date of any change. Licensee must include in that file the
50 * documentation of any changes made by any predecessor Licensee. Licensee
51 * must include a prominent statement that the modification is derived,
52 * directly or indirectly, from Original Intel Code.
54 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55 * Redistribution of source code of any substantial portion of the Covered
56 * Code or modification without rights to further distribute source must
57 * include the following Disclaimer and Export Compliance provision in the
58 * documentation and/or other materials provided with distribution. In
59 * addition, Licensee may not authorize further sublicense of source of any
60 * portion of the Covered Code, and must include terms to the effect that the
61 * license from Licensee to its licensee is limited to the intellectual
62 * property embodied in the software Licensee provides to its licensee, and
63 * not to intellectual property embodied in modifications its licensee may
66 * 3.3. Redistribution of Executable. Redistribution in executable form of any
67 * substantial portion of the Covered Code or modification must reproduce the
68 * above Copyright Notice, and the following Disclaimer and Export Compliance
69 * provision in the documentation and/or other materials provided with the
72 * 3.4. Intel retains all right, title, and interest in and to the Original
75 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76 * Intel shall be used in advertising or otherwise to promote the sale, use or
77 * other dealings in products derived from or relating to the Covered Code
78 * without prior written authorization from Intel.
80 * 4. Disclaimer and Export Compliance
82 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83 * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85 * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86 * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
90 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
99 * 4.3. Licensee shall not export, either directly or indirectly, any of this
100 * software or system incorporating such software without first obtaining any
101 * required license or other approval from the U. S. Department of Commerce or
102 * any other agency or department of the United States Government. In the
103 * event Licensee exports any such software from the United States or
104 * re-exports any such software from a foreign destination, Licensee shall
105 * ensure that the distribution and export/re-export of the software is in
106 * compliance with all laws, regulations, orders, or other restrictions of the
107 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108 * any of its subsidiaries will export/re-export any technical data, process,
109 * software, or service, directly or indirectly, to any country for which the
110 * United States government or any agency thereof requires an export license,
111 * other governmental approval, or letter of assurance, without first obtaining
112 * such license, approval or letter.
114 *****************************************************************************
116 * Alternatively, you may choose to be licensed under the terms of the
119 * Redistribution and use in source and binary forms, with or without
120 * modification, are permitted provided that the following conditions
122 * 1. Redistributions of source code must retain the above copyright
123 * notice, this list of conditions, and the following disclaimer,
124 * without modification.
125 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
126 * substantially similar to the "NO WARRANTY" disclaimer below
127 * ("Disclaimer") and any redistribution must be conditioned upon
128 * including a substantially similar Disclaimer requirement for further
129 * binary redistribution.
130 * 3. Neither the names of the above-listed copyright holders nor the names
131 * of any contributors may be used to endorse or promote products derived
132 * from this software without specific prior written permission.
134 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
146 * Alternatively, you may choose to be licensed under the terms of the
147 * GNU General Public License ("GPL") version 2 as published by the Free
148 * Software Foundation.
150 *****************************************************************************/
152 #include "aecommon.h"
153 #include "aetables.h"
155 #define _COMPONENT ACPI_TOOLS
156 ACPI_MODULE_NAME ("aetables")
158 /* Local prototypes */
161 AeInitializeTableHeader (
162 ACPI_TABLE_HEADER *Header,
168 ACPI_TABLE_HEADER *ExistingTable,
169 ACPI_TABLE_HEADER **NewTable);
171 /* User table (DSDT) */
173 static ACPI_TABLE_HEADER *DsdtToInstallOverride;
175 /* Non-AML tables that are constructed locally and installed */
177 static ACPI_TABLE_RSDP LocalRSDP;
178 static ACPI_TABLE_FACS LocalFACS;
179 static ACPI_TABLE_HEADER LocalTEST;
180 static ACPI_TABLE_HEADER LocalBADTABLE;
183 * We need a local FADT so that the hardware subcomponent will function,
184 * even though the underlying OSD HW access functions don't do anything.
186 static ACPI_TABLE_FADT LocalFADT;
189 * Use XSDT so that both 32- and 64-bit versions of this utility will
190 * function automatically.
192 static ACPI_TABLE_XSDT *LocalXSDT;
194 #define BASE_XSDT_TABLES 9
195 #define BASE_XSDT_SIZE ((BASE_XSDT_TABLES) * sizeof (UINT64))
197 #define ACPI_MAX_INIT_TABLES (32)
200 /******************************************************************************
202 * FUNCTION: AeTableOverride
204 * DESCRIPTION: Local implementation of AcpiOsTableOverride.
205 * Exercise the override mechanism
207 *****************************************************************************/
211 ACPI_TABLE_HEADER *ExistingTable,
212 ACPI_TABLE_HEADER **NewTable)
215 if (!AcpiGbl_LoadTestTables)
221 /* This code exercises the table override mechanism in the core */
223 if (ACPI_COMPARE_NAMESEG (ExistingTable->Signature, ACPI_SIG_DSDT))
225 *NewTable = DsdtToInstallOverride;
228 /* This code tests override of dynamically loaded tables */
230 else if (ACPI_COMPARE_NAMESEG (ExistingTable->Signature, "OEM9"))
232 *NewTable = ACPI_CAST_PTR (ACPI_TABLE_HEADER, Ssdt3Code);
237 /******************************************************************************
239 * FUNCTION: AeInitializeTableHeader
241 * PARAMETERS: Header - A valid standard ACPI table header
242 * Signature - Signature to insert
243 * Length - Length of the table
245 * RETURN: None. Header is modified.
247 * DESCRIPTION: Initialize the table header for a local ACPI table.
249 *****************************************************************************/
252 AeInitializeTableHeader (
253 ACPI_TABLE_HEADER *Header,
258 ACPI_COPY_NAMESEG (Header->Signature, Signature);
259 Header->Length = Length;
261 Header->OemRevision = 0x1001;
262 memcpy (Header->OemId, "Intel ", ACPI_OEM_ID_SIZE);
263 memcpy (Header->OemTableId, "AcpiExec", ACPI_OEM_TABLE_ID_SIZE);
264 ACPI_COPY_NAMESEG (Header->AslCompilerId, "INTL");
265 Header->AslCompilerRevision = ACPI_CA_VERSION;
267 /* Set the checksum, must set to zero first */
269 Header->Checksum = 0;
270 Header->Checksum = (UINT8) -AcpiTbChecksum (
271 (void *) Header, Header->Length);
275 /******************************************************************************
277 * FUNCTION: AeBuildLocalTables
279 * PARAMETERS: TableCount - Number of tables on the command line
280 * ListHead - List of actual tables from files
284 * DESCRIPTION: Build a complete ACPI table chain, with a local RSDP, XSDT,
285 * FADT, and several other test tables.
287 *****************************************************************************/
291 ACPI_NEW_TABLE_DESC *ListHead)
293 UINT32 TableCount = 1;
294 ACPI_PHYSICAL_ADDRESS DsdtAddress = 0;
296 ACPI_NEW_TABLE_DESC *NextTable;
298 ACPI_TABLE_FADT *ExternalFadt = NULL;
302 * Update the table count. For the DSDT, it is not put into the XSDT.
303 * For the FADT, this table is already accounted for since we usually
304 * install a local FADT.
306 NextTable = ListHead;
309 if (!ACPI_COMPARE_NAMESEG (NextTable->Table->Signature, ACPI_SIG_DSDT) &&
310 !ACPI_COMPARE_NAMESEG (NextTable->Table->Signature, ACPI_SIG_FADT))
315 NextTable = NextTable->Next;
318 XsdtSize = (((TableCount + 1) * sizeof (UINT64)) +
319 sizeof (ACPI_TABLE_HEADER));
320 if (AcpiGbl_LoadTestTables)
322 XsdtSize += BASE_XSDT_SIZE;
327 LocalXSDT = AcpiOsAllocate (XsdtSize);
330 return (AE_NO_MEMORY);
333 memset (LocalXSDT, 0, XsdtSize);
334 LocalXSDT->TableOffsetEntry[0] = ACPI_PTR_TO_PHYSADDR (&LocalFADT);
338 * Install the user tables. The DSDT must be installed in the FADT.
339 * All other tables are installed directly into the XSDT.
341 NextTable = ListHead;
345 * Incoming DSDT or FADT are special cases. All other tables are
346 * just immediately installed into the XSDT.
348 if (ACPI_COMPARE_NAMESEG (NextTable->Table->Signature, ACPI_SIG_DSDT))
352 printf ("Already found a DSDT, only one allowed\n");
353 return (AE_ALREADY_EXISTS);
356 /* The incoming user table is a DSDT */
358 DsdtAddress = ACPI_PTR_TO_PHYSADDR (NextTable->Table);
359 DsdtToInstallOverride = NextTable->Table;
361 else if (ACPI_COMPARE_NAMESEG (NextTable->Table->Signature, ACPI_SIG_FADT))
363 ExternalFadt = ACPI_CAST_PTR (ACPI_TABLE_FADT, NextTable->Table);
364 LocalXSDT->TableOffsetEntry[0] = ACPI_PTR_TO_PHYSADDR (NextTable->Table);
368 /* Install the table in the XSDT */
370 LocalXSDT->TableOffsetEntry[NextIndex] =
371 ACPI_PTR_TO_PHYSADDR (NextTable->Table);
375 NextTable = NextTable->Next;
378 /* Install the optional extra local tables */
380 if (AcpiGbl_LoadTestTables)
382 LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&LocalTEST);
383 LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&LocalBADTABLE);
385 /* Install two SSDTs to test multiple table support */
387 LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&Ssdt1Code);
388 LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&Ssdt2Code);
390 /* Install the OEM1 table to test LoadTable */
392 LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&Oem1Code);
394 /* Install the OEMx table to test LoadTable */
396 LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&OemxCode);
398 /* Install the ECDT table to test _REG */
400 LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&EcdtCode);
402 /* Install two UEFIs to test multiple table support */
404 LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&Uefi1Code);
405 LocalXSDT->TableOffsetEntry[NextIndex++] = ACPI_PTR_TO_PHYSADDR (&Uefi2Code);
408 /* Build an RSDP. Contains a valid XSDT only, no RSDT */
410 memset (&LocalRSDP, 0, sizeof (ACPI_TABLE_RSDP));
411 ACPI_MAKE_RSDP_SIG (LocalRSDP.Signature);
412 memcpy (LocalRSDP.OemId, "Intel", 6);
414 LocalRSDP.Revision = 2;
415 LocalRSDP.XsdtPhysicalAddress = ACPI_PTR_TO_PHYSADDR (LocalXSDT);
416 LocalRSDP.Length = sizeof (ACPI_TABLE_RSDP);
418 /* Set checksums for both XSDT and RSDP */
420 AeInitializeTableHeader ((void *) LocalXSDT, ACPI_SIG_XSDT, XsdtSize);
422 LocalRSDP.Checksum = 0;
423 LocalRSDP.Checksum = (UINT8) -AcpiTbChecksum (
424 (void *) &LocalRSDP, ACPI_RSDP_CHECKSUM_LENGTH);
428 /* Use the local DSDT because incoming table(s) are all SSDT(s) */
430 DsdtAddress = ACPI_PTR_TO_PHYSADDR (LocalDsdtCode);
431 DsdtToInstallOverride = ACPI_CAST_PTR (ACPI_TABLE_HEADER, LocalDsdtCode);
435 * Build an FADT. There are three options for the FADT:
436 * 1) Incoming external FADT specified on the command line
437 * 2) A "hardware reduced" local FADT
438 * 3) A fully featured local FADT
440 memset (&LocalFADT, 0, sizeof (ACPI_TABLE_FADT));
445 * Use the external FADT, but we must update the DSDT/FACS
446 * addresses as well as the checksum
448 ExternalFadt->Dsdt = (UINT32) DsdtAddress;
449 if (!AcpiGbl_ReducedHardware)
451 ExternalFadt->Facs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
455 * If there room in the FADT for the XDsdt and XFacs 64-bit
456 * pointers, use them.
458 if (ExternalFadt->Header.Length > ACPI_PTR_DIFF (
459 &ExternalFadt->XDsdt, ExternalFadt))
461 ExternalFadt->Dsdt = 0;
462 ExternalFadt->Facs = 0;
464 ExternalFadt->XDsdt = DsdtAddress;
465 if (!AcpiGbl_ReducedHardware)
467 ExternalFadt->XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
471 /* Complete the external FADT with the checksum */
473 ExternalFadt->Header.Checksum = 0;
474 ExternalFadt->Header.Checksum = (UINT8) -AcpiTbChecksum (
475 (void *) ExternalFadt, ExternalFadt->Header.Length);
477 else if (AcpiGbl_UseHwReducedFadt)
479 memcpy (&LocalFADT, HwReducedFadtCode, ACPI_FADT_V5_SIZE);
481 LocalFADT.XDsdt = DsdtAddress;
486 * Build a local FADT so we can test the hardware/event init
488 LocalFADT.Header.Revision = 5;
490 /* Setup FADT header and DSDT/FACS addresses */
495 LocalFADT.XDsdt = DsdtAddress;
496 LocalFADT.XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
498 /* Miscellaneous FADT fields */
500 LocalFADT.Gpe0BlockLength = 0x20;
501 LocalFADT.Gpe0Block = 0x00003210;
503 LocalFADT.Gpe1BlockLength = 0x20;
504 LocalFADT.Gpe1Block = 0x0000BA98;
505 LocalFADT.Gpe1Base = 0x80;
507 LocalFADT.Pm1EventLength = 4;
508 LocalFADT.Pm1aEventBlock = 0x00001aaa;
509 LocalFADT.Pm1bEventBlock = 0x00001bbb;
511 LocalFADT.Pm1ControlLength = 2;
512 LocalFADT.Pm1aControlBlock = 0xB0;
514 LocalFADT.PmTimerLength = 4;
515 LocalFADT.PmTimerBlock = 0xA0;
517 LocalFADT.Pm2ControlBlock = 0xC0;
518 LocalFADT.Pm2ControlLength = 1;
520 /* Setup one example X-64 GAS field */
522 LocalFADT.XPm1bEventBlock.SpaceId = ACPI_ADR_SPACE_SYSTEM_IO;
523 LocalFADT.XPm1bEventBlock.Address = LocalFADT.Pm1bEventBlock;
524 LocalFADT.XPm1bEventBlock.BitWidth = (UINT8)
525 ACPI_MUL_8 (LocalFADT.Pm1EventLength);
528 AeInitializeTableHeader ((void *) &LocalFADT,
529 ACPI_SIG_FADT, sizeof (ACPI_TABLE_FADT));
533 memset (&LocalFACS, 0, sizeof (ACPI_TABLE_FACS));
534 ACPI_COPY_NAMESEG (LocalFACS.Signature, ACPI_SIG_FACS);
536 LocalFACS.Length = sizeof (ACPI_TABLE_FACS);
537 LocalFACS.GlobalLock = 0x11AA0011;
539 /* Build the optional local tables */
541 if (AcpiGbl_LoadTestTables)
544 * Build a fake table [TEST] so that we make sure that the
545 * ACPICA core ignores it
547 memset (&LocalTEST, 0, sizeof (ACPI_TABLE_HEADER));
548 ACPI_COPY_NAMESEG (LocalTEST.Signature, "TEST");
550 LocalTEST.Revision = 1;
551 LocalTEST.Length = sizeof (ACPI_TABLE_HEADER);
553 LocalTEST.Checksum = 0;
554 LocalTEST.Checksum = (UINT8) -AcpiTbChecksum (
555 (void *) &LocalTEST, LocalTEST.Length);
558 * Build a fake table with a bad signature [BAD!] so that we make
559 * sure that the ACPICA core ignores it
561 memset (&LocalBADTABLE, 0, sizeof (ACPI_TABLE_HEADER));
562 ACPI_COPY_NAMESEG (LocalBADTABLE.Signature, "BAD!");
564 LocalBADTABLE.Revision = 1;
565 LocalBADTABLE.Length = sizeof (ACPI_TABLE_HEADER);
567 LocalBADTABLE.Checksum = 0;
568 LocalBADTABLE.Checksum = (UINT8) -AcpiTbChecksum (
569 (void *) &LocalBADTABLE, LocalBADTABLE.Length);
576 /******************************************************************************
578 * FUNCTION: AeInstallTables
584 * DESCRIPTION: Install the various ACPI tables
586 *****************************************************************************/
593 ACPI_TABLE_HEADER Header;
594 ACPI_TABLE_HEADER *Table;
598 Status = AcpiInitializeTables (NULL, ACPI_MAX_INIT_TABLES, TRUE);
599 ACPI_CHECK_OK (AcpiInitializeTables, Status);
602 * The following code is prepared to test the deferred table
603 * verification mechanism. When AcpiGbl_EnableTableValidation is set
604 * to FALSE by default, AcpiReallocateRootTable() sets it back to TRUE
605 * and triggers the deferred table verification mechanism accordingly.
607 (void) AcpiReallocateRootTable ();
609 if (AcpiGbl_LoadTestTables)
611 /* Test multiple table/UEFI support. First, get the headers */
613 Status = AcpiGetTableHeader (ACPI_SIG_UEFI, 1, &Header);
614 ACPI_CHECK_OK (AcpiGetTableHeader, Status);
616 Status = AcpiGetTableHeader (ACPI_SIG_UEFI, 2, &Header);
617 ACPI_CHECK_OK (AcpiGetTableHeader, Status);
619 Status = AcpiGetTableHeader (ACPI_SIG_UEFI, 3, &Header);
620 ACPI_CHECK_STATUS (AcpiGetTableHeader, Status, AE_NOT_FOUND);
622 /* Now get the actual tables */
624 Status = AcpiGetTable (ACPI_SIG_UEFI, 1, &Table);
625 ACPI_CHECK_OK (AcpiGetTable, Status);
627 Status = AcpiGetTable (ACPI_SIG_UEFI, 2, &Table);
628 ACPI_CHECK_OK (AcpiGetTable, Status);
630 Status = AcpiGetTable (ACPI_SIG_UEFI, 3, &Table);
631 ACPI_CHECK_STATUS (AcpiGetTable, Status, AE_NOT_FOUND);
634 /* Check that we can get all of the ACPI tables */
638 Status = AcpiGetTableByIndex (i, &Table);
639 if ((Status == AE_BAD_PARAMETER) || !Table)
644 ACPI_CHECK_OK (AcpiGetTableByIndex, Status);
651 /******************************************************************************
653 * FUNCTION: AeLoadTables
659 * DESCRIPTION: Load the definition block ACPI tables
661 *****************************************************************************/
670 Status = AcpiLoadTables ();
671 ACPI_CHECK_OK (AcpiLoadTables, Status);
674 * Test run-time control method installation. Do it twice to test code
675 * for an existing name.
677 Status = AcpiInstallMethod (MethodCode);
678 ACPI_CHECK_OK (AcpiInstallMethod, Status);
680 Status = AcpiInstallMethod (MethodCode);
681 ACPI_CHECK_OK (AcpiInstallMethod, Status);
687 /******************************************************************************
689 * FUNCTION: AcpiOsGetRootPointer
691 * PARAMETERS: Flags - not used
692 * Address - Where the root pointer is returned
696 * DESCRIPTION: Return a local RSDP, used to dynamically load tables via the
697 * standard ACPI mechanism.
699 *****************************************************************************/
701 ACPI_PHYSICAL_ADDRESS
702 AcpiOsGetRootPointer (
706 return (ACPI_PTR_TO_PHYSADDR (&LocalRSDP));