From 154f50a2d96e2e23df2a06332ad7e24acbe0d499 Mon Sep 17 00:00:00 2001 From: chabbimilind Date: Mon, 1 Jan 2018 21:02:33 -0500 Subject: [PATCH] Avoid setting watchpoint on stack protector i.e., TLS area --- .../sample-sources/watchpoint_clients.c | 4 ++- .../sample-sources/watchpoint_support.c | 25 ++++++++++++++++--- .../sample-sources/watchpoint_support.h | 1 + 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/tool/hpcrun/sample-sources/watchpoint_clients.c b/src/tool/hpcrun/sample-sources/watchpoint_clients.c index 19f510580b..8854fc2513 100755 --- a/src/tool/hpcrun/sample-sources/watchpoint_clients.c +++ b/src/tool/hpcrun/sample-sources/watchpoint_clients.c @@ -1493,7 +1493,9 @@ static inline bool IsValidAddress(void * addr, void * pc){ return false; if(IsAltStackAddress(addr)) return false; - + if(IsFSorGS(addr)) + return false; + if(IsBlackListedWatchpointAddress(addr) || IsBlackListedWatchpointAddress(pc)){ return false; } diff --git a/src/tool/hpcrun/sample-sources/watchpoint_support.c b/src/tool/hpcrun/sample-sources/watchpoint_support.c index c387fc857e..08f8e1e2a6 100644 --- a/src/tool/hpcrun/sample-sources/watchpoint_support.c +++ b/src/tool/hpcrun/sample-sources/watchpoint_support.c @@ -31,7 +31,8 @@ #include #include #include - +#include +#include #include "common.h" #include @@ -100,6 +101,8 @@ WPConfig_t wpConfig; typedef struct ThreadData{ int lbrDummyFD __attribute__((aligned(CACHE_LINE_SZ))); stack_t ss; + void * fs_reg_val; + void * gs_reg_val; uint64_t samplePostFull; long numWatchpointTriggers; long numWatchpointImpreciseIP; @@ -117,11 +120,23 @@ typedef struct ThreadData{ static __thread ThreadData_t tData; bool IsAltStackAddress(void *addr){ - if(addr >= tData.ss.ss_sp && addr < tData.ss.ss_sp + tData.ss.ss_size) + if((addr >= tData.ss.ss_sp) && (addr < tData.ss.ss_sp + tData.ss.ss_size)) return true; return false; } +bool IsFSorGS(void * addr) { + if (tData.fs_reg_val == (void *) -1) { + syscall(SYS_arch_prctl, ARCH_GET_FS, &tData.fs_reg_val); + syscall(SYS_arch_prctl, ARCH_GET_GS, &tData.gs_reg_val); + } + // 4096 smallest one page size + if ( (tData.fs_reg_val <= addr) && (addr < tData.fs_reg_val + 4096)) + return true; + if ( (tData.gs_reg_val <= addr) && (addr < tData.gs_reg_val + 4096)) + return true; + return false; +} /********* OS SUPPORT ****************/ @@ -367,8 +382,6 @@ void SpatialReuseWPConfigOverride(void *v){ wpConfig.dontDisassembleWPAddress = true; } - - static void CreateWatchPoint(WatchPointInfo_t * wpi, SampleData_t * sampleData, bool modify) { // Perf event settings struct perf_event_attr pe = { @@ -537,6 +550,8 @@ void WatchpointThreadInit(WatchPointUpCall_t func){ tData.lbrDummyFD = -1; tData.fptr = func; + tData.fs_reg_val = (void*)-1; + tData.gs_reg_val = (void*)-1; srand48_r(time(NULL), &tData.randBuffer); tData.samplePostFull = SAMPLES_POST_FULL_RESET_VAL; tData.numWatchpointTriggers = 0; @@ -571,6 +586,8 @@ void WatchpointThreadTerminate(){ CloseDummyHardwareEvent(tData.lbrDummyFD); tData.lbrDummyFD = -1; } + tData.fs_reg_val = (void*)-1; + tData.gs_reg_val = (void*)-1; hpcrun_stats_num_watchpoints_triggered_inc(tData.numWatchpointTriggers); hpcrun_stats_num_watchpoints_imprecise_inc(tData.numWatchpointImpreciseIP); diff --git a/src/tool/hpcrun/sample-sources/watchpoint_support.h b/src/tool/hpcrun/sample-sources/watchpoint_support.h index 2e198f1d4b..35e8922360 100644 --- a/src/tool/hpcrun/sample-sources/watchpoint_support.h +++ b/src/tool/hpcrun/sample-sources/watchpoint_support.h @@ -147,6 +147,7 @@ extern void WatchpointThreadTerminate(); extern bool SubscribeWatchpoint(SampleData_t * sampleData, OverwritePolicy overwritePolicy, bool captureValue); extern bool OnSample(perf_mmap_data_t * mmap_data, void * contextPC, cct_node_t *node, int sampledMetricId); extern bool IsAltStackAddress(void *addr); +extern bool IsFSorGS(void *addr); extern double ProportionOfWatchpointAmongOthersSharingTheSameContext(WatchPointInfo_t *wpi);