Message ID | ZtmC2FPbntuq1jUn@tucnak |
---|---|
State | New |
Headers | show |
Series | libsanitizer: On aarch64 use hint #34 in prologue of libsanitizer functions | expand |
Jakub Jelinek <jakub@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 <jakub@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
--- 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" \ );