Jakub Jelinek <ja...@redhat.com> writes:
> Hi!
>
> When gcc is built with -mbranch-protection=standard, running sanitized
> programs doesn't work properly on bti enabled kernels.
>
> This has been fixed upstream with
> https://github.com/llvm/llvm-project/pull/84061
>
> The following patch cherry picks that from upstream, ok for trunk/14.3?

Yes, thanks!

Richard

> For trunk we should eventually do a full merge from upstream, but I'm hoping
> they will first fix up the _BitInt libubsan support mess.
>
> 2024-09-05  Jakub Jelinek  <ja...@redhat.com>
>
>       * sanitizer_common/sanitizer_asm.h: Cherry-pick llvm-project revision
>       1c792d24e0a228ad49cc004a1c26bbd7cd87f030.
>       * interception/interception.h: Likewise.
>
> --- libsanitizer/sanitizer_common/sanitizer_asm.h
> +++ libsanitizer/sanitizer_common/sanitizer_asm.h
> @@ -42,6 +42,16 @@
>  # define CFI_RESTORE(reg)
>  #endif
>  
> +#if defined(__aarch64__) && defined(__ARM_FEATURE_BTI_DEFAULT)
> +# define ASM_STARTPROC CFI_STARTPROC; hint #34
> +# define C_ASM_STARTPROC SANITIZER_STRINGIFY(CFI_STARTPROC) "\nhint #34"
> +#else
> +# define ASM_STARTPROC CFI_STARTPROC
> +# define C_ASM_STARTPROC SANITIZER_STRINGIFY(CFI_STARTPROC)
> +#endif
> +#define ASM_ENDPROC CFI_ENDPROC
> +#define C_ASM_ENDPROC SANITIZER_STRINGIFY(CFI_ENDPROC)
> +
>  #if defined(__x86_64__) || defined(__i386__) || defined(__sparc__)
>  # define ASM_TAIL_CALL jmp
>  #elif defined(__arm__) || defined(__aarch64__) || defined(__mips__) || \
> @@ -114,9 +124,9 @@
>           .globl __interceptor_trampoline_##name;                             
>   \
>           ASM_TYPE_FUNCTION(__interceptor_trampoline_##name);                 
>   \
>           __interceptor_trampoline_##name:                                    
>   \
> -                 CFI_STARTPROC;                                              
>   \
> +                 ASM_STARTPROC;                                              
>   \
>                   ASM_TAIL_CALL ASM_PREEMPTIBLE_SYM(__interceptor_##name);    
>   \
> -                 CFI_ENDPROC;                                                
>   \
> +                 ASM_ENDPROC;                                                
>   \
>           ASM_SIZE(__interceptor_trampoline_##name)
>  #  define ASM_INTERCEPTOR_TRAMPOLINE_SUPPORT 1
>  # endif  // Architecture supports interceptor trampoline
> --- libsanitizer/interception/interception.h
> +++ libsanitizer/interception/interception.h
> @@ -204,11 +204,11 @@ const interpose_substitution substitution_##func_name[] 
>             \
>         ".type  " SANITIZER_STRINGIFY(TRAMPOLINE(func)) ", "                  
>   \
>           ASM_TYPE_FUNCTION_STR "\n"                                          
>   \
>         SANITIZER_STRINGIFY(TRAMPOLINE(func)) ":\n"                           
>   \
> -       SANITIZER_STRINGIFY(CFI_STARTPROC) "\n"                               
>   \
> +       C_ASM_STARTPROC "\n"                                                  
>   \
>         C_ASM_TAIL_CALL(SANITIZER_STRINGIFY(TRAMPOLINE(func)),                
>   \
>                         "__interceptor_"                                      
>   \
>                           SANITIZER_STRINGIFY(ASM_PREEMPTIBLE_SYM(func))) 
> "\n"  \
> -       SANITIZER_STRINGIFY(CFI_ENDPROC) "\n"                                 
>   \
> +       C_ASM_ENDPROC "\n"                                                    
>   \
>         ".size  " SANITIZER_STRINGIFY(TRAMPOLINE(func)) ", "                  
>   \
>              ".-" SANITIZER_STRINGIFY(TRAMPOLINE(func)) "\n"                  
>   \
>       );
>
>       Jakub

Reply via email to