Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

192 lines
4.3 KiB

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
callback.c
Abstract:
This module implements all the callbacks that are NT specific from
the AML Interperter
Environment
Kernel mode only
Revision History:
04-Jun-97 Initial Revision
01-Mar-98 Split off all the OSNotify() into osnotify.c
02-Mar-98 Rewrite to make the notifactions work at DPC level
13-Mar-00 Rewrite to handle Load()/Unload()
--*/
#include "pch.h"
//
// Keep track of the number of Loads and Unloads present in the system
//
ULONG AcpiTableDelta = 0;
NTSTATUS
EXPORT
ACPICallBackLoad(
IN ULONG EventType,
IN ULONG NotifyType,
IN ULONG EventData,
IN PNSOBJ AcpiObject,
IN ULONG EventParameter
)
/*++
Routine Description:
This routine is called when before we process the Load() and after we
finish the Load() operator.
The purpose of this function is to do the work required to load the
table. We actually split the work to be done at the start of the
load process and the work to be done after the table has been loaded
Arguments:
EventType - EVTYPE_OPCODE_EX
NotifyType - This indicates wether or not we have completed the Load() yet
EventData - OP_LOAD
AcpiObject - the affected name space object (ignored)
EventParam - Supplied information (ignored)
Return Value:
NTSTATUS
--*/
{
ULONG newValue;
if (NotifyType == OPEXF_NOTIFY_PRE) {
//
// We are being called before the load operator. Increment
// the count of Load()'s outstanding. If this value reaches
// 1, then we know that this is the first instance..
//
newValue = InterlockedIncrement( &AcpiTableDelta );
if (newValue == 1) {
//
// We need to get rid of the GPEs...
//
ACPIGpeClearEventMasks();
}
return STATUS_SUCCESS;
}
//
// We are being called after the load operator. Decrement the Load()'s
// outstanding. If this value reaches 0, then we know what we are the
// last instance
//
newValue = InterlockedDecrement( &AcpiTableDelta );
if (newValue == 0) {
//
// We re-enable to re-enable the GPEs
//
ACPIGpeBuildEventMasks();
//
// We also need to process the table...
//
ACPITableLoad();
}
return STATUS_SUCCESS;
}
NTSTATUS
EXPORT
ACPICallBackUnload(
IN ULONG EventType,
IN ULONG NotifyType,
IN ULONG EventData,
IN PNSOBJ AcpiObject,
IN ULONG EventParameter
)
/*++
Routine Description:
This routine is called when the AML interpreter has started unloading
a Differentiated Data Block
Arguments:
EventType - The event type (should be EVTYPE_OPCODE)
NotifyType - This indicates wether or not we have completed the
Unload() yet
EventData - The event subtype (should be OP_UNLOAD)
AcpiObject - The affected name space object (ignored)
EventParamter - The event specific information
Return Value:
NTSTATUS
--*/
{
ULONG newValue;
if (NotifyType == OPEXF_NOTIFY_PRE) {
//
// We are being called before the load operator. Increment
// the count of Load()'s outstanding. If this value reaches
// 1, then we know that this is the first instance..
//
newValue = InterlockedIncrement( &AcpiTableDelta );
if (newValue == 1) {
//
// We need to get rid of the GPEs...
//
ACPIGpeClearEventMasks();
}
//
// Lets try to flush the power and device queues
//
ACPIBuildFlushQueue( RootDeviceExtension );
ACPIDevicePowerFlushQueue( RootDeviceExtension );
return STATUS_SUCCESS;
}
//
// We are being called after the load operator. Decrement the Load()'s
// outstanding. If this value reaches 0, then we know what we are the
// last instance
//
newValue = InterlockedDecrement( &AcpiTableDelta );
if (newValue == 0) {
//
// We re-enable to re-enable the GPEs
//
ACPIGpeBuildEventMasks();
//
// We also need to process the disappearing table...
//
ACPITableUnload();
}
return STATUS_SUCCESS;
}