|
@@ -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)
|
|
|
|
- && stack[FRAME_MARKER] == REGS_MARKER) {
|
|
|
|
|
|
+ if (validate_sp(sp, tsk, STACK_INT_FRAME_SIZE)
|
|
|
|
+ && 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);
|