aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/jump_label.h32
-rw-r--r--include/linux/perf_event.h11
-rw-r--r--include/linux/uprobes.h76
3 files changed, 118 insertions, 1 deletions
diff --git a/include/linux/jump_label.h b/include/linux/jump_label.h
index 5ce8b140428f..f7c69580fea7 100644
--- a/include/linux/jump_label.h
+++ b/include/linux/jump_label.h
@@ -1,6 +1,38 @@
1#ifndef _LINUX_JUMP_LABEL_H 1#ifndef _LINUX_JUMP_LABEL_H
2#define _LINUX_JUMP_LABEL_H 2#define _LINUX_JUMP_LABEL_H
3 3
4/*
5 * Jump label support
6 *
7 * Copyright (C) 2009-2012 Jason Baron <jbaron@redhat.com>
8 * Copyright (C) 2011-2012 Peter Zijlstra <pzijlstr@redhat.com>
9 *
10 * Jump labels provide an interface to generate dynamic branches using
11 * self-modifying code. Assuming toolchain and architecture support the result
12 * of a "if (static_branch(&key))" statement is a unconditional branch (which
13 * defaults to false - and the true block is placed out of line).
14 *
15 * However at runtime we can change the 'static' branch target using
16 * jump_label_{inc,dec}(). These function as a 'reference' count on the key
17 * object and for as long as there are references all branches referring to
18 * that particular key will point to the (out of line) true block.
19 *
20 * Since this relies on modifying code the jump_label_{inc,dec}() functions
21 * must be considered absolute slow paths (machine wide synchronization etc.).
22 * OTOH, since the affected branches are unconditional their runtime overhead
23 * will be absolutely minimal, esp. in the default (off) case where the total
24 * effect is a single NOP of appropriate size. The on case will patch in a jump
25 * to the out-of-line block.
26 *
27 * When the control is directly exposed to userspace it is prudent to delay the
28 * decrement to avoid high frequency code modifications which can (and do)
29 * cause significant performance degradation. Struct jump_label_key_deferred and
30 * jump_label_dec_deferred() provide for this.
31 *
32 * Lacking toolchain and or architecture support, it falls back to a simple
33 * conditional branch.
34 */
35
4#include <linux/types.h> 36#include <linux/types.h>
5#include <linux/compiler.h> 37#include <linux/compiler.h>
6#include <linux/workqueue.h> 38#include <linux/workqueue.h>
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
index abb2776be1ba..412b790f5da6 100644
--- a/include/linux/perf_event.h
+++ b/include/linux/perf_event.h
@@ -291,12 +291,14 @@ struct perf_event_mmap_page {
291 __s64 offset; /* add to hardware event value */ 291 __s64 offset; /* add to hardware event value */
292 __u64 time_enabled; /* time event active */ 292 __u64 time_enabled; /* time event active */
293 __u64 time_running; /* time event on cpu */ 293 __u64 time_running; /* time event on cpu */
294 __u32 time_mult, time_shift;
295 __u64 time_offset;
294 296
295 /* 297 /*
296 * Hole for extension of the self monitor capabilities 298 * Hole for extension of the self monitor capabilities
297 */ 299 */
298 300
299 __u64 __reserved[123]; /* align to 1k */ 301 __u64 __reserved[121]; /* align to 1k */
300 302
301 /* 303 /*
302 * Control data for the mmap() data buffer. 304 * Control data for the mmap() data buffer.
@@ -616,6 +618,7 @@ struct pmu {
616 struct list_head entry; 618 struct list_head entry;
617 619
618 struct device *dev; 620 struct device *dev;
621 const struct attribute_group **attr_groups;
619 char *name; 622 char *name;
620 int type; 623 int type;
621 624
@@ -681,6 +684,12 @@ struct pmu {
681 * for each successful ->add() during the transaction. 684 * for each successful ->add() during the transaction.
682 */ 685 */
683 void (*cancel_txn) (struct pmu *pmu); /* optional */ 686 void (*cancel_txn) (struct pmu *pmu); /* optional */
687
688 /*
689 * Will return the value for perf_event_mmap_page::index for this event,
690 * if no implementation is provided it will default to: event->hw.idx + 1.
691 */
692 int (*event_idx) (struct perf_event *event); /*optional */
684}; 693};
685 694
686/** 695/**
diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h
new file mode 100644
index 000000000000..eac525f41b94
--- /dev/null
+++ b/include/linux/uprobes.h
@@ -0,0 +1,76 @@
1#ifndef _LINUX_UPROBES_H
2#define _LINUX_UPROBES_H
3/*
4 * User-space Probes (UProbes)
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 *
20 * Copyright (C) IBM Corporation, 2008-2012
21 * Authors:
22 * Srikar Dronamraju
23 * Jim Keniston
24 * Copyright (C) 2011-2012 Red Hat, Inc., Peter Zijlstra <pzijlstr@redhat.com>
25 */
26
27#include <linux/errno.h>
28#include <linux/rbtree.h>
29
30struct vm_area_struct;
31#ifdef CONFIG_ARCH_SUPPORTS_UPROBES
32#include <asm/uprobes.h>
33#endif
34
35/* flags that denote/change uprobes behaviour */
36
37/* Have a copy of original instruction */
38#define UPROBE_COPY_INSN 0x1
39
40/* Dont run handlers when first register/ last unregister in progress*/
41#define UPROBE_RUN_HANDLER 0x2
42
43struct uprobe_consumer {
44 int (*handler)(struct uprobe_consumer *self, struct pt_regs *regs);
45 /*
46 * filter is optional; If a filter exists, handler is run
47 * if and only if filter returns true.
48 */
49 bool (*filter)(struct uprobe_consumer *self, struct task_struct *task);
50
51 struct uprobe_consumer *next;
52};
53
54#ifdef CONFIG_UPROBES
55extern int __weak set_swbp(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr);
56extern int __weak set_orig_insn(struct arch_uprobe *aup, struct mm_struct *mm, unsigned long vaddr, bool verify);
57extern bool __weak is_swbp_insn(uprobe_opcode_t *insn);
58extern int uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc);
59extern void uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc);
60extern int uprobe_mmap(struct vm_area_struct *vma);
61#else /* CONFIG_UPROBES is not defined */
62static inline int
63uprobe_register(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
64{
65 return -ENOSYS;
66}
67static inline void
68uprobe_unregister(struct inode *inode, loff_t offset, struct uprobe_consumer *uc)
69{
70}
71static inline int uprobe_mmap(struct vm_area_struct *vma)
72{
73 return 0;
74}
75#endif /* CONFIG_UPROBES */
76#endif /* _LINUX_UPROBES_H */