@@ -2490,7 +2490,7 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent
2490
2490
/* 32-bit process in 64-bit kernel. */
2491
2491
unsigned long ss_base , cs_base ;
2492
2492
struct stack_frame_ia32 frame ;
2493
- const void __user * fp ;
2493
+ const struct stack_frame_ia32 __user * fp ;
2494
2494
2495
2495
if (!test_thread_flag (TIF_IA32 ))
2496
2496
return 0 ;
@@ -2501,18 +2501,12 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent
2501
2501
fp = compat_ptr (ss_base + regs -> bp );
2502
2502
pagefault_disable ();
2503
2503
while (entry -> nr < entry -> max_stack ) {
2504
- unsigned long bytes ;
2505
- frame .next_frame = 0 ;
2506
- frame .return_address = 0 ;
2507
-
2508
2504
if (!valid_user_frame (fp , sizeof (frame )))
2509
2505
break ;
2510
2506
2511
- bytes = __copy_from_user_nmi (& frame .next_frame , fp , 4 );
2512
- if (bytes != 0 )
2507
+ if (__get_user (frame .next_frame , & fp -> next_frame ))
2513
2508
break ;
2514
- bytes = __copy_from_user_nmi (& frame .return_address , fp + 4 , 4 );
2515
- if (bytes != 0 )
2509
+ if (__get_user (frame .return_address , & fp -> return_address ))
2516
2510
break ;
2517
2511
2518
2512
perf_callchain_store (entry , cs_base + frame .return_address );
@@ -2533,7 +2527,7 @@ void
2533
2527
perf_callchain_user (struct perf_callchain_entry_ctx * entry , struct pt_regs * regs )
2534
2528
{
2535
2529
struct stack_frame frame ;
2536
- const unsigned long __user * fp ;
2530
+ const struct stack_frame __user * fp ;
2537
2531
2538
2532
if (perf_guest_cbs && perf_guest_cbs -> is_in_guest ()) {
2539
2533
/* TODO: We don't support guest os callchain now */
@@ -2546,7 +2540,7 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs
2546
2540
if (regs -> flags & (X86_VM_MASK | PERF_EFLAGS_VM ))
2547
2541
return ;
2548
2542
2549
- fp = (unsigned long __user * )regs -> bp ;
2543
+ fp = (void __user * )regs -> bp ;
2550
2544
2551
2545
perf_callchain_store (entry , regs -> ip );
2552
2546
@@ -2558,19 +2552,12 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs
2558
2552
2559
2553
pagefault_disable ();
2560
2554
while (entry -> nr < entry -> max_stack ) {
2561
- unsigned long bytes ;
2562
-
2563
- frame .next_frame = NULL ;
2564
- frame .return_address = 0 ;
2565
-
2566
2555
if (!valid_user_frame (fp , sizeof (frame )))
2567
2556
break ;
2568
2557
2569
- bytes = __copy_from_user_nmi (& frame .next_frame , fp , sizeof (* fp ));
2570
- if (bytes != 0 )
2558
+ if (__get_user (frame .next_frame , & fp -> next_frame ))
2571
2559
break ;
2572
- bytes = __copy_from_user_nmi (& frame .return_address , fp + 1 , sizeof (* fp ));
2573
- if (bytes != 0 )
2560
+ if (__get_user (frame .return_address , & fp -> return_address ))
2574
2561
break ;
2575
2562
2576
2563
perf_callchain_store (entry , frame .return_address );
0 commit comments