diff options
| -rw-r--r-- | arch/x86/events/core.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c index 33787ee817f0..26ced536005a 100644 --- a/arch/x86/events/core.c +++ b/arch/x86/events/core.c | |||
| @@ -2319,7 +2319,7 @@ void | |||
| 2319 | perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs) | 2319 | perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs) |
| 2320 | { | 2320 | { |
| 2321 | struct stack_frame frame; | 2321 | struct stack_frame frame; |
| 2322 | const void __user *fp; | 2322 | const unsigned long __user *fp; |
| 2323 | 2323 | ||
| 2324 | if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) { | 2324 | if (perf_guest_cbs && perf_guest_cbs->is_in_guest()) { |
| 2325 | /* TODO: We don't support guest os callchain now */ | 2325 | /* TODO: We don't support guest os callchain now */ |
| @@ -2332,7 +2332,7 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs | |||
| 2332 | if (regs->flags & (X86_VM_MASK | PERF_EFLAGS_VM)) | 2332 | if (regs->flags & (X86_VM_MASK | PERF_EFLAGS_VM)) |
| 2333 | return; | 2333 | return; |
| 2334 | 2334 | ||
| 2335 | fp = (void __user *)regs->bp; | 2335 | fp = (unsigned long __user *)regs->bp; |
| 2336 | 2336 | ||
| 2337 | perf_callchain_store(entry, regs->ip); | 2337 | perf_callchain_store(entry, regs->ip); |
| 2338 | 2338 | ||
| @@ -2345,16 +2345,17 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs | |||
| 2345 | pagefault_disable(); | 2345 | pagefault_disable(); |
| 2346 | while (entry->nr < entry->max_stack) { | 2346 | while (entry->nr < entry->max_stack) { |
| 2347 | unsigned long bytes; | 2347 | unsigned long bytes; |
| 2348 | |||
| 2348 | frame.next_frame = NULL; | 2349 | frame.next_frame = NULL; |
| 2349 | frame.return_address = 0; | 2350 | frame.return_address = 0; |
| 2350 | 2351 | ||
| 2351 | if (!access_ok(VERIFY_READ, fp, 16)) | 2352 | if (!access_ok(VERIFY_READ, fp, sizeof(*fp) * 2)) |
| 2352 | break; | 2353 | break; |
| 2353 | 2354 | ||
| 2354 | bytes = __copy_from_user_nmi(&frame.next_frame, fp, 8); | 2355 | bytes = __copy_from_user_nmi(&frame.next_frame, fp, sizeof(*fp)); |
| 2355 | if (bytes != 0) | 2356 | if (bytes != 0) |
| 2356 | break; | 2357 | break; |
| 2357 | bytes = __copy_from_user_nmi(&frame.return_address, fp+8, 8); | 2358 | bytes = __copy_from_user_nmi(&frame.return_address, fp + 1, sizeof(*fp)); |
| 2358 | if (bytes != 0) | 2359 | if (bytes != 0) |
| 2359 | break; | 2360 | break; |
| 2360 | 2361 | ||
