This is an archive of the discontinued LLVM Phabricator instance.

[tsan] On arm64e, strip out ptrauth bits from incoming PCs
ClosedPublic

Authored by kubamracek on Aug 21 2020, 3:09 PM.

Diff Detail

Event Timeline

kubamracek created this revision.Aug 21 2020, 3:09 PM
kubamracek requested review of this revision.Aug 21 2020, 3:09 PM
yln added a comment.EditedAug 21 2020, 3:42 PM

Thanks for tackling this!

I grepped for "pc" in the header and there are a couple more.

➤ grep "pc" compiler-rt/lib/tsan/rtl/tsan_interface.h
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read1_pc(void *addr, void *pc);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read2_pc(void *addr, void *pc);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read4_pc(void *addr, void *pc);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read8_pc(void *addr, void *pc);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_read16_pc(void *addr, void *pc);  << missing, defined in different file
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write1_pc(void *addr, void *pc);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write2_pc(void *addr, void *pc);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write4_pc(void *addr, void *pc);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write8_pc(void *addr, void *pc);
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_write16_pc(void *addr, void *pc);  << missing, defined in different file
SANITIZER_INTERFACE_ATTRIBUTE void __tsan_func_entry(void *call_pc);

void __tsan_external_read(void *addr, void *caller_pc, void *tag);  << missing
void __tsan_external_write(void *addr, void *caller_pc, void *tag);  << missing
void __tsan_read_range_pc(void *addr, unsigned long size, void *pc);  << ok
void __tsan_write_range_pc(void *addr, unsigned long size, void *pc);  << ok

// Do we even care about the go ones?

void __tsan_go_atomic32_load(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
void __tsan_go_atomic64_load(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
void __tsan_go_atomic32_store(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
void __tsan_go_atomic64_store(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
void __tsan_go_atomic32_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
void __tsan_go_atomic64_fetch_add(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
void __tsan_go_atomic32_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
void __tsan_go_atomic64_exchange(ThreadState *thr, uptr cpc, uptr pc, u8 *a);
void __tsan_go_atomic32_compare_exchange(ThreadState *thr, uptr cpc, uptr pc,
void __tsan_go_atomic64_compare_exchange(ThreadState *thr, uptr cpc, uptr pc,
kubamracek retitled this revision from [tsan On arm64e, strip out ptrauth bits from incoming PCs to [tsan] On arm64e, strip out ptrauth bits from incoming PCs.

Great finds, thanks! I've updated the missing places. I'm leaving the Go parts alone, for now, as Go isn't using ptrauth.

yln accepted this revision.Aug 25 2020, 10:06 AM
This revision is now accepted and ready to land.Aug 25 2020, 10:06 AM