forked from OSchip/llvm-project
Expose __hwasan_tag_mismatch_stub
Summary: GCC would like to emit a function call to report a tag mismatch rather than hard-code the `brk` instruction directly. __hwasan_tag_mismatch_stub contains most of the functionality to do this already, but requires exposure in the dynamic library. This patch moves __hwasan_tag_mismatch_stub outside of the anonymous namespace that it was defined in and declares it in hwasan_interface_internal.h. We also add the ability to pass sizes larger than 16 bytes to this reporting function by providing a fourth parameter that is only looked at when the size provided is not in the original accepted range. This does not change the behaviour where it is already being called, since the previous definition only accepted sizes up to 16 bytes and hence the change in behaviour is not seen by existing users. The change in declaration does not matter, since the only existing use is in the __hwasan_tag_mismatch function written in assembly. Tested with gcc and clang on an AArch64 vm. Reviewers: eugenis, kcc, pcc, #sanitizers Reviewed By: eugenis, #sanitizers Subscribers: kristof.beyls, llvm-commits Tags: #sanitizers, #llvm Differential Revision: https://reviews.llvm.org/D69113
This commit is contained in:
parent
73cebfe412
commit
612eadb7bc
|
|
@ -111,6 +111,10 @@ uptr __hwasan_tag_pointer(uptr p, u8 tag);
|
|||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __hwasan_tag_mismatch(uptr addr, u8 ts);
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
void __hwasan_tag_mismatch4(uptr addr, uptr access_info, uptr *registers_frame,
|
||||
size_t outsize);
|
||||
|
||||
SANITIZER_INTERFACE_ATTRIBUTE
|
||||
u8 __hwasan_generate_tag();
|
||||
|
||||
|
|
|
|||
|
|
@ -460,21 +460,6 @@ static bool HwasanOnSIGTRAP(int signo, siginfo_t *info, ucontext_t *uc) {
|
|||
return true;
|
||||
}
|
||||
|
||||
// Entry point stub for interoperability between __hwasan_tag_mismatch (ASM) and
|
||||
// the rest of the mismatch handling code (C++).
|
||||
extern "C" void __hwasan_tag_mismatch_stub(uptr addr, uptr access_info,
|
||||
uptr *registers_frame) {
|
||||
AccessInfo ai;
|
||||
ai.is_store = access_info & 0x10;
|
||||
ai.recover = false;
|
||||
ai.addr = addr;
|
||||
ai.size = 1 << (access_info & 0xf);
|
||||
|
||||
HandleTagMismatch(ai, (uptr)__builtin_return_address(0),
|
||||
(uptr)__builtin_frame_address(0), nullptr, registers_frame);
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
||||
static void OnStackUnwind(const SignalContext &sig, const void *,
|
||||
BufferedStackTrace *stack) {
|
||||
stack->Unwind(StackTrace::GetNextInstructionPc(sig.pc), sig.bp, sig.context,
|
||||
|
|
@ -493,4 +478,24 @@ void HwasanOnDeadlySignal(int signo, void *info, void *context) {
|
|||
|
||||
} // namespace __hwasan
|
||||
|
||||
// Entry point for interoperability between __hwasan_tag_mismatch (ASM) and the
|
||||
// rest of the mismatch handling code (C++).
|
||||
void __hwasan_tag_mismatch4(uptr addr, uptr access_info, uptr *registers_frame,
|
||||
size_t outsize) {
|
||||
__hwasan::AccessInfo ai;
|
||||
ai.is_store = access_info & 0x10;
|
||||
ai.is_load = !ai.is_store;
|
||||
ai.recover = access_info & 0x20;
|
||||
ai.addr = addr;
|
||||
if ((access_info & 0xf) == 0xf)
|
||||
ai.size = outsize;
|
||||
else
|
||||
ai.size = 1 << (access_info & 0xf);
|
||||
|
||||
__hwasan::HandleTagMismatch(ai, (uptr)__builtin_return_address(0),
|
||||
(uptr)__builtin_frame_address(0), nullptr,
|
||||
registers_frame);
|
||||
__builtin_unreachable();
|
||||
}
|
||||
|
||||
#endif // SANITIZER_FREEBSD || SANITIZER_LINUX || SANITIZER_NETBSD
|
||||
|
|
|
|||
|
|
@ -135,12 +135,12 @@ __hwasan_tag_mismatch_v2:
|
|||
stp x4, x5, [sp, #32]
|
||||
stp x2, x3, [sp, #16]
|
||||
|
||||
// Pass the address of the frame to __hwasan_tag_mismatch_stub, so that it can
|
||||
// Pass the address of the frame to __hwasan_tag_mismatch4, so that it can
|
||||
// extract the saved registers from this frame without having to worry about
|
||||
// finding this frame.
|
||||
mov x2, sp
|
||||
|
||||
bl __hwasan_tag_mismatch_stub
|
||||
bl __hwasan_tag_mismatch4
|
||||
CFI_ENDPROC
|
||||
|
||||
.Lfunc_end0:
|
||||
|
|
|
|||
Loading…
Reference in New Issue