|
|
/*** 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
|