[compiler-rt][hwasan] Define fuchsia implementations of required hwasan functions

This contains all the definitions required by hwasan for the fuchsia
implementation and can be landed independently from the remaining parts of D91466.

Differential Revision: https://reviews.llvm.org/D103936
This commit is contained in:
Leonard Chan 2021-06-09 12:38:08 -07:00
parent 5b350183cd
commit a11aea68a4
2 changed files with 36 additions and 1 deletions

View File

@ -30,6 +30,19 @@ THREADLOCAL uptr __hwasan_tls;
namespace __hwasan { namespace __hwasan {
bool InitShadow() {
__sanitizer::InitShadowBounds();
CHECK_NE(__sanitizer::ShadowBounds.shadow_limit, 0);
return true;
}
bool MemIsApp(uptr p) {
CHECK(GetTagFromPointer(p) == 0);
return __sanitizer::ShadowBounds.shadow_limit <= p &&
p <= (__sanitizer::ShadowBounds.memory_limit - 1);
}
// These are known parameters passed to the hwasan runtime on thread creation. // These are known parameters passed to the hwasan runtime on thread creation.
struct Thread::InitState { struct Thread::InitState {
uptr stack_bottom, stack_top; uptr stack_bottom, stack_top;
@ -130,6 +143,26 @@ static void ThreadExitHook(void *hook, thrd_t self) {
hwasanThreadList().ReleaseThread(thread); hwasanThreadList().ReleaseThread(thread);
} }
// Not implemented because Fuchsia does not use signal handlers.
void HwasanOnDeadlySignal(int signo, void *info, void *context) {}
// Not implemented because Fuchsia does not use interceptors.
void InitializeInterceptors() {}
// Not implemented because this is only relevant for Android.
void AndroidTestTlsSlot() {}
// TSD was normally used on linux as a means of calling the hwasan thread exit
// handler passed to pthread_key_create. This is not needed on Fuchsia because
// we will be using __sanitizer_thread_exit_hook.
void HwasanTSDInit() {}
void HwasanTSDThreadInit() {}
// On linux, this just would call `atexit(HwasanAtExit)`. The functions in
// HwasanAtExit are unimplemented for Fuchsia and effectively no-ops, so this
// function is unneeded.
void InstallAtExitHandler() {}
} // namespace __hwasan } // namespace __hwasan
extern "C" { extern "C" {

View File

@ -156,8 +156,10 @@ uptr GetMmapGranularity() { return _zx_system_get_page_size(); }
sanitizer_shadow_bounds_t ShadowBounds; sanitizer_shadow_bounds_t ShadowBounds;
void InitShadowBounds() { ShadowBounds = __sanitizer_shadow_bounds(); }
uptr GetMaxUserVirtualAddress() { uptr GetMaxUserVirtualAddress() {
ShadowBounds = __sanitizer_shadow_bounds(); InitShadowBounds();
return ShadowBounds.memory_limit - 1; return ShadowBounds.memory_limit - 1;
} }