Commit a70857e4 authored by Aaron Tomlin's avatar Aaron Tomlin Committed by Ingo Molnar

sched: Add helper for task stack page overrun checking

This facility is used in a few places so let's introduce
a helper function to improve code readability.
Signed-off-by: default avatarAaron Tomlin <atomlin@redhat.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Cc: aneesh.kumar@linux.vnet.ibm.com
Cc: dzickus@redhat.com
Cc: bmr@redhat.com
Cc: jcastillo@redhat.com
Cc: oleg@redhat.com
Cc: riel@redhat.com
Cc: prarit@redhat.com
Cc: jgh@redhat.com
Cc: minchan@kernel.org
Cc: mpe@ellerman.id.au
Cc: tglx@linutronix.de
Cc: hannes@cmpxchg.org
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Seiji Aguchi <seiji.aguchi@hds.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Yasuaki Ishimatsu <isimatu.yasuaki@jp.fujitsu.com>
Cc: linuxppc-dev@lists.ozlabs.org
Link: http://lkml.kernel.org/r/1410527779-8133-3-git-send-email-atomlin@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent d4311ff1
...@@ -507,7 +507,6 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address, ...@@ -507,7 +507,6 @@ int __kprobes do_page_fault(struct pt_regs *regs, unsigned long address,
void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig) void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
{ {
const struct exception_table_entry *entry; const struct exception_table_entry *entry;
unsigned long *stackend;
/* Are we prepared to handle this fault? */ /* Are we prepared to handle this fault? */
if ((entry = search_exception_tables(regs->nip)) != NULL) { if ((entry = search_exception_tables(regs->nip)) != NULL) {
...@@ -536,8 +535,7 @@ void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig) ...@@ -536,8 +535,7 @@ void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig)
printk(KERN_ALERT "Faulting instruction address: 0x%08lx\n", printk(KERN_ALERT "Faulting instruction address: 0x%08lx\n",
regs->nip); regs->nip);
stackend = end_of_stack(current); if (task_stack_end_corrupted(current))
if (*stackend != STACK_END_MAGIC)
printk(KERN_ALERT "Thread overran stack, or stack corrupted\n"); printk(KERN_ALERT "Thread overran stack, or stack corrupted\n");
die("Kernel access of bad area", regs, sig); die("Kernel access of bad area", regs, sig);
......
...@@ -648,7 +648,6 @@ no_context(struct pt_regs *regs, unsigned long error_code, ...@@ -648,7 +648,6 @@ no_context(struct pt_regs *regs, unsigned long error_code,
unsigned long address, int signal, int si_code) unsigned long address, int signal, int si_code)
{ {
struct task_struct *tsk = current; struct task_struct *tsk = current;
unsigned long *stackend;
unsigned long flags; unsigned long flags;
int sig; int sig;
...@@ -708,8 +707,7 @@ no_context(struct pt_regs *regs, unsigned long error_code, ...@@ -708,8 +707,7 @@ no_context(struct pt_regs *regs, unsigned long error_code,
show_fault_oops(regs, error_code, address); show_fault_oops(regs, error_code, address);
stackend = end_of_stack(tsk); if (task_stack_end_corrupted(tsk))
if (*stackend != STACK_END_MAGIC)
printk(KERN_EMERG "Thread overran stack, or stack corrupted\n"); printk(KERN_EMERG "Thread overran stack, or stack corrupted\n");
tsk->thread.cr2 = address; tsk->thread.cr2 = address;
......
...@@ -2617,6 +2617,8 @@ static inline unsigned long *end_of_stack(struct task_struct *p) ...@@ -2617,6 +2617,8 @@ static inline unsigned long *end_of_stack(struct task_struct *p)
} }
#endif #endif
#define task_stack_end_corrupted(task) \
(*(end_of_stack(task)) != STACK_END_MAGIC)
static inline int object_is_on_stack(void *obj) static inline int object_is_on_stack(void *obj)
{ {
......
...@@ -170,7 +170,7 @@ check_stack(unsigned long ip, unsigned long *stack) ...@@ -170,7 +170,7 @@ check_stack(unsigned long ip, unsigned long *stack)
i++; i++;
} }
if (*end_of_stack(current) != STACK_END_MAGIC) { if (task_stack_end_corrupted(current)) {
print_max_stack(); print_max_stack();
BUG(); BUG();
} }
......
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