HyperDbg Debugger
Toggle main menu visibility
Loading...
Searching...
No Matches
LbrDefinitions.h
Go to the documentation of this file.
1
12
#pragma once
13
15
// Constants //
17
21
#define MSR_LEGACY_LBR_SELECT 0x000001C8
22
27
#define MAXIMUM_LBR_CAPACITY 0x20
// 32 entries, which is the maximum supported by modern Intel CPUs
28
29
/*
30
* Intel LBR_SELECT bits
31
*
32
* Hardware branch filter (not available on all CPUs)
33
*/
34
#define LBR_KERNEL_BIT 0
/* do not capture at ring0 */
35
#define LBR_USER_BIT 1
/* do not capture at ring > 0 */
36
#define LBR_JCC_BIT 2
/* do not capture conditional branches */
37
#define LBR_REL_CALL_BIT 3
/* do not capture relative calls */
38
#define LBR_IND_CALL_BIT 4
/* do not capture indirect calls */
39
#define LBR_RETURN_BIT 5
/* do not capture near returns */
40
#define LBR_IND_JMP_BIT 6
/* do not capture indirect jumps */
41
#define LBR_REL_JMP_BIT 7
/* do not capture relative jumps */
42
#define LBR_FAR_BIT 8
/* do not capture far branches */
43
#define LBR_CALL_STACK_BIT 9
/* enable call stack: not available on all CPUs */
44
45
/*
46
* We mask it out before writing it to
47
* the actual MSR. But it helps the constraint code to understand
48
* that this is a separate configuration.
49
*/
50
#define LBR_KERNEL (1 << LBR_KERNEL_BIT)
51
#define LBR_USER (1 << LBR_USER_BIT)
52
#define LBR_JCC (1 << LBR_JCC_BIT)
53
#define LBR_REL_CALL (1 << LBR_REL_CALL_BIT)
54
#define LBR_IND_CALL (1 << LBR_IND_CALL_BIT)
55
#define LBR_RETURN (1 << LBR_RETURN_BIT)
56
#define LBR_IND_JMP (1 << LBR_IND_JMP_BIT)
57
#define LBR_REL_JMP (1 << LBR_REL_JMP_BIT)
58
#define LBR_FAR_OTHER_BRANCHES (1 << LBR_FAR_BIT)
// It is used for OTHER BRANCHES in ARCH LBR
59
#define LBR_CALL_STACK (1 << LBR_CALL_STACK_BIT)
60
65
#define LBR_CALL_STACK_BASE_FLAGS (LBR_CALL_STACK | (LBR_JCC | LBR_IND_JMP | LBR_REL_JMP | LBR_FAR_OTHER_BRANCHES))
66
70
#define LBR_BR_TYPE_COND 0x0
71
#define LBR_BR_TYPE_JMP_INDIRECT 0x1
72
#define LBR_BR_TYPE_JMP_DIRECT 0x2
73
#define LBR_BR_TYPE_CALL_INDIRECT 0x3
74
#define LBR_BR_TYPE_CALL_DIRECT 0x4
75
#define LBR_BR_TYPE_RET 0x5
76
#define LBR_BR_TYPE_RESERVED_MIN 0x6
/* 011xb */
77
#define LBR_BR_TYPE_RESERVED_MAX 0x7
/* 011xb */
78
#define LBR_BR_TYPE_OTHER_MIN 0x8
/* 1xxxb */
79
#define LBR_BR_TYPE_OTHER_MAX 0xF
/* 1xxxb */
80
81
#define LBR_BR_TYPE_NAME_MAX_LEN 16
/* longest string is "CALL Indirect\0" = 14 chars, rounded up */
82
84
// MSR Structures //
86
90
typedef
union
91
{
92
struct
93
{
95
UINT64
CycleCount
: 16;
96
99
UINT64
Reserved
: 40;
100
113
UINT64
BrType_OnlyArchLbr
: 4;
114
116
UINT64
CycCntValid_OnlyArchLbr
: 1;
117
126
UINT64
TsxAbort
: 1;
127
133
UINT64
InTsx
: 1;
134
141
UINT64
Mispred
: 1;
142
};
143
UINT64
AsUInt
;
144
}
MSR_LBR_INFO
, *
PMSR_LBR_INFO
;
145
147
// Structures //
149
154
typedef
struct
_LBR_BRANCH_ENTRY
155
{
156
ULONGLONG
From
;
157
ULONGLONG
To
;
158
159
}
LBR_BRANCH_ENTRY
,
PLBR_BRANCH_ENTRY
;
160
165
typedef
struct
_LBR_STACK_ENTRY
166
{
167
LBR_BRANCH_ENTRY
BranchEntry
[
MAXIMUM_LBR_CAPACITY
];
168
MSR_LBR_INFO
LastBranchInfo
[
MAXIMUM_LBR_CAPACITY
];
169
UINT8
Tos
;
170
171
}
LBR_STACK_ENTRY
,
PLBR_STACK_ENTRY
;
UINT8
unsigned char UINT8
Definition
BasicTypes.h:52
PLBR_STACK_ENTRY
struct _LBR_STACK_ENTRY PLBR_STACK_ENTRY
PLBR_BRANCH_ENTRY
struct _LBR_BRANCH_ENTRY PLBR_BRANCH_ENTRY
LBR_BRANCH_ENTRY
struct _LBR_BRANCH_ENTRY LBR_BRANCH_ENTRY
The structure to hold a single LBR entry (from and to addresses).
LBR_STACK_ENTRY
struct _LBR_STACK_ENTRY LBR_STACK_ENTRY
The structure to hold the LBR stack for a single processor core, including the branch entries and the...
PMSR_LBR_INFO
union MSR_LBR_INFO * PMSR_LBR_INFO
MAXIMUM_LBR_CAPACITY
#define MAXIMUM_LBR_CAPACITY
Maximum LBR capacity that is supported by processors.
Definition
LbrDefinitions.h:27
LBR_BRANCH_ENTRY
struct _LBR_BRANCH_ENTRY LBR_BRANCH_ENTRY
The structure to hold a single LBR entry (from and to addresses).
_LBR_BRANCH_ENTRY
The structure to hold a single LBR entry (from and to addresses).
Definition
LbrDefinitions.h:155
_LBR_BRANCH_ENTRY::From
ULONGLONG From
Definition
LbrDefinitions.h:156
_LBR_BRANCH_ENTRY::To
ULONGLONG To
Definition
LbrDefinitions.h:157
_LBR_STACK_ENTRY
The structure to hold the LBR stack for a single processor core, including the branch entries and the...
Definition
LbrDefinitions.h:166
_LBR_STACK_ENTRY::LastBranchInfo
MSR_LBR_INFO LastBranchInfo[MAXIMUM_LBR_CAPACITY]
Definition
LbrDefinitions.h:168
_LBR_STACK_ENTRY::Tos
UINT8 Tos
Definition
LbrDefinitions.h:169
_LBR_STACK_ENTRY::BranchEntry
LBR_BRANCH_ENTRY BranchEntry[MAXIMUM_LBR_CAPACITY]
Definition
LbrDefinitions.h:167
MSR_LBR_INFO
Definition
LbrDefinitions.h:91
MSR_LBR_INFO::InTsx
UINT64 InTsx
Definition
LbrDefinitions.h:133
MSR_LBR_INFO::Mispred
UINT64 Mispred
Definition
LbrDefinitions.h:141
MSR_LBR_INFO::BrType_OnlyArchLbr
UINT64 BrType_OnlyArchLbr
Definition
LbrDefinitions.h:113
MSR_LBR_INFO::CycCntValid_OnlyArchLbr
UINT64 CycCntValid_OnlyArchLbr
Definition
LbrDefinitions.h:116
MSR_LBR_INFO::CycleCount
UINT64 CycleCount
Definition
LbrDefinitions.h:95
MSR_LBR_INFO::AsUInt
UINT64 AsUInt
Definition
LbrDefinitions.h:143
MSR_LBR_INFO::Reserved
UINT64 Reserved
Definition
LbrDefinitions.h:99
MSR_LBR_INFO::TsxAbort
UINT64 TsxAbort
Definition
LbrDefinitions.h:126
hyperdbg
build
bin
debug
SDK
headers
LbrDefinitions.h
Generated by
1.17.0