aehandlers.c revision 1.1.1.7 1 /******************************************************************************
2 *
3 * Module Name: aehandlers - Various handlers for acpiexec
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2015, 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 ("aehandlers")
48
49
50 /* Local prototypes */
51
52 static void
53 AeNotifyHandler1 (
54 ACPI_HANDLE Device,
55 UINT32 Value,
56 void *Context);
57
58 static void
59 AeNotifyHandler2 (
60 ACPI_HANDLE Device,
61 UINT32 Value,
62 void *Context);
63
64 static void
65 AeCommonNotifyHandler (
66 ACPI_HANDLE Device,
67 UINT32 Value,
68 UINT32 HandlerId);
69
70 static void
71 AeDeviceNotifyHandler (
72 ACPI_HANDLE Device,
73 UINT32 Value,
74 void *Context);
75
76 static ACPI_STATUS
77 AeExceptionHandler (
78 ACPI_STATUS AmlStatus,
79 ACPI_NAME Name,
80 UINT16 Opcode,
81 UINT32 AmlOffset,
82 void *Context);
83
84 static ACPI_STATUS
85 AeTableHandler (
86 UINT32 Event,
87 void *Table,
88 void *Context);
89
90 static void
91 AeAttachedDataHandler (
92 ACPI_HANDLE Object,
93 void *Data);
94
95 static void
96 AeAttachedDataHandler2 (
97 ACPI_HANDLE Object,
98 void *Data);
99
100 static UINT32
101 AeInterfaceHandler (
102 ACPI_STRING InterfaceName,
103 UINT32 Supported);
104
105 #if (!ACPI_REDUCED_HARDWARE)
106 static UINT32
107 AeEventHandler (
108 void *Context);
109
110 static UINT32
111 AeSciHandler (
112 void *Context);
113
114 static char *TableEvents[] =
115 {
116 "LOAD",
117 "UNLOAD",
118 "UNKNOWN"
119 };
120 #endif /* !ACPI_REDUCED_HARDWARE */
121
122
123 static UINT32 SigintCount = 0;
124 static AE_DEBUG_REGIONS AeRegions;
125
126
127 /******************************************************************************
128 *
129 * FUNCTION: AeCtrlCHandler
130 *
131 * PARAMETERS: Sig
132 *
133 * RETURN: none
134 *
135 * DESCRIPTION: Control-C handler. Abort running control method if any.
136 *
137 *****************************************************************************/
138
139 void ACPI_SYSTEM_XFACE
140 AeCtrlCHandler (
141 int Sig)
142 {
143
144 signal (SIGINT, SIG_IGN);
145 SigintCount++;
146
147 AcpiOsPrintf ("Caught a ctrl-c (#%u)\n\n", SigintCount);
148
149 if (AcpiGbl_MethodExecuting)
150 {
151 AcpiGbl_AbortMethod = TRUE;
152 signal (SIGINT, AeCtrlCHandler);
153
154 if (SigintCount < 10)
155 {
156 return;
157 }
158 }
159
160 (void) AcpiOsTerminate ();
161 exit (0);
162 }
163
164
165 /******************************************************************************
166 *
167 * FUNCTION: AeNotifyHandler(s)
168 *
169 * PARAMETERS: Standard notify handler parameters
170 *
171 * RETURN: Status
172 *
173 * DESCRIPTION: Notify handlers for AcpiExec utility. Used by the ASL
174 * test suite(s) to communicate errors and other information to
175 * this utility via the Notify() operator. Tests notify handling
176 * and multiple notify handler support.
177 *
178 *****************************************************************************/
179
180 static void
181 AeNotifyHandler1 (
182 ACPI_HANDLE Device,
183 UINT32 Value,
184 void *Context)
185 {
186 AeCommonNotifyHandler (Device, Value, 1);
187 }
188
189 static void
190 AeNotifyHandler2 (
191 ACPI_HANDLE Device,
192 UINT32 Value,
193 void *Context)
194 {
195 AeCommonNotifyHandler (Device, Value, 2);
196 }
197
198 static void
199 AeCommonNotifyHandler (
200 ACPI_HANDLE Device,
201 UINT32 Value,
202 UINT32 HandlerId)
203 {
204 char *Type;
205
206
207 Type = "Device";
208 if (Value <= ACPI_MAX_SYS_NOTIFY)
209 {
210 Type = "System";
211 }
212
213 switch (Value)
214 {
215 #if 0
216 case 0:
217
218 printf ("[AcpiExec] Method Error 0x%X: Results not equal\n", Value);
219 if (AcpiGbl_DebugFile)
220 {
221 AcpiOsPrintf ("[AcpiExec] Method Error: Results not equal\n");
222 }
223 break;
224
225 case 1:
226
227 printf ("[AcpiExec] Method Error: Incorrect numeric result\n");
228 if (AcpiGbl_DebugFile)
229 {
230 AcpiOsPrintf ("[AcpiExec] Method Error: Incorrect numeric result\n");
231 }
232 break;
233
234 case 2:
235
236 printf ("[AcpiExec] Method Error: An operand was overwritten\n");
237 if (AcpiGbl_DebugFile)
238 {
239 AcpiOsPrintf ("[AcpiExec] Method Error: An operand was overwritten\n");
240 }
241 break;
242
243 #endif
244
245 default:
246
247 printf ("[AcpiExec] Handler %u: Received a %s Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
248 HandlerId, Type, AcpiUtGetNodeName (Device), Device, Value,
249 AcpiUtGetNotifyName (Value, ACPI_TYPE_ANY));
250 if (AcpiGbl_DebugFile)
251 {
252 AcpiOsPrintf ("[AcpiExec] Handler %u: Received a %s notify, Value 0x%2.2X\n",
253 HandlerId, Type, Value);
254 }
255
256 (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
257 break;
258 }
259 }
260
261
262 /******************************************************************************
263 *
264 * FUNCTION: AeSystemNotifyHandler
265 *
266 * PARAMETERS: Standard notify handler parameters
267 *
268 * RETURN: Status
269 *
270 * DESCRIPTION: System notify handler for AcpiExec utility. Used by the ASL
271 * test suite(s) to communicate errors and other information to
272 * this utility via the Notify() operator.
273 *
274 *****************************************************************************/
275
276 static void
277 AeSystemNotifyHandler (
278 ACPI_HANDLE Device,
279 UINT32 Value,
280 void *Context)
281 {
282
283 printf ("[AcpiExec] Global: Received a System Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
284 AcpiUtGetNodeName (Device), Device, Value,
285 AcpiUtGetNotifyName (Value, ACPI_TYPE_ANY));
286 if (AcpiGbl_DebugFile)
287 {
288 AcpiOsPrintf ("[AcpiExec] Global: Received a System Notify, Value 0x%2.2X\n", Value);
289 }
290
291 (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
292 }
293
294
295 /******************************************************************************
296 *
297 * FUNCTION: AeDeviceNotifyHandler
298 *
299 * PARAMETERS: Standard notify handler parameters
300 *
301 * RETURN: Status
302 *
303 * DESCRIPTION: Device notify handler for AcpiExec utility. Used by the ASL
304 * test suite(s) to communicate errors and other information to
305 * this utility via the Notify() operator.
306 *
307 *****************************************************************************/
308
309 static void
310 AeDeviceNotifyHandler (
311 ACPI_HANDLE Device,
312 UINT32 Value,
313 void *Context)
314 {
315
316 printf ("[AcpiExec] Global: Received a Device Notify on [%4.4s] %p Value 0x%2.2X (%s)\n",
317 AcpiUtGetNodeName (Device), Device, Value,
318 AcpiUtGetNotifyName (Value, ACPI_TYPE_ANY));
319 if (AcpiGbl_DebugFile)
320 {
321 AcpiOsPrintf ("[AcpiExec] Global: Received a Device Notify, Value 0x%2.2X\n", Value);
322 }
323
324 (void) AcpiEvaluateObject (Device, "_NOT", NULL, NULL);
325 }
326
327
328 /******************************************************************************
329 *
330 * FUNCTION: AeExceptionHandler
331 *
332 * PARAMETERS: Standard exception handler parameters
333 *
334 * RETURN: Status
335 *
336 * DESCRIPTION: System exception handler for AcpiExec utility.
337 *
338 *****************************************************************************/
339
340 static ACPI_STATUS
341 AeExceptionHandler (
342 ACPI_STATUS AmlStatus,
343 ACPI_NAME Name,
344 UINT16 Opcode,
345 UINT32 AmlOffset,
346 void *Context)
347 {
348 ACPI_STATUS NewAmlStatus = AmlStatus;
349 ACPI_STATUS Status;
350 ACPI_BUFFER ReturnObj;
351 ACPI_OBJECT_LIST ArgList;
352 ACPI_OBJECT Arg[3];
353 const char *Exception;
354
355
356 Exception = AcpiFormatException (AmlStatus);
357 AcpiOsPrintf ("[AcpiExec] Exception %s during execution ", Exception);
358 if (Name)
359 {
360 AcpiOsPrintf ("of method [%4.4s]", (char *) &Name);
361 }
362 else
363 {
364 AcpiOsPrintf ("at module level (table load)");
365 }
366 AcpiOsPrintf (" Opcode [%s] @%X\n", AcpiPsGetOpcodeName (Opcode), AmlOffset);
367
368 /*
369 * Invoke the _ERR method if present
370 *
371 * Setup parameter object
372 */
373 ArgList.Count = 3;
374 ArgList.Pointer = Arg;
375
376 Arg[0].Type = ACPI_TYPE_INTEGER;
377 Arg[0].Integer.Value = AmlStatus;
378
379 Arg[1].Type = ACPI_TYPE_STRING;
380 Arg[1].String.Pointer = ACPI_CAST_PTR (char, Exception);
381 Arg[1].String.Length = strlen (Exception);
382
383 Arg[2].Type = ACPI_TYPE_INTEGER;
384 Arg[2].Integer.Value = AcpiOsGetThreadId();
385
386 /* Setup return buffer */
387
388 ReturnObj.Pointer = NULL;
389 ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
390
391 Status = AcpiEvaluateObject (NULL, "\\_ERR", &ArgList, &ReturnObj);
392 if (ACPI_SUCCESS (Status))
393 {
394 if (ReturnObj.Pointer)
395 {
396 /* Override original status */
397
398 NewAmlStatus = (ACPI_STATUS)
399 ((ACPI_OBJECT *) ReturnObj.Pointer)->Integer.Value;
400
401 /* Free a buffer created via ACPI_ALLOCATE_BUFFER */
402
403 AcpiOsFree (ReturnObj.Pointer);
404 }
405 }
406 else if (Status != AE_NOT_FOUND)
407 {
408 AcpiOsPrintf ("[AcpiExec] Could not execute _ERR method, %s\n",
409 AcpiFormatException (Status));
410 }
411
412 /* Global override */
413
414 if (AcpiGbl_IgnoreErrors)
415 {
416 NewAmlStatus = AE_OK;
417 }
418
419 if (NewAmlStatus != AmlStatus)
420 {
421 AcpiOsPrintf ("[AcpiExec] Exception override, new status %s\n",
422 AcpiFormatException (NewAmlStatus));
423 }
424
425 return (NewAmlStatus);
426 }
427
428
429 /******************************************************************************
430 *
431 * FUNCTION: AeTableHandler
432 *
433 * PARAMETERS: Table handler
434 *
435 * RETURN: Status
436 *
437 * DESCRIPTION: System table handler for AcpiExec utility.
438 *
439 *****************************************************************************/
440
441 static ACPI_STATUS
442 AeTableHandler (
443 UINT32 Event,
444 void *Table,
445 void *Context)
446 {
447 #if (!ACPI_REDUCED_HARDWARE)
448 ACPI_STATUS Status;
449 #endif /* !ACPI_REDUCED_HARDWARE */
450
451
452 if (Event > ACPI_NUM_TABLE_EVENTS)
453 {
454 Event = ACPI_NUM_TABLE_EVENTS;
455 }
456
457 #if (!ACPI_REDUCED_HARDWARE)
458 /* Enable any GPEs associated with newly-loaded GPE methods */
459
460 Status = AcpiUpdateAllGpes ();
461 AE_CHECK_OK (AcpiUpdateAllGpes, Status);
462
463 printf ("[AcpiExec] Table Event %s, [%4.4s] %p\n",
464 TableEvents[Event], ((ACPI_TABLE_HEADER *) Table)->Signature, Table);
465 #endif /* !ACPI_REDUCED_HARDWARE */
466
467 return (AE_OK);
468 }
469
470
471 /******************************************************************************
472 *
473 * FUNCTION: AeGpeHandler
474 *
475 * DESCRIPTION: Common GPE handler for acpiexec
476 *
477 *****************************************************************************/
478
479 UINT32
480 AeGpeHandler (
481 ACPI_HANDLE GpeDevice,
482 UINT32 GpeNumber,
483 void *Context)
484 {
485 ACPI_NAMESPACE_NODE *DeviceNode = (ACPI_NAMESPACE_NODE *) GpeDevice;
486
487
488 AcpiOsPrintf ("[AcpiExec] GPE Handler received GPE %02X (GPE block %4.4s)\n",
489 GpeNumber, GpeDevice ? DeviceNode->Name.Ascii : "FADT");
490
491 return (ACPI_REENABLE_GPE);
492 }
493
494
495 /******************************************************************************
496 *
497 * FUNCTION: AeGlobalEventHandler
498 *
499 * DESCRIPTION: Global GPE/Fixed event handler
500 *
501 *****************************************************************************/
502
503 void
504 AeGlobalEventHandler (
505 UINT32 Type,
506 ACPI_HANDLE Device,
507 UINT32 EventNumber,
508 void *Context)
509 {
510 char *TypeName;
511
512
513 switch (Type)
514 {
515 case ACPI_EVENT_TYPE_GPE:
516
517 TypeName = "GPE";
518 break;
519
520 case ACPI_EVENT_TYPE_FIXED:
521
522 TypeName = "FixedEvent";
523 break;
524
525 default:
526
527 TypeName = "UNKNOWN";
528 break;
529 }
530
531 AcpiOsPrintf ("[AcpiExec] Global Event Handler received: Type %s Number %.2X Dev %p\n",
532 TypeName, EventNumber, Device);
533 }
534
535
536 /******************************************************************************
537 *
538 * FUNCTION: AeAttachedDataHandler
539 *
540 * DESCRIPTION: Handler for deletion of nodes with attached data (attached via
541 * AcpiAttachData)
542 *
543 *****************************************************************************/
544
545 static void
546 AeAttachedDataHandler (
547 ACPI_HANDLE Object,
548 void *Data)
549 {
550 ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
551
552
553 AcpiOsPrintf ("Received an attached data deletion (1) on %4.4s\n",
554 Node->Name.Ascii);
555 }
556
557
558 /******************************************************************************
559 *
560 * FUNCTION: AeAttachedDataHandler2
561 *
562 * DESCRIPTION: Handler for deletion of nodes with attached data (attached via
563 * AcpiAttachData)
564 *
565 *****************************************************************************/
566
567 static void
568 AeAttachedDataHandler2 (
569 ACPI_HANDLE Object,
570 void *Data)
571 {
572 ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Data);
573
574
575 AcpiOsPrintf ("Received an attached data deletion (2) on %4.4s\n",
576 Node->Name.Ascii);
577 }
578
579
580 /******************************************************************************
581 *
582 * FUNCTION: AeInterfaceHandler
583 *
584 * DESCRIPTION: Handler for _OSI invocations
585 *
586 *****************************************************************************/
587
588 static UINT32
589 AeInterfaceHandler (
590 ACPI_STRING InterfaceName,
591 UINT32 Supported)
592 {
593 ACPI_FUNCTION_NAME (AeInterfaceHandler);
594
595
596 ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
597 "Received _OSI (\"%s\"), is %ssupported\n",
598 InterfaceName, Supported == 0 ? "not " : ""));
599
600 return (Supported);
601 }
602
603
604 #if (!ACPI_REDUCED_HARDWARE)
605 /******************************************************************************
606 *
607 * FUNCTION: AeEventHandler, AeSciHandler
608 *
609 * DESCRIPTION: Handler for Fixed Events and SCIs
610 *
611 *****************************************************************************/
612
613 static UINT32
614 AeEventHandler (
615 void *Context)
616 {
617 return (0);
618 }
619
620 static UINT32
621 AeSciHandler (
622 void *Context)
623 {
624
625 AcpiOsPrintf ("[AcpiExec] Received an SCI at handler\n");
626 return (0);
627 }
628
629 #endif /* !ACPI_REDUCED_HARDWARE */
630
631
632 /*******************************************************************************
633 *
634 * FUNCTION: AeInstallSciHandler
635 *
636 * PARAMETERS: None
637 *
638 * RETURN: Status
639 *
640 * DESCRIPTION: Install handler for SCIs. Exercise the code by doing an
641 * install/remove/install.
642 *
643 ******************************************************************************/
644
645 static ACPI_STATUS
646 AeInstallSciHandler (
647 void)
648 {
649 ACPI_STATUS Status;
650
651
652 Status = AcpiInstallSciHandler (AeSciHandler, &AeMyContext);
653 if (ACPI_FAILURE (Status))
654 {
655 ACPI_EXCEPTION ((AE_INFO, Status,
656 "Could not install an SCI handler (1)"));
657 }
658
659 Status = AcpiRemoveSciHandler (AeSciHandler);
660 if (ACPI_FAILURE (Status))
661 {
662 ACPI_EXCEPTION ((AE_INFO, Status,
663 "Could not remove an SCI handler"));
664 }
665
666 Status = AcpiInstallSciHandler (AeSciHandler, &AeMyContext);
667 if (ACPI_FAILURE (Status))
668 {
669 ACPI_EXCEPTION ((AE_INFO, Status,
670 "Could not install an SCI handler (2)"));
671 }
672
673 return (Status);
674 }
675
676
677 /******************************************************************************
678 *
679 * FUNCTION: AeInstallLateHandlers
680 *
681 * PARAMETERS: None
682 *
683 * RETURN: Status
684 *
685 * DESCRIPTION: Install handlers for the AcpiExec utility.
686 *
687 *****************************************************************************/
688
689 ACPI_STATUS
690 AeInstallLateHandlers (
691 void)
692 {
693 ACPI_STATUS Status;
694
695
696 #if (!ACPI_REDUCED_HARDWARE)
697 if (!AcpiGbl_ReducedHardware)
698 {
699 /* Install a user SCI handler */
700
701 Status = AeInstallSciHandler ();
702 AE_CHECK_OK (AeInstallSciHandler, Status);
703
704 /* Install some fixed event handlers */
705
706 Status = AcpiInstallFixedEventHandler (ACPI_EVENT_GLOBAL, AeEventHandler, NULL);
707 AE_CHECK_OK (AcpiInstallFixedEventHandler, Status);
708
709 Status = AcpiInstallFixedEventHandler (ACPI_EVENT_RTC, AeEventHandler, NULL);
710 AE_CHECK_OK (AcpiInstallFixedEventHandler, Status);
711 }
712 #endif /* !ACPI_REDUCED_HARDWARE */
713
714 AeMyContext.Connection = NULL;
715 AeMyContext.AccessLength = 0xA5;
716
717 /*
718 * We will install a handler for each EC device, directly under the EC
719 * device definition. This is unlike the other handlers which we install
720 * at the root node. Also install memory and I/O handlers at any PCI
721 * devices.
722 */
723 AeInstallDeviceHandlers ();
724
725 /*
726 * Install handlers for some of the "device driver" address spaces
727 * such as SMBus, etc.
728 */
729 AeInstallRegionHandlers ();
730 return (AE_OK);
731 }
732
733
734 /******************************************************************************
735 *
736 * FUNCTION: AeInstallEarlyHandlers
737 *
738 * PARAMETERS: None
739 *
740 * RETURN: Status
741 *
742 * DESCRIPTION: Install handlers for the AcpiExec utility.
743 *
744 * Notes: Don't install handler for PCI_Config, we want to use the
745 * default handler to exercise that code.
746 *
747 *****************************************************************************/
748
749 ACPI_STATUS
750 AeInstallEarlyHandlers (
751 void)
752 {
753 ACPI_STATUS Status;
754 ACPI_HANDLE Handle;
755
756
757 ACPI_FUNCTION_ENTRY ();
758
759
760 Status = AcpiInstallInterfaceHandler (AeInterfaceHandler);
761 if (ACPI_FAILURE (Status))
762 {
763 printf ("Could not install interface handler, %s\n",
764 AcpiFormatException (Status));
765 }
766
767 Status = AcpiInstallTableHandler (AeTableHandler, NULL);
768 if (ACPI_FAILURE (Status))
769 {
770 printf ("Could not install table handler, %s\n",
771 AcpiFormatException (Status));
772 }
773
774 Status = AcpiInstallExceptionHandler (AeExceptionHandler);
775 if (ACPI_FAILURE (Status))
776 {
777 printf ("Could not install exception handler, %s\n",
778 AcpiFormatException (Status));
779 }
780
781 /* Install global notify handlers */
782
783 Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY,
784 AeSystemNotifyHandler, NULL);
785 if (ACPI_FAILURE (Status))
786 {
787 printf ("Could not install a global system notify handler, %s\n",
788 AcpiFormatException (Status));
789 }
790
791 Status = AcpiInstallNotifyHandler (ACPI_ROOT_OBJECT, ACPI_DEVICE_NOTIFY,
792 AeDeviceNotifyHandler, NULL);
793 if (ACPI_FAILURE (Status))
794 {
795 printf ("Could not install a global notify handler, %s\n",
796 AcpiFormatException (Status));
797 }
798
799 Status = AcpiGetHandle (NULL, "\\_SB", &Handle);
800 if (ACPI_SUCCESS (Status))
801 {
802 Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
803 AeNotifyHandler1, NULL);
804 if (ACPI_FAILURE (Status))
805 {
806 printf ("Could not install a notify handler, %s\n",
807 AcpiFormatException (Status));
808 }
809
810 Status = AcpiRemoveNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
811 AeNotifyHandler1);
812 if (ACPI_FAILURE (Status))
813 {
814 printf ("Could not remove a notify handler, %s\n",
815 AcpiFormatException (Status));
816 }
817
818 Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
819 AeNotifyHandler1, NULL);
820 AE_CHECK_OK (AcpiInstallNotifyHandler, Status);
821
822 Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
823 AeNotifyHandler1);
824 AE_CHECK_OK (AcpiRemoveNotifyHandler, Status);
825
826 #if 0
827 Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
828 AeNotifyHandler1, NULL);
829 if (ACPI_FAILURE (Status))
830 {
831 printf ("Could not install a notify handler, %s\n",
832 AcpiFormatException (Status));
833 }
834 #endif
835
836 /* Install two handlers for _SB_ */
837
838 Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
839 AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
840
841 Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
842 AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
843
844 /* Attempt duplicate handler installation, should fail */
845
846 Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
847 AeNotifyHandler1, ACPI_CAST_PTR (void, 0x77777777));
848
849 Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
850 AE_CHECK_OK (AcpiAttachData, Status);
851
852 Status = AcpiDetachData (Handle, AeAttachedDataHandler);
853 AE_CHECK_OK (AcpiDetachData, Status);
854
855 /* Test attach data at the root object */
856
857 Status = AcpiAttachData (ACPI_ROOT_OBJECT, AeAttachedDataHandler,
858 AcpiGbl_RootNode);
859 AE_CHECK_OK (AcpiAttachData, Status);
860
861 Status = AcpiAttachData (ACPI_ROOT_OBJECT, AeAttachedDataHandler2,
862 AcpiGbl_RootNode);
863 AE_CHECK_OK (AcpiAttachData, Status);
864
865 /* Test support for multiple attaches */
866
867 Status = AcpiAttachData (Handle, AeAttachedDataHandler, Handle);
868 AE_CHECK_OK (AcpiAttachData, Status);
869
870 Status = AcpiAttachData (Handle, AeAttachedDataHandler2, Handle);
871 AE_CHECK_OK (AcpiAttachData, Status);
872 }
873 else
874 {
875 printf ("No _SB_ found, %s\n", AcpiFormatException (Status));
876 }
877
878
879 Status = AcpiGetHandle (NULL, "\\_TZ.TZ1", &Handle);
880 if (ACPI_SUCCESS (Status))
881 {
882 Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
883 AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
884
885 Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
886 AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
887
888 Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
889 AeNotifyHandler1);
890 Status = AcpiRemoveNotifyHandler (Handle, ACPI_ALL_NOTIFY,
891 AeNotifyHandler2);
892
893 Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
894 AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
895
896 Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
897 AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
898 }
899
900 Status = AcpiGetHandle (NULL, "\\_PR.CPU0", &Handle);
901 if (ACPI_SUCCESS (Status))
902 {
903 Status = AcpiInstallNotifyHandler (Handle, ACPI_ALL_NOTIFY,
904 AeNotifyHandler1, ACPI_CAST_PTR (void, 0x01234567));
905
906 Status = AcpiInstallNotifyHandler (Handle, ACPI_SYSTEM_NOTIFY,
907 AeNotifyHandler2, ACPI_CAST_PTR (void, 0x89ABCDEF));
908 }
909
910 /*
911 * Install handlers that will override the default handlers for some of
912 * the space IDs.
913 */
914 AeOverrideRegionHandlers ();
915
916 /*
917 * Initialize the global Region Handler space
918 * MCW 3/23/00
919 */
920 AeRegions.NumberOfRegions = 0;
921 AeRegions.RegionList = NULL;
922 return (AE_OK);
923 }
924