1ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells/*
2ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells * Copyright (C) 1999 Cort Dougan <cort@cs.nmt.edu>
3ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells */
4ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells#ifndef _ASM_POWERPC_DEBUG_H
5ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells#define _ASM_POWERPC_DEBUG_H
6ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells
79422de3e953d0e60eb95f5430a9dd803eec1c6d7Michael Neuling#include <asm/hw_breakpoint.h>
89422de3e953d0e60eb95f5430a9dd803eec1c6d7Michael Neuling
9ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsstruct pt_regs;
10ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells
11ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsextern struct dentry *powerpc_debugfs_root;
12ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells
13ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells#if defined(CONFIG_DEBUGGER) || defined(CONFIG_KEXEC)
14ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells
15ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsextern int (*__debugger)(struct pt_regs *regs);
16ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsextern int (*__debugger_ipi)(struct pt_regs *regs);
17ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsextern int (*__debugger_bpt)(struct pt_regs *regs);
18ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsextern int (*__debugger_sstep)(struct pt_regs *regs);
19ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsextern int (*__debugger_iabr_match)(struct pt_regs *regs);
209422de3e953d0e60eb95f5430a9dd803eec1c6d7Michael Neulingextern int (*__debugger_break_match)(struct pt_regs *regs);
21ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsextern int (*__debugger_fault_handler)(struct pt_regs *regs);
22ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells
23ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells#define DEBUGGER_BOILERPLATE(__NAME) \
24ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsstatic inline int __NAME(struct pt_regs *regs) \
25ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells{ \
26ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells	if (unlikely(__ ## __NAME)) \
27ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells		return __ ## __NAME(regs); \
28ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells	return 0; \
29ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells}
30ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells
31ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David HowellsDEBUGGER_BOILERPLATE(debugger)
32ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David HowellsDEBUGGER_BOILERPLATE(debugger_ipi)
33ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David HowellsDEBUGGER_BOILERPLATE(debugger_bpt)
34ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David HowellsDEBUGGER_BOILERPLATE(debugger_sstep)
35ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David HowellsDEBUGGER_BOILERPLATE(debugger_iabr_match)
369422de3e953d0e60eb95f5430a9dd803eec1c6d7Michael NeulingDEBUGGER_BOILERPLATE(debugger_break_match)
37ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David HowellsDEBUGGER_BOILERPLATE(debugger_fault_handler)
38ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells
39ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells#else
40ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsstatic inline int debugger(struct pt_regs *regs) { return 0; }
41ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsstatic inline int debugger_ipi(struct pt_regs *regs) { return 0; }
42ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsstatic inline int debugger_bpt(struct pt_regs *regs) { return 0; }
43ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsstatic inline int debugger_sstep(struct pt_regs *regs) { return 0; }
44ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsstatic inline int debugger_iabr_match(struct pt_regs *regs) { return 0; }
459422de3e953d0e60eb95f5430a9dd803eec1c6d7Michael Neulingstatic inline int debugger_break_match(struct pt_regs *regs) { return 0; }
46ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsstatic inline int debugger_fault_handler(struct pt_regs *regs) { return 0; }
47ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells#endif
48ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells
4904c32a516806ec74b62048baf4cddcbb840927dbPaul Gortmakervoid set_breakpoint(struct arch_hw_breakpoint *brk);
5021f585073d6347651f2262da187606fa1c4ee16dPaul Gortmakervoid __set_breakpoint(struct arch_hw_breakpoint *brk);
51ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells#ifdef CONFIG_PPC_ADV_DEBUG_REGS
52ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howellsextern void do_send_trap(struct pt_regs *regs, unsigned long address,
53ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells			 unsigned long error_code, int signal_code, int brkpt);
54ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells#else
559422de3e953d0e60eb95f5430a9dd803eec1c6d7Michael Neuling
569422de3e953d0e60eb95f5430a9dd803eec1c6d7Michael Neulingextern void do_break(struct pt_regs *regs, unsigned long address,
579422de3e953d0e60eb95f5430a9dd803eec1c6d7Michael Neuling		     unsigned long error_code);
58ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells#endif
59ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells
60ae3a197e3d0bfe3f4bf1693723e82dc018c096f3David Howells#endif /* _ASM_POWERPC_DEBUG_H */
61