Files
AaLl86 848f1280bd Version 0.5
- Fuilly implemented the experimental support for XSAVE
2017-01-28 14:27:25 +01:00

82 lines
3.5 KiB
C

/**********************************************************************
* Windows Intel Processor Trace (PT) Driver 0.5
* Filename: IntelPtXSave.h
* Defines the Intel Processor Trace support data structures for XSAVE feature
* Last revision: 01/25/2017
*
* Copyright© 2017 Andrea Allievi, Richard Johnson
* TALOS Research and Intelligence Group and Microsoft Ltd
* All right reserved
**********************************************************************/
#pragma once
#include "Intel_Defs.h"
// The XSAVES function used in AMD64/X86 CPUs (defined in Amd64XSAve.asm)
extern "C" void _xsaves(void *mem, unsigned __int64 save_mask);
#define CPUID_XSAVE_MASK (1 << 26) // The XSAVE support in CPUID leaf 1
#define PT_XSAVE_MASK (1 << 8) // The PT support in XSAVE
#define IA32_XSS_XSAVE_MASK (1 << 8) // The XSS MSR support in XSAVE
#define MSR_IA32_XSS (0x00000DA0) // IA32_XSS Model specific register ID
#define OSXSAVE_CR4_MASK (1i64 << 18) // The XSAVE on/off bitmask in CR4 register
typedef struct _GLOBAL_DATA {
DWORD dwXSaveSAreaSize; // Supervisor XSAVE Area maximum size
DWORD dwXSaveUAreaSize; // User-mode XSAVE Area maximum size
} GLOBAL_DATA;
// Intel PT XSAVE Area
typedef struct DECLSPEC_ALIGN(16) _XSAVE_PT_EXTENDED_AREA {
MSR_RTIT_CTL_DESC rtit_ctl; // + 0x00 - IA32_RTIT_CTL MSR
MSR_RTIT_OUTPUTBASE_DESC rtit_outputbase; // + 0x08 - IA32_RTIT_OUTPUTBASE MSR
MSR_RTIT_OUTPUT_MASK_PTRS_DESC rtit_output_mask_ptrs; // + 0x10 - IA32_RTIT_OUTPUTMASK_PTRS MSR
MSR_RTIT_STATUS_DESC rtit_status; // + 0x18 - IA32_RTIT_STATUS MSR
ULONGLONG rtit_cr3_match; // + 0x20 - IA32_RTIT_CR3_MATCH
ULONGLONG rtit_addr0_a; // + 0x28 - MSR_IA32_RTIT_ADDR0_A (start) MSR
ULONGLONG rtit_addr0_b; // + 0x30 - MSR_IA32_RTIT_ADDR0_B (end) MSR
ULONGLONG rtit_addr1_a; // + 0x38 - MSR_IA32_RTIT_ADDR0_A (start) MSR
ULONGLONG rtit_addr1_b; // + 0x40 - MSR_IA32_RTIT_ADDR0_B (end) MSR
} XSAVE_PT_EXTENDED_AREA;
typedef struct DECLSPEC_ALIGN(16) _XSAVE_AREA_EX {
XSAVE_FORMAT LegacyState; // + 0x00
XSAVE_AREA_HEADER Header; // + 0x200
XSAVE_PT_EXTENDED_AREA ExtendedArea; // + 0x240
} XSAVE_AREA_EX, *PXSAVE_AREA_EX;
#pragma pack(push)
#pragma pack(1)
typedef union _MSR_IA32_XSS_DESC {
struct {
DWORD Reserved : 8; // [7:0] Reserved
DWORD IntelPt : 1; // [8] Trace Packet Configuration State (R/W)
DWORD Reserved2 : 23;
} Bits;
ULONG64 value;
} MSR_IA32_XSS_DESC;
typedef union _XCR0_DESC {
struct {
DWORD FpuMmx : 1; // [0] x87 FPU/MMX state (must be 1)
DWORD Sse : 1; // [1] SSE state
DWORD Avx : 1; // [2] AVX state
DWORD BNDREG : 1; // [3] BNDREG state
DWORD BNDCSR : 1; // [4] BNDCSR state
DWORD OpMask : 1; // [5] Opmask state
DWORD ZMM_Hi256 : 1; // [6] ZMM_Hi256 state
DWORD Hi16_ZMM : 1; // [7] Hi16_ZMM state
DWORD Reserved : 1; // [8] Reserved - Used for Intel PT in IA32_XSS MSR
DWORD PKRU : 1; // [9] PKRU state
DWORD Reserved2 : 22; // [10:32] Reserved for future expansion
} Bits;
ULONG64 value;
} XCR0_DESC;
#pragma pack(pop)
// Check if the current processor support the XSAVE feature for Intel PT
NTSTATUS CheckPtXSaveSupport(DWORD * pdwSAreaSize, DWORD * pdwUAreaSize, DWORD * pdwPtSize);
// Get the current XSAVE Area size for the enabled features in XCR0 and IA32_XSS MSR of current CPU
DWORD GetCurXSaveAreaSize();
// Save all the PT data to an XSAVE area
NTSTATUS SavePtData(PXSAVE_AREA_EX lpXSaveArea, DWORD dwSize);