Commit ec2b36b9 authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Paul Mackerras

[POWERPC] Move stackframe definitions to common header

This moves various definitions used all over the place to parse stack
frames to ptrace.h so only one definition is needed.
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent f4ac7b5e
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <asm/cputable.h> #include <asm/cputable.h>
#include <asm/firmware.h> #include <asm/firmware.h>
#include <asm/bug.h> #include <asm/bug.h>
#include <asm/ptrace.h>
/* /*
* System calls. * System calls.
...@@ -39,7 +40,7 @@ ...@@ -39,7 +40,7 @@
/* This value is used to mark exception frames on the stack. */ /* This value is used to mark exception frames on the stack. */
exception_marker: exception_marker:
.tc ID_72656773_68657265[TC],0x7265677368657265 .tc ID_EXC_MARKER[TC],STACK_FRAME_REGS_MARKER
.section ".text" .section ".text"
.align 7 .align 7
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <asm/thread_info.h> #include <asm/thread_info.h>
#include <asm/ppc_asm.h> #include <asm/ppc_asm.h>
#include <asm/asm-offsets.h> #include <asm/asm-offsets.h>
#include <asm/ptrace.h>
/* 601 only have IBAT; cr0.eq is set on 601 when using this macro */ /* 601 only have IBAT; cr0.eq is set on 601 when using this macro */
#define LOAD_BAT(n, reg, RA, RB) \ #define LOAD_BAT(n, reg, RA, RB) \
...@@ -268,8 +269,8 @@ __secondary_hold_acknowledge: ...@@ -268,8 +269,8 @@ __secondary_hold_acknowledge:
li r10,MSR_KERNEL & ~(MSR_IR|MSR_DR); /* can take exceptions */ \ li r10,MSR_KERNEL & ~(MSR_IR|MSR_DR); /* can take exceptions */ \
MTMSRD(r10); /* (except for mach check in rtas) */ \ MTMSRD(r10); /* (except for mach check in rtas) */ \
stw r0,GPR0(r11); \ stw r0,GPR0(r11); \
lis r10,0x7265; /* put exception frame marker */ \ lis r10,STACK_FRAME_REGS_MARKER@ha; /* exception frame marker */ \
addi r10,r10,0x6773; \ addi r10,r10,STACK_FRAME_REGS_MARKER@l; \
stw r10,8(r11); \ stw r10,8(r11); \
SAVE_4GPRS(3, r11); \ SAVE_4GPRS(3, r11); \
SAVE_2GPRS(7, r11) SAVE_2GPRS(7, r11)
......
...@@ -914,20 +914,6 @@ int validate_sp(unsigned long sp, struct task_struct *p, ...@@ -914,20 +914,6 @@ int validate_sp(unsigned long sp, struct task_struct *p,
return valid_irq_stack(sp, p, nbytes); return valid_irq_stack(sp, p, nbytes);
} }
#ifdef CONFIG_PPC64
#define MIN_STACK_FRAME 112 /* same as STACK_FRAME_OVERHEAD, in fact */
#define FRAME_LR_SAVE 2
#define INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD + 288)
#define REGS_MARKER 0x7265677368657265ul
#define FRAME_MARKER 12
#else
#define MIN_STACK_FRAME 16
#define FRAME_LR_SAVE 1
#define INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD)
#define REGS_MARKER 0x72656773ul
#define FRAME_MARKER 2
#endif
EXPORT_SYMBOL(validate_sp); EXPORT_SYMBOL(validate_sp);
unsigned long get_wchan(struct task_struct *p) unsigned long get_wchan(struct task_struct *p)
...@@ -939,15 +925,15 @@ unsigned long get_wchan(struct task_struct *p) ...@@ -939,15 +925,15 @@ unsigned long get_wchan(struct task_struct *p)
return 0; return 0;
sp = p->thread.ksp; sp = p->thread.ksp;
if (!validate_sp(sp, p, MIN_STACK_FRAME)) if (!validate_sp(sp, p, STACK_FRAME_OVERHEAD))
return 0; return 0;
do { do {
sp = *(unsigned long *)sp; sp = *(unsigned long *)sp;
if (!validate_sp(sp, p, MIN_STACK_FRAME)) if (!validate_sp(sp, p, STACK_FRAME_OVERHEAD))
return 0; return 0;
if (count > 0) { if (count > 0) {
ip = ((unsigned long *)sp)[FRAME_LR_SAVE]; ip = ((unsigned long *)sp)[STACK_FRAME_LR_SAVE];
if (!in_sched_functions(ip)) if (!in_sched_functions(ip))
return ip; return ip;
} }
...@@ -976,12 +962,12 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) ...@@ -976,12 +962,12 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
lr = 0; lr = 0;
printk("Call Trace:\n"); printk("Call Trace:\n");
do { do {
if (!validate_sp(sp, tsk, MIN_STACK_FRAME)) if (!validate_sp(sp, tsk, STACK_FRAME_OVERHEAD))
return; return;
stack = (unsigned long *) sp; stack = (unsigned long *) sp;
newsp = stack[0]; newsp = stack[0];
ip = stack[FRAME_LR_SAVE]; ip = stack[STACK_FRAME_LR_SAVE];
if (!firstframe || ip != lr) { if (!firstframe || ip != lr) {
printk("["REG"] ["REG"] ", sp, ip); printk("["REG"] ["REG"] ", sp, ip);
print_symbol("%s", ip); print_symbol("%s", ip);
...@@ -995,8 +981,8 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) ...@@ -995,8 +981,8 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
* See if this is an exception frame. * See if this is an exception frame.
* We look for the "regshere" marker in the current frame. * We look for the "regshere" marker in the current frame.
*/ */
if (validate_sp(sp, tsk, INT_FRAME_SIZE) if (validate_sp(sp, tsk, STACK_INT_FRAME_SIZE)
&& stack[FRAME_MARKER] == REGS_MARKER) { && stack[STACK_FRAME_MARKER] == STACK_FRAME_REGS_MARKER) {
struct pt_regs *regs = (struct pt_regs *) struct pt_regs *regs = (struct pt_regs *)
(sp + STACK_FRAME_OVERHEAD); (sp + STACK_FRAME_OVERHEAD);
printk("--- Exception: %lx", regs->trap); printk("--- Exception: %lx", regs->trap);
......
...@@ -1243,15 +1243,12 @@ static void get_function_bounds(unsigned long pc, unsigned long *startp, ...@@ -1243,15 +1243,12 @@ static void get_function_bounds(unsigned long pc, unsigned long *startp,
static int xmon_depth_to_print = 64; static int xmon_depth_to_print = 64;
#ifdef CONFIG_PPC64 #define LRSAVE_OFFSET (STACK_FRAME_LR_SAVE * sizeof(unsigned long))
#define LRSAVE_OFFSET 0x10 #define MARKER_OFFSET (STACK_FRAME_MARKER * sizeof(unsigned long))
#define REG_FRAME_MARKER 0x7265677368657265ul /* "regshere" */
#define MARKER_OFFSET 0x60 #ifdef __powerpc64__
#define REGS_OFFSET 0x70 #define REGS_OFFSET 0x70
#else #else
#define LRSAVE_OFFSET 4
#define REG_FRAME_MARKER 0x72656773
#define MARKER_OFFSET 8
#define REGS_OFFSET 16 #define REGS_OFFSET 16
#endif #endif
...@@ -1317,7 +1314,7 @@ static void xmon_show_stack(unsigned long sp, unsigned long lr, ...@@ -1317,7 +1314,7 @@ static void xmon_show_stack(unsigned long sp, unsigned long lr,
/* Look for "regshere" marker to see if this is /* Look for "regshere" marker to see if this is
an exception frame. */ an exception frame. */
if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long)) if (mread(sp + MARKER_OFFSET, &marker, sizeof(unsigned long))
&& marker == REG_FRAME_MARKER) { && marker == STACK_FRAME_REGS_MARKER) {
if (mread(sp + REGS_OFFSET, &regs, sizeof(regs)) if (mread(sp + REGS_OFFSET, &regs, sizeof(regs))
!= sizeof(regs)) { != sizeof(regs)) {
printf("Couldn't read registers at %lx\n", printf("Couldn't read registers at %lx\n",
......
...@@ -58,6 +58,11 @@ struct pt_regs { ...@@ -58,6 +58,11 @@ struct pt_regs {
#define __ARCH_WANT_COMPAT_SYS_PTRACE #define __ARCH_WANT_COMPAT_SYS_PTRACE
#define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */ #define STACK_FRAME_OVERHEAD 112 /* size of minimum stack frame */
#define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */
#define STACK_FRAME_REGS_MARKER ASM_CONST(0x7265677368657265)
#define STACK_INT_FRAME_SIZE (sizeof(struct pt_regs) + \
STACK_FRAME_OVERHEAD + 288)
#define STACK_FRAME_MARKER 12
/* Size of dummy stack frame allocated when calling signal handler. */ /* Size of dummy stack frame allocated when calling signal handler. */
#define __SIGNAL_FRAMESIZE 128 #define __SIGNAL_FRAMESIZE 128
...@@ -66,6 +71,10 @@ struct pt_regs { ...@@ -66,6 +71,10 @@ struct pt_regs {
#else /* __powerpc64__ */ #else /* __powerpc64__ */
#define STACK_FRAME_OVERHEAD 16 /* size of minimum stack frame */ #define STACK_FRAME_OVERHEAD 16 /* size of minimum stack frame */
#define STACK_FRAME_LR_SAVE 1 /* Location of LR in stack frame */
#define STACK_FRAME_REGS_MARKER ASM_CONST(0x72656773)
#define STACK_INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_OVERHEAD)
#define STACK_FRAME_MARKER 2
/* Size of stack frame allocated when calling signal handler. */ /* Size of stack frame allocated when calling signal handler. */
#define __SIGNAL_FRAMESIZE 64 #define __SIGNAL_FRAMESIZE 64
......
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