blob: 92102fa47c6e4eb9b8acd3836cdbe713e73cb932 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
/* msr tests */
#include "libcflat.h"
#define MSR_KERNEL_GS_BASE 0xc0000102 /* SwapGS GS shadow */
int nr_passed, nr_tests;
#ifdef __x86_64__
static void report(const char *name, int passed)
{
++nr_tests;
if (passed)
++nr_passed;
printf("%s: %s\n", name, passed ? "PASS" : "FAIL");
}
static void wrmsr(unsigned index, unsigned long long value)
{
asm volatile ("wrmsr" : : "c"(index), "A"(value));
}
static unsigned long long rdmsr(unsigned index)
{
unsigned long long value;
asm volatile ("rdmsr" : "=A"(value) : "c"(index));
return value;
}
#endif
static void test_kernel_gs_base(void)
{
#ifdef __x86_64__
unsigned long long v1 = 0x123456789abcdef, v2;
wrmsr(MSR_KERNEL_GS_BASE, v1);
v2 = rdmsr(MSR_KERNEL_GS_BASE);
report("MSR_KERNEL_GS_BASE", v1 == v2);
#endif
}
int main(int ac, char **av)
{
test_kernel_gs_base();
printf("%d tests, %d failures\n", nr_tests, nr_tests - nr_passed);
return nr_passed == nr_tests ? 0 : 1;
}
|