1 /******************************************************************************
2  *
3  * Module Name: aeexec - Support routines for AcpiExec utility
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2016, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #include "aecommon.h"
45 
46 #define _COMPONENT          ACPI_TOOLS
47         ACPI_MODULE_NAME    ("aeexec")
48 
49 /* Local prototypes */
50 
51 static ACPI_STATUS
52 AeSetupConfiguration (
53     void                    *RegionAddr);
54 
55 static void
56 AeTestBufferArgument (
57     void);
58 
59 static void
60 AeTestPackageArgument (
61     void);
62 
63 static ACPI_STATUS
64 AeGetDevices (
65     ACPI_HANDLE             ObjHandle,
66     UINT32                  NestingLevel,
67     void                    *Context,
68     void                    **ReturnValue);
69 
70 static ACPI_STATUS
71 ExecuteOSI (
72     char                    *OsiString,
73     UINT64                  ExpectedResult);
74 
75 static void
76 AeMutexInterfaces (
77     void);
78 
79 static void
80 AeHardwareInterfaces (
81     void);
82 
83 static void
84 AeGenericRegisters (
85     void);
86 
87 static void
88 AeTestSleepData (
89     void);
90 
91 #if (!ACPI_REDUCED_HARDWARE)
92 static void
93 AfInstallGpeBlock (
94     void);
95 #endif /* !ACPI_REDUCED_HARDWARE */
96 
97 extern unsigned char Ssdt2Code[];
98 extern unsigned char Ssdt3Code[];
99 extern unsigned char Ssdt4Code[];
100 
101 
102 /******************************************************************************
103  *
104  * FUNCTION:    AeSetupConfiguration
105  *
106  * PARAMETERS:  RegionAddr          - Address for an ACPI table to be loaded
107  *                                    dynamically. Test purposes only.
108  *
109  * RETURN:      Status
110  *
111  * DESCRIPTION: Call AML _CFG configuration control method
112  *
113  *****************************************************************************/
114 
115 static ACPI_STATUS
116 AeSetupConfiguration (
117     void                    *RegionAddr)
118 {
119     ACPI_OBJECT_LIST        ArgList;
120     ACPI_OBJECT             Arg[3];
121 
122 
123     /*
124      * Invoke _CFG method if present
125      */
126     ArgList.Count = 1;
127     ArgList.Pointer = Arg;
128 
129     Arg[0].Type = ACPI_TYPE_INTEGER;
130     Arg[0].Integer.Value = ACPI_TO_INTEGER (RegionAddr);
131 
132     (void) AcpiEvaluateObject (NULL, "\\_CFG", &ArgList, NULL);
133     return (AE_OK);
134 }
135 
136 
137 #if (!ACPI_REDUCED_HARDWARE)
138 /******************************************************************************
139  *
140  * FUNCTION:    AfInstallGpeBlock
141  *
142  * PARAMETERS:  None
143  *
144  * RETURN:      None
145  *
146  * DESCRIPTION: Test GPE block device initialization. Requires test ASL with
147  *              A \GPE2 device.
148  *
149  *****************************************************************************/
150 
151 static void
152 AfInstallGpeBlock (
153     void)
154 {
155     ACPI_STATUS                 Status;
156     ACPI_HANDLE                 Handle;
157     ACPI_GENERIC_ADDRESS        BlockAddress;
158     ACPI_HANDLE                 GpeDevice;
159     ACPI_OBJECT_TYPE            Type;
160 
161 
162     /* _GPE should always exist */
163 
164     Status = AcpiGetHandle (NULL, "\\_GPE", &Handle);
165     ACPI_CHECK_OK (AcpiGetHandle, Status);
166     if (ACPI_FAILURE (Status))
167     {
168         return;
169     }
170 
171     memset (&BlockAddress, 0, sizeof (ACPI_GENERIC_ADDRESS));
172     BlockAddress.SpaceId = ACPI_ADR_SPACE_SYSTEM_MEMORY;
173     BlockAddress.Address = 0x76540000;
174 
175     /* Attempt to install a GPE block on GPE2 (if present) */
176 
177     Status = AcpiGetHandle (NULL, "\\GPE2", &Handle);
178     if (ACPI_SUCCESS (Status))
179     {
180         Status = AcpiGetType (Handle, &Type);
181         if (ACPI_FAILURE (Status) ||
182            (Type != ACPI_TYPE_DEVICE))
183         {
184             return;
185         }
186 
187         Status = AcpiInstallGpeBlock (Handle, &BlockAddress, 7, 8);
188         ACPI_CHECK_OK (AcpiInstallGpeBlock, Status);
189 
190         Status = AcpiInstallGpeHandler (Handle, 8,
191             ACPI_GPE_LEVEL_TRIGGERED, AeGpeHandler, NULL);
192         ACPI_CHECK_OK (AcpiInstallGpeHandler, Status);
193 
194         Status = AcpiEnableGpe (Handle, 8);
195         ACPI_CHECK_OK (AcpiEnableGpe, Status);
196 
197         Status = AcpiGetGpeDevice (0x30, &GpeDevice);
198         ACPI_CHECK_OK (AcpiGetGpeDevice, Status);
199 
200         Status = AcpiGetGpeDevice (0x42, &GpeDevice);
201         ACPI_CHECK_OK (AcpiGetGpeDevice, Status);
202 
203         Status = AcpiGetGpeDevice (AcpiCurrentGpeCount-1, &GpeDevice);
204         ACPI_CHECK_OK (AcpiGetGpeDevice, Status);
205 
206         Status = AcpiGetGpeDevice (AcpiCurrentGpeCount, &GpeDevice);
207         ACPI_CHECK_STATUS (AcpiGetGpeDevice, Status, AE_NOT_EXIST);
208 
209         Status = AcpiRemoveGpeHandler (Handle, 8, AeGpeHandler);
210         ACPI_CHECK_OK (AcpiRemoveGpeHandler, Status);
211     }
212 
213     /* Attempt to install a GPE block on GPE3 (if present) */
214 
215     Status = AcpiGetHandle (NULL, "\\GPE3", &Handle);
216     if (ACPI_SUCCESS (Status))
217     {
218         Status = AcpiGetType (Handle, &Type);
219         if (ACPI_FAILURE (Status) ||
220            (Type != ACPI_TYPE_DEVICE))
221         {
222             return;
223         }
224 
225         Status = AcpiInstallGpeBlock (Handle, &BlockAddress, 8, 11);
226         ACPI_CHECK_OK (AcpiInstallGpeBlock, Status);
227     }
228 }
229 #endif /* !ACPI_REDUCED_HARDWARE */
230 
231 
232 /* Test using a Buffer object as a method argument */
233 
234 static void
235 AeTestBufferArgument (
236     void)
237 {
238     ACPI_OBJECT_LIST        Params;
239     ACPI_OBJECT             BufArg;
240     UINT8                   Buffer[] =
241     {
242         0,0,0,0,
243         4,0,0,0,
244         1,2,3,4
245     };
246 
247 
248     BufArg.Type = ACPI_TYPE_BUFFER;
249     BufArg.Buffer.Length = 12;
250     BufArg.Buffer.Pointer = Buffer;
251 
252     Params.Count = 1;
253     Params.Pointer = &BufArg;
254 
255     (void) AcpiEvaluateObject (NULL, "\\BUF", &Params, NULL);
256 }
257 
258 
259 static ACPI_OBJECT                 PkgArg;
260 static ACPI_OBJECT                 PkgElements[5];
261 static ACPI_OBJECT                 Pkg2Elements[5];
262 static ACPI_OBJECT_LIST            Params;
263 
264 
265 /*
266  * Test using a Package object as an method argument
267  */
268 static void
269 AeTestPackageArgument (
270     void)
271 {
272 
273     /* Main package */
274 
275     PkgArg.Type = ACPI_TYPE_PACKAGE;
276     PkgArg.Package.Count = 4;
277     PkgArg.Package.Elements = PkgElements;
278 
279     /* Main package elements */
280 
281     PkgElements[0].Type = ACPI_TYPE_INTEGER;
282     PkgElements[0].Integer.Value = 0x22228888;
283 
284     PkgElements[1].Type = ACPI_TYPE_STRING;
285     PkgElements[1].String.Length = sizeof ("Top-level package");
286     PkgElements[1].String.Pointer = "Top-level package";
287 
288     PkgElements[2].Type = ACPI_TYPE_BUFFER;
289     PkgElements[2].Buffer.Length = sizeof ("XXXX");
290     PkgElements[2].Buffer.Pointer = (UINT8 *) "XXXX";
291 
292     PkgElements[3].Type = ACPI_TYPE_PACKAGE;
293     PkgElements[3].Package.Count = 2;
294     PkgElements[3].Package.Elements = Pkg2Elements;
295 
296     /* Subpackage elements */
297 
298     Pkg2Elements[0].Type = ACPI_TYPE_INTEGER;
299     Pkg2Elements[0].Integer.Value = 0xAAAABBBB;
300 
301     Pkg2Elements[1].Type = ACPI_TYPE_STRING;
302     Pkg2Elements[1].String.Length = sizeof ("Nested Package");
303     Pkg2Elements[1].String.Pointer = "Nested Package";
304 
305     /* Parameter object */
306 
307     Params.Count = 1;
308     Params.Pointer = &PkgArg;
309 
310     (void) AcpiEvaluateObject (NULL, "\\_PKG", &Params, NULL);
311 }
312 
313 
314 static ACPI_STATUS
315 AeGetDevices (
316     ACPI_HANDLE                     ObjHandle,
317     UINT32                          NestingLevel,
318     void                            *Context,
319     void                            **ReturnValue)
320 {
321 
322     return (AE_OK);
323 }
324 
325 
326 /******************************************************************************
327  *
328  * FUNCTION:    ExecuteOSI
329  *
330  * PARAMETERS:  OsiString           - String passed to _OSI method
331  *              ExpectedResult      - 0 (FALSE) or ACPI_UINT64_MAX (TRUE)
332  *
333  * RETURN:      Status
334  *
335  * DESCRIPTION: Execute the internally implemented (in ACPICA) _OSI method.
336  *
337  *****************************************************************************/
338 
339 static ACPI_STATUS
340 ExecuteOSI (
341     char                    *OsiString,
342     UINT64                  ExpectedResult)
343 {
344     ACPI_STATUS             Status;
345     ACPI_OBJECT_LIST        ArgList;
346     ACPI_OBJECT             Arg[1];
347     ACPI_BUFFER             ReturnValue;
348     ACPI_OBJECT             *Obj;
349 
350 
351     /* Setup input argument */
352 
353     ArgList.Count = 1;
354     ArgList.Pointer = Arg;
355 
356     Arg[0].Type = ACPI_TYPE_STRING;
357     Arg[0].String.Pointer = OsiString;
358     Arg[0].String.Length = strlen (Arg[0].String.Pointer);
359 
360     /* Ask ACPICA to allocate space for the return object */
361 
362     ReturnValue.Length = ACPI_ALLOCATE_BUFFER;
363 
364     Status = AcpiEvaluateObject (NULL, "\\_OSI", &ArgList, &ReturnValue);
365 
366     if (ACPI_FAILURE (Status))
367     {
368         AcpiOsPrintf (
369             "Could not execute _OSI method, %s\n",
370             AcpiFormatException (Status));
371         return (Status);
372     }
373 
374     Status = AE_ERROR;
375 
376     if (ReturnValue.Length < sizeof (ACPI_OBJECT))
377     {
378         AcpiOsPrintf (
379             "Return value from _OSI method too small, %.8X\n",
380             ReturnValue.Length);
381         goto ErrorExit;
382     }
383 
384     Obj = ReturnValue.Pointer;
385     if (Obj->Type != ACPI_TYPE_INTEGER)
386     {
387         AcpiOsPrintf (
388             "Invalid return type from _OSI method, %.2X\n", Obj->Type);
389         goto ErrorExit;
390     }
391 
392     if (Obj->Integer.Value != ExpectedResult)
393     {
394         AcpiOsPrintf (
395             "Invalid return value from _OSI, expected %8.8X%8.8X found %8.8X%8.8X\n",
396             ACPI_FORMAT_UINT64 (ExpectedResult),
397             ACPI_FORMAT_UINT64 (Obj->Integer.Value));
398         goto ErrorExit;
399     }
400 
401     Status = AE_OK;
402 
403     /* Reset the OSI data */
404 
405     AcpiGbl_OsiData = 0;
406 
407 ErrorExit:
408 
409     /* Free a buffer created via ACPI_ALLOCATE_BUFFER */
410 
411     AcpiOsFree (ReturnValue.Pointer);
412     return (Status);
413 }
414 
415 
416 /******************************************************************************
417  *
418  * FUNCTION:    AeGenericRegisters
419  *
420  * DESCRIPTION: Call the AcpiRead/Write interfaces.
421  *
422  *****************************************************************************/
423 
424 static ACPI_GENERIC_ADDRESS       GenericRegister;
425 
426 static void
427 AeGenericRegisters (
428     void)
429 {
430     ACPI_STATUS             Status;
431     UINT64                  Value;
432 
433 
434     GenericRegister.Address = 0x1234;
435     GenericRegister.BitWidth = 64;
436     GenericRegister.BitOffset = 0;
437     GenericRegister.SpaceId = ACPI_ADR_SPACE_SYSTEM_IO;
438 
439     Status = AcpiRead (&Value, &GenericRegister);
440     ACPI_CHECK_OK (AcpiRead, Status);
441 
442     Status = AcpiWrite (Value, &GenericRegister);
443     ACPI_CHECK_OK (AcpiWrite, Status);
444 
445     GenericRegister.Address = 0x12345678;
446     GenericRegister.BitOffset = 0;
447     GenericRegister.SpaceId = ACPI_ADR_SPACE_SYSTEM_MEMORY;
448 
449     Status = AcpiRead (&Value, &GenericRegister);
450     ACPI_CHECK_OK (AcpiRead, Status);
451 
452     Status = AcpiWrite (Value, &GenericRegister);
453     ACPI_CHECK_OK (AcpiWrite, Status);
454 }
455 
456 
457 /******************************************************************************
458  *
459  * FUNCTION:    AeMutexInterfaces
460  *
461  * DESCRIPTION: Exercise the AML mutex access interfaces
462  *
463  *****************************************************************************/
464 
465 static void
466 AeMutexInterfaces (
467     void)
468 {
469     ACPI_STATUS             Status;
470     ACPI_HANDLE             MutexHandle;
471 
472 
473     /* Get a handle to an AML mutex */
474 
475     Status = AcpiGetHandle (NULL, "\\MTX1", &MutexHandle);
476     if (Status == AE_NOT_FOUND)
477     {
478         return;
479     }
480 
481     ACPI_CHECK_OK (AcpiGetHandle, Status);
482     if (ACPI_FAILURE (Status))
483     {
484         return;
485     }
486 
487     /* Acquire the  mutex */
488 
489     Status = AcpiAcquireMutex (NULL, "\\MTX1", 0xFFFF);
490     ACPI_CHECK_OK (AcpiAcquireMutex, Status);
491     if (ACPI_FAILURE (Status))
492     {
493         return;
494     }
495 
496     /* Release mutex with different parameters */
497 
498     Status = AcpiReleaseMutex (MutexHandle, NULL);
499     ACPI_CHECK_OK (AcpiReleaseMutex, Status);
500 }
501 
502 
503 /******************************************************************************
504  *
505  * FUNCTION:    AeHardwareInterfaces
506  *
507  * DESCRIPTION: Call various hardware support interfaces
508  *
509  *****************************************************************************/
510 
511 static void
512 AeHardwareInterfaces (
513     void)
514 {
515 #if (!ACPI_REDUCED_HARDWARE)
516 
517     ACPI_STATUS             Status;
518     UINT32                  Value;
519 
520 
521     /* If Hardware Reduced flag is set, we are all done */
522 
523     if (AcpiGbl_ReducedHardware)
524     {
525         return;
526     }
527 
528     Status = AcpiWriteBitRegister (ACPI_BITREG_WAKE_STATUS, 1);
529     ACPI_CHECK_OK (AcpiWriteBitRegister, Status);
530 
531     Status = AcpiWriteBitRegister (ACPI_BITREG_GLOBAL_LOCK_ENABLE, 1);
532     ACPI_CHECK_OK (AcpiWriteBitRegister, Status);
533 
534     Status = AcpiWriteBitRegister (ACPI_BITREG_SLEEP_ENABLE, 1);
535     ACPI_CHECK_OK (AcpiWriteBitRegister, Status);
536 
537     Status = AcpiWriteBitRegister (ACPI_BITREG_ARB_DISABLE, 1);
538     ACPI_CHECK_OK (AcpiWriteBitRegister, Status);
539 
540 
541     Status = AcpiReadBitRegister (ACPI_BITREG_WAKE_STATUS, &Value);
542     ACPI_CHECK_OK (AcpiReadBitRegister, Status);
543 
544     Status = AcpiReadBitRegister (ACPI_BITREG_GLOBAL_LOCK_ENABLE, &Value);
545     ACPI_CHECK_OK (AcpiReadBitRegister, Status);
546 
547     Status = AcpiReadBitRegister (ACPI_BITREG_SLEEP_ENABLE, &Value);
548     ACPI_CHECK_OK (AcpiReadBitRegister, Status);
549 
550     Status = AcpiReadBitRegister (ACPI_BITREG_ARB_DISABLE, &Value);
551     ACPI_CHECK_OK (AcpiReadBitRegister, Status);
552 
553 #endif /* !ACPI_REDUCED_HARDWARE */
554 }
555 
556 
557 /******************************************************************************
558  *
559  * FUNCTION:    AeTestSleepData
560  *
561  * DESCRIPTION: Exercise the sleep/wake support (_S0, _S1, etc.)
562  *
563  *****************************************************************************/
564 
565 static void
566 AeTestSleepData (
567     void)
568 {
569     int                     State;
570     UINT8                   TypeA;
571     UINT8                   TypeB;
572     ACPI_STATUS             Status;
573 
574 
575     /* Attempt to get sleep data for all known sleep states */
576 
577     for (State = ACPI_STATE_S0; State <= ACPI_S_STATES_MAX; State++)
578     {
579         Status = AcpiGetSleepTypeData ((UINT8) State, &TypeA, &TypeB);
580 
581         /* All sleep methods are optional */
582 
583         if (Status != AE_NOT_FOUND)
584         {
585             ACPI_CHECK_OK (AcpiGetSleepTypeData, Status);
586         }
587     }
588 }
589 
590 
591 /******************************************************************************
592  *
593  * FUNCTION:    AeMiscellaneousTests
594  *
595  * DESCRIPTION: Various ACPICA validation tests.
596  *
597  *****************************************************************************/
598 
599 void
600 AeMiscellaneousTests (
601     void)
602 {
603     ACPI_BUFFER             ReturnBuf;
604     char                    Buffer[32];
605     ACPI_STATUS             Status;
606     ACPI_STATISTICS         Stats;
607     ACPI_HANDLE             Handle;
608 
609 #if (!ACPI_REDUCED_HARDWARE)
610     UINT32                  LockHandle1;
611     UINT32                  LockHandle2;
612     ACPI_VENDOR_UUID        Uuid =
613         {0, {ACPI_INIT_UUID (0,0,0,0,0,0,0,0,0,0,0)}};
614 #endif /* !ACPI_REDUCED_HARDWARE */
615 
616 
617     Status = AcpiGetHandle (NULL, "\\", &Handle);
618     ACPI_CHECK_OK (AcpiGetHandle, Status);
619 
620     if (AcpiGbl_DoInterfaceTests)
621     {
622         /*
623          * Tests for AcpiLoadTable and AcpiUnloadParentTable
624          */
625 
626         /* Attempt unload of DSDT, should fail */
627 
628         Status = AcpiGetHandle (NULL, "\\_SB_", &Handle);
629         ACPI_CHECK_OK (AcpiGetHandle, Status);
630 
631         Status = AcpiUnloadParentTable (Handle);
632         ACPI_CHECK_STATUS (AcpiUnloadParentTable, Status, AE_TYPE);
633 
634         /* Load and unload SSDT4 */
635 
636         Status = AcpiLoadTable ((ACPI_TABLE_HEADER *) Ssdt4Code);
637         ACPI_CHECK_OK (AcpiLoadTable, Status);
638 
639         Status = AcpiGetHandle (NULL, "\\_T96", &Handle);
640         ACPI_CHECK_OK (AcpiGetHandle, Status);
641 
642         Status = AcpiUnloadParentTable (Handle);
643         ACPI_CHECK_OK (AcpiUnloadParentTable, Status);
644 
645         /* Re-load SSDT4 */
646 
647         Status = AcpiLoadTable ((ACPI_TABLE_HEADER *) Ssdt4Code);
648         ACPI_CHECK_OK (AcpiLoadTable, Status);
649 
650         /* Unload and re-load SSDT2 (SSDT2 is in the XSDT) */
651 
652         Status = AcpiGetHandle (NULL, "\\_T99", &Handle);
653         ACPI_CHECK_OK (AcpiGetHandle, Status);
654 
655         Status = AcpiUnloadParentTable (Handle);
656         ACPI_CHECK_OK (AcpiUnloadParentTable, Status);
657 
658         Status = AcpiLoadTable ((ACPI_TABLE_HEADER *) Ssdt2Code);
659         ACPI_CHECK_OK (AcpiLoadTable, Status);
660 
661         /* Load OEM9 table (causes table override) */
662 
663         Status = AcpiLoadTable ((ACPI_TABLE_HEADER *) Ssdt3Code);
664         ACPI_CHECK_OK (AcpiLoadTable, Status);
665     }
666 
667     AeHardwareInterfaces ();
668     AeGenericRegisters ();
669     AeSetupConfiguration (Ssdt3Code);
670 
671     AeTestBufferArgument();
672     AeTestPackageArgument ();
673     AeMutexInterfaces ();
674     AeTestSleepData ();
675 
676     /* Test _OSI install/remove */
677 
678     Status = AcpiInstallInterface ("");
679     ACPI_CHECK_STATUS (AcpiInstallInterface, Status, AE_BAD_PARAMETER);
680 
681     Status = AcpiInstallInterface ("TestString");
682     ACPI_CHECK_OK (AcpiInstallInterface, Status);
683 
684     Status = AcpiInstallInterface ("TestString");
685     ACPI_CHECK_STATUS (AcpiInstallInterface, Status, AE_ALREADY_EXISTS);
686 
687     Status = AcpiRemoveInterface ("Windows 2006");
688     ACPI_CHECK_OK (AcpiRemoveInterface, Status);
689 
690     Status = AcpiRemoveInterface ("TestString");
691     ACPI_CHECK_OK (AcpiRemoveInterface, Status);
692 
693     Status = AcpiRemoveInterface ("XXXXXX");
694     ACPI_CHECK_STATUS (AcpiRemoveInterface, Status, AE_NOT_EXIST);
695 
696     Status = AcpiInstallInterface ("AnotherTestString");
697     ACPI_CHECK_OK (AcpiInstallInterface, Status);
698 
699     /* Test _OSI execution */
700 
701     Status = ExecuteOSI ("Extended Address Space Descriptor", ACPI_UINT64_MAX);
702     ACPI_CHECK_OK (ExecuteOSI, Status);
703 
704     Status = ExecuteOSI ("Windows 2001", ACPI_UINT64_MAX);
705     ACPI_CHECK_OK (ExecuteOSI, Status);
706 
707     Status = ExecuteOSI ("MichiganTerminalSystem", 0);
708     ACPI_CHECK_OK (ExecuteOSI, Status);
709 
710 
711     ReturnBuf.Length = 32;
712     ReturnBuf.Pointer = Buffer;
713 
714     Status = AcpiGetName (ACPI_ROOT_OBJECT,
715         ACPI_FULL_PATHNAME_NO_TRAILING, &ReturnBuf);
716     ACPI_CHECK_OK (AcpiGetName, Status);
717 
718     /* Get Devices */
719 
720     Status = AcpiGetDevices (NULL, AeGetDevices, NULL, NULL);
721     ACPI_CHECK_OK (AcpiGetDevices, Status);
722 
723     Status = AcpiGetStatistics (&Stats);
724     ACPI_CHECK_OK (AcpiGetStatistics, Status);
725 
726 
727 #if (!ACPI_REDUCED_HARDWARE)
728 
729     Status = AcpiInstallGlobalEventHandler (AeGlobalEventHandler, NULL);
730     ACPI_CHECK_OK (AcpiInstallGlobalEventHandler, Status);
731 
732     /* If Hardware Reduced flag is set, we are all done */
733 
734     if (AcpiGbl_ReducedHardware)
735     {
736         return;
737     }
738 
739     Status = AcpiEnableEvent (ACPI_EVENT_GLOBAL, 0);
740     ACPI_CHECK_OK (AcpiEnableEvent, Status);
741 
742     /*
743      * GPEs: Handlers, enable/disable, etc.
744      */
745     Status = AcpiInstallGpeHandler (NULL, 0,
746         ACPI_GPE_LEVEL_TRIGGERED, AeGpeHandler, NULL);
747     ACPI_CHECK_OK (AcpiInstallGpeHandler, Status);
748 
749     Status = AcpiEnableGpe (NULL, 0);
750     ACPI_CHECK_OK (AcpiEnableGpe, Status);
751 
752     Status = AcpiRemoveGpeHandler (NULL, 0, AeGpeHandler);
753     ACPI_CHECK_OK (AcpiRemoveGpeHandler, Status);
754 
755     Status = AcpiInstallGpeHandler (NULL, 0,
756         ACPI_GPE_LEVEL_TRIGGERED, AeGpeHandler, NULL);
757     ACPI_CHECK_OK (AcpiInstallGpeHandler, Status);
758 
759     Status = AcpiEnableGpe (NULL, 0);
760     ACPI_CHECK_OK (AcpiEnableGpe, Status);
761 
762     Status = AcpiSetGpe (NULL, 0, ACPI_GPE_DISABLE);
763     ACPI_CHECK_OK (AcpiSetGpe, Status);
764 
765     Status = AcpiSetGpe (NULL, 0, ACPI_GPE_ENABLE);
766     ACPI_CHECK_OK (AcpiSetGpe, Status);
767 
768 
769     Status = AcpiInstallGpeHandler (NULL, 1,
770         ACPI_GPE_EDGE_TRIGGERED, AeGpeHandler, NULL);
771     ACPI_CHECK_OK (AcpiInstallGpeHandler, Status);
772 
773     Status = AcpiEnableGpe (NULL, 1);
774     ACPI_CHECK_OK (AcpiEnableGpe, Status);
775 
776 
777     Status = AcpiInstallGpeHandler (NULL, 2,
778         ACPI_GPE_LEVEL_TRIGGERED, AeGpeHandler, NULL);
779     ACPI_CHECK_OK (AcpiInstallGpeHandler, Status);
780 
781     Status = AcpiEnableGpe (NULL, 2);
782     ACPI_CHECK_OK (AcpiEnableGpe, Status);
783 
784 
785     Status = AcpiInstallGpeHandler (NULL, 3,
786         ACPI_GPE_EDGE_TRIGGERED, AeGpeHandler, NULL);
787     ACPI_CHECK_OK (AcpiInstallGpeHandler, Status);
788 
789     Status = AcpiInstallGpeHandler (NULL, 4,
790         ACPI_GPE_LEVEL_TRIGGERED, AeGpeHandler, NULL);
791     ACPI_CHECK_OK (AcpiInstallGpeHandler, Status);
792 
793     Status = AcpiInstallGpeHandler (NULL, 5,
794         ACPI_GPE_EDGE_TRIGGERED, AeGpeHandler, NULL);
795     ACPI_CHECK_OK (AcpiInstallGpeHandler, Status);
796 
797     Status = AcpiGetHandle (NULL, "\\_SB", &Handle);
798     ACPI_CHECK_OK (AcpiGetHandle, Status);
799 
800     Status = AcpiSetupGpeForWake (Handle, NULL, 5);
801     ACPI_CHECK_OK (AcpiSetupGpeForWake, Status);
802 
803     Status = AcpiSetGpeWakeMask (NULL, 5, ACPI_GPE_ENABLE);
804     ACPI_CHECK_OK (AcpiSetGpeWakeMask, Status);
805 
806     Status = AcpiSetupGpeForWake (Handle, NULL, 6);
807     ACPI_CHECK_OK (AcpiSetupGpeForWake, Status);
808 
809     Status = AcpiSetupGpeForWake (ACPI_ROOT_OBJECT, NULL, 6);
810     ACPI_CHECK_OK (AcpiSetupGpeForWake, Status);
811 
812     Status = AcpiSetupGpeForWake (Handle, NULL, 9);
813     ACPI_CHECK_OK (AcpiSetupGpeForWake, Status);
814 
815     Status = AcpiInstallGpeHandler (NULL, 0x19,
816         ACPI_GPE_LEVEL_TRIGGERED, AeGpeHandler, NULL);
817     ACPI_CHECK_OK (AcpiInstallGpeHandler, Status);
818 
819     Status = AcpiEnableGpe (NULL, 0x19);
820     ACPI_CHECK_OK (AcpiEnableGpe, Status);
821 
822 
823     /* GPE block 1 */
824 
825     Status = AcpiInstallGpeHandler (NULL, 101,
826         ACPI_GPE_LEVEL_TRIGGERED, AeGpeHandler, NULL);
827     ACPI_CHECK_OK (AcpiInstallGpeHandler, Status);
828 
829     Status = AcpiEnableGpe (NULL, 101);
830     ACPI_CHECK_OK (AcpiEnableGpe, Status);
831 
832     Status = AcpiDisableGpe (NULL, 101);
833     ACPI_CHECK_OK (AcpiDisableGpe, Status);
834 
835     AfInstallGpeBlock ();
836 
837     /* Here is where the GPEs are actually "enabled" */
838 
839     Status = AcpiUpdateAllGpes ();
840     ACPI_CHECK_OK (AcpiUpdateAllGpes, Status);
841 
842     Status = AcpiGetHandle (NULL, "RSRC", &Handle);
843     if (ACPI_SUCCESS (Status))
844     {
845         ReturnBuf.Length = ACPI_ALLOCATE_BUFFER;
846 
847         Status = AcpiGetVendorResource (Handle, "_CRS", &Uuid, &ReturnBuf);
848         if (ACPI_SUCCESS (Status))
849         {
850             AcpiOsFree (ReturnBuf.Pointer);
851         }
852     }
853 
854     /* Test global lock */
855 
856     Status = AcpiAcquireGlobalLock (0xFFFF, &LockHandle1);
857     ACPI_CHECK_OK (AcpiAcquireGlobalLock, Status);
858 
859     Status = AcpiAcquireGlobalLock (0x5, &LockHandle2);
860     ACPI_CHECK_OK (AcpiAcquireGlobalLock, Status);
861 
862     Status = AcpiReleaseGlobalLock (LockHandle1);
863     ACPI_CHECK_OK (AcpiReleaseGlobalLock, Status);
864 
865     Status = AcpiReleaseGlobalLock (LockHandle2);
866     ACPI_CHECK_OK (AcpiReleaseGlobalLock, Status);
867 
868 #endif /* !ACPI_REDUCED_HARDWARE */
869 }
870