diff options
Diffstat (limited to 'arch/sparc/kernel/perf_event.c')
-rw-r--r-- | arch/sparc/kernel/perf_event.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/sparc/kernel/perf_event.c b/arch/sparc/kernel/perf_event.c index b0da5aedb336..6596f66ce112 100644 --- a/arch/sparc/kernel/perf_event.c +++ b/arch/sparc/kernel/perf_event.c | |||
@@ -9,7 +9,7 @@ | |||
9 | * Copyright (C) 2008-2009 Red Hat, Inc., Ingo Molnar | 9 | * Copyright (C) 2008-2009 Red Hat, Inc., Ingo Molnar |
10 | * Copyright (C) 2009 Jaswinder Singh Rajput | 10 | * Copyright (C) 2009 Jaswinder Singh Rajput |
11 | * Copyright (C) 2009 Advanced Micro Devices, Inc., Robert Richter | 11 | * Copyright (C) 2009 Advanced Micro Devices, Inc., Robert Richter |
12 | * Copyright (C) 2008-2009 Red Hat, Inc., Peter Zijlstra <pzijlstr@redhat.com> | 12 | * Copyright (C) 2008-2009 Red Hat, Inc., Peter Zijlstra |
13 | */ | 13 | */ |
14 | 14 | ||
15 | #include <linux/perf_event.h> | 15 | #include <linux/perf_event.h> |
@@ -1828,11 +1828,18 @@ static void perf_callchain_user_32(struct perf_callchain_entry *entry, | |||
1828 | void | 1828 | void |
1829 | perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs) | 1829 | perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs) |
1830 | { | 1830 | { |
1831 | u64 saved_fault_address = current_thread_info()->fault_address; | ||
1832 | u8 saved_fault_code = get_thread_fault_code(); | ||
1833 | mm_segment_t old_fs; | ||
1834 | |||
1831 | perf_callchain_store(entry, regs->tpc); | 1835 | perf_callchain_store(entry, regs->tpc); |
1832 | 1836 | ||
1833 | if (!current->mm) | 1837 | if (!current->mm) |
1834 | return; | 1838 | return; |
1835 | 1839 | ||
1840 | old_fs = get_fs(); | ||
1841 | set_fs(USER_DS); | ||
1842 | |||
1836 | flushw_user(); | 1843 | flushw_user(); |
1837 | 1844 | ||
1838 | pagefault_disable(); | 1845 | pagefault_disable(); |
@@ -1843,4 +1850,8 @@ perf_callchain_user(struct perf_callchain_entry *entry, struct pt_regs *regs) | |||
1843 | perf_callchain_user_64(entry, regs); | 1850 | perf_callchain_user_64(entry, regs); |
1844 | 1851 | ||
1845 | pagefault_enable(); | 1852 | pagefault_enable(); |
1853 | |||
1854 | set_fs(old_fs); | ||
1855 | set_thread_fault_code(saved_fault_code); | ||
1856 | current_thread_info()->fault_address = saved_fault_address; | ||
1846 | } | 1857 | } |