MaskRay added inline comments.

================
Comment at: clang/test/CodeGenCXX/catch-undef-behavior.cpp:408
 
   // RTTI pointer check
+  // CHECK: [[CalleeTypeHashPtr:%.+]] = getelementptr <{ i32, i32 }>, <{ i32, 
i32 }>* [[PTR]], i32 -1, i32 1
----------------
peter.smith wrote:
> MaskRay wrote:
> > peter.smith wrote:
> > > CalleeTypeHash check?
> > `CalleeTypeHashPtr` seems clear. Do you mean to change `HashCmp` below to 
> > `CalleeTypeHashMatch`?
> > 
> > 
> Apologies; I meant the comment is stale, it still says RTTI pointer check
Sorry for missing the stale comment. Fixed!


================
Comment at: llvm/test/CodeGen/AArch64/patchable-function-entry-bti.ll:92
 ; CHECK-NEXT: .Ltmp{{.*}}:
 ; CHECK-NEXT:   nop
 ; CHECK-NEXT:   .word   3238382334  // 0xc105cafe
----------------
peter.smith wrote:
> MaskRay wrote:
> > MaskRay wrote:
> > > peter.smith wrote:
> > > > samitolvanen wrote:
> > > > > peter.smith wrote:
> > > > > > Assuming the test is the equivalent of 
> > > > > > `-fpatchable-function-entry=1,1` I think this is the wrong place 
> > > > > > for the nop, I think it needs to be after the signature and the 
> > > > > > loads adjusted. For example with -fsanitize=kcfi 
> > > > > > -fpatchable-function-entries=1,1
> > > > > > ```
> > > > > > typedef int Fptr(void);
> > > > > > 
> > > > > > int function(void) {
> > > > > >   return 0;
> > > > > > }
> > > > > > 
> > > > > > int call(Fptr* fp) {
> > > > > >   return fp();
> > > > > > }
> > > > > > ```
> > > > > > Results in code like:
> > > > > > ```
> > > > > >         .word   1670944012                      // @call
> > > > > >                                         // 0x6398950c
> > > > > > .Ltmp1:
> > > > > >         nop
> > > > > > call:
> > > > > > .Lfunc_begin1:
> > > > > >         .cfi_startproc
> > > > > > // %bb.0:                               // %entry
> > > > > >         ldur    w16, [x0, #-8]
> > > > > >         movk    w17, #50598
> > > > > >         movk    w17, #14001, lsl #16
> > > > > >         cmp     w16, w17
> > > > > >         b.eq    .Ltmp2
> > > > > >         brk     #0x8220
> > > > > > .Ltmp2:
> > > > > >         br      x0
> > > > > > .Lfunc_end1:
> > > > > > ```
> > > > > > Note the NOP is after the signature, with the `ldur` having an 
> > > > > > offset of -8 and not the usual -4. I think you would need to make 
> > > > > > sure the signature is a branch instruction for each target for this 
> > > > > > scheme to work.
> > > > > No, this looks correct to me. Note that in AsmPrinter the type hash 
> > > > > is emitted after the patchable-function-prefix nops, while the KCFI 
> > > > > type hash is emitted before them.
> > > > My concern is more along the lines of how would this function be 
> > > > patched if the code doing the patching were unaware of the signature. 
> > > > I'm not familiar with how the kernel uses the nops so it could be that 
> > > > this is won't be a problem in practice.
> > > > 
> > > > With -fsanitize=kcfi it looks like there is no difference to the code 
> > > > doing the patching as the nops are in the same place with respect to 
> > > > the function entry point and there is no fall through into the 
> > > > signature.
> > > > 
> > > > With -fsanitize=function anything patching the first nop as an 
> > > > instruction would need to branch over the signature (unless the first 
> > > > entry of the signature was a branch instruction, but that would mean a 
> > > > target specific signature), obviously if the nop is patched with data 
> > > > and isn't the entry point then this doesn't matter. The code doing the 
> > > > patching would also need to know how to locate the nop ahead of the 
> > > > signature.
> > > The responsibility is on the user side to ensure that when M>0, they code 
> > > patches one of the M NOPs to a branch over the signature (0xc105cafe). 
> > > 
> > > ```
> > > // -fsanitize=function -fpatchable-function-entry=3,3
> > > .Ltmp0:
> > >         nop
> > >         nop
> > >         nop    # ensure there is a branch over the signature
> > >         .long   3238382334                      # 0xc105cafe
> > >         .long   2772461324                      # 0xa540670c
> > > foo:
> > > ```
> > > 
> > > In addition, `-fpatchable-function-entry=N,M` where M>0 is uncommon. 
> > > `-fpatchable-function-entry=` didn't work with `-fsanitize=function` 
> > > before my changes.
> > > 
> > > My concern is more along the lines of how would this function be patched 
> > > if the code doing the patching were unaware of the signature. I'm not 
> > > familiar with how the kernel uses the nops so it could be that this is 
> > > won't be a problem in practice.
> > 
> > I think the patching code must be aware if the user decides to use 
> > `-fpatchable-function-entry=N,M` where `M>0`, otherwise it's the pilot 
> > error to use the option with `-fsanitize=function`.
> > 
> > `-fsanitize=function` is designed to be compatible with uninstrumented 
> > functions (used as indirect call callees) and compatible with object files, 
> >  `-fpatchable-function-entry=N,M` functions, and regular functions. The 
> > call site must use the fixed offset unaffected by 
> > `-fpatchable-function-entry=N,M`.
> I don't have any objections here. Just wanted to make sure that we weren't 
> breaking any expectations.
> 
> I found one use in the kernel that uses -fpatchable-function-entry=4,2  
> (https://lore.kernel.org/all/20230123134603.1064407-9-mark.rutl...@arm.com/) 
> 
> Quoting from that:
> ```
> Currently, this approach is not compatible with CLANG_CFI, as the
> presence/absence of pre-function NOPs changes the offset of the
> pre-function type hash, and there's no existing mechanism to ensure a
> consistent offset for instrumented and uninstrumented functions. When
> CLANG_CFI is enabled, the existing scheme with a global ops->func
> pointer is used, and there should be no functional change. I am
> currently working with others to allow the two to work together in
> future (though this will liekly require updated compiler support).
> ```
> 
> I expect -fsanitize=kcfi to be used in this case over -fsanitize=functions so 
> I don't think this will cause a problem in practice.
> I expect -fsanitize=kcfi to be used in this case over -fsanitize=functions so 
> I don't think this will cause a problem in practice.

Yes, the kernel requires the addresses of the instrumented call sites which can 
only be provided by -fsanitize=kcfi. -fsanitize=function instrumented call 
sites are not recorded in a metadata section.
The kernel doesn't have a -fsanitize=function configuration.

For userspace programs that want to attempt both -fpatchable-function-entry=N,M 
where M>0 and -fsanitize=function, I expect that they need to check the 
-fsanitize=function signature...


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D148785/new/

https://reviews.llvm.org/D148785

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to