Did I miss applying this to the kernel-cache previously ? or did
I miss a patch against the linux-yocto repo itself ?

The reason I ask, is that it is awkward to apply patches like this
to the tree.

If you send the patch against linux-yocto, I'll apply it and then
commit the change to the kernel-cache via my scripts.

Bruce

In message: [linux-yocto][yocto-kernel-cache][master yocto-5.4][PATCH] 
arm64/perf: fix backtrace for AAPCS with FP enabled
on 27/04/2020 [email protected] wrote:

> From: Yanfei Xu <[email protected]>
> 
> This change is for arm64 platform compat mode.
> 
> ------[cut here: not apply patch]--------
>  Samples: 119K of event 'cycles'
>  Event count (approx.): 114092698680
> 
>  Children      Self  Command    Shared Object       Symbol
>  ........  ........  .........  ..................
> 
>     99.85%     0.00%  perf-test  [unknown]           [.]
> 0x00000000ff80f4ec
>             |
>             ---0xff80f4ec
>                |
>                |--37.68%--__aeabi_idivmod
>                |
>                |--25.35%--calculate_meaning_of_life
>                |
>                |--20.06%--____aeabi_idivmod_from_thumb
>                |
>                |--7.25%--0
>                |          |
>                |          |--1.76%--0xf543df9c
>                |          |          __gettimeofday
> 
> ------[cut here: apply patch]------------
>  Samples: 114K of event 'cycles'
>  Event count (approx.): 109799966925
> 
>  Children      Self  Command    Shared Object       Symbol
>  ........  ........  .........  ..................
> 
>     99.91%     0.00%  perf-test  perf-test           [.] main
>             |
>             ---main
>                |
>                |--57.49%--pthread_create@@GLIBC_2.4
>                |          |
>                |           --57.44%--0xf7cf2f88
>                |                     |
>                |                     |--20.16%--__aeabi_idivmod
>                |                     |
>                |
> |--13.79%--calculate_meaning_of_life
>                |                     |
>                |
> |--10.89%--____aeabi_idivmod_from_thumb
>                |                     |
>                |                     |--8.99%--current_timestamp
>                |                     |          |
>                |                     |           --8.98%--__gettimeofday
> 
> 1/1 [
> Author: Fang Jia
> Email: [email protected]
> Subject: arm64/perf: fix backtrace for AAPCS with FP enabled
> Date: Fri, 28 Dec 2018 16:28:34 +0800
> 
> This change is for arm64 platform compat mode.
> The change for arm32 platform has been included in this commit "perf:
> fix backtrace for AAPCS with FP enabled".
> 
> This change replaces code designed for the obsolete ARM APCS ABI, which
> causes failures of the perf backtrace logic unless the gcc option
> -mapcs-frame is used to build all binaries on the platform.  This
> obsolete gcc option forces the compiler to include the stack pointer
> along with the frame pointer and link register in the stack frame
> for each funciton call. The current AAPCS ABI document, doesn't
> explicitly describe the frame structure when the gcc frame pointer
> option, -fno-omit-frame-pointer, is enabled. However, with this option
> enabled, examination of the emitted prologue instructions shows that
> 1) R11 is used as the frame pointer,
> 2) only the R11 and LR are saved onto the stack, not the stack pointer,
> 3) after this prologue setup, the frame pointer, R11 points to the
> saved location of LR on the stack.
> 
> The use of unsigned int arithmetic in the commit is required since
> the gcc emitted pointer arithmetic uses 8-byte pointer sizes, which are
> incorrect addresses for the 4-byte stack address size.
> 
> Signed-off-by: Fang Jia <[email protected]>
> Reviewed-by: Jiwei Sun <[email protected]>
> Signed-off-by: De Huo <[email protected]>
> ]
> 
> Signed-off-by: Yanfei Xu <[email protected]>
> ---
>  ...-backtrace-for-AAPCS-with-FP-enabled.patch | 93 +++++++++++++++++++
>  patches/misc/misc.scc                         |  1 +
>  2 files changed, 94 insertions(+)
>  create mode 100644 
> patches/misc/arm64-perf-fix-backtrace-for-AAPCS-with-FP-enabled.patch
> 
> diff --git 
> a/patches/misc/arm64-perf-fix-backtrace-for-AAPCS-with-FP-enabled.patch 
> b/patches/misc/arm64-perf-fix-backtrace-for-AAPCS-with-FP-enabled.patch
> new file mode 100644
> index 00000000..4c1e78cf
> --- /dev/null
> +++ b/patches/misc/arm64-perf-fix-backtrace-for-AAPCS-with-FP-enabled.patch
> @@ -0,0 +1,93 @@
> +From cbbce37ccc6041d3ae3d3cb3b1918a61a39820a0 Mon Sep 17 00:00:00 2001
> +From: Fang Jia <[email protected]>
> +Date: Fri, 28 Dec 2018 16:28:34 +0800
> +Subject: [PATCH] arm64/perf: fix backtrace for AAPCS with FP enabled
> +
> +This change is for arm64 platform compat mode.
> +The change for arm32 platform has been included in this commit "perf: fix
> +backtrace for AAPCS with FP enabled".
> +
> +This change replaces code designed for the obsolete ARM APCS ABI, which
> +causes failures of the perf backtrace logic unless the gcc option
> +-mapcs-frame is used to build all binaries on the platform.  This
> +obsolete gcc option forces the compiler to include the stack pointer
> +along with the frame pointer and link register in the stack frame
> +for each funciton call. The current AAPCS ABI document, doesn't
> +explicitly describe the frame structure when the gcc frame pointer
> +option, -fno-omit-frame-pointer, is enabled. However, with this option
> +enabled, examination of the emitted prologue instructions shows that
> +1) R11 is used as the frame pointer,
> +2) only the R11 and LR are saved onto the stack, not the stack pointer,
> +3) after this prologue setup, the frame pointer, R11 points to the
> +saved location of LR on the stack.
> +
> +The use of unsigned int arithmetic in the commit is required since
> +the gcc emitted pointer arithmetic uses 8-byte pointer sizes, which are
> +incorrect addresses for the 4-byte stack address size.
> +
> +Signed-off-by: Fang Jia <[email protected]>
> +Reviewed-by: Jiwei Sun <[email protected]>
> +Signed-off-by: De Huo <[email protected]>
> +---
> + arch/arm64/kernel/perf_callchain.c | 25 +++++++++++++++----------
> + 1 file changed, 15 insertions(+), 10 deletions(-)
> +
> +diff --git a/arch/arm64/kernel/perf_callchain.c 
> b/arch/arm64/kernel/perf_callchain.c
> +index 9d63514b9836..b9bbe0b04fc1 100644
> +--- a/arch/arm64/kernel/perf_callchain.c
> ++++ b/arch/arm64/kernel/perf_callchain.c
> +@@ -54,16 +54,22 @@ user_backtrace(struct frame_tail __user *tail,
> + 
> + #ifdef CONFIG_COMPAT
> + /*
> +- * The registers we're interested in are at the end of the variable
> +- * length saved register structure. The fp points at the end of this
> +- * structure so the address of this struct is:
> +- * (struct compat_frame_tail *)(xxx->fp)-1
> ++ * The AAPCS ABI, the most current replacing the obsolete APCS ABI,
> ++ * does not specifically describe the stack frame with respect to the
> ++ * frame pointer.  However, the examination of emitted prologue
> ++ * instructions for ARM implies that with -fno-omit-framepointer,
> ++ * register R11 is used as the frame pointer register and saved on the
> ++ * stack, with LR.
> +  *
> +- * This code has been adapted from the ARM OProfile support.
> ++ * After the prolog, the FP points to the location of the saved LR and
> ++ * FP+4 points to the previous frames FP as shown below:
> ++ *  Stack Hi Mem
> ++ *  (Value of FP)+4  Saved FP for caller
> ++ *  (Value of FP)    LR set by caller
> ++ *  Stack Lo Mem
> +  */
> + struct compat_frame_tail {
> +     compat_uptr_t   fp; /* a (struct compat_frame_tail *) in compat mode */
> +-    u32             sp;
> +     u32             lr;
> + } __attribute__((packed));
> + 
> +@@ -91,11 +97,10 @@ compat_user_backtrace(struct compat_frame_tail __user 
> *tail,
> +      * Frame pointers should strictly progress back up the stack
> +      * (towards higher addresses).
> +      */
> +-    if (tail + 1 >= (struct compat_frame_tail __user *)
> +-                    compat_ptr(buftail.fp))
> ++    if ((u32)tail + 4 >= buftail.fp)
> +             return NULL;
> + 
> +-    return (struct compat_frame_tail __user *)compat_ptr(buftail.fp) - 1;
> ++    return (struct compat_frame_tail __user *)(buftail.fp - 4);
> + }
> + #endif /* CONFIG_COMPAT */
> + 
> +@@ -123,7 +128,7 @@ void perf_callchain_user(struct perf_callchain_entry_ctx 
> *entry,
> +             /* AARCH32 compat mode */
> +             struct compat_frame_tail __user *tail;
> + 
> +-            tail = (struct compat_frame_tail __user *)regs->compat_fp - 1;
> ++            tail = (struct compat_frame_tail __user *)(regs->compat_fp - 4);
> + 
> +             while ((entry->nr < entry->max_stack) &&
> +                     tail && !((unsigned long)tail & 0x3))
> +-- 
> +2.17.1
> +
> diff --git a/patches/misc/misc.scc b/patches/misc/misc.scc
> index dc091c36..910b4d36 100644
> --- a/patches/misc/misc.scc
> +++ b/patches/misc/misc.scc
> @@ -8,3 +8,4 @@ patch 
> uvesafb-provide-option-to-specify-timeout-for-task-c.patch
>  patch linux-yocto-Handle-bin-awk-issues.patch
>  patch modpost-srcversion-sometimes-incorrect.patch
>  patch x86-boot-compressed-64-Define-__force_order-only-whe.patch
> +patch arm64-perf-fix-backtrace-for-AAPCS-with-FP-enabled.patch
> -- 
> 2.18.2
> 
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#8629): 
https://lists.yoctoproject.org/g/linux-yocto/message/8629
Mute This Topic: https://lists.yoctoproject.org/mt/73303101/21656
Group Owner: [email protected]
Unsubscribe: 
https://lists.yoctoproject.org/g/linux-yocto/leave/6687884/624485779/xyzzy  
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to