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