Commit 57014e07 authored by Anton Blanchard's avatar Anton Blanchard

ppc64: use generic debugger hooks instead of hardwiring xmon

	everywhere
ppc64: create CONFIG_XMON_DEFAULT so we can have debugging enabled
	but xmon disabled at boot.
parent f8469e97
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
define_bool CONFIG_UID16 n define_bool CONFIG_UID16 n
define_bool CONFIG_RWSEM_GENERIC_SPINLOCK n define_bool CONFIG_RWSEM_GENERIC_SPINLOCK n
define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y
define_bool CONFIG_GENERIC_BUST_SPINLOCK n
define_bool CONFIG_GENERIC_ISA_DMA y define_bool CONFIG_GENERIC_ISA_DMA y
define_bool CONFIG_HAVE_DEC_LOCK y define_bool CONFIG_HAVE_DEC_LOCK y
...@@ -30,8 +29,6 @@ define_bool CONFIG_PREEMPT n ...@@ -30,8 +29,6 @@ define_bool CONFIG_PREEMPT n
if [ "$CONFIG_PPC_ISERIES" = "y" ]; then if [ "$CONFIG_PPC_ISERIES" = "y" ]; then
define_bool CONFIG_MSCHUNKS y define_bool CONFIG_MSCHUNKS y
else
bool 'MsChunks Physical to Absolute address translation support' CONFIG_MSCHUNKS
fi fi
endmenu endmenu
...@@ -206,10 +203,16 @@ source net/bluetooth/Config.in ...@@ -206,10 +203,16 @@ source net/bluetooth/Config.in
mainmenu_option next_comment mainmenu_option next_comment
comment 'Kernel hacking' comment 'Kernel hacking'
bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ bool 'Kernel debugging' CONFIG_DEBUG_KERNEL
bool 'Include kgdb kernel debugger' CONFIG_KGDB if [ "$CONFIG_DEBUG_KERNEL" != "n" ]; then
bool 'Include xmon kernel debugger' CONFIG_XMON bool ' Debug memory allocations' CONFIG_DEBUG_SLAB
bool 'Include PPCDBG realtime debugging' CONFIG_PPCDBG bool ' Magic SysRq key' CONFIG_MAGIC_SYSRQ
bool ' Include xmon kernel debugger' CONFIG_XMON
if [ "$CONFIG_XMON" = "y" ]; then
bool ' Enable xmon by default' CONFIG_XMON_DEFAULT
fi
bool ' Include PPCDBG realtime debugging' CONFIG_PPCDBG
fi
endmenu endmenu
source lib/Config.in source lib/Config.in
...@@ -40,8 +40,6 @@ obj-$(CONFIG_PCI) += pSeries_pci.o pSeries_lpar.o pSeries_hvCall.o eeh.o ...@@ -40,8 +40,6 @@ obj-$(CONFIG_PCI) += pSeries_pci.o pSeries_lpar.o pSeries_hvCall.o eeh.o
obj-y += rtasd.o nvram.o obj-y += rtasd.o nvram.o
endif endif
obj-$(CONFIG_KGDB) += ppc-stub.o
obj-$(CONFIG_SMP) += smp.o obj-$(CONFIG_SMP) += smp.o
obj-y += prom.o lmb.o rtas.o rtas-proc.o chrp_setup.o i8259.o obj-y += prom.o lmb.o rtas.o rtas-proc.o chrp_setup.o i8259.o
......
...@@ -75,22 +75,6 @@ irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned = ...@@ -75,22 +75,6 @@ irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned =
int ppc_spurious_interrupts = 0; int ppc_spurious_interrupts = 0;
struct irqaction *ppc_irq_action[NR_IRQS]; struct irqaction *ppc_irq_action[NR_IRQS];
unsigned long lpEvent_count = 0; unsigned long lpEvent_count = 0;
#ifdef CONFIG_XMON
extern void xmon(struct pt_regs *regs);
extern int xmon_bpt(struct pt_regs *regs);
extern int xmon_sstep(struct pt_regs *regs);
extern int xmon_iabr_match(struct pt_regs *regs);
extern int xmon_dabr_match(struct pt_regs *regs);
extern void (*xmon_fault_handler)(struct pt_regs *regs);
#endif
#ifdef CONFIG_XMON
extern void (*debugger)(struct pt_regs *regs);
extern int (*debugger_bpt)(struct pt_regs *regs);
extern int (*debugger_sstep)(struct pt_regs *regs);
extern int (*debugger_iabr_match)(struct pt_regs *regs);
extern int (*debugger_dabr_match)(struct pt_regs *regs);
extern void (*debugger_fault_handler)(struct pt_regs *regs);
#endif
/* nasty hack for shared irq's since we need to do kmalloc calls but /* nasty hack for shared irq's since we need to do kmalloc calls but
* can't very early in the boot when we need to do a request irq. * can't very early in the boot when we need to do a request irq.
......
This diff is collapsed.
...@@ -257,7 +257,7 @@ EXPORT_SYMBOL(console_drivers); ...@@ -257,7 +257,7 @@ EXPORT_SYMBOL(console_drivers);
EXPORT_SYMBOL(xmon); EXPORT_SYMBOL(xmon);
#endif #endif
#if defined(CONFIG_KGDB) || defined(CONFIG_XMON) #ifdef CONFIG_DEBUG_KERNEL
extern void (*debugger)(struct pt_regs *regs); extern void (*debugger)(struct pt_regs *regs);
extern int (*debugger_bpt)(struct pt_regs *regs); extern int (*debugger_bpt)(struct pt_regs *regs);
extern int (*debugger_sstep)(struct pt_regs *regs); extern int (*debugger_sstep)(struct pt_regs *regs);
......
...@@ -130,6 +130,14 @@ void setup_system(unsigned long r3, unsigned long r4, unsigned long r5, ...@@ -130,6 +130,14 @@ void setup_system(unsigned long r3, unsigned long r4, unsigned long r5,
/* This should be fixed properly in kernel/resource.c */ /* This should be fixed properly in kernel/resource.c */
iomem_resource.end = MEM_SPACE_LIMIT; iomem_resource.end = MEM_SPACE_LIMIT;
#ifdef CONFIG_XMON_DEFAULT
debugger = xmon;
debugger_bpt = xmon_bpt;
debugger_sstep = xmon_sstep;
debugger_iabr_match = xmon_iabr_match;
debugger_dabr_match = xmon_dabr_match;
#endif
/* pSeries systems are identified in prom.c via OF. */ /* pSeries systems are identified in prom.c via OF. */
if ( itLpNaca.xLparInstalled == 1 ) if ( itLpNaca.xLparInstalled == 1 )
naca->platform = PLATFORM_ISERIES_LPAR; naca->platform = PLATFORM_ISERIES_LPAR;
...@@ -507,11 +515,6 @@ void __init setup_arch(char **cmdline_p) ...@@ -507,11 +515,6 @@ void __init setup_arch(char **cmdline_p)
ppc_md.progress("setup_arch:enter", 0x3eab); ppc_md.progress("setup_arch:enter", 0x3eab);
#if defined(CONFIG_KGDB)
kgdb_map_scc();
set_debug_traps();
breakpoint();
#endif
/* /*
* Set cache line size based on type of cpu as a default. * Set cache line size based on type of cpu as a default.
* Systems with OF can look in the properties on the cpu node(s) * Systems with OF can look in the properties on the cpu node(s)
...@@ -543,26 +546,6 @@ void __init setup_arch(char **cmdline_p) ...@@ -543,26 +546,6 @@ void __init setup_arch(char **cmdline_p)
ppc_md.progress("setup_arch: exit", 0x3eab); ppc_md.progress("setup_arch: exit", 0x3eab);
} }
void exception_trace(unsigned long trap)
{
unsigned long x, srr0, srr1, reg20, reg1, reg21;
asm("mflr %0" : "=r" (x) :);
asm("mfspr %0,0x1a" : "=r" (srr0) :);
asm("mfspr %0,0x1b" : "=r" (srr1) :);
asm("mr %0,1" : "=r" (reg1) :);
asm("mr %0,20" : "=r" (reg20) :);
asm("mr %0,21" : "=r" (reg21) :);
udbg_puts("\n");
udbg_puts("Took an exception : "); udbg_puthex(x); udbg_puts("\n");
udbg_puts(" "); udbg_puthex(reg1); udbg_puts("\n");
udbg_puts(" "); udbg_puthex(reg20); udbg_puts("\n");
udbg_puts(" "); udbg_puthex(reg21); udbg_puts("\n");
udbg_puts(" "); udbg_puthex(srr0); udbg_puts("\n");
udbg_puts(" "); udbg_puthex(srr1); udbg_puts("\n");
}
int set_spread_lpevents( char * str ) int set_spread_lpevents( char * str )
{ {
/* The parameter is the number of processors to share in processing lp events */ /* The parameter is the number of processors to share in processing lp events */
......
...@@ -38,31 +38,12 @@ ...@@ -38,31 +38,12 @@
#include <asm/ppcdebug.h> #include <asm/ppcdebug.h>
extern int fix_alignment(struct pt_regs *); extern int fix_alignment(struct pt_regs *);
extern void bad_page_fault(struct pt_regs *, unsigned long); extern void bad_page_fault(struct pt_regs *, unsigned long, int);
/* This is true if we are using the firmware NMI handler (typically LPAR) */ /* This is true if we are using the firmware NMI handler (typically LPAR) */
extern int fwnmi_active; extern int fwnmi_active;
#ifdef CONFIG_XMON #ifdef CONFIG_DEBUG_KERNEL
extern void xmon(struct pt_regs *regs);
extern int xmon_bpt(struct pt_regs *regs);
extern int xmon_sstep(struct pt_regs *regs);
extern int xmon_iabr_match(struct pt_regs *regs);
extern int xmon_dabr_match(struct pt_regs *regs);
extern void (*xmon_fault_handler)(struct pt_regs *regs);
#endif
#ifdef CONFIG_XMON
#define CONFIG_DEBUGGER
void (*debugger)(struct pt_regs *regs) = xmon;
int (*debugger_bpt)(struct pt_regs *regs) = xmon_bpt;
int (*debugger_sstep)(struct pt_regs *regs) = xmon_sstep;
int (*debugger_iabr_match)(struct pt_regs *regs) = xmon_iabr_match;
int (*debugger_dabr_match)(struct pt_regs *regs) = xmon_dabr_match;
void (*debugger_fault_handler)(struct pt_regs *regs);
#else
#ifdef CONFIG_KGDB
#define CONFIG_DEBUGGER
void (*debugger)(struct pt_regs *regs); void (*debugger)(struct pt_regs *regs);
int (*debugger_bpt)(struct pt_regs *regs); int (*debugger_bpt)(struct pt_regs *regs);
int (*debugger_sstep)(struct pt_regs *regs); int (*debugger_sstep)(struct pt_regs *regs);
...@@ -70,7 +51,6 @@ int (*debugger_iabr_match)(struct pt_regs *regs); ...@@ -70,7 +51,6 @@ int (*debugger_iabr_match)(struct pt_regs *regs);
int (*debugger_dabr_match)(struct pt_regs *regs); int (*debugger_dabr_match)(struct pt_regs *regs);
void (*debugger_fault_handler)(struct pt_regs *regs); void (*debugger_fault_handler)(struct pt_regs *regs);
#endif #endif
#endif
/* /*
* Trap & Exception support * Trap & Exception support
...@@ -103,10 +83,8 @@ static void ...@@ -103,10 +83,8 @@ static void
_exception(int signr, siginfo_t *info, struct pt_regs *regs) _exception(int signr, siginfo_t *info, struct pt_regs *regs)
{ {
if (!user_mode(regs)) { if (!user_mode(regs)) {
#ifdef CONFIG_DEBUGGER
if (debugger) if (debugger)
debugger(regs); debugger(regs);
#endif
die("Exception in kernel mode\n", regs, signr); die("Exception in kernel mode\n", regs, signr);
} }
...@@ -159,10 +137,8 @@ SystemResetException(struct pt_regs *regs) ...@@ -159,10 +137,8 @@ SystemResetException(struct pt_regs *regs)
errlog = FWNMI_get_errinfo(regs); errlog = FWNMI_get_errinfo(regs);
} }
#ifdef CONFIG_DEBUGGER
if (debugger) if (debugger)
debugger(regs); debugger(regs);
#endif
#ifdef PANIC_ON_ERROR #ifdef PANIC_ON_ERROR
panic("System Reset"); panic("System Reset");
...@@ -201,14 +177,13 @@ MachineCheckException(struct pt_regs *regs) ...@@ -201,14 +177,13 @@ MachineCheckException(struct pt_regs *regs)
return; return;
} }
#ifdef CONFIG_DEBUGGER
if (debugger_fault_handler) { if (debugger_fault_handler) {
debugger_fault_handler(regs); debugger_fault_handler(regs);
return; return;
} }
if (debugger) if (debugger)
debugger(regs); debugger(regs);
#endif
console_verbose(); console_verbose();
spin_lock_irq(&die_lock); spin_lock_irq(&die_lock);
bust_spinlocks(1); bust_spinlocks(1);
...@@ -252,10 +227,8 @@ InstructionBreakpointException(struct pt_regs *regs) ...@@ -252,10 +227,8 @@ InstructionBreakpointException(struct pt_regs *regs)
{ {
siginfo_t info; siginfo_t info;
#ifdef CONFIG_DEBUGGER
if (debugger_iabr_match && debugger_iabr_match(regs)) if (debugger_iabr_match && debugger_iabr_match(regs))
return; return;
#endif
info.si_signo = SIGTRAP; info.si_signo = SIGTRAP;
info.si_errno = 0; info.si_errno = 0;
...@@ -325,10 +298,9 @@ ProgramCheckException(struct pt_regs *regs) ...@@ -325,10 +298,9 @@ ProgramCheckException(struct pt_regs *regs)
} else if (regs->msr & 0x20000) { } else if (regs->msr & 0x20000) {
/* trap exception */ /* trap exception */
#ifdef CONFIG_DEBUGGER
if (debugger_bpt && debugger_bpt(regs)) if (debugger_bpt && debugger_bpt(regs))
return; return;
#endif
info.si_signo = SIGTRAP; info.si_signo = SIGTRAP;
info.si_errno = 0; info.si_errno = 0;
info.si_code = TRAP_BRKPT; info.si_code = TRAP_BRKPT;
...@@ -352,10 +324,8 @@ SingleStepException(struct pt_regs *regs) ...@@ -352,10 +324,8 @@ SingleStepException(struct pt_regs *regs)
regs->msr &= ~MSR_SE; /* Turn off 'trace' bit */ regs->msr &= ~MSR_SE; /* Turn off 'trace' bit */
#ifdef CONFIG_DEBUGGER
if (debugger_sstep && debugger_sstep(regs)) if (debugger_sstep && debugger_sstep(regs))
return; return;
#endif
info.si_signo = SIGTRAP; info.si_signo = SIGTRAP;
info.si_errno = 0; info.si_errno = 0;
...@@ -402,7 +372,7 @@ AlignmentException(struct pt_regs *regs) ...@@ -402,7 +372,7 @@ AlignmentException(struct pt_regs *regs)
force_sig_info(SIGSEGV, &info, current); force_sig_info(SIGSEGV, &info, current);
} else { } else {
/* Search exception table */ /* Search exception table */
bad_page_fault(regs, regs->dar); bad_page_fault(regs, regs->dar, SIGSEGV);
} }
return; return;
......
...@@ -38,10 +38,7 @@ ...@@ -38,10 +38,7 @@
#include <asm/ppcdebug.h> #include <asm/ppcdebug.h>
#if defined(CONFIG_XMON) || defined(CONFIG_KGDB) #ifdef CONFIG_DEBUG_KERNEL
extern void (*debugger)(struct pt_regs *);
extern void (*debugger_fault_handler)(struct pt_regs *);
extern int (*debugger_dabr_match)(struct pt_regs *);
int debugger_kernel_faults = 1; int debugger_kernel_faults = 1;
#endif #endif
...@@ -69,7 +66,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address, ...@@ -69,7 +66,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
if (regs->trap == 0x400) if (regs->trap == 0x400)
error_code &= 0x48200000; error_code &= 0x48200000;
#if defined(CONFIG_XMON) || defined(CONFIG_KGDB) #ifdef CONFIG_DEBUG_KERNEL
if (debugger_fault_handler && (regs->trap == 0x300 || if (debugger_fault_handler && (regs->trap == 0x300 ||
regs->trap == 0x380)) { regs->trap == 0x380)) {
debugger_fault_handler(regs); debugger_fault_handler(regs);
...@@ -81,7 +78,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address, ...@@ -81,7 +78,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
if (debugger_dabr_match(regs)) if (debugger_dabr_match(regs))
return; return;
} }
#endif /* CONFIG_XMON || CONFIG_KGDB */ #endif
if (in_interrupt() || mm == NULL) { if (in_interrupt() || mm == NULL) {
bad_page_fault(regs, address, SIGSEGV); bad_page_fault(regs, address, SIGSEGV);
...@@ -102,7 +99,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address, ...@@ -102,7 +99,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
good_area: good_area:
code = SEGV_ACCERR; code = SEGV_ACCERR;
/* a write */ /* a write */
if (is_write) { if (is_write) {
if (!(vma->vm_flags & VM_WRITE)) if (!(vma->vm_flags & VM_WRITE))
...@@ -122,18 +119,18 @@ void do_page_fault(struct pt_regs *regs, unsigned long address, ...@@ -122,18 +119,18 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
* make sure we exit gracefully rather than endlessly redo * make sure we exit gracefully rather than endlessly redo
* the fault. * the fault.
*/ */
switch (handle_mm_fault(mm, vma, address, is_write)) { switch (handle_mm_fault(mm, vma, address, is_write)) {
case 1: case 1:
current->min_flt++; current->min_flt++;
break; break;
case 2: case 2:
current->maj_flt++; current->maj_flt++;
break; break;
case 0: case 0:
goto do_sigbus; goto do_sigbus;
default: default:
goto out_of_memory; goto out_of_memory;
} }
up_read(&mm->mmap_sem); up_read(&mm->mmap_sem);
...@@ -149,8 +146,8 @@ void do_page_fault(struct pt_regs *regs, unsigned long address, ...@@ -149,8 +146,8 @@ void do_page_fault(struct pt_regs *regs, unsigned long address,
info.si_code = code; info.si_code = code;
info.si_addr = (void *) address; info.si_addr = (void *) address;
#ifdef CONFIG_XMON #ifdef CONFIG_XMON
ifppcdebug(PPCDBG_SIGNALXMON) ifppcdebug(PPCDBG_SIGNALXMON)
PPCDBG_ENTER_DEBUGGER_REGS(regs); PPCDBG_ENTER_DEBUGGER_REGS(regs);
#endif #endif
force_sig_info(SIGSEGV, &info, current); force_sig_info(SIGSEGV, &info, current);
...@@ -207,10 +204,9 @@ bad_page_fault(struct pt_regs *regs, unsigned long address, int sig) ...@@ -207,10 +204,9 @@ bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
} }
/* kernel has accessed a bad area */ /* kernel has accessed a bad area */
#if defined(CONFIG_XMON) || defined(CONFIG_KGDB) #ifdef CONFIG_DEBUG_KERNEL
if (debugger_kernel_faults) if (debugger_kernel_faults)
debugger(regs); debugger(regs);
#endif #endif
die("Kernel access of bad area", regs, sig); die("Kernel access of bad area", regs, sig);
} }
...@@ -85,14 +85,10 @@ extern struct task_struct *current_set[NR_CPUS]; ...@@ -85,14 +85,10 @@ extern struct task_struct *current_set[NR_CPUS];
void mm_init_ppc64(void); void mm_init_ppc64(void);
unsigned long *pmac_find_end_of_memory(void);
extern unsigned long *find_end_of_memory(void);
extern pgd_t ioremap_dir[]; extern pgd_t ioremap_dir[];
pgd_t * ioremap_pgd = (pgd_t *)&ioremap_dir; pgd_t * ioremap_pgd = (pgd_t *)&ioremap_dir;
static void map_io_page(unsigned long va, unsigned long pa, int flags); static void map_io_page(unsigned long va, unsigned long pa, int flags);
extern void die_if_kernel(char *,struct pt_regs *,long);
unsigned long klimit = (unsigned long)_end; unsigned long klimit = (unsigned long)_end;
...@@ -437,12 +433,11 @@ void free_initrd_mem(unsigned long start, unsigned long end) ...@@ -437,12 +433,11 @@ void free_initrd_mem(unsigned long start, unsigned long end)
} }
#endif #endif
/* /*
* Do very early mm setup. * Do very early mm setup.
*/ */
void __init mm_init_ppc64(void) { void __init mm_init_ppc64(void)
{
struct paca_struct *lpaca; struct paca_struct *lpaca;
unsigned long guard_page, index; unsigned long guard_page, index;
...@@ -470,8 +465,6 @@ void __init mm_init_ppc64(void) { ...@@ -470,8 +465,6 @@ void __init mm_init_ppc64(void) {
ppc_md.progress("MM:exit", 0x211); ppc_md.progress("MM:exit", 0x211);
} }
/* /*
* Initialize the bootmem system and give it all the memory we * Initialize the bootmem system and give it all the memory we
* have available. * have available.
......
...@@ -55,9 +55,31 @@ ...@@ -55,9 +55,31 @@
#define smp_wmb() __asm__ __volatile__("": : :"memory") #define smp_wmb() __asm__ __volatile__("": : :"memory")
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
#ifdef CONFIG_DEBUG_KERNEL
extern void (*debugger)(struct pt_regs *regs);
extern int (*debugger_bpt)(struct pt_regs *regs);
extern int (*debugger_sstep)(struct pt_regs *regs);
extern int (*debugger_iabr_match)(struct pt_regs *regs);
extern int (*debugger_dabr_match)(struct pt_regs *regs);
extern void (*debugger_fault_handler)(struct pt_regs *regs);
#else
#define debugger(regs) do { } while (0)
#define debugger_bpt(regs) 0
#define debugger_sstep(regs) 0
#define debugger_iabr_match(regs) 0
#define debugger_dabr_match(regs) 0
#define debugger_fault_handler ((void (*)(struct pt_regs *))0)
#endif
#ifdef CONFIG_XMON #ifdef CONFIG_XMON
extern void xmon_irq(int, void *, struct pt_regs *); extern void xmon_irq(int, void *, struct pt_regs *);
extern void xmon(struct pt_regs *excp);
extern void xmon(struct pt_regs *regs);
extern int xmon_bpt(struct pt_regs *regs);
extern int xmon_sstep(struct pt_regs *regs);
extern int xmon_iabr_match(struct pt_regs *regs);
extern int xmon_dabr_match(struct pt_regs *regs);
extern void (*xmon_fault_handler)(struct pt_regs *regs);
#endif #endif
extern void print_backtrace(unsigned long *); extern void print_backtrace(unsigned long *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment