ReactOS
0.4.15-dev-4582-g6dc1738
intrin_i.h
Go to the documentation of this file.
1
#ifndef _INTRIN_INTERNAL_
2
#define _INTRIN_INTERNAL_
3
4
FORCEINLINE
5
VOID
6
KeSetCurrentIrql
(
KIRQL
Irql
)
7
{
8
__writecr8(
Irql
);
9
}
10
11
FORCEINLINE
12
PKGDTENTRY64
13
KiGetGdtEntry
(
PVOID
pGdt,
USHORT
Selector)
14
{
15
return
(
PKGDTENTRY64
)((
ULONG64
)pGdt + (Selector & ~
RPL_MASK
));
16
}
17
18
FORCEINLINE
19
PVOID
20
KiGetGdtDescriptorBase
(
PKGDTENTRY
Entry
)
21
{
22
return
(
PVOID
)((
ULONG64
)
Entry
->BaseLow |
23
(
ULONG64
)
Entry
->Bytes.BaseMiddle << 16 |
24
(
ULONG64
)
Entry
->Bytes.BaseHigh << 24 |
25
(
ULONG64
)
Entry
->BaseUpper << 32);
26
}
27
28
FORCEINLINE
29
VOID
30
KiSetGdtDescriptorBase
(
PKGDTENTRY
Entry
,
ULONG64
Base
)
31
{
32
Entry
->BaseLow =
Base
& 0xffff;
33
Entry
->Bits.BaseMiddle = (
Base
>> 16) & 0xff;
34
Entry
->Bits.BaseHigh = (
Base
>> 24) & 0xff;
35
Entry
->BaseUpper =
Base
>> 32;
36
}
37
38
FORCEINLINE
39
VOID
40
KiSetGdtDescriptorLimit
(
PKGDTENTRY
Entry
,
ULONG
Limit
)
41
{
42
Entry
->LimitLow =
Limit
& 0xffff;
43
Entry
->Bits.LimitHigh =
Limit
>> 16;
44
}
45
46
FORCEINLINE
47
VOID
48
KiInitGdtEntry
(
PKGDTENTRY64
Entry
,
ULONG64
Base
,
ULONG
Size
,
UCHAR
Type
,
UCHAR
Dpl)
49
{
50
KiSetGdtDescriptorBase
(
Entry
,
Base
);
51
KiSetGdtDescriptorLimit
(
Entry
,
Size
- 1);
52
Entry
->Bits.Type =
Type
;
53
Entry
->Bits.Dpl = Dpl;
54
Entry
->Bits.Present = 1;
55
Entry
->Bits.System = 0;
56
Entry
->Bits.LongMode = 0;
57
Entry
->Bits.DefaultBig = 0;
58
Entry
->Bits.Granularity = 0;
59
Entry
->MustBeZero = 0;
60
}
61
62
#if defined(__GNUC__)
63
64
static
__inline__
__attribute__
((always_inline))
void
__lgdt(
void
*
Source
)
65
{
66
__asm__
__volatile__(
"lgdt %0"
: :
"m"
(*(
short
*)
Source
));
67
}
68
69
static
__inline__
__attribute__
((always_inline))
void
__sgdt(
void
*
Destination
)
70
{
71
__asm__
__volatile__(
"sgdt %0"
: :
"m"
(*(
short
*)
Destination
) :
"memory"
);
72
}
73
74
static
__inline__
__attribute__
((always_inline))
void
__lldt(
unsigned
short
Value
)
75
{
76
__asm__
__volatile__(
"lldt %0"
: :
"rm"
(
Value
));
77
}
78
79
static
__inline__
__attribute__
((always_inline))
void
__sldt(
void
*
Destination
)
80
{
81
__asm__
__volatile__(
"sldt %0"
: :
"m"
(*(
short
*)
Destination
) :
"memory"
);
82
}
83
84
static
__inline__
__attribute__
((always_inline))
void
__ldmxcsr(
unsigned
long
*
Source
)
85
{
86
__asm__
__volatile__(
"ldmxcsr %0"
: :
"m"
(*
Source
));
87
}
88
89
static
__inline__
__attribute__
((always_inline))
void
__stmxcsr(
unsigned
long
*
Destination
)
90
{
91
__asm__
__volatile__(
"stmxcsr %0"
: :
"m"
(*
Destination
) :
"memory"
);
92
}
93
94
static
__inline__
__attribute__
((always_inline))
void
__ltr(
unsigned
short
Source
)
95
{
96
__asm__
__volatile__(
"ltr %0"
: :
"rm"
(
Source
));
97
}
98
99
static
__inline__
__attribute__
((always_inline))
void
__str(
unsigned
short
*
Destination
)
100
{
101
__asm__
__volatile__(
"str %0"
: :
"m"
(*
Destination
) :
"memory"
);
102
}
103
104
105
#elif defined(_MSC_VER)
106
107
void
__lgdt(
void
*
Source
);
108
109
void
__sgdt(
void
*
Destination
);
110
111
void
__lldt(
unsigned
short
Value
);
112
113
void
__sldt(
void
*
Destination
);
114
115
void
__ltr(
unsigned
short
Source
);
116
117
void
__str(
unsigned
short
*
Destination
);
118
119
120
#else
121
#error Unknown compiler for inline assembler
122
#endif
123
124
#endif
125
126
/* EOF */
KiGetGdtDescriptorBase
FORCEINLINE PVOID KiGetGdtDescriptorBase(PKGDTENTRY Entry)
Definition:
intrin_i.h:20
_KGDTENTRY64
Definition:
ketypes.h:408
KeSetCurrentIrql
FORCEINLINE VOID KeSetCurrentIrql(KIRQL Irql)
Definition:
intrin_i.h:6
Base
_In_opt_ ULONG Base
Definition:
rtlfuncs.h:2386
Size
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition:
pci.h:361
__asm__
__asm__("\n\t \ NewInt3Handler:\n\t \ pushl $" STR(REASON_INT3) "\n\t \ // call debugger loop\n\t \ jmp NewInt31Handler\n\t \ ")
KiGetGdtEntry
FORCEINLINE PKGDTENTRY64 KiGetGdtEntry(PVOID pGdt, USHORT Selector)
Definition:
intrin_i.h:13
_KGDTENTRY
Definition:
ketypes.h:334
Irql
_Out_ PKIRQL Irql
Definition:
csq.h:179
KiSetGdtDescriptorLimit
FORCEINLINE VOID KiSetGdtDescriptorLimit(PKGDTENTRY Entry, ULONG Limit)
Definition:
intrin_i.h:40
__attribute__
#define __attribute__(x)
Definition:
wpp_private.h:207
KIRQL
UCHAR KIRQL
Definition:
env_spec_w32.h:591
RPL_MASK
#define RPL_MASK
Definition:
ketypes.h:69
Value
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition:
wdfregistry.h:406
Type
Type
Definition:
Type.h:6
Destination
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition:
rtlfuncs.h:2950
ULONG64
unsigned __int64 ULONG64
Definition:
imports.h:198
UCHAR
unsigned char UCHAR
Definition:
xmlstorage.h:181
KiSetGdtDescriptorBase
FORCEINLINE VOID KiSetGdtDescriptorBase(PKGDTENTRY Entry, ULONG64 Base)
Definition:
intrin_i.h:30
KiInitGdtEntry
FORCEINLINE VOID KiInitGdtEntry(PKGDTENTRY64 Entry, ULONG64 Base, ULONG Size, UCHAR Type, UCHAR Dpl)
Definition:
intrin_i.h:48
USHORT
unsigned short USHORT
Definition:
pedump.c:61
FORCEINLINE
#define FORCEINLINE
Definition:
wdftypes.h:67
ULONG
unsigned int ULONG
Definition:
retypes.h:1
Source
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition:
ndis.h:3167
void
Definition:
nsiface.idl:2306
Limit
_In_ LONG _In_ LONG Limit
Definition:
kefuncs.h:317
Entry
base of all file and directory entries
Definition:
entries.h:82
ntoskrnl
include
internal
amd64
intrin_i.h
Generated on Mon May 23 2022 06:07:07 for ReactOS by
1.8.15