windows-nt/Source/XPSP1/NT/base/busdrv/acpi/driver/inc/amli.h

400 lines
13 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*** amli.h - AML Interpreter Public Definitions
*
* Copyright (c) 1996,1997 Microsoft Corporation
* Author: Michael Tsang (MikeTs)
* Created 09/03/96
*
* MODIFICATION HISTORY
*/
#ifndef _AMLI_H
#define _AMLI_H
#include <list.h>
#ifndef _INC_NSOBJ_ONLY
/*** Build Options
*/
#if DBG
#define DEBUG
#define DEBUGGER
#define TRACING
#endif
#ifdef MAXDEBUG
#define TRACING
#endif
/*** Macros
*/
#define AMLI_FAC_CODE 0
#define NTINFO(x) (x)
#define NTWARN(x) (x)
#define NTERR(x) (x)
#define AMLIERR(x) (x)
#define STDCALL __stdcall
#define AMLIAPI __cdecl
#ifndef EXPORT
#define EXPORT __cdecl
#endif
// Name space navigation macros
#define NSGETPARENT(p) ((p)->pnsParent)
#define NSGETFIRSTCHILD(p) ((p)->pnsFirstChild)
#define NSGETPREVSIBLING(p) (((p)->pnsParent != NULL && \
(p)->pnsParent->pnsFirstChild != \
(p))? \
(PNSOBJ)((p)->list.plistPrev): NULL)
#define NSGETNEXTSIBLING(p) (((p)->pnsParent != NULL && \
(p)->pnsParent->pnsFirstChild != \
(PNSOBJ)((p)->list.plistNext))? \
(PNSOBJ)((p)->list.plistNext): NULL)
#define NSGETOBJTYPE(p) ((p)->ObjData.dwDataType)
/*** Constants
*/
// AMLI Error Codes
#define AMLIERR_NONE STATUS_SUCCESS
#define AMLIERR_OUT_OF_MEM STATUS_INSUFFICIENT_RESOURCES
#define AMLIERR_INVALID_OPCODE STATUS_ACPI_INVALID_OPCODE
#define AMLIERR_NAME_TOO_LONG STATUS_NAME_TOO_LONG
#define AMLIERR_ASSERT_FAILED STATUS_ACPI_ASSERT_FAILED
#define AMLIERR_INVALID_NAME STATUS_OBJECT_NAME_INVALID
#define AMLIERR_OBJ_NOT_FOUND STATUS_OBJECT_NAME_NOT_FOUND
#define AMLIERR_OBJ_ALREADY_EXIST STATUS_OBJECT_NAME_COLLISION
#define AMLIERR_INDEX_TOO_BIG STATUS_ACPI_INVALID_INDEX
#define AMLIERR_ARG_NOT_EXIST STATUS_ACPI_INVALID_ARGUMENT
#define AMLIERR_FATAL STATUS_ACPI_FATAL
#define AMLIERR_INVALID_SUPERNAME STATUS_ACPI_INVALID_SUPERNAME
#define AMLIERR_UNEXPECTED_ARGTYPE STATUS_ACPI_INVALID_ARGTYPE
#define AMLIERR_UNEXPECTED_OBJTYPE STATUS_ACPI_INVALID_OBJTYPE
#define AMLIERR_UNEXPECTED_TARGETTYPE STATUS_ACPI_INVALID_TARGETTYPE
#define AMLIERR_INCORRECT_NUMARG STATUS_ACPI_INCORRECT_ARGUMENT_COUNT
#define AMLIERR_FAILED_ADDR_XLATE STATUS_ACPI_ADDRESS_NOT_MAPPED
#define AMLIERR_INVALID_EVENTTYPE STATUS_ACPI_INVALID_EVENTTYPE
#define AMLIERR_REGHANDLER_FAILED STATUS_ACPI_REG_HANDLER_FAILED
#define AMLIERR_HANDLER_EXIST STATUS_ACPI_HANDLER_COLLISION
#define AMLIERR_INVALID_DATA STATUS_ACPI_INVALID_DATA
#define AMLIERR_INVALID_REGIONSPACE STATUS_ACPI_INVALID_REGION
#define AMLIERR_INVALID_ACCSIZE STATUS_ACPI_INVALID_ACCESS_SIZE
#define AMLIERR_INVALID_TABLE STATUS_ACPI_INVALID_TABLE
#define AMLIERR_ACQUIREGL_FAILED STATUS_ACPI_ACQUIRE_GLOBAL_LOCK
#define AMLIERR_ALREADY_INITIALIZED STATUS_ACPI_ALREADY_INITIALIZED
#define AMLIERR_NOT_INITIALIZED STATUS_ACPI_NOT_INITIALIZED
#define AMLIERR_MUTEX_INVALID_LEVEL STATUS_ACPI_INVALID_MUTEX_LEVEL
#define AMLIERR_MUTEX_NOT_OWNED STATUS_ACPI_MUTEX_NOT_OWNED
#define AMLIERR_MUTEX_NOT_OWNER STATUS_ACPI_MUTEX_NOT_OWNER
#define AMLIERR_RS_ACCESS STATUS_ACPI_RS_ACCESS
#define AMLIERR_STACK_OVERFLOW STATUS_ACPI_STACK_OVERFLOW
#define AMLIERR_INVALID_BUFFSIZE STATUS_INVALID_BUFFER_SIZE
#define AMLIERR_BUFF_TOOSMALL STATUS_BUFFER_TOO_SMALL
#define AMLIERR_NOTIFY_FAILED STATUS_ACPI_FATAL
// RegEventHandler constants
#define EVTYPE_OPCODE 0x00000001
#define EVTYPE_NOTIFY 0x00000002
#define EVTYPE_FATAL 0x00000003
#define EVTYPE_VALIDATE_TABLE 0x00000004
#define EVTYPE_ACQREL_GLOBALLOCK 0x00000005
#define EVTYPE_RS_COOKACCESS 0x00000006
#define EVTYPE_RS_RAWACCESS 0x00000007
#define EVTYPE_CON_MESSAGE 0x00000008
#define EVTYPE_CON_PROMPT 0x00000009
#define EVTYPE_CREATE 0x0000000A
#define EVTYPE_DESTROYOBJ 0x0000000B
#define EVTYPE_OPCODE_EX 0x0000000C
// OPCODE_EX flags
#define OPEXF_NOTIFY_PRE 0x00000001
#define OPEXF_NOTIFY_POST 0x00000002
// DESTROYOBJ events
#define DESTROYOBJ_START 0x00000001
#define DESTROYOBJ_REMOVE_OBJECT 0x00000002
#define DESTROYOBJ_END 0x00000003
#define DESTROYOBJ_CHILD_NOT_FREED 0x00000004
#define DESTROYOBJ_BOGUS_PARENT 0x00000005
// Notify Event Constants
#define OPEVENT_DEVICE_ENUM 0x00000000
#define OPEVENT_DEVICE_CHECK 0x00000001
#define OPEVENT_DEVICE_WAKE 0x00000002
#define OPEVENT_DEVICE_EJECT 0x00000003
#define RSACCESS_READ 0
#define RSACCESS_WRITE 1
#define GLOBALLOCK_ACQUIRE 0
#define GLOBALLOCK_RELEASE 1
// dwfAMLIInit flags
#define AMLIIF_INIT_BREAK 0x00000001 //break at AMLIInit completion
#define AMLIIF_LOADDDB_BREAK 0x00000002 //break at LoadDDB completion
#define AMLIIF_NOCHK_TABLEVER 0x80000000 //do not check table version
#endif //ifndef _INC_NSOBJ_ONLY
#define NAMESEG ULONG
#define SUPERNAME NAMESEG
// dwfFlags for AMLIGetNameSpaceObject
#define NSF_LOCAL_SCOPE 0x00000001
/*** Type and Structure definitions
*/
typedef struct _ObjData OBJDATA, *POBJDATA, **PPOBJDATA;
typedef struct _NSObj NSOBJ, *PNSOBJ, **PPNSOBJ;
//dwDataType values
typedef enum _OBJTYPES {
OBJTYPE_UNKNOWN = 0,
OBJTYPE_INTDATA,
OBJTYPE_STRDATA,
OBJTYPE_BUFFDATA,
OBJTYPE_PKGDATA,
OBJTYPE_FIELDUNIT,
OBJTYPE_DEVICE,
OBJTYPE_EVENT,
OBJTYPE_METHOD,
OBJTYPE_MUTEX,
OBJTYPE_OPREGION,
OBJTYPE_POWERRES,
OBJTYPE_PROCESSOR,
OBJTYPE_THERMALZONE,
OBJTYPE_BUFFFIELD,
OBJTYPE_DDBHANDLE,
OBJTYPE_DEBUG,
//These are internal object types (not to be exported to the ASL code)
OBJTYPE_INTERNAL = 0x80,
OBJTYPE_OBJALIAS = 0x80,
OBJTYPE_DATAALIAS,
OBJTYPE_BANKFIELD,
OBJTYPE_FIELD,
OBJTYPE_INDEXFIELD,
OBJTYPE_DATA,
OBJTYPE_DATAFIELD,
OBJTYPE_DATAOBJ,
} OBJTYPES;
struct _ObjData
{
USHORT dwfData; //flags
USHORT dwDataType; //object type
union
{
ULONG dwRefCount; //reference count if base object
POBJDATA pdataBase; //alias pointer to base object
};
union
{
ULONG dwDataValue; //data value of object 32-bit
ULONG_PTR uipDataValue; //data value of object 64-bit
PNSOBJ pnsAlias; //alias ptr to base obj (OBJTYPE_OBJALIAS)
POBJDATA pdataAlias; //alias ptr to base obj (OBJTYPE_DATAALIAS)
PVOID powner; //object owner (OBJTYPE_DDBHANDLE)
};
ULONG dwDataLen; //object buffer length
PUCHAR pbDataBuff; //object buffer
};
//dwfData flags
#define DATAF_BUFF_ALIAS 0x00000001
#define DATAF_GLOBAL_LOCK 0x00000002
#define DATAF_NSOBJ_DEFUNC 0x00000004
//Predefined data values (dwDataValue)
#define DATAVALUE_ZERO 0
#define DATAVALUE_ONE 1
#define DATAVALUE_ONES 0xffffffff
struct _NSObj
{
LIST list; //NOTE: list must be first in structure
PNSOBJ pnsParent;
PNSOBJ pnsFirstChild;
ULONG dwNameSeg;
HANDLE hOwner;
PNSOBJ pnsOwnedNext;
OBJDATA ObjData;
PVOID Context;
ULONG dwRefCount;
};
typedef struct _FieldDesc
{
ULONG dwByteOffset;
ULONG dwStartBitPos;
ULONG dwNumBits;
ULONG dwFieldFlags;
} FIELDDESC, *PFIELDDESC;
//dwFieldFlags
#define FDF_FIELDFLAGS_MASK 0x000000ff
#define FDF_ACCATTRIB_MASK 0x0000ff00
#define FDF_BUFFER_TYPE 0x00010000
#define FDF_NEEDLOCK 0x80000000
typedef struct _BuffFieldObj
{
FIELDDESC FieldDesc;
PUCHAR pbDataBuff;
ULONG dwBuffLen;
} BUFFFIELDOBJ, *PBUFFFIELDOBJ;
typedef struct _FieldUnitObj
{
FIELDDESC FieldDesc;
PNSOBJ pnsFieldParent;
} FIELDUNITOBJ, *PFIELDUNITOBJ;
typedef struct _BankFieldObj
{
PNSOBJ pnsBase;
PNSOBJ pnsBank;
ULONG dwBankValue;
} BANKFIELDOBJ, *PBANKFIELDOBJ;
typedef struct _FieldObj
{
PNSOBJ pnsBase;
} FIELDOBJ, *PFIELDOBJ;
typedef struct _IndexFieldObj
{
PNSOBJ pnsIndex;
PNSOBJ pnsData;
} INDEXFIELDOBJ, *PINDEXFIELDOBJ;
#ifdef ASL_ASSEMBLER
#define KSPIN_LOCK ULONG
#endif
typedef struct _OpRegionObj
{
ULONG_PTR uipOffset;
ULONG dwLen;
UCHAR bRegionSpace;
UCHAR reserved[3];
volatile LONG RegionBusy;
KSPIN_LOCK listLock;
PLIST plistWaiters;
} OPREGIONOBJ, *POPREGIONOBJ;
typedef struct _MutexObj
{
ULONG dwSyncLevel;
ULONG dwcOwned;
HANDLE hOwner;
PLIST plistWaiters;
} MUTEXOBJ, *PMUTEXOBJ;
typedef struct _EventObj
{
ULONG dwcSignaled;
PLIST plistWaiters;
} EVENTOBJ, *PEVENTOBJ;
typedef struct _MethodObj
{
MUTEXOBJ Mutex;
UCHAR bMethodFlags;
UCHAR abCodeBuff[ANYSIZE_ARRAY];
} METHODOBJ, *PMETHODOBJ;
typedef struct _PowerResObj
{
UCHAR bSystemLevel;
UCHAR bResOrder;
} POWERRESOBJ, *PPOWERRESOBJ;
typedef struct _ProcessorObj
{
ULONG dwPBlk;
ULONG dwPBlkLen;
UCHAR bApicID;
} PROCESSOROBJ, *PPROCESSOROBJ;
typedef struct _PackageObj
{
ULONG dwcElements;
OBJDATA adata[ANYSIZE_ARRAY];
} PACKAGEOBJ, *PPACKAGEOBJ;
#ifndef _INC_NSOBJ_ONLY
typedef struct _ctxtdata
{
PVOID dwData1;
PVOID dwData2;
PVOID dwData3;
PVOID dwData4;
} CTXTDATA, *PCTXTDATA;
typedef NTSTATUS (EXPORT *PFNHND)();
typedef NTSTATUS (EXPORT *PFNOH)(ULONG, ULONG, PNSOBJ, ULONG);
typedef NTSTATUS (EXPORT *PFNOO)(ULONG, PNSOBJ);
typedef VOID (EXPORT *PFNAA)(PVOID);
typedef NTSTATUS (EXPORT *PFNNH)(ULONG, ULONG, PNSOBJ, ULONG, PFNAA, PVOID);
typedef NTSTATUS (EXPORT *PFNCA)(ULONG, PNSOBJ, ULONG_PTR, ULONG, PULONG, ULONG_PTR,
PFNAA, PVOID);
typedef NTSTATUS (EXPORT *PFNRA)(ULONG, PFIELDUNITOBJ, POBJDATA, ULONG_PTR, PFNAA,
PVOID);
typedef NTSTATUS (EXPORT *PFNVT)(PDSDT, ULONG_PTR);
typedef NTSTATUS (EXPORT *PFNFT)(ULONG, ULONG, ULONG, ULONG_PTR, ULONG_PTR);
typedef NTSTATUS (EXPORT *PFNGL)(ULONG, ULONG, ULONG_PTR, PFNAA, PVOID);
typedef VOID (EXPORT *PFNCM)(PSZ, ULONG_PTR);
typedef VOID (EXPORT *PFNCP)(PSZ, PSZ, ULONG, ULONG_PTR);
typedef VOID (EXPORT *PFNACB)(PNSOBJ, NTSTATUS, POBJDATA, PVOID);
typedef NTSTATUS (EXPORT *PFNOPEX)(ULONG, ULONG, ULONG, PNSOBJ, ULONG);
typedef NTSTATUS (EXPORT *PFNDOBJ)(ULONG, PVOID, ULONG);
/*** Exported function prototypes
*/
#ifdef DEBUGGER
VOID STDCALL AMLIDebugger(BOOLEAN fCallFromVxD);
#endif
NTSTATUS AMLIAPI AMLIInitialize(ULONG dwCtxtBlkSize, ULONG dwGlobalHeapBlkSize,
ULONG dwfAMLIInit, ULONG dwmsTimeSliceLength,
ULONG dwmsTimeSliceInterval, ULONG dwmsMaxCTObjs);
NTSTATUS AMLIAPI AMLITerminate(VOID);
NTSTATUS AMLIAPI AMLILoadDDB(PDSDT pDSDT, HANDLE *phDDB);
VOID AMLIAPI AMLIUnloadDDB(HANDLE hDDB);
NTSTATUS AMLIAPI AMLIGetNameSpaceObject(PSZ pszObjPath, PNSOBJ pnsScope,
PPNSOBJ ppns, ULONG dwfFlags);
NTSTATUS AMLIAPI AMLIGetFieldUnitRegionObj(PFIELDUNITOBJ pfu, PPNSOBJ ppns);
NTSTATUS AMLIAPI AMLIEvalNameSpaceObject(PNSOBJ pns, POBJDATA pResult,
int icArgs, POBJDATA pArgs);
NTSTATUS AMLIAPI AMLIAsyncEvalObject(PNSOBJ pns, POBJDATA pResult, int icArgs,
POBJDATA pArgs, PFNACB pfnAsynCallBack,
PVOID pvContext);
NTSTATUS AMLIAPI AMLINestAsyncEvalObject(PNSOBJ pns, POBJDATA pResult,
int icArgs, POBJDATA pArgs,
PFNACB pfnAsynCallBack,
PVOID pvContext);
NTSTATUS AMLIAPI AMLIEvalPackageElement(PNSOBJ pns, int iPktIndex,
POBJDATA pResult);
NTSTATUS AMLIAPI AMLIEvalPkgDataElement(POBJDATA pdataPkg, int iPkgIndex,
POBJDATA pdataResult);
VOID AMLIAPI AMLIFreeDataBuffs(POBJDATA pdata, int icData);
NTSTATUS AMLIAPI AMLIRegEventHandler(ULONG dwEventType, ULONG_PTR uipEventData,
PFNHND pfnHandler, ULONG_PTR uipParam);
NTSTATUS AMLIAPI AMLIPauseInterpreter(PFNAA pfnCallBack, PVOID Context);
VOID AMLIAPI AMLIResumeInterpreter(VOID);
VOID AMLIAPI AMLIReferenceObject(PNSOBJ pnsObj);
VOID AMLIAPI AMLIDereferenceObject(PNSOBJ pnsObj);
NTSTATUS AMLIAPI AMLIDestroyFreedObjs(PNSOBJ pnsoObj);
#ifdef DEBUGGER
NTSTATUS AMLIAPI AMLIGetLastError(PSZ *ppszErrMsg);
#endif
#endif //ifndef _INC_NSOBJ_ONLY
#endif //ifndef _AMLI_H