About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / prctl / disable-tsc-test.c




Custom Search

Based on kernel version 3.13. Page generated on 2014-01-20 22:04 EST.

1	/*
2	 * Tests for prctl(PR_GET_TSC, ...) / prctl(PR_SET_TSC, ...)
3	 *
4	 * Basic test to test behaviour of PR_GET_TSC and PR_SET_TSC
5	 */
6	
7	#include <stdio.h>
8	#include <stdlib.h>
9	#include <unistd.h>
10	#include <signal.h>
11	#include <inttypes.h>
12	
13	
14	#include <sys/prctl.h>
15	#include <linux/prctl.h>
16	
17	/* Get/set the process' ability to use the timestamp counter instruction */
18	#ifndef PR_GET_TSC
19	#define PR_GET_TSC 25
20	#define PR_SET_TSC 26
21	# define PR_TSC_ENABLE		1   /* allow the use of the timestamp counter */
22	# define PR_TSC_SIGSEGV		2   /* throw a SIGSEGV instead of reading the TSC */
23	#endif
24	
25	const char *tsc_names[] =
26	{
27		[0] = "[not set]",
28		[PR_TSC_ENABLE] = "PR_TSC_ENABLE",
29		[PR_TSC_SIGSEGV] = "PR_TSC_SIGSEGV",
30	};
31	
32	uint64_t rdtsc() {
33	uint32_t lo, hi;
34	/* We cannot use "=A", since this would use %rax on x86_64 */
35	__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
36	return (uint64_t)hi << 32 | lo;
37	}
38	
39	void sigsegv_cb(int sig)
40	{
41		int tsc_val = 0;
42	
43		printf("[ SIG_SEGV ]\n");
44		printf("prctl(PR_GET_TSC, &tsc_val); ");
45		fflush(stdout);
46	
47		if ( prctl(PR_GET_TSC, &tsc_val) == -1)
48			perror("prctl");
49	
50		printf("tsc_val == %s\n", tsc_names[tsc_val]);
51		printf("prctl(PR_SET_TSC, PR_TSC_ENABLE)\n");
52		fflush(stdout);
53		if ( prctl(PR_SET_TSC, PR_TSC_ENABLE) == -1)
54			perror("prctl");
55	
56		printf("rdtsc() == ");
57	}
58	
59	int main(int argc, char **argv)
60	{
61		int tsc_val = 0;
62	
63		signal(SIGSEGV, sigsegv_cb);
64	
65		printf("rdtsc() == %llu\n", (unsigned long long)rdtsc());
66		printf("prctl(PR_GET_TSC, &tsc_val); ");
67		fflush(stdout);
68	
69		if ( prctl(PR_GET_TSC, &tsc_val) == -1)
70			perror("prctl");
71	
72		printf("tsc_val == %s\n", tsc_names[tsc_val]);
73		printf("rdtsc() == %llu\n", (unsigned long long)rdtsc());
74		printf("prctl(PR_SET_TSC, PR_TSC_ENABLE)\n");
75		fflush(stdout);
76	
77		if ( prctl(PR_SET_TSC, PR_TSC_ENABLE) == -1)
78			perror("prctl");
79	
80		printf("rdtsc() == %llu\n", (unsigned long long)rdtsc());
81		printf("prctl(PR_SET_TSC, PR_TSC_SIGSEGV)\n");
82		fflush(stdout);
83	
84		if ( prctl(PR_SET_TSC, PR_TSC_SIGSEGV) == -1)
85			perror("prctl");
86	
87		printf("rdtsc() == ");
88		fflush(stdout);
89		printf("%llu\n", (unsigned long long)rdtsc());
90		fflush(stdout);
91	
92		exit(EXIT_SUCCESS);
93	}
Hide Line Numbers
About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Information is copyright its respective author. All material is available from the Linux Kernel Source distributed under a GPL License. This page is provided as a free service by mjmwired.net.