blob: 7881368142faaad53fe374c60aff964a69549770 [file] [log] [blame]
Markus Metzgereee3af42008-01-30 13:31:09 +01001/*
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
26struct 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 */
34enum bts_qualifier {
35 BTS_INVALID = 0,
36 BTS_BRANCH,
37 BTS_TASK_ARRIVES,
38 BTS_TASK_DEPARTS
39};
40
41struct bts_struct {
Markus Metzgere6ae5d92008-01-30 13:32:03 +010042 u64 qualifier;
Markus Metzgereee3af42008-01-30 13:31:09 +010043 union {
44 /* BTS_BRANCH */
45 struct {
Markus Metzgere6ae5d92008-01-30 13:32:03 +010046 u64 from_ip;
47 u64 to_ip;
Markus Metzgereee3af42008-01-30 13:31:09 +010048 } lbr;
49 /* BTS_TASK_ARRIVES or
50 BTS_TASK_DEPARTS */
Markus Metzgere6ae5d92008-01-30 13:32:03 +010051 u64 jiffies;
Markus Metzgereee3af42008-01-30 13:31:09 +010052 } variant;
53};
54
Markus Metzgera95d67f2008-01-30 13:31:20 +010055/* Overflow handling mechanisms */
56#define DS_O_SIGNAL 1 /* send overflow signal */
57#define DS_O_WRAP 2 /* wrap around */
Markus Metzgereee3af42008-01-30 13:31:09 +010058
59extern int ds_allocate(void **, size_t);
60extern int ds_free(void **);
61extern int ds_get_bts_size(void *);
Markus Metzgera95d67f2008-01-30 13:31:20 +010062extern int ds_get_bts_end(void *);
Markus Metzgereee3af42008-01-30 13:31:09 +010063extern int ds_get_bts_index(void *);
Markus Metzgera95d67f2008-01-30 13:31:20 +010064extern int ds_set_overflow(void *, int);
65extern int ds_get_overflow(void *);
66extern int ds_clear(void *);
Markus Metzgere6ae5d92008-01-30 13:32:03 +010067extern int ds_read_bts(void *, int, struct bts_struct *);
Markus Metzgereee3af42008-01-30 13:31:09 +010068extern int ds_write_bts(void *, const struct bts_struct *);
69extern unsigned long ds_debugctl_mask(void);
70extern void __cpuinit ds_init_intel(struct cpuinfo_x86 *c);
71
72#endif /* _ASM_X86_DS_H */