Subversion Repositories Kolibri OS

Rev

Rev 1498 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1498 serge 1
/******************************************************************************
2
 *
2216 Serge 3
 * Module Name: aetables - ACPI table setup/install for acpiexec utility
1498 serge 4
 *
5
 *****************************************************************************/
6
 
7
/******************************************************************************
8
 *
9
 * 1. Copyright Notice
10
 *
2216 Serge 11
 * Some or all of this work - Copyright (c) 1999 - 2011, Intel Corp.
1498 serge 12
 * All rights reserved.
13
 *
14
 * 2. License
15
 *
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
19
 * property rights.
20
 *
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
27
 *
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;
36
 *
37
 * The above copyright and patent license is granted only if the following
38
 * conditions are met:
39
 *
40
 * 3. Conditions
41
 *
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.
53
 *
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
64
 * make.
65
 *
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
70
 * distribution.
71
 *
72
 * 3.4. Intel retains all right, title, and interest in and to the Original
73
 * Intel Code.
74
 *
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.
79
 *
80
 * 4. Disclaimer and Export Compliance
81
 *
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
88
 * PARTICULAR PURPOSE.
89
 *
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
97
 * LIMITED REMEDY.
98
 *
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.
113
 *
114
 *****************************************************************************/
115
 
116
#include "aecommon.h"
2216 Serge 117
#include "aetables.h"
1498 serge 118
 
119
#define _COMPONENT          ACPI_TOOLS
120
        ACPI_MODULE_NAME    ("aetables")
121
 
122
/* Local prototypes */
123
 
124
void
125
AeTableOverride (
126
    ACPI_TABLE_HEADER       *ExistingTable,
127
    ACPI_TABLE_HEADER       **NewTable);
128
 
129
ACPI_PHYSICAL_ADDRESS
130
AeLocalGetRootPointer (
131
    void);
132
 
2216 Serge 133
/* User table (DSDT) */
1498 serge 134
 
2216 Serge 135
static ACPI_TABLE_HEADER        *DsdtToInstallOverride;
1498 serge 136
 
2216 Serge 137
/* Non-AML tables that are constructed locally and installed */
1498 serge 138
 
2216 Serge 139
static ACPI_TABLE_RSDP          LocalRSDP;
140
static ACPI_TABLE_FACS          LocalFACS;
141
static ACPI_TABLE_HEADER        LocalTEST;
142
static ACPI_TABLE_HEADER        LocalBADTABLE;
1498 serge 143
 
144
/*
2216 Serge 145
 * We need a local FADT so that the hardware subcomponent will function,
146
 * even though the underlying OSD HW access functions don't do anything.
1498 serge 147
 */
2216 Serge 148
static ACPI_TABLE_FADT          LocalFADT;
1498 serge 149
 
150
/*
2216 Serge 151
 * Use XSDT so that both 32- and 64-bit versions of this utility will
152
 * function automatically.
1498 serge 153
 */
2216 Serge 154
static ACPI_TABLE_XSDT          *LocalXSDT;
1498 serge 155
 
2216 Serge 156
#define BASE_XSDT_TABLES        8
157
#define BASE_XSDT_SIZE          (sizeof (ACPI_TABLE_XSDT) + \
158
                                    ((BASE_XSDT_TABLES -1) * sizeof (UINT64)))
1498 serge 159
 
2216 Serge 160
#define ACPI_MAX_INIT_TABLES    (32)
161
static ACPI_TABLE_DESC          Tables[ACPI_MAX_INIT_TABLES];
1498 serge 162
 
163
 
164
/******************************************************************************
165
 *
166
 * FUNCTION:    AeTableOverride
167
 *
168
 * DESCRIPTION: Local implementation of AcpiOsTableOverride.
169
 *              Exercise the override mechanism
170
 *
171
 *****************************************************************************/
172
 
173
void
174
AeTableOverride (
175
    ACPI_TABLE_HEADER       *ExistingTable,
176
    ACPI_TABLE_HEADER       **NewTable)
177
{
178
 
179
    /* This code exercises the table override mechanism in the core */
180
 
181
    if (ACPI_COMPARE_NAME (ExistingTable->Signature, ACPI_SIG_DSDT))
182
    {
183
        *NewTable = DsdtToInstallOverride;
184
    }
185
 
186
    /* This code tests override of dynamically loaded tables */
187
 
188
    else if (ACPI_COMPARE_NAME (ExistingTable->Signature, "TSDT"))
189
    {
190
        *NewTable = ACPI_CAST_PTR (ACPI_TABLE_HEADER, Ssdt3Code);
191
    }
192
}
193
 
194
 
195
/******************************************************************************
196
 *
197
 * FUNCTION:    AeBuildLocalTables
198
 *
199
 * PARAMETERS:  TableCount      - Number of tables on the command line
200
 *              TableList       - List of actual tables from files
201
 *
202
 * RETURN:      Status
203
 *
2216 Serge 204
 * DESCRIPTION: Build a complete ACPI table chain, with a local RSDP, XSDT,
1498 serge 205
 *              FADT, and several other test tables.
206
 *
207
 *****************************************************************************/
208
 
209
ACPI_STATUS
210
AeBuildLocalTables (
211
    UINT32                  TableCount,
212
    AE_TABLE_DESC           *TableList)
213
{
214
    ACPI_PHYSICAL_ADDRESS   DsdtAddress = 0;
2216 Serge 215
    UINT32                  XsdtSize;
1498 serge 216
    AE_TABLE_DESC           *NextTable;
217
    UINT32                  NextIndex;
218
    ACPI_TABLE_FADT         *ExternalFadt = NULL;
219
 
220
 
221
    /*
2216 Serge 222
     * Update the table count. For DSDT, it is not put into the XSDT. For
1498 serge 223
     * FADT, this is already accounted for since we usually install a
224
     * local FADT.
225
     */
226
    NextTable = TableList;
227
    while (NextTable)
228
    {
229
        if (ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_DSDT) ||
230
            ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_FADT))
231
        {
232
            TableCount--;
233
        }
234
        NextTable = NextTable->Next;
235
    }
236
 
2216 Serge 237
    XsdtSize = BASE_XSDT_SIZE + (TableCount * sizeof (UINT64));
1498 serge 238
 
2216 Serge 239
    /* Build an XSDT */
1498 serge 240
 
2216 Serge 241
    LocalXSDT = AcpiOsAllocate (XsdtSize);
242
    if (!LocalXSDT)
1498 serge 243
    {
2216 Serge 244
        return (AE_NO_MEMORY);
1498 serge 245
    }
246
 
2216 Serge 247
    ACPI_MEMSET (LocalXSDT, 0, XsdtSize);
248
    ACPI_STRNCPY (LocalXSDT->Header.Signature, ACPI_SIG_XSDT, 4);
249
    LocalXSDT->Header.Length = XsdtSize;
250
    LocalXSDT->Header.Revision = 1;
1498 serge 251
 
2216 Serge 252
    LocalXSDT->TableOffsetEntry[0] = ACPI_PTR_TO_PHYSADDR (&LocalTEST);
253
    LocalXSDT->TableOffsetEntry[1] = ACPI_PTR_TO_PHYSADDR (&LocalBADTABLE);
254
    LocalXSDT->TableOffsetEntry[2] = ACPI_PTR_TO_PHYSADDR (&LocalFADT);
1498 serge 255
 
256
    /* Install two SSDTs to test multiple table support */
257
 
2216 Serge 258
    LocalXSDT->TableOffsetEntry[3] = ACPI_PTR_TO_PHYSADDR (&Ssdt1Code);
259
    LocalXSDT->TableOffsetEntry[4] = ACPI_PTR_TO_PHYSADDR (&Ssdt2Code);
1498 serge 260
 
261
    /* Install the OEM1 table to test LoadTable */
262
 
2216 Serge 263
    LocalXSDT->TableOffsetEntry[5] = ACPI_PTR_TO_PHYSADDR (&Oem1Code);
1498 serge 264
 
265
    /* Install the OEMx table to test LoadTable */
266
 
2216 Serge 267
    LocalXSDT->TableOffsetEntry[6] = ACPI_PTR_TO_PHYSADDR (&OemxCode);
1498 serge 268
 
2216 Serge 269
     /* Install the ECDT table to test _REG */
270
 
271
    LocalXSDT->TableOffsetEntry[7] = ACPI_PTR_TO_PHYSADDR (&EcdtCode);
272
 
273
   /*
1498 serge 274
     * Install the user tables. The DSDT must be installed in the FADT.
2216 Serge 275
     * All other tables are installed directly into the XSDT.
1498 serge 276
     */
2216 Serge 277
    NextIndex = BASE_XSDT_TABLES;
1498 serge 278
    NextTable = TableList;
279
    while (NextTable)
280
    {
281
        /*
282
         * Incoming DSDT or FADT are special cases. All other tables are
2216 Serge 283
         * just immediately installed into the XSDT.
1498 serge 284
         */
285
        if (ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_DSDT))
286
        {
287
            if (DsdtAddress)
288
            {
289
                printf ("Already found a DSDT, only one allowed\n");
2216 Serge 290
                return (AE_ALREADY_EXISTS);
1498 serge 291
            }
292
 
293
            /* The incoming user table is a DSDT */
294
 
295
            DsdtAddress = ACPI_PTR_TO_PHYSADDR (&DsdtCode);
296
            DsdtToInstallOverride = NextTable->Table;
297
        }
298
        else if (ACPI_COMPARE_NAME (NextTable->Table->Signature, ACPI_SIG_FADT))
299
        {
300
            ExternalFadt = ACPI_CAST_PTR (ACPI_TABLE_FADT, NextTable->Table);
2216 Serge 301
            LocalXSDT->TableOffsetEntry[2] = ACPI_PTR_TO_PHYSADDR (NextTable->Table);
1498 serge 302
        }
303
        else
304
        {
2216 Serge 305
            /* Install the table in the XSDT */
1498 serge 306
 
2216 Serge 307
            LocalXSDT->TableOffsetEntry[NextIndex] = ACPI_PTR_TO_PHYSADDR (NextTable->Table);
1498 serge 308
            NextIndex++;
309
        }
310
 
311
        NextTable = NextTable->Next;
312
    }
313
 
314
    /* Build an RSDP */
315
 
316
    ACPI_MEMSET (&LocalRSDP, 0, sizeof (ACPI_TABLE_RSDP));
317
    ACPI_MEMCPY (LocalRSDP.Signature, ACPI_SIG_RSDP, 8);
318
    ACPI_MEMCPY (LocalRSDP.OemId, "I_TEST", 6);
2216 Serge 319
    LocalRSDP.Revision = 2;
320
    LocalRSDP.XsdtPhysicalAddress = ACPI_PTR_TO_PHYSADDR (LocalXSDT);
321
    LocalRSDP.Length = sizeof (ACPI_TABLE_XSDT);
1498 serge 322
 
2216 Serge 323
    /* Set checksums for both XSDT and RSDP */
1498 serge 324
 
2216 Serge 325
    LocalXSDT->Header.Checksum = (UINT8) -AcpiTbChecksum (
326
        (void *) LocalXSDT, LocalXSDT->Header.Length);
1498 serge 327
    LocalRSDP.Checksum = (UINT8) -AcpiTbChecksum (
328
        (void *) &LocalRSDP, ACPI_RSDP_CHECKSUM_LENGTH);
329
 
330
    if (!DsdtAddress)
331
    {
332
        /* Use the local DSDT because incoming table(s) are all SSDT(s) */
333
 
334
        DsdtAddress = ACPI_PTR_TO_PHYSADDR (LocalDsdtCode);
335
        DsdtToInstallOverride = ACPI_CAST_PTR (ACPI_TABLE_HEADER, LocalDsdtCode);
336
    }
337
 
338
    if (ExternalFadt)
339
    {
340
        /*
341
         * Use the external FADT, but we must update the DSDT/FACS addresses
342
         * as well as the checksum
343
         */
344
        ExternalFadt->Dsdt = DsdtAddress;
345
        ExternalFadt->Facs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
346
 
347
        if (ExternalFadt->Header.Length > ACPI_PTR_DIFF (&ExternalFadt->XDsdt, ExternalFadt))
348
        {
349
            ExternalFadt->XDsdt = DsdtAddress;
350
            ExternalFadt->XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
351
        }
352
        /* Complete the FADT with the checksum */
353
 
354
        ExternalFadt->Header.Checksum = 0;
355
        ExternalFadt->Header.Checksum = (UINT8) -AcpiTbChecksum (
356
            (void *) ExternalFadt, ExternalFadt->Header.Length);
357
    }
358
    else
359
    {
360
        /*
361
         * Build a local FADT so we can test the hardware/event init
362
         */
363
        ACPI_MEMSET (&LocalFADT, 0, sizeof (ACPI_TABLE_FADT));
364
        ACPI_STRNCPY (LocalFADT.Header.Signature, ACPI_SIG_FADT, 4);
365
 
366
        /* Setup FADT header and DSDT/FACS addresses */
367
 
2216 Serge 368
        LocalFADT.Dsdt = 0;
369
        LocalFADT.Facs = 0;
1498 serge 370
 
371
        LocalFADT.XDsdt = DsdtAddress;
372
        LocalFADT.XFacs = ACPI_PTR_TO_PHYSADDR (&LocalFACS);
373
 
374
        LocalFADT.Header.Revision = 3;
375
        LocalFADT.Header.Length = sizeof (ACPI_TABLE_FADT);
376
 
377
        /* Miscellaneous FADT fields */
378
 
379
        LocalFADT.Gpe0BlockLength = 16;
2216 Serge 380
        LocalFADT.Gpe0Block = 0x00001234;
381
 
1498 serge 382
        LocalFADT.Gpe1BlockLength = 6;
2216 Serge 383
        LocalFADT.Gpe1Block = 0x00005678;
1498 serge 384
        LocalFADT.Gpe1Base = 96;
385
 
386
        LocalFADT.Pm1EventLength = 4;
387
        LocalFADT.Pm1aEventBlock = 0x00001aaa;
388
        LocalFADT.Pm1bEventBlock = 0x00001bbb;
2216 Serge 389
 
390
        LocalFADT.Pm1ControlLength = 2;
1498 serge 391
        LocalFADT.Pm1aControlBlock = 0xB0;
392
 
2216 Serge 393
        LocalFADT.PmTimerLength = 4;
394
        LocalFADT.PmTimerBlock = 0xA0;
395
 
396
        LocalFADT.Pm2ControlBlock = 0xC0;
397
        LocalFADT.Pm2ControlLength = 1;
398
 
1498 serge 399
        /* Setup one example X-64 field */
400
 
401
        LocalFADT.XPm1bEventBlock.SpaceId = ACPI_ADR_SPACE_SYSTEM_IO;
402
        LocalFADT.XPm1bEventBlock.Address = LocalFADT.Pm1bEventBlock;
403
        LocalFADT.XPm1bEventBlock.BitWidth = (UINT8) ACPI_MUL_8 (LocalFADT.Pm1EventLength);
404
 
405
        /* Complete the FADT with the checksum */
406
 
407
        LocalFADT.Header.Checksum = 0;
408
        LocalFADT.Header.Checksum = (UINT8) -AcpiTbChecksum (
409
            (void *) &LocalFADT, LocalFADT.Header.Length);
410
    }
411
 
412
    /* Build a FACS */
413
 
414
    ACPI_MEMSET (&LocalFACS, 0, sizeof (ACPI_TABLE_FACS));
415
    ACPI_STRNCPY (LocalFACS.Signature, ACPI_SIG_FACS, 4);
416
 
417
    LocalFACS.Length = sizeof (ACPI_TABLE_FACS);
418
    LocalFACS.GlobalLock = 0x11AA0011;
419
 
2216 Serge 420
    /*
421
     * Build a fake table [TEST] so that we make sure that the
422
     * ACPICA core ignores it
423
     */
1498 serge 424
    ACPI_MEMSET (&LocalTEST, 0, sizeof (ACPI_TABLE_HEADER));
425
    ACPI_STRNCPY (LocalTEST.Signature, "TEST", 4);
426
 
427
    LocalTEST.Revision = 1;
428
    LocalTEST.Length = sizeof (ACPI_TABLE_HEADER);
429
    LocalTEST.Checksum = (UINT8) -AcpiTbChecksum (
430
        (void *) &LocalTEST, LocalTEST.Length);
431
 
2216 Serge 432
    /*
433
     * Build a fake table with a bad signature [BAD!] so that we make
434
     * sure that the ACPICA core ignores it
435
     */
1498 serge 436
    ACPI_MEMSET (&LocalBADTABLE, 0, sizeof (ACPI_TABLE_HEADER));
437
    ACPI_STRNCPY (LocalBADTABLE.Signature, "BAD!", 4);
438
 
439
    LocalBADTABLE.Revision = 1;
440
    LocalBADTABLE.Length = sizeof (ACPI_TABLE_HEADER);
441
    LocalBADTABLE.Checksum = (UINT8) -AcpiTbChecksum (
442
        (void *) &LocalBADTABLE, LocalBADTABLE.Length);
443
 
444
    return (AE_OK);
445
}
446
 
447
 
448
/******************************************************************************
449
 *
450
 * FUNCTION:    AeInstallTables
451
 *
452
 * PARAMETERS:  None
453
 *
454
 * RETURN:      Status
455
 *
456
 * DESCRIPTION: Install the various ACPI tables
457
 *
458
 *****************************************************************************/
459
 
460
ACPI_STATUS
461
AeInstallTables (
462
    void)
463
{
464
    ACPI_STATUS             Status;
465
 
2216 Serge 466
 
1498 serge 467
    Status = AcpiInitializeTables (Tables, ACPI_MAX_INIT_TABLES, TRUE);
2216 Serge 468
    AE_CHECK_OK (AcpiInitializeTables, Status);
469
 
1498 serge 470
    Status = AcpiReallocateRootTable ();
2216 Serge 471
    AE_CHECK_OK (AcpiReallocateRootTable, Status);
472
 
1498 serge 473
    Status = AcpiLoadTables ();
2216 Serge 474
    AE_CHECK_OK (AcpiLoadTables, Status);
1498 serge 475
 
476
    /*
477
     * Test run-time control method installation. Do it twice to test code
478
     * for an existing name.
479
     */
480
    Status = AcpiInstallMethod (MethodCode);
481
    if (ACPI_FAILURE (Status))
482
    {
483
        AcpiOsPrintf ("%s, Could not install method\n",
484
            AcpiFormatException (Status));
485
    }
486
 
487
    Status = AcpiInstallMethod (MethodCode);
488
    if (ACPI_FAILURE (Status))
489
    {
490
        AcpiOsPrintf ("%s, Could not install method\n",
491
            AcpiFormatException (Status));
492
    }
493
 
494
    return (AE_OK);
495
}
496
 
497
 
498
/******************************************************************************
499
 *
500
 * FUNCTION:    AeLocalGetRootPointer
501
 *
502
 * PARAMETERS:  Flags       - not used
503
 *              Address     - Where the root pointer is returned
504
 *
505
 * RETURN:      Status
506
 *
507
 * DESCRIPTION: Return a local RSDP, used to dynamically load tables via the
508
 *              standard ACPI mechanism.
509
 *
510
 *****************************************************************************/
511
 
512
ACPI_PHYSICAL_ADDRESS
513
AeLocalGetRootPointer (
514
    void)
515
{
516
 
517
    return ((ACPI_PHYSICAL_ADDRESS) &LocalRSDP);
518
}