diff options
author | Randolph Chung <tausq@parisc-linux.org> | 2005-10-21 22:42:18 -0400 |
---|---|---|
committer | Kyle McMartin <kyle@parisc-linux.org> | 2005-10-21 22:42:18 -0400 |
commit | 5cd55b0edee7f979530c86b23728d461ddeb9f3f (patch) | |
tree | a279495f59c8de8bbfdd1bbdfd0b0927160fa669 /arch/parisc | |
parent | 951a0150135c46c7791d68e0d1112900d99302d7 (diff) |
[PARISC] Take into account nullified insn and lock functions for profiling
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>
Diffstat (limited to 'arch/parisc')
-rw-r--r-- | arch/parisc/kernel/time.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c index 7ff67f8e9f8..163cdf39be2 100644 --- a/arch/parisc/kernel/time.c +++ b/arch/parisc/kernel/time.c @@ -104,6 +104,24 @@ irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) return IRQ_HANDLED; } + +unsigned long profile_pc(struct pt_regs *regs) +{ + unsigned long pc = instruction_pointer(regs); + + if (regs->gr[0] & PSW_N) + pc -= 4; + +#ifdef CONFIG_SMP + if (in_lock_functions(pc)) + pc = regs->gr[2]; +#endif + + return pc; +} +EXPORT_SYMBOL(profile_pc); + + /*** converted from ia64 ***/ /* * Return the number of micro-seconds that elapsed since the last |