ACPI!ParseTerm函数中调用ACPI!OpRegion函数的ACPI!_OpRegionObj->bRegionSpace = REGSPACE_PCICFG的情况--重要
0: kd> kc
#
00 ACPI!OpRegion
01 ACPI!ParseTerm
02 ACPI!RunContext
03 ACPI!InsertReadyQueue
04 ACPI!RestartContext
05 ACPI!SyncLoadDDB
06 ACPI!AMLILoadDDB
07 ACPI!ACPIInitializeDDB
08 ACPI!ACPIInitializeDDBs
09 ACPI!ACPIInitialize
0a ACPI!ACPIInitStartACPI
0b ACPI!ACPIRootIrpStartDevice
0c ACPI!ACPIDispatchIrp
0d nt!IofCallDriver
0e nt!IopSynchronousCall
0f nt!IopStartDevice
10 nt!PipProcessStartPhase1
11 nt!PipProcessDevNodeTree
12 nt!PipDeviceActionWorker
13 nt!PipRequestDeviceAction
14 nt!IopInitializeBootDrivers
15 nt!IoInitSystem
16 nt!Phase1Initialization
17 nt!PspSystemThreadStartup
18 nt!KiThreadStartup
NTSTATUS LOCAL OpRegion(PCTXT pctxt, PTERM pterm)
{
0: kd> p
Breakpoint 5 hit
eax=899b0134 ebx=8997de40 ecx=f743960a edx=00000000 esi=8997c000 edi=8997de20
eip=f741dc18 esp=f789a0e0 ebp=f789a114 iopl=0 nv up ei pl nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000202
ACPI!CreateNameSpaceObject:
f741dc18 55 push ebp
0: kd> dv
pheap = 0x899af000
pszName = 0x899af540 "REGS"
pnsScope = 0x899affac
powner = 0x899af330
ppns = 0x8997de40
dwfNS = 0
pns = 0x00000008
0: kd> gu
eax=00000000 ebx=8997de40 ecx=899b0190 edx=00000000 esi=8997c000 edi=8997de20
eip=f7421967 esp=f789a0e4 ebp=f789a114 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
ACPI!OpRegion+0x59:
f7421967 83c418 add esp,18h
0: kd> dv
pctxt = 0x8997c000
pterm = 0x8997de20
rc = 0n898
XlatedAddr = {38508042513}
0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_term *)0x8997de20)
((ACPI!_term *)0x8997de20) : 0x8997de20 [Type: _term *]
[+0x000] FrameHdr [Type: _framehdr]
[+0x010] pbOpTerm : 0xf74c7821 : 0x5b [Type: unsigned char *]
[+0x014] pbOpEnd : 0x0 [Type: unsigned char *]
[+0x018] pbScopeEnd : 0xf74c92a2 : 0x14 [Type: unsigned char *]
[+0x01c] pamlterm : 0xf7438eb0 [Type: _amlterm *]
[+0x020] pnsObj : 0x899b0190[Type: _NSObj *]
[+0x024] iArg : 4 [Type: int]
[+0x028] icArgs : 4 [Type: int]
[+0x02c] pdataArgs : 0x899b0134 [Type: _ObjData *]
[+0x030] pdataResult : 0x8997c040 [Type: _ObjData *]
0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_NSObj *)0x899b0190)
((ACPI!_NSObj *)0x899b0190) : 0x899b0190 [Type: _NSObj *]
[+0x000] list [Type: _List]
[+0x008] pnsParent : 0x899affac [Type: _NSObj *]
[+0x00c] pnsFirstChild : 0x0 [Type: _NSObj *]
[+0x010] dwNameSeg : 0x53474552 [Type: unsigned long]
[+0x014] hOwner : 0x899af330 [Type: void *]
[+0x018] pnsOwnedNext : 0x899b00f0 [Type: _NSObj *]
[+0x01c] ObjData [Type: _ObjData]
[+0x030] Context : 0x0 [Type: void *]
[+0x034] dwRefCount : 0x0 [Type: unsigned long]
pterm->pnsObj->ObjData.dwDataType = OBJTYPE_OPREGION;
pterm->pnsObj->ObjData.dwDataLen = sizeof(OPREGIONOBJ);
0: kd> dt _NSObj 0x899b0190
ACPI!_NSObj
+0x000 list : _List
+0x008 pnsParent : 0x899affac _NSObj
+0x00c pnsFirstChild : (null)
+0x010 dwNameSeg : 0x53474552
+0x014 hOwner : 0x899af330 Void
+0x018 pnsOwnedNext : 0x899b00f0 _NSObj
+0x01c ObjData : _ObjData
+0x030 Context : (null)
+0x034 dwRefCount : 0
0: kd> dx -id 0,0,899a2278 -r1 (*((ACPI!_ObjData *)0x899b01ac))
(*((ACPI!_ObjData *)0x899b01ac)) [Type: _ObjData]
[+0x000] dwfData : 0x0 [Type: unsigned short]
[+0x002] dwDataType : 0xa[Type: unsigned short] OBJTYPE_OPREGION,
[+0x004] dwRefCount : 0x0 [Type: unsigned long]
[+0x004] pdataBase : 0x0 [Type: _ObjData *]
[+0x008] dwDataValue : 0x0 [Type: unsigned long]
[+0x008] uipDataValue : 0x0 [Type: unsigned long]
[+0x008] pnsAlias : 0x0 [Type: _NSObj *]
[+0x008] pdataAlias : 0x0 [Type: _ObjData *]
[+0x008] powner : 0x0 [Type: void *]
[+0x00c] dwDataLen : 0x18[Type: unsigned long]
[+0x010] pbDataBuff : 0x899afff0 : 0x0 [Type: unsigned char *]
//dwDataType values
typedef enum _OBJTYPES {
OBJTYPE_UNKNOWN = 0,
OBJTYPE_INTDATA,
OBJTYPE_STRDATA, 2
OBJTYPE_BUFFDATA,
OBJTYPE_PKGDATA,
OBJTYPE_FIELDUNIT,
OBJTYPE_DEVICE, 6
OBJTYPE_EVENT,
OBJTYPE_METHOD, 8
OBJTYPE_MUTEX,
OBJTYPE_OPREGION, a
0: kd> dt _OPREGIONOBJ -v
ACPI!_OpRegionObj
struct _OpRegionObj, 7 elements,0x18 bytes
+0x000 uipOffset : Uint4B
+0x004 dwLen : Uint4B
+0x008 bRegionSpace : UChar
+0x009 reserved : [3] UChar
+0x00c RegionBusy : Int4B
+0x010 listLock : Uint4B
+0x014 plistWaiters : Ptr32 to struct _List, 2 elements, 0x8 bytes
else
{
POPREGIONOBJ pop;
MEMZERO(pterm->pnsObj->ObjData.pbDataBuff,
pterm->pnsObj->ObjData.dwDataLen);
pop = (POPREGIONOBJ)pterm->pnsObj->ObjData.pbDataBuff;
pop->bRegionSpace = (UCHAR)pterm->pdataArgs[1].uipDataValue; 关键地方1:
pop->uipOffset = pterm->pdataArgs[2].uipDataValue; 关键地方2:
pop->dwLen = (ULONG)pterm->pdataArgs[3].uipDataValue; 关键地方3:
KeInitializeSpinLock(&pop->listLock);
if (pop->bRegionSpace == REGSPACE_MEM)
{
/*** Operation region space
*/
#define REGSPACE_MEM 0 //SystemMemory
#define REGSPACE_IO 1 //SystemIO
#define REGSPACE_PCICFG 2 //PCI_Config
#define REGSPACE_EC 3 //EmbeddedControl
#define REGSPACE_SMB 4 //SMBus
#define REGSPACE_CMOSCFG 5 //Cmos_Config
#define REGSPACE_PCIBARTARGET 6 //PCIBARTarget
0: kd> dv
pctxt = 0x8997c000
pterm = 0x8997de20
rc = 0n0
XlatedAddr = {38508042513}
0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_term *)0x8997de20)
((ACPI!_term *)0x8997de20) : 0x8997de20 [Type: _term *]
[+0x000] FrameHdr [Type: _framehdr]
[+0x010] pbOpTerm : 0xf74c7821 : 0x5b [Type: unsigned char *]
[+0x014] pbOpEnd : 0x0 [Type: unsigned char *]
[+0x018] pbScopeEnd : 0xf74c92a2 : 0x14 [Type: unsigned char *]
[+0x01c] pamlterm : 0xf7438eb0 [Type: _amlterm *]
[+0x020] pnsObj : 0x899b0190 [Type: _NSObj *]
[+0x024] iArg : 4 [Type: int]
[+0x028] icArgs : 4 [Type: int]
[+0x02c] pdataArgs : 0x899b0134 [Type: _ObjData *]
[+0x030] pdataResult : 0x8997c040 [Type: _ObjData *]
0: kd> dx -id 0,0,899a2278 -r1 ((ACPI!_ObjData *)0x899b0134)
((ACPI!_ObjData *)0x899b0134) : 0x899b0134 [Type: _ObjData *]
[+0x000] dwfData : 0x0 [Type: unsigned short]
[+0x002] dwDataType : 0x2 [Type: unsigned short]
[+0x004] dwRefCount : 0x0 [Type: unsigned long]
[+0x004] pdataBase : 0x0 [Type: _ObjData *]
[+0x008] dwDataValue : 0x0 [Type: unsigned long]
[+0x008] uipDataValue : 0x0 [Type: unsigned long]
[+0x008] pnsAlias : 0x0 [Type: _NSObj *]
[+0x008] pdataAlias : 0x0 [Type: _ObjData *]
[+0x008] powner : 0x0 [Type: void *]
[+0x00c] dwDataLen : 0x5 [Type: unsigned long]
[+0x010] pbDataBuff : 0x899af540 : 0x52 [Type: unsigned char *]
0: kd> dt ACPI!_ObjData 0x899b0134+14 pdataArgs[1]
+0x000 dwfData : 0
+0x002 dwDataType : 1
+0x004 dwRefCount : 0
+0x004 pdataBase : (null)
+0x008 dwDataValue : 2
+0x008 uipDataValue : 2 关键地方1:+0x008 uipDataValue : 2
+0x008 pnsAlias : 0x00000002 _NSObj
+0x008 pdataAlias : 0x00000002 _ObjData
+0x008 powner : 0x00000002 Void
+0x00c dwDataLen : 0
+0x010 pbDataBuff : (null)
#define REGSPACE_PCICFG 2 //PCI_Config
0: kd> dt ACPI!_ObjData 0x899b0134+14*2
+0x000 dwfData : 0
+0x002 dwDataType : 1
+0x004 dwRefCount : 0
+0x004 pdataBase : (null)
+0x008 dwDataValue : 0x50
+0x008 uipDataValue : 0x50 关键地方2:+0x008 uipDataValue : 0x50
+0x008 pnsAlias : 0x00000050 _NSObj
+0x008 pdataAlias : 0x00000050 _ObjData
+0x008 powner : 0x00000050 Void
+0x00c dwDataLen : 0
+0x010 pbDataBuff : (null)
0: kd> dt ACPI!_ObjData 0x899b0134+14*3
+0x000 dwfData : 0
+0x002 dwDataType : 1
+0x004 dwRefCount : 0
+0x004 pdataBase : (null)
+0x008 dwDataValue : 0x30 关键地方3:+0x008 uipDataValue : 0x30
+0x008 uipDataValue : 0x30
+0x008 pnsAlias : 0x00000030 _NSObj
+0x008 pdataAlias : 0x00000030 _ObjData
+0x008 powner : 0x00000030 Void
+0x00c dwDataLen : 0
+0x010 pbDataBuff : (null)
0: kd> dt _opregionobj 0x899afff0
ACPI!_OpRegionObj
+0x000 uipOffset : 0x50
+0x004 dwLen : 0x30
+0x008 bRegionSpace : 0x2 ''
+0x009 reserved : [3] ""
+0x00c RegionBusy : 0n0
+0x010 listLock : 0
+0x014 plistWaiters : (null)
if (pop->bRegionSpace ==REGSPACE_MEM)
{
if(gInitTime)
{
ValidateMemoryOpregionRange(pop->uipOffset, pop->dwLen);
}
rc = MapUnmapPhysMem(pctxt, pop->uipOffset, pop->dwLen,
&pop->uipOffset);
}
else if (pop->bRegionSpace ==REGSPACE_IO)
{
PHYSICAL_ADDRESS phyaddr = {0, 0}, XlatedAddr;
ULONG dwAddrSpace;
phyaddr.LowPart = (ULONG)pop->uipOffset;
dwAddrSpace = 1;
if (HalTranslateBusAddress(Internal, 0, phyaddr, &dwAddrSpace,
&XlatedAddr))
{
pop->uipOffset = (ULONG_PTR)XlatedAddr.LowPart;
}
else
{
rc = AMLI_LOGERR(AMLIERR_FAILED_ADDR_XLATE,
("OpRegion: failed to translate IO address %x",
pop->uipOffset));
}
}
else if (pop->bRegionSpace ==REGSPACE_PCIBARTARGET)
{
if (ghCreate.pfnHandler != NULL)
{
((PFNOO)ghCreate.pfnHandler)(OBJTYPE_OPREGION, pterm->pnsObj);
}
}
都不符合条件,返回了。!!!比较简单。
pop->bRegionSpace = REGSPACE_PCICFG的情况比较简单。