Commit e6badee9 authored by Heiko Carstens's avatar Heiko Carstens Committed by Vasily Gorbik

s390/dumpstack: simplify in stack logic code

The pattern for all in_<type>_stack() functions is the same; especially
also the size of all stacks is the same. Simplify the code by passing only
the stack address to the generic in_stack() helper, which then can assume a
THREAD_SIZE sized stack.
Reviewed-by: default avatarVasily Gorbik <gor@linux.ibm.com>
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent 0f2d4fee
...@@ -41,60 +41,50 @@ const char *stack_type_name(enum stack_type type) ...@@ -41,60 +41,50 @@ const char *stack_type_name(enum stack_type type)
EXPORT_SYMBOL_GPL(stack_type_name); EXPORT_SYMBOL_GPL(stack_type_name);
static inline bool in_stack(unsigned long sp, struct stack_info *info, static inline bool in_stack(unsigned long sp, struct stack_info *info,
enum stack_type type, unsigned long low, enum stack_type type, unsigned long stack)
unsigned long high)
{ {
if (sp < low || sp >= high) if (sp < stack || sp >= stack + THREAD_SIZE)
return false; return false;
info->type = type; info->type = type;
info->begin = low; info->begin = stack;
info->end = high; info->end = stack + THREAD_SIZE;
return true; return true;
} }
static bool in_task_stack(unsigned long sp, struct task_struct *task, static bool in_task_stack(unsigned long sp, struct task_struct *task,
struct stack_info *info) struct stack_info *info)
{ {
unsigned long stack; unsigned long stack = (unsigned long)task_stack_page(task);
stack = (unsigned long) task_stack_page(task); return in_stack(sp, info, STACK_TYPE_TASK, stack);
return in_stack(sp, info, STACK_TYPE_TASK, stack, stack + THREAD_SIZE);
} }
static bool in_irq_stack(unsigned long sp, struct stack_info *info) static bool in_irq_stack(unsigned long sp, struct stack_info *info)
{ {
unsigned long frame_size, top; unsigned long stack = S390_lowcore.async_stack - STACK_INIT_OFFSET;
frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs); return in_stack(sp, info, STACK_TYPE_IRQ, stack);
top = S390_lowcore.async_stack + frame_size;
return in_stack(sp, info, STACK_TYPE_IRQ, top - THREAD_SIZE, top);
} }
static bool in_nodat_stack(unsigned long sp, struct stack_info *info) static bool in_nodat_stack(unsigned long sp, struct stack_info *info)
{ {
unsigned long frame_size, top; unsigned long stack = S390_lowcore.nodat_stack - STACK_INIT_OFFSET;
frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs); return in_stack(sp, info, STACK_TYPE_NODAT, stack);
top = S390_lowcore.nodat_stack + frame_size;
return in_stack(sp, info, STACK_TYPE_NODAT, top - THREAD_SIZE, top);
} }
static bool in_mcck_stack(unsigned long sp, struct stack_info *info) static bool in_mcck_stack(unsigned long sp, struct stack_info *info)
{ {
unsigned long frame_size, top; unsigned long stack = S390_lowcore.mcck_stack - STACK_INIT_OFFSET;
frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs); return in_stack(sp, info, STACK_TYPE_MCCK, stack);
top = S390_lowcore.mcck_stack + frame_size;
return in_stack(sp, info, STACK_TYPE_MCCK, top - THREAD_SIZE, top);
} }
static bool in_restart_stack(unsigned long sp, struct stack_info *info) static bool in_restart_stack(unsigned long sp, struct stack_info *info)
{ {
unsigned long frame_size, top; unsigned long stack = S390_lowcore.restart_stack - STACK_INIT_OFFSET;
frame_size = STACK_FRAME_OVERHEAD + sizeof(struct pt_regs); return in_stack(sp, info, STACK_TYPE_RESTART, stack);
top = S390_lowcore.restart_stack + frame_size;
return in_stack(sp, info, STACK_TYPE_RESTART, top - THREAD_SIZE, top);
} }
int get_stack_info(unsigned long sp, struct task_struct *task, int get_stack_info(unsigned long sp, struct task_struct *task,
......
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