Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6: sparc64: remove duplicated include sparc: Add kgdb support. kgdbts: Sparc needs sstep emulation. sparc32: Kill smp_message_pass() and related code. sparc64: Kill PIL_RESERVED, unused. sparc64: Split entry.S up into seperate files.
This commit is contained in:
@@ -52,6 +52,17 @@
|
||||
nop; \
|
||||
nop;
|
||||
|
||||
#ifdef CONFIG_KGDB
|
||||
#define KGDB_TRAP(num) \
|
||||
b kgdb_trap_low; \
|
||||
rd %psr,%l0; \
|
||||
nop; \
|
||||
nop;
|
||||
#else
|
||||
#define KGDB_TRAP(num) \
|
||||
BAD_TRAP(num)
|
||||
#endif
|
||||
|
||||
/* The Get Condition Codes software trap for userland. */
|
||||
#define GETCC_TRAP \
|
||||
b getcc_trap_handler; mov %psr, %l0; nop; nop;
|
||||
|
||||
+29
-85
@@ -1,94 +1,38 @@
|
||||
/* $Id: kgdb.h,v 1.8 1998/01/07 06:33:44 baccala Exp $
|
||||
* kgdb.h: Defines and declarations for serial line source level
|
||||
* remote debugging of the Linux kernel using gdb.
|
||||
*
|
||||
* Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
|
||||
*/
|
||||
#ifndef _SPARC_KGDB_H
|
||||
#define _SPARC_KGDB_H
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
/* To init the kgdb engine. */
|
||||
extern void set_debug_traps(void);
|
||||
#ifdef CONFIG_SPARC32
|
||||
#define BUFMAX 2048
|
||||
#else
|
||||
#define BUFMAX 4096
|
||||
#endif
|
||||
|
||||
/* To enter the debugger explicitly. */
|
||||
extern void breakpoint(void);
|
||||
|
||||
/* For convenience we define the format of a kgdb trap breakpoint
|
||||
* frame here also.
|
||||
*/
|
||||
struct kgdb_frame {
|
||||
unsigned long globals[8];
|
||||
unsigned long outs[8];
|
||||
unsigned long locals[8];
|
||||
unsigned long ins[8];
|
||||
unsigned long fpregs[32];
|
||||
unsigned long y;
|
||||
unsigned long psr;
|
||||
unsigned long wim;
|
||||
unsigned long tbr;
|
||||
unsigned long pc;
|
||||
unsigned long npc;
|
||||
unsigned long fpsr;
|
||||
unsigned long cpsr;
|
||||
enum regnames {
|
||||
GDB_G0, GDB_G1, GDB_G2, GDB_G3, GDB_G4, GDB_G5, GDB_G6, GDB_G7,
|
||||
GDB_O0, GDB_O1, GDB_O2, GDB_O3, GDB_O4, GDB_O5, GDB_SP, GDB_O7,
|
||||
GDB_L0, GDB_L1, GDB_L2, GDB_L3, GDB_L4, GDB_L5, GDB_L6, GDB_L7,
|
||||
GDB_I0, GDB_I1, GDB_I2, GDB_I3, GDB_I4, GDB_I5, GDB_FP, GDB_I7,
|
||||
GDB_F0,
|
||||
GDB_F31 = GDB_F0 + 31,
|
||||
#ifdef CONFIG_SPARC32
|
||||
GDB_Y, GDB_PSR, GDB_WIM, GDB_TBR, GDB_PC, GDB_NPC,
|
||||
GDB_FSR, GDB_CSR,
|
||||
#else
|
||||
GDB_F32 = GDB_F0 + 32,
|
||||
GDB_F62 = GDB_F32 + 15,
|
||||
GDB_PC, GDB_NPC, GDB_STATE, GDB_FSR, GDB_FPRS, GDB_Y,
|
||||
#endif
|
||||
};
|
||||
#endif /* !(__ASSEMBLY__) */
|
||||
|
||||
/* Macros for assembly usage of the kgdb breakpoint frame. */
|
||||
#define KGDB_G0 0x000
|
||||
#define KGDB_G1 0x004
|
||||
#define KGDB_G2 0x008
|
||||
#define KGDB_G4 0x010
|
||||
#define KGDB_G6 0x018
|
||||
#define KGDB_I0 0x020
|
||||
#define KGDB_I2 0x028
|
||||
#define KGDB_I4 0x030
|
||||
#define KGDB_I6 0x038
|
||||
#define KGDB_Y 0x100
|
||||
#define KGDB_PSR 0x104
|
||||
#define KGDB_WIM 0x108
|
||||
#define KGDB_TBR 0x10c
|
||||
#define KGDB_PC 0x110
|
||||
#define KGDB_NPC 0x114
|
||||
#ifdef CONFIG_SPARC32
|
||||
#define NUMREGBYTES ((GDB_CSR + 1) * 4)
|
||||
#else
|
||||
#define NUMREGBYTES ((GDB_Y + 1) * 8)
|
||||
#endif
|
||||
|
||||
#define SAVE_KGDB_GLOBALS(reg) \
|
||||
std %g0, [%reg + STACKFRAME_SZ + KGDB_G0]; \
|
||||
std %g2, [%reg + STACKFRAME_SZ + KGDB_G2]; \
|
||||
std %g4, [%reg + STACKFRAME_SZ + KGDB_G4]; \
|
||||
std %g6, [%reg + STACKFRAME_SZ + KGDB_G6];
|
||||
extern void arch_kgdb_breakpoint(void);
|
||||
|
||||
#define SAVE_KGDB_INS(reg) \
|
||||
std %i0, [%reg + STACKFRAME_SZ + KGDB_I0]; \
|
||||
std %i2, [%reg + STACKFRAME_SZ + KGDB_I2]; \
|
||||
std %i4, [%reg + STACKFRAME_SZ + KGDB_I4]; \
|
||||
std %i6, [%reg + STACKFRAME_SZ + KGDB_I6];
|
||||
#define BREAK_INSTR_SIZE 4
|
||||
#define CACHE_FLUSH_IS_SAFE 1
|
||||
|
||||
#define SAVE_KGDB_SREGS(reg, reg_y, reg_psr, reg_wim, reg_tbr, reg_pc, reg_npc) \
|
||||
st %reg_y, [%reg + STACKFRAME_SZ + KGDB_Y]; \
|
||||
st %reg_psr, [%reg + STACKFRAME_SZ + KGDB_PSR]; \
|
||||
st %reg_wim, [%reg + STACKFRAME_SZ + KGDB_WIM]; \
|
||||
st %reg_tbr, [%reg + STACKFRAME_SZ + KGDB_TBR]; \
|
||||
st %reg_pc, [%reg + STACKFRAME_SZ + KGDB_PC]; \
|
||||
st %reg_npc, [%reg + STACKFRAME_SZ + KGDB_NPC];
|
||||
|
||||
#define LOAD_KGDB_GLOBALS(reg) \
|
||||
ld [%reg + STACKFRAME_SZ + KGDB_G1], %g1; \
|
||||
ldd [%reg + STACKFRAME_SZ + KGDB_G2], %g2; \
|
||||
ldd [%reg + STACKFRAME_SZ + KGDB_G4], %g4; \
|
||||
ldd [%reg + STACKFRAME_SZ + KGDB_G6], %g6;
|
||||
|
||||
#define LOAD_KGDB_INS(reg) \
|
||||
ldd [%reg + STACKFRAME_SZ + KGDB_I0], %i0; \
|
||||
ldd [%reg + STACKFRAME_SZ + KGDB_I2], %i2; \
|
||||
ldd [%reg + STACKFRAME_SZ + KGDB_I4], %i4; \
|
||||
ldd [%reg + STACKFRAME_SZ + KGDB_I6], %i6;
|
||||
|
||||
#define LOAD_KGDB_SREGS(reg, reg_y, reg_psr, reg_wim, reg_tbr, reg_pc, reg_npc) \
|
||||
ld [%reg + STACKFRAME_SZ + KGDB_Y], %reg_y; \
|
||||
ld [%reg + STACKFRAME_SZ + KGDB_PSR], %reg_psr; \
|
||||
ld [%reg + STACKFRAME_SZ + KGDB_WIM], %reg_wim; \
|
||||
ld [%reg + STACKFRAME_SZ + KGDB_TBR], %reg_tbr; \
|
||||
ld [%reg + STACKFRAME_SZ + KGDB_PC], %reg_pc; \
|
||||
ld [%reg + STACKFRAME_SZ + KGDB_NPC], %reg_npc;
|
||||
|
||||
#endif /* !(_SPARC_KGDB_H) */
|
||||
#endif /* _SPARC_KGDB_H */
|
||||
|
||||
@@ -51,13 +51,11 @@ void smp_bogo(struct seq_file *);
|
||||
void smp_info(struct seq_file *);
|
||||
|
||||
BTFIXUPDEF_CALL(void, smp_cross_call, smpfunc_t, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
|
||||
BTFIXUPDEF_CALL(void, smp_message_pass, int, int, unsigned long, int)
|
||||
BTFIXUPDEF_CALL(int, __hard_smp_processor_id, void)
|
||||
BTFIXUPDEF_BLACKBOX(hard_smp_processor_id)
|
||||
BTFIXUPDEF_BLACKBOX(load_current)
|
||||
|
||||
#define smp_cross_call(func,arg1,arg2,arg3,arg4,arg5) BTFIXUP_CALL(smp_cross_call)(func,arg1,arg2,arg3,arg4,arg5)
|
||||
#define smp_message_pass(target,msg,data,wait) BTFIXUP_CALL(smp_message_pass)(target,msg,data,wait)
|
||||
|
||||
static inline void xc0(smpfunc_t func) { smp_cross_call(func, 0, 0, 0, 0, 0); }
|
||||
static inline void xc1(smpfunc_t func, unsigned long arg1)
|
||||
|
||||
@@ -94,6 +94,8 @@ extern void fpsave(unsigned long *fpregs, unsigned long *fsr,
|
||||
} while(0)
|
||||
#endif
|
||||
|
||||
extern void flushw_all(void);
|
||||
|
||||
/*
|
||||
* Flush windows so that the VM switch which follows
|
||||
* would not pull the stack from under us.
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
#include <asm-sparc/kgdb.h>
|
||||
@@ -19,11 +19,4 @@
|
||||
#define PIL_SMP_CTX_NEW_VERSION 4
|
||||
#define PIL_DEVICE_IRQ 5
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#define PIL_RESERVED(PIL) ((PIL) == PIL_SMP_CALL_FUNC || \
|
||||
(PIL) == PIL_SMP_RECEIVE_SIGNAL || \
|
||||
(PIL) == PIL_SMP_CAPTURE || \
|
||||
(PIL) == PIL_SMP_CTX_NEW_VERSION)
|
||||
#endif
|
||||
|
||||
#endif /* !(_SPARC64_PIL_H) */
|
||||
|
||||
@@ -180,12 +180,13 @@ do { if (test_thread_flag(TIF_PERFCTR)) { \
|
||||
"ldx [%%sp + 2047 + 0x70], %%i6\n\t" \
|
||||
"ldx [%%sp + 2047 + 0x78], %%i7\n\t" \
|
||||
"ldx [%%g6 + %9], %%g4\n\t" \
|
||||
"brz,pt %%o7, 1f\n\t" \
|
||||
"brz,pt %%o7, switch_to_pc\n\t" \
|
||||
" mov %%g7, %0\n\t" \
|
||||
"sethi %%hi(ret_from_syscall), %%g1\n\t" \
|
||||
"jmpl %%g1 + %%lo(ret_from_syscall), %%g0\n\t" \
|
||||
" nop\n\t" \
|
||||
"1:\n\t" \
|
||||
".globl switch_to_pc\n\t" \
|
||||
"switch_to_pc:\n\t" \
|
||||
: "=&r" (last), "=r" (current), "=r" (current_thread_info_reg), \
|
||||
"=r" (__local_per_cpu_offset) \
|
||||
: "0" (task_thread_info(next)), \
|
||||
|
||||
@@ -175,6 +175,12 @@
|
||||
#define KPROBES_TRAP(lvl) TRAP_ARG(bad_trap, lvl)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KGDB
|
||||
#define KGDB_TRAP(lvl) TRAP_IRQ(kgdb_trap, lvl)
|
||||
#else
|
||||
#define KGDB_TRAP(lvl) TRAP_ARG(bad_trap, lvl)
|
||||
#endif
|
||||
|
||||
#define SUN4V_ITSB_MISS \
|
||||
ldxa [%g0] ASI_SCRATCHPAD, %g2; \
|
||||
ldx [%g2 + HV_FAULT_I_ADDR_OFFSET], %g4; \
|
||||
|
||||
Reference in New Issue
Block a user