diff options
Diffstat (limited to 'include/linux/oprofile.h')
-rw-r--r-- | include/linux/oprofile.h | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/include/linux/oprofile.h b/include/linux/oprofile.h new file mode 100644 index 000000000000..559c4c38a9c7 --- /dev/null +++ b/include/linux/oprofile.h | |||
@@ -0,0 +1,119 @@ | |||
1 | /** | ||
2 | * @file oprofile.h | ||
3 | * | ||
4 | * API for machine-specific interrupts to interface | ||
5 | * to oprofile. | ||
6 | * | ||
7 | * @remark Copyright 2002 OProfile authors | ||
8 | * @remark Read the file COPYING | ||
9 | * | ||
10 | * @author John Levon <levon@movementarian.org> | ||
11 | */ | ||
12 | |||
13 | #ifndef OPROFILE_H | ||
14 | #define OPROFILE_H | ||
15 | |||
16 | #include <linux/types.h> | ||
17 | #include <linux/spinlock.h> | ||
18 | #include <asm/atomic.h> | ||
19 | |||
20 | struct super_block; | ||
21 | struct dentry; | ||
22 | struct file_operations; | ||
23 | struct pt_regs; | ||
24 | |||
25 | /* Operations structure to be filled in */ | ||
26 | struct oprofile_operations { | ||
27 | /* create any necessary configuration files in the oprofile fs. | ||
28 | * Optional. */ | ||
29 | int (*create_files)(struct super_block * sb, struct dentry * root); | ||
30 | /* Do any necessary interrupt setup. Optional. */ | ||
31 | int (*setup)(void); | ||
32 | /* Do any necessary interrupt shutdown. Optional. */ | ||
33 | void (*shutdown)(void); | ||
34 | /* Start delivering interrupts. */ | ||
35 | int (*start)(void); | ||
36 | /* Stop delivering interrupts. */ | ||
37 | void (*stop)(void); | ||
38 | /* Initiate a stack backtrace. Optional. */ | ||
39 | void (*backtrace)(struct pt_regs * const regs, unsigned int depth); | ||
40 | /* CPU identification string. */ | ||
41 | char * cpu_type; | ||
42 | }; | ||
43 | |||
44 | /** | ||
45 | * One-time initialisation. *ops must be set to a filled-in | ||
46 | * operations structure. This is called even in timer interrupt | ||
47 | * mode so an arch can set a backtrace callback. | ||
48 | * | ||
49 | * If an error occurs, the fields should be left untouched. | ||
50 | */ | ||
51 | int oprofile_arch_init(struct oprofile_operations * ops); | ||
52 | |||
53 | /** | ||
54 | * One-time exit/cleanup for the arch. | ||
55 | */ | ||
56 | void oprofile_arch_exit(void); | ||
57 | |||
58 | /** | ||
59 | * Add a sample. This may be called from any context. Pass | ||
60 | * smp_processor_id() as cpu. | ||
61 | */ | ||
62 | void oprofile_add_sample(struct pt_regs * const regs, unsigned long event); | ||
63 | |||
64 | /* Use this instead when the PC value is not from the regs. Doesn't | ||
65 | * backtrace. */ | ||
66 | void oprofile_add_pc(unsigned long pc, int is_kernel, unsigned long event); | ||
67 | |||
68 | /* add a backtrace entry, to be called from the ->backtrace callback */ | ||
69 | void oprofile_add_trace(unsigned long eip); | ||
70 | |||
71 | |||
72 | /** | ||
73 | * Create a file of the given name as a child of the given root, with | ||
74 | * the specified file operations. | ||
75 | */ | ||
76 | int oprofilefs_create_file(struct super_block * sb, struct dentry * root, | ||
77 | char const * name, struct file_operations * fops); | ||
78 | |||
79 | int oprofilefs_create_file_perm(struct super_block * sb, struct dentry * root, | ||
80 | char const * name, struct file_operations * fops, int perm); | ||
81 | |||
82 | /** Create a file for read/write access to an unsigned long. */ | ||
83 | int oprofilefs_create_ulong(struct super_block * sb, struct dentry * root, | ||
84 | char const * name, ulong * val); | ||
85 | |||
86 | /** Create a file for read-only access to an unsigned long. */ | ||
87 | int oprofilefs_create_ro_ulong(struct super_block * sb, struct dentry * root, | ||
88 | char const * name, ulong * val); | ||
89 | |||
90 | /** Create a file for read-only access to an atomic_t. */ | ||
91 | int oprofilefs_create_ro_atomic(struct super_block * sb, struct dentry * root, | ||
92 | char const * name, atomic_t * val); | ||
93 | |||
94 | /** create a directory */ | ||
95 | struct dentry * oprofilefs_mkdir(struct super_block * sb, struct dentry * root, | ||
96 | char const * name); | ||
97 | |||
98 | /** | ||
99 | * Write the given asciz string to the given user buffer @buf, updating *offset | ||
100 | * appropriately. Returns bytes written or -EFAULT. | ||
101 | */ | ||
102 | ssize_t oprofilefs_str_to_user(char const * str, char __user * buf, size_t count, loff_t * offset); | ||
103 | |||
104 | /** | ||
105 | * Convert an unsigned long value into ASCII and copy it to the user buffer @buf, | ||
106 | * updating *offset appropriately. Returns bytes written or -EFAULT. | ||
107 | */ | ||
108 | ssize_t oprofilefs_ulong_to_user(unsigned long val, char __user * buf, size_t count, loff_t * offset); | ||
109 | |||
110 | /** | ||
111 | * Read an ASCII string for a number from a userspace buffer and fill *val on success. | ||
112 | * Returns 0 on success, < 0 on error. | ||
113 | */ | ||
114 | int oprofilefs_ulong_from_user(unsigned long * val, char const __user * buf, size_t count); | ||
115 | |||
116 | /** lock for read/write safety */ | ||
117 | extern spinlock_t oprofilefs_lock; | ||
118 | |||
119 | #endif /* OPROFILE_H */ | ||