summaryrefslogtreecommitdiff
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;
}