diff options
author | Kumar Gala <galak@kernel.crashing.org> | 2008-06-26 03:01:37 -0400 |
---|---|---|
committer | Kumar Gala <galak@kernel.crashing.org> | 2008-06-26 04:35:46 -0400 |
commit | f82796214a95b1ec00c2f121c1080d10f2b099a1 (patch) | |
tree | c5702217e2a482ee2f15fca17be547b9ba1a31a4 /arch/powerpc/kernel/traps.c | |
parent | b76e59d1fb086c2fdac5d243e09786d6581f2026 (diff) |
powerpc/booke: Add kprobes support for booke style processors
This patch is based on work done by Madhvesh. R. Sulibhavi back in
March 2007.
We refactor some of the single step handling since it differs between
"classic" and "booke" powerpc cores.
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/kernel/traps.c')
-rw-r--r-- | arch/powerpc/kernel/traps.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 4b5b7ff4f78b..b463d48145a4 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c | |||
@@ -1030,21 +1030,29 @@ void SoftwareEmulation(struct pt_regs *regs) | |||
1030 | 1030 | ||
1031 | #if defined(CONFIG_40x) || defined(CONFIG_BOOKE) | 1031 | #if defined(CONFIG_40x) || defined(CONFIG_BOOKE) |
1032 | 1032 | ||
1033 | void DebugException(struct pt_regs *regs, unsigned long debug_status) | 1033 | void __kprobes DebugException(struct pt_regs *regs, unsigned long debug_status) |
1034 | { | 1034 | { |
1035 | if (debug_status & DBSR_IC) { /* instruction completion */ | 1035 | if (debug_status & DBSR_IC) { /* instruction completion */ |
1036 | regs->msr &= ~MSR_DE; | 1036 | regs->msr &= ~MSR_DE; |
1037 | |||
1038 | /* Disable instruction completion */ | ||
1039 | mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) & ~DBCR0_IC); | ||
1040 | /* Clear the instruction completion event */ | ||
1041 | mtspr(SPRN_DBSR, DBSR_IC); | ||
1042 | |||
1043 | if (notify_die(DIE_SSTEP, "single_step", regs, 5, | ||
1044 | 5, SIGTRAP) == NOTIFY_STOP) { | ||
1045 | return; | ||
1046 | } | ||
1047 | |||
1048 | if (debugger_sstep(regs)) | ||
1049 | return; | ||
1050 | |||
1037 | if (user_mode(regs)) { | 1051 | if (user_mode(regs)) { |
1038 | current->thread.dbcr0 &= ~DBCR0_IC; | 1052 | current->thread.dbcr0 &= ~DBCR0_IC; |
1039 | } else { | ||
1040 | /* Disable instruction completion */ | ||
1041 | mtspr(SPRN_DBCR0, mfspr(SPRN_DBCR0) & ~DBCR0_IC); | ||
1042 | /* Clear the instruction completion event */ | ||
1043 | mtspr(SPRN_DBSR, DBSR_IC); | ||
1044 | if (debugger_sstep(regs)) | ||
1045 | return; | ||
1046 | } | 1053 | } |
1047 | _exception(SIGTRAP, regs, TRAP_TRACE, 0); | 1054 | |
1055 | _exception(SIGTRAP, regs, TRAP_TRACE, regs->nip); | ||
1048 | } | 1056 | } |
1049 | } | 1057 | } |
1050 | #endif /* CONFIG_4xx || CONFIG_BOOKE */ | 1058 | #endif /* CONFIG_4xx || CONFIG_BOOKE */ |