/*++ Copyright (c) 1999 Microsoft Corporation Module Name: ia64cpu.h Abstract: Structures and types shared between the IA64 CPU and its debugger extensions. Author: 27-Sept-1999 BarryBo Revision History: 9-Aug-1999 [askhalid] added WOW64IsCurrentProcess --*/ #ifndef _IA64CPU_INCLUDE #define _IA64CPU_INCLUDE #ifdef __cplusplus extern "C" { #endif #define GDT_ENTRIES 24 #define GDT_TABLE_SIZE (GDT_ENTRIES<<3) // Each 387 register takes 1 ia64 fp register #define NUMBER_OF_387REGS 8 // Each XMMI register takes 2 ia64 fp registers #define NUMBER_OF_XMMI_REGS 8 /* ** The order of this structure is very important. The Reserved space at ** the beginnig allows the ExtendedRegisters[] array in the CONTEXT32 structure ** to be aligned properly. ** ** There are constants in the ISA transisiton code that are dependant on ** the offsets in this structure. If you make changes here, you must ** make changes to the cpu\ia64\simulate.s code at the very least */ #pragma pack(push, 4) typedef struct _CpuContext { DWORD Reserved; CONTEXT32 Context; // // Because the sizeof(CONTEXT32) struct above is 4 bytes short of // being divisible by 16, the padding allows the following // fields to be on 8 byte boundaries. If they are not, we will // do misaligned accesses on isa transisitons and we will // see ASSERTS in the cpumain.c code (CpuThreadInit()). // ULONGLONG Gdt[GDT_ENTRIES]; ULONGLONG GdtDescriptor; ULONGLONG LdtDescriptor; ULONGLONG FsDescriptor; #if defined(WOW64_HISTORY) // // This MUST be the last entry in the CPUCONTEXT structure // The size is actually allocated based on a registry entry // and is appended to the sizeof the CPUCONTEXT structure as reported // back in CpuProcessInit() // WOW64SERVICE_BUF Wow64Service[1]; #endif // defined WOW64_HISTORY } CPUCONTEXT, *PCPUCONTEXT; #pragma pack(pop) // // GDT Entry // #ifndef WOW64EXTS_386 typedef struct _KGDTENTRY { USHORT LimitLow; USHORT BaseLow; union { struct { UCHAR BaseMid; UCHAR Flags1; // Declare as bytes to avoid alignment UCHAR Flags2; // Problems. UCHAR BaseHi; } Bytes; struct { ULONG BaseMid : 8; ULONG Type : 5; ULONG Dpl : 2; ULONG Pres : 1; ULONG LimitHi : 4; ULONG Sys : 1; ULONG Reserved_0 : 1; ULONG Default_Big : 1; ULONG Granularity : 1; ULONG BaseHi : 8; } Bits; } HighWord; } KGDTENTRY, *PKGDTENTRY; #endif #define TYPE_TSS 0x01 // 01001 = NonBusy TSS #define TYPE_LDT 0x02 // 00010 = LDT // // UnScrambled Descriptor format // typedef struct _KDESCRIPTOR_UNSCRAM { union { ULONGLONG DescriptorWords; struct { ULONGLONG Base : 32; ULONGLONG Limit : 20; ULONGLONG Type : 5; ULONGLONG Dpl : 2; ULONGLONG Pres : 1; ULONGLONG Sys : 1; ULONGLONG Reserved_0 : 1; ULONGLONG Default_Big : 1; ULONGLONG Granularity : 1; } Bits; } Words; } KXDESCRIPTOR, *PKXDESCRIPTOR; #define TYPE_CODE_USER 0x1B // 0x11011 = Code, Readable, Accessed #define TYPE_DATA_USER 0x13 // 0x10011 = Data, ReadWrite, Accessed #define DESCRIPTOR_EXPAND_DOWN 0x14 #define DESCRIPTOR_DATA_READWRITE (0x8|0x2) // Data, Read/Write #define DPL_USER 3 #define DPL_SYSTEM 0 #define GRAN_BYTE 0 #define GRAN_PAGE 1 #define SELECTOR_TABLE_INDEX 0x04 // // Now define the API's used to convert IA64 hardware into ia32 context // VOID Wow64CtxFromIa64( IN ULONG Ia32ContextFlags, IN PCONTEXT ContextIa64, IN OUT PCONTEXT32 ContextX86); VOID Wow64CtxToIa64( IN ULONG Ia32ContextFlags, IN PCONTEXT32 ContextX86, IN OUT PCONTEXT ContextIa64); VOID Wow64CopyFpFromIa64Byte16( IN PVOID Byte16Fp, IN OUT PVOID Byte10Fp, IN ULONG NumRegs); VOID Wow64CopyFpToIa64Byte16( IN PVOID Byte10Fp, IN OUT PVOID Byte16Fp, IN ULONG NumRegs); VOID Wow64CopyXMMIToIa64Byte16( IN PVOID ByteXMMI, IN OUT PVOID Byte16Fp, IN ULONG NumRegs); VOID Wow64CopyXMMIFromIa64Byte16( IN PVOID Byte16Fp, IN OUT PVOID ByteXMMI, IN ULONG NumRegs); VOID Wow64RotateFpTop( IN ULONGLONG Ia64_FSR, IN OUT FLOAT128 UNALIGNED *ia32FxSave); VOID Wow64CopyIa64ToFill( IN FLOAT128 UNALIGNED *ia64Fp, IN OUT PFLOAT128 FillArea, IN ULONG NumRegs); VOID Wow64CopyIa64FromSpill( IN PFLOAT128 SpillArea, IN OUT FLOAT128 UNALIGNED *ia64Fp, IN ULONG NumRegs); // The following ptototypes are to be used only by the cpu debugger extension NTSTATUS GetContextRecord( IN PCPUCONTEXT cpu, IN OUT PCONTEXT32 Context ); NTSTATUS SetContextRecord( IN PCPUCONTEXT cpu, IN OUT PCONTEXT32 Context ); NTSTATUS CpupGetContextThread( IN HANDLE ThreadHandle, IN HANDLE ProcessHandle, IN PTEB Teb, IN OUT PCONTEXT32 Context); NTSTATUS CpupSetContextThread( IN HANDLE ThreadHandle, IN HANDLE ProcessHandle, IN PTEB Teb, IN OUT PCONTEXT32 Context); NTSTATUS CpupSetContext( IN PCONTEXT32 Context ); NTSTATUS CpupGetContext( IN OUT PCONTEXT32 Context ); #ifdef __cplusplus } #endif #endif