diff options
| author | John Levon <levon@movementarian.org> | 2002-10-15 04:30:56 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-10-15 04:30:56 -0700 |
| commit | 99ee21eefb9e88a850072e7dab6f0f078f560ece (patch) | |
| tree | eff9c1b0c0f8d031332006da86d6850e7fb52473 /include | |
| parent | 7b401a1309642111dec4f42f4a0491e366c2ae38 (diff) | |
[PATCH] oprofile - core
Add the oprofile core. The core design is very similar to that we
discussed in private mail. The nasty details should be documented in
the patch below.
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/oprofile.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/include/linux/oprofile.h b/include/linux/oprofile.h new file mode 100644 index 000000000000..982b64e0518a --- /dev/null +++ b/include/linux/oprofile.h @@ -0,0 +1,98 @@ +/** + * @file oprofile.h + * + * API for machine-specific interrupts to interface + * to oprofile. + * + * @remark Copyright 2002 OProfile authors + * @remark Read the file COPYING + * + * @author John Levon <levon@movementarian.org> + */ + +#ifndef OPROFILE_H +#define OPROFILE_H + +#include <linux/types.h> +#include <linux/spinlock.h> +#include <asm/atomic.h> + +struct super_block; +struct dentry; +struct file_operations; + +enum oprofile_cpu { + OPROFILE_CPU_PPRO, + OPROFILE_CPU_PII, + OPROFILE_CPU_PIII, + OPROFILE_CPU_ATHLON, + OPROFILE_CPU_TIMER +}; + +/* Operations structure to be filled in */ +struct oprofile_operations { + /* create any necessary configuration files in the oprofile fs. + * Optional. */ + int (*create_files)(struct super_block * sb, struct dentry * root); + /* Do any necessary interrupt setup. Optional. */ + int (*setup)(void); + /* Do any necessary interrupt shutdown. Optional. */ + void (*shutdown)(void); + /* Start delivering interrupts. */ + int (*start)(void); + /* Stop delivering interrupts. */ + void (*stop)(void); +}; + +/** + * One-time initialisation. *ops must be set to a filled-in + * operations structure. oprofile_cpu_type must be set. + * Return 0 on success. + */ +int oprofile_arch_init(struct oprofile_operations ** ops, enum oprofile_cpu * cpu); + +/** + * Add a sample. This may be called from any context. Pass + * smp_processor_id() as cpu. + */ +extern void FASTCALL(oprofile_add_sample(unsigned long eip, unsigned long event, int cpu)); + +/** + * Create a file of the given name as a child of the given root, with + * the specified file operations. + */ +int oprofilefs_create_file(struct super_block * sb, struct dentry * root, + char const * name, struct file_operations * fops); + +/** Create a file for read/write access to an unsigned long. */ +int oprofilefs_create_ulong(struct super_block * sb, struct dentry * root, + char const * name, ulong * val); + +/** Create a file for read-only access to an unsigned long. */ +int oprofilefs_create_ro_ulong(struct super_block * sb, struct dentry * root, + char const * name, ulong * val); + +/** Create a file for read-only access to an atomic_t. */ +int oprofilefs_create_ro_atomic(struct super_block * sb, struct dentry * root, + char const * name, atomic_t * val); + +/** create a directory */ +struct dentry * oprofilefs_mkdir(struct super_block * sb, struct dentry * root, + char const * name); + +/** + * Convert an unsigned long value into ASCII and copy it to the user buffer @buf, + * updating *offset appropriately. Returns bytes written or -EFAULT. + */ +ssize_t oprofilefs_ulong_to_user(unsigned long * val, char * buf, size_t count, loff_t * offset); + +/** + * Read an ASCII string for a number from a userspace buffer and fill *val on success. + * Returns 0 on success, < 0 on error. + */ +int oprofilefs_ulong_from_user(unsigned long * val, char const * buf, size_t count); + +/** lock for read/write safety */ +extern spinlock_t oprofilefs_lock; + +#endif /* OPROFILE_H */ |
