Skip to content

Commit

Permalink
Avoid setting watchpoint on stack protector i.e., TLS area
Browse files Browse the repository at this point in the history
  • Loading branch information
chabbimilind committed Jan 2, 2018
1 parent d4369e5 commit 154f50a
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 5 deletions.
4 changes: 3 additions & 1 deletion src/tool/hpcrun/sample-sources/watchpoint_clients.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
25 changes: 21 additions & 4 deletions src/tool/hpcrun/sample-sources/watchpoint_support.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
#include <math.h>
#include <assert.h>
#include <strings.h>

#include <asm/prctl.h>
#include <sys/prctl.h>

#include "common.h"
#include <hpcrun/main.h>
Expand Down Expand Up @@ -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;
Expand All @@ -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 ****************/
Expand Down Expand Up @@ -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 = {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
1 change: 1 addition & 0 deletions src/tool/hpcrun/sample-sources/watchpoint_support.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);


Expand Down

0 comments on commit 154f50a

Please sign in to comment.