2022-05-25 14:06:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
#ifndef _ARM64_KETYPES_H
|
|
|
|
#define _ARM64_KETYPES_H
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Interrupt request levels */
|
|
|
|
#define PASSIVE_LEVEL 0
|
|
|
|
#define LOW_LEVEL 0
|
|
|
|
#define APC_LEVEL 1
|
|
|
|
#define DISPATCH_LEVEL 2
|
|
|
|
#define CMCI_LEVEL 5
|
|
|
|
#define CLOCK_LEVEL 13
|
|
|
|
#define IPI_LEVEL 14
|
|
|
|
#define DRS_LEVEL 14
|
|
|
|
#define POWER_LEVEL 14
|
|
|
|
#define PROFILE_LEVEL 15
|
|
|
|
#define HIGH_LEVEL 15
|
|
|
|
|
|
|
|
//
|
|
|
|
// IPI Types
|
|
|
|
//
|
|
|
|
#define IPI_APC 1
|
|
|
|
#define IPI_DPC 2
|
|
|
|
#define IPI_FREEZE 4
|
|
|
|
#define IPI_PACKET_READY 6
|
|
|
|
#define IPI_SYNCH_REQUEST 16
|
|
|
|
|
|
|
|
//
|
|
|
|
// PRCB Flags
|
|
|
|
//
|
|
|
|
#define PRCB_MAJOR_VERSION 1
|
|
|
|
#define PRCB_BUILD_DEBUG 1
|
|
|
|
#define PRCB_BUILD_UNIPROCESSOR 2
|
|
|
|
|
|
|
|
//
|
|
|
|
// No LDTs on ARM64
|
|
|
|
//
|
|
|
|
#define LDT_ENTRY ULONG
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
// HAL Variables
|
|
|
|
//
|
|
|
|
#define INITIAL_STALL_COUNT 100
|
|
|
|
#define MM_HAL_VA_START 0xFFFFFFFFFFC00000ULL
|
|
|
|
#define MM_HAL_VA_END 0xFFFFFFFFFFFFFFFFULL
|
|
|
|
|
2023-11-19 23:51:33 +00:00
|
|
|
//
|
|
|
|
// Double fault stack size
|
|
|
|
//
|
|
|
|
#define DOUBLE_FAULT_STACK_SIZE 0x8000
|
|
|
|
|
2022-05-25 14:06:32 +00:00
|
|
|
//
|
|
|
|
// Structure for CPUID info
|
|
|
|
//
|
|
|
|
typedef union _CPU_INFO
|
|
|
|
{
|
|
|
|
ULONG dummy;
|
|
|
|
} CPU_INFO, *PCPU_INFO;
|
|
|
|
|
|
|
|
typedef struct _KTRAP_FRAME
|
|
|
|
{
|
|
|
|
UCHAR ExceptionActive;
|
|
|
|
UCHAR ContextFromKFramesUnwound;
|
|
|
|
UCHAR DebugRegistersValid;
|
|
|
|
union
|
|
|
|
{
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
CHAR PreviousMode;
|
|
|
|
UCHAR PreviousIrql;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
ULONG Reserved;
|
|
|
|
union
|
|
|
|
{
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
ULONG64 FaultAddress;
|
|
|
|
ULONG64 TrapFrame;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
//struct PKARM64_VFP_STATE VfpState;
|
|
|
|
ULONG VfpState;
|
|
|
|
ULONG Bcr[8];
|
|
|
|
ULONG64 Bvr[8];
|
|
|
|
ULONG Wcr[2];
|
|
|
|
ULONG64 Wvr[2];
|
|
|
|
ULONG Spsr;
|
|
|
|
ULONG Esr;
|
|
|
|
ULONG64 Sp;
|
|
|
|
union
|
|
|
|
{
|
|
|
|
ULONG64 X[19];
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
ULONG64 X0;
|
|
|
|
ULONG64 X1;
|
|
|
|
ULONG64 X2;
|
|
|
|
ULONG64 X3;
|
|
|
|
ULONG64 X4;
|
|
|
|
ULONG64 X5;
|
|
|
|
ULONG64 X6;
|
|
|
|
ULONG64 X7;
|
|
|
|
ULONG64 X8;
|
|
|
|
ULONG64 X9;
|
|
|
|
ULONG64 X10;
|
|
|
|
ULONG64 X11;
|
|
|
|
ULONG64 X12;
|
|
|
|
ULONG64 X13;
|
|
|
|
ULONG64 X14;
|
|
|
|
ULONG64 X15;
|
|
|
|
ULONG64 X16;
|
|
|
|
ULONG64 X17;
|
|
|
|
ULONG64 X18;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
ULONG64 Lr;
|
|
|
|
ULONG64 Fp;
|
|
|
|
ULONG64 Pc;
|
|
|
|
} KTRAP_FRAME, *PKTRAP_FRAME;
|
|
|
|
|
|
|
|
typedef struct _KEXCEPTION_FRAME
|
|
|
|
{
|
|
|
|
ULONG dummy;
|
|
|
|
} KEXCEPTION_FRAME, *PKEXCEPTION_FRAME;
|
|
|
|
|
|
|
|
#ifndef NTOS_MODE_USER
|
|
|
|
|
|
|
|
typedef struct _TRAPFRAME_LOG_ENTRY
|
|
|
|
{
|
|
|
|
ULONG64 Thread;
|
|
|
|
UCHAR CpuNumber;
|
|
|
|
UCHAR TrapType;
|
|
|
|
USHORT Padding;
|
|
|
|
ULONG Cpsrl;
|
|
|
|
ULONG64 X0;
|
|
|
|
ULONG64 X1;
|
|
|
|
ULONG64 X2;
|
|
|
|
ULONG64 X3;
|
|
|
|
ULONG64 X4;
|
|
|
|
ULONG64 X5;
|
|
|
|
ULONG64 X6;
|
|
|
|
ULONG64 X7;
|
|
|
|
ULONG64 Fp;
|
|
|
|
ULONG64 Lr;
|
|
|
|
ULONG64 Sp;
|
|
|
|
ULONG64 Pc;
|
|
|
|
ULONG64 Far;
|
|
|
|
ULONG Esr;
|
|
|
|
ULONG Reserved1;
|
|
|
|
} TRAPFRAME_LOG_ENTRY, *PTRAPFRAME_LOG_ENTRY;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Processor Region Control Block
|
|
|
|
// Based on WoA
|
|
|
|
//
|
|
|
|
typedef struct _KPRCB
|
|
|
|
{
|
|
|
|
ULONG dummy;
|
|
|
|
} KPRCB, *PKPRCB;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Processor Control Region
|
|
|
|
// Based on WoA
|
|
|
|
//
|
|
|
|
typedef struct _KIPCR
|
|
|
|
{
|
|
|
|
union
|
|
|
|
{
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
ULONG TibPad0[2];
|
|
|
|
PVOID Spare1;
|
|
|
|
struct _KPCR *Self;
|
|
|
|
PVOID PcrReserved0;
|
|
|
|
struct _KSPIN_LOCK_QUEUE* LockArray;
|
|
|
|
PVOID Used_Self;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
KIRQL CurrentIrql;
|
|
|
|
UCHAR SecondLevelCacheAssociativity;
|
|
|
|
UCHAR Pad1[2];
|
|
|
|
USHORT MajorVersion;
|
|
|
|
USHORT MinorVersion;
|
|
|
|
ULONG StallScaleFactor;
|
|
|
|
ULONG SecondLevelCacheSize;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
UCHAR ApcInterrupt;
|
|
|
|
UCHAR DispatchInterrupt;
|
|
|
|
};
|
|
|
|
USHORT InterruptPad;
|
|
|
|
UCHAR BtiMitigation;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
UCHAR SsbMitigationFirmware:1;
|
|
|
|
UCHAR SsbMitigationDynamic:1;
|
|
|
|
UCHAR SsbMitigationKernel:1;
|
|
|
|
UCHAR SsbMitigationUser:1;
|
|
|
|
UCHAR SsbMitigationReserved:4;
|
|
|
|
};
|
|
|
|
UCHAR Pad2[2];
|
|
|
|
ULONG64 PanicStorage[6];
|
|
|
|
PVOID KdVersionBlock;
|
|
|
|
PVOID HalReserved[134];
|
|
|
|
PVOID KvaUserModeTtbr1;
|
|
|
|
|
|
|
|
/* Private members, not in ntddk.h */
|
|
|
|
PVOID Idt[256];
|
|
|
|
PVOID* IdtExt;
|
|
|
|
PVOID PcrAlign[15];
|
|
|
|
KPRCB Prcb;
|
|
|
|
} KIPCR, *PKIPCR;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Special Registers Structure (outside of CONTEXT)
|
|
|
|
// Based on WoA symbols
|
|
|
|
//
|
|
|
|
typedef struct _KSPECIAL_REGISTERS
|
|
|
|
{
|
|
|
|
ULONG64 Elr_El1;
|
|
|
|
UINT32 Spsr_El1;
|
|
|
|
ULONG64 Tpidr_El0;
|
|
|
|
ULONG64 Tpidrro_El0;
|
|
|
|
ULONG64 Tpidr_El1;
|
|
|
|
ULONG64 KernelBvr[8];
|
|
|
|
ULONG KernelBcr[8];
|
|
|
|
ULONG64 KernelWvr[2];
|
|
|
|
ULONG KernelWcr[2];
|
|
|
|
} KSPECIAL_REGISTERS, *PKSPECIAL_REGISTERS;
|
|
|
|
|
|
|
|
//
|
|
|
|
// ARM64 Architecture State
|
|
|
|
// Based on WoA symbols
|
|
|
|
//
|
|
|
|
typedef struct _KARM64_ARCH_STATE
|
|
|
|
{
|
|
|
|
ULONG64 Midr_El1;
|
|
|
|
ULONG64 Sctlr_El1;
|
|
|
|
ULONG64 Actlr_El1;
|
|
|
|
ULONG64 Cpacr_El1;
|
|
|
|
ULONG64 Tcr_El1;
|
|
|
|
ULONG64 Ttbr0_El1;
|
|
|
|
ULONG64 Ttbr1_El1;
|
|
|
|
ULONG64 Esr_El1;
|
|
|
|
ULONG64 Far_El1;
|
|
|
|
ULONG64 Pmcr_El0;
|
|
|
|
ULONG64 Pmcntenset_El0;
|
|
|
|
ULONG64 Pmccntr_El0;
|
|
|
|
ULONG64 Pmxevcntr_El0[31];
|
|
|
|
ULONG64 Pmxevtyper_El0[31];
|
|
|
|
ULONG64 Pmovsclr_El0;
|
|
|
|
ULONG64 Pmselr_El0;
|
|
|
|
ULONG64 Pmuserenr_El0;
|
|
|
|
ULONG64 Mair_El1;
|
|
|
|
ULONG64 Vbar_El1;
|
|
|
|
} KARM64_ARCH_STATE, *PKARM64_ARCH_STATE;
|
|
|
|
|
|
|
|
typedef struct _KPROCESSOR_STATE
|
|
|
|
{
|
|
|
|
KSPECIAL_REGISTERS SpecialRegisters; // 0
|
|
|
|
KARM64_ARCH_STATE ArchState; // 160
|
|
|
|
CONTEXT ContextFrame; // 800
|
|
|
|
} KPROCESSOR_STATE, *PKPROCESSOR_STATE;
|
|
|
|
|
|
|
|
//
|
|
|
|
// Macro to get current KPRCB
|
|
|
|
//
|
|
|
|
FORCEINLINE
|
|
|
|
struct _KPRCB *
|
|
|
|
KeGetCurrentPrcb(VOID)
|
|
|
|
{
|
|
|
|
//UNIMPLEMENTED;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Just read it from the PCR
|
|
|
|
//
|
|
|
|
#define KeGetCurrentIrql() KeGetPcr()->CurrentIrql
|
|
|
|
#define _KeGetCurrentThread() KeGetCurrentPrcb()->CurrentThread
|
|
|
|
#define _KeGetPreviousMode() KeGetCurrentPrcb()->CurrentThread->PreviousMode
|
|
|
|
#define _KeIsExecutingDpc() (KeGetCurrentPrcb()->DpcRoutineActive != 0)
|
|
|
|
#define KeGetCurrentThread() _KeGetCurrentThread()
|
|
|
|
#define KeGetPreviousMode() _KeGetPreviousMode()
|
|
|
|
|
|
|
|
#endif // !NTOS_MODE_USER
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}; // extern "C"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif // !_ARM64_KETYPES_H
|