[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: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
Родитель
f4ac7b5eb7
Коммит
ec2b36b9f2
|
@ -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 @@
|
||||||
|
|
||||||
/* 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 @@
|
||||||
#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:
|
||||||
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,
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
* 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,
|
||||||
|
|
||||||
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,
|
||||||
/* 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, ®s, sizeof(regs))
|
if (mread(sp + REGS_OFFSET, ®s, 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 {
|
||||||
#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 {
|
||||||
#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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче