|
@@ -12,10 +12,9 @@
|
|
|
#include <linux/sched.h>
|
|
|
#include <linux/mm.h>
|
|
|
#include <linux/compat.h>
|
|
|
-#include <linux/highmem.h>
|
|
|
+#include <linux/uaccess.h>
|
|
|
|
|
|
#include <asm/ptrace.h>
|
|
|
-#include <asm/uaccess.h>
|
|
|
#include <asm/stacktrace.h>
|
|
|
|
|
|
static int backtrace_stack(void *data, char *name)
|
|
@@ -38,42 +37,6 @@ static struct stacktrace_ops backtrace_ops = {
|
|
|
.walk_stack = print_context_stack,
|
|
|
};
|
|
|
|
|
|
-/* from arch/x86/kernel/cpu/perf_event.c: */
|
|
|
-
|
|
|
-/*
|
|
|
- * best effort, GUP based copy_from_user() that assumes IRQ or NMI context
|
|
|
- */
|
|
|
-static unsigned long
|
|
|
-copy_from_user_nmi(void *to, const void __user *from, unsigned long n)
|
|
|
-{
|
|
|
- unsigned long offset, addr = (unsigned long)from;
|
|
|
- unsigned long size, len = 0;
|
|
|
- struct page *page;
|
|
|
- void *map;
|
|
|
- int ret;
|
|
|
-
|
|
|
- do {
|
|
|
- ret = __get_user_pages_fast(addr, 1, 0, &page);
|
|
|
- if (!ret)
|
|
|
- break;
|
|
|
-
|
|
|
- offset = addr & (PAGE_SIZE - 1);
|
|
|
- size = min(PAGE_SIZE - offset, n - len);
|
|
|
-
|
|
|
- map = kmap_atomic(page);
|
|
|
- memcpy(to, map+offset, size);
|
|
|
- kunmap_atomic(map);
|
|
|
- put_page(page);
|
|
|
-
|
|
|
- len += size;
|
|
|
- to += size;
|
|
|
- addr += size;
|
|
|
-
|
|
|
- } while (len < n);
|
|
|
-
|
|
|
- return len;
|
|
|
-}
|
|
|
-
|
|
|
#ifdef CONFIG_COMPAT
|
|
|
static struct stack_frame_ia32 *
|
|
|
dump_user_backtrace_32(struct stack_frame_ia32 *head)
|