diff options
Diffstat (limited to 'include/asm-x86/ds.h')
-rw-r--r-- | include/asm-x86/ds.h | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/include/asm-x86/ds.h b/include/asm-x86/ds.h new file mode 100644 index 000000000000..7881368142fa --- /dev/null +++ b/include/asm-x86/ds.h | |||
@@ -0,0 +1,72 @@ | |||
1 | /* | ||
2 | * Debug Store (DS) support | ||
3 | * | ||
4 | * This provides a low-level interface to the hardware's Debug Store | ||
5 | * feature that is used for last branch recording (LBR) and | ||
6 | * precise-event based sampling (PEBS). | ||
7 | * | ||
8 | * Different architectures use a different DS layout/pointer size. | ||
9 | * The below functions therefore work on a void*. | ||
10 | * | ||
11 | * | ||
12 | * Since there is no user for PEBS, yet, only LBR (or branch | ||
13 | * trace store, BTS) is supported. | ||
14 | * | ||
15 | * | ||
16 | * Copyright (C) 2007 Intel Corporation. | ||
17 | * Markus Metzger <markus.t.metzger@intel.com>, Dec 2007 | ||
18 | */ | ||
19 | |||
20 | #ifndef _ASM_X86_DS_H | ||
21 | #define _ASM_X86_DS_H | ||
22 | |||
23 | #include <linux/types.h> | ||
24 | #include <linux/init.h> | ||
25 | |||
26 | struct cpuinfo_x86; | ||
27 | |||
28 | |||
29 | /* a branch trace record entry | ||
30 | * | ||
31 | * In order to unify the interface between various processor versions, | ||
32 | * we use the below data structure for all processors. | ||
33 | */ | ||
34 | enum bts_qualifier { | ||
35 | BTS_INVALID = 0, | ||
36 | BTS_BRANCH, | ||
37 | BTS_TASK_ARRIVES, | ||
38 | BTS_TASK_DEPARTS | ||
39 | }; | ||
40 | |||
41 | struct bts_struct { | ||
42 | u64 qualifier; | ||
43 | union { | ||
44 | /* BTS_BRANCH */ | ||
45 | struct { | ||
46 | u64 from_ip; | ||
47 | u64 to_ip; | ||
48 | } lbr; | ||
49 | /* BTS_TASK_ARRIVES or | ||
50 | BTS_TASK_DEPARTS */ | ||
51 | u64 jiffies; | ||
52 | } variant; | ||
53 | }; | ||
54 | |||
55 | /* Overflow handling mechanisms */ | ||
56 | #define DS_O_SIGNAL 1 /* send overflow signal */ | ||
57 | #define DS_O_WRAP 2 /* wrap around */ | ||
58 | |||
59 | extern int ds_allocate(void **, size_t); | ||
60 | extern int ds_free(void **); | ||
61 | extern int ds_get_bts_size(void *); | ||
62 | extern int ds_get_bts_end(void *); | ||
63 | extern int ds_get_bts_index(void *); | ||
64 | extern int ds_set_overflow(void *, int); | ||
65 | extern int ds_get_overflow(void *); | ||
66 | extern int ds_clear(void *); | ||
67 | extern int ds_read_bts(void *, int, struct bts_struct *); | ||
68 | extern int ds_write_bts(void *, const struct bts_struct *); | ||
69 | extern unsigned long ds_debugctl_mask(void); | ||
70 | extern void __cpuinit ds_init_intel(struct cpuinfo_x86 *c); | ||
71 | |||
72 | #endif /* _ASM_X86_DS_H */ | ||