5cd55b0ede
export profile_pc() symbol - oprofile needs it when built as a module. Signed-off-by: Grant Grundler <grundler@parisc-linux.org> Take into account nullified insn and lock functions for profiling This is needed at the end of functions; it is typical that the return branch nullifies the next insn, which is in the next function. This causes profiling data to show up against the "wrong" function. We also count lock times against the locker. This is consistent with other architectures. Signed-off-by: Randolph Chung <tausq@parisc-linux.org> Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
56 lines
1.7 KiB
C
56 lines
1.7 KiB
C
#ifndef _PARISC_PTRACE_H
|
|
#define _PARISC_PTRACE_H
|
|
|
|
/* written by Philipp Rumpf, Copyright (C) 1999 SuSE GmbH Nuernberg
|
|
** Copyright (C) 2000 Grant Grundler, Hewlett-Packard
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
|
|
/* This struct defines the way the registers are stored on the
|
|
* stack during a system call.
|
|
*
|
|
* N.B. gdb/strace care about the size and offsets within this
|
|
* structure. If you change things, you may break object compatibility
|
|
* for those applications.
|
|
*/
|
|
|
|
struct pt_regs {
|
|
unsigned long gr[32]; /* PSW is in gr[0] */
|
|
__u64 fr[32];
|
|
unsigned long sr[ 8];
|
|
unsigned long iasq[2];
|
|
unsigned long iaoq[2];
|
|
unsigned long cr27;
|
|
unsigned long pad0; /* available for other uses */
|
|
unsigned long orig_r28;
|
|
unsigned long ksp;
|
|
unsigned long kpc;
|
|
unsigned long sar; /* CR11 */
|
|
unsigned long iir; /* CR19 */
|
|
unsigned long isr; /* CR20 */
|
|
unsigned long ior; /* CR21 */
|
|
unsigned long ipsw; /* CR22 */
|
|
};
|
|
|
|
#define task_regs(task) ((struct pt_regs *) ((char *)(task) + TASK_REGS))
|
|
/*
|
|
* The numbers chosen here are somewhat arbitrary but absolutely MUST
|
|
* not overlap with any of the number assigned in <linux/ptrace.h>.
|
|
*
|
|
* These ones are taken from IA-64 on the assumption that theirs are
|
|
* the most correct (and we also want to support PTRACE_SINGLEBLOCK
|
|
* since we have taken branch traps too)
|
|
*/
|
|
#define PTRACE_SINGLEBLOCK 12 /* resume execution until next branch */
|
|
#ifdef __KERNEL__
|
|
|
|
/* XXX should we use iaoq[1] or iaoq[0] ? */
|
|
#define user_mode(regs) (((regs)->iaoq[0] & 3) ? 1 : 0)
|
|
#define user_space(regs) (((regs)->iasq[1] != 0) ? 1 : 0)
|
|
#define instruction_pointer(regs) ((regs)->iaoq[0] & ~3)
|
|
unsigned long profile_pc(struct pt_regs *);
|
|
extern void show_regs(struct pt_regs *);
|
|
#endif
|
|
|
|
#endif
|