From dfcbd6b3da9a9cc08df2339a8c29ade1b3d8368c Mon Sep 17 00:00:00 2001 From: Alexander Ivchenko Date: Mon, 26 Dec 2016 15:14:06 +0000 Subject: [PATCH] libtool-version: New version. 2016-12-26 Alexander Ivchenko * mpxrt/libtool-version: New version. * mpxrt/mpxrt-utils.c (set_mpx_rt_stop_handler): New function. (print_help): Add help for CHKP_RT_STOP_HANDLER environment variable. (__mpxrt_init_env_vars): Add initialization of stop_handler. (__mpxrt_stop_handler): New function. (__mpxrt_stop): Ditto. * mpxrt/mpxrt-utils.h (mpx_rt_stop_mode_handler_t): New enum. * mpxrt/mpxrt.c (handler): Replace exit(255) with __mpxrt_stop function call. From-SVN: r243928 --- libmpx/ChangeLog | 13 ++++++++++ libmpx/mpxrt/libtool-version | 2 +- libmpx/mpxrt/mpxrt-utils.c | 46 ++++++++++++++++++++++++++++++++++++ libmpx/mpxrt/mpxrt-utils.h | 5 ++++ libmpx/mpxrt/mpxrt.c | 6 ++--- 5 files changed, 68 insertions(+), 4 deletions(-) diff --git a/libmpx/ChangeLog b/libmpx/ChangeLog index 07a4dd7636f..4f7a68425da 100644 --- a/libmpx/ChangeLog +++ b/libmpx/ChangeLog @@ -1,3 +1,16 @@ +2016-12-26 Alexander Ivchenko + + * mpxrt/libtool-version: New version. + * mpxrt/mpxrt-utils.c (set_mpx_rt_stop_handler): New function. + (print_help): Add help for CHKP_RT_STOP_HANDLER environment + variable. + (__mpxrt_init_env_vars): Add initialization of stop_handler. + (__mpxrt_stop_handler): New function. + (__mpxrt_stop): Ditto. + * mpxrt/mpxrt-utils.h (mpx_rt_stop_mode_handler_t): New enum. + * mpxrt/mpxrt.c (handler): Replace exit(255) with __mpxrt_stop + function call. + 2016-11-15 Matthias Klose * configure: Regenerate. diff --git a/libmpx/mpxrt/libtool-version b/libmpx/mpxrt/libtool-version index 7d9925549d1..736d763e605 100644 --- a/libmpx/mpxrt/libtool-version +++ b/libmpx/mpxrt/libtool-version @@ -3,4 +3,4 @@ # a separate file so that version updates don't involve re-running # automake. # CURRENT:REVISION:AGE -2:0:0 +2:1:0 diff --git a/libmpx/mpxrt/mpxrt-utils.c b/libmpx/mpxrt/mpxrt-utils.c index 057a3553cb5..63ee7c6ae63 100644 --- a/libmpx/mpxrt/mpxrt-utils.c +++ b/libmpx/mpxrt/mpxrt-utils.c @@ -60,6 +60,9 @@ #define MPX_RT_MODE "CHKP_RT_MODE" #define MPX_RT_MODE_DEFAULT MPX_RT_COUNT #define MPX_RT_MODE_DEFAULT_STR "count" +#define MPX_RT_STOP_HANDLER "CHKP_RT_STOP_HANDLER" +#define MPX_RT_STOP_HANDLER_DEFAULT MPX_RT_STOP_HANDLER_ABORT +#define MPX_RT_STOP_HANDLER_DEFAULT_STR "abort" #define MPX_RT_HELP "CHKP_RT_HELP" #define MPX_RT_ADDPID "CHKP_RT_ADDPID" #define MPX_RT_BNDPRESERVE "CHKP_RT_BNDPRESERVE" @@ -84,6 +87,7 @@ typedef struct { static int summary; static int add_pid; static mpx_rt_mode_t mode; +static mpx_rt_stop_mode_handler_t stop_handler; static env_var_list_t env_var_list; static verbose_type verbose_val; static FILE *out; @@ -226,6 +230,23 @@ set_mpx_rt_mode (const char *env) } } +static mpx_rt_stop_mode_handler_t +set_mpx_rt_stop_handler (const char *env) +{ + if (env == 0) + return MPX_RT_STOP_HANDLER_DEFAULT; + else if (strcmp (env, "abort") == 0) + return MPX_RT_STOP_HANDLER_ABORT; + else if (strcmp (env, "exit") == 0) + return MPX_RT_STOP_HANDLER_EXIT; + { + __mpxrt_print (VERB_ERROR, "Illegal value '%s' for %s. Legal values are" + "[abort | exit]\nUsing default value %s\n", + env, MPX_RT_STOP_HANDLER, MPX_RT_STOP_HANDLER_DEFAULT); + return MPX_RT_STOP_HANDLER_DEFAULT; + } +} + static void print_help (void) { @@ -244,6 +265,11 @@ print_help (void) fprintf (out, "%s \t\t set MPX runtime behavior on #BR exception." " [stop | count]\n" "\t\t\t [default: %s]\n", MPX_RT_MODE, MPX_RT_MODE_DEFAULT_STR); + fprintf (out, "%s \t set the handler function MPX runtime will call\n" + "\t\t\t on #BR exception when %s is set to \'stop\'." + " [abort | exit]\n" + "\t\t\t [default: %s]\n", MPX_RT_STOP_HANDLER, MPX_RT_MODE, + MPX_RT_STOP_HANDLER_DEFAULT_STR); fprintf (out, "%s \t\t generate out,err file for each process.\n" "\t\t\t generated file will be MPX_RT_{OUT,ERR}_FILE.pid\n" "\t\t\t [default: no]\n", MPX_RT_ADDPID); @@ -357,6 +383,10 @@ __mpxrt_init_env_vars (int* bndpreserve) env_var_list_add (MPX_RT_MODE, env); mode = set_mpx_rt_mode (env); + env = secure_getenv (MPX_RT_STOP_HANDLER); + env_var_list_add (MPX_RT_STOP_HANDLER, env); + stop_handler = set_mpx_rt_stop_handler (env); + env = secure_getenv (MPX_RT_BNDPRESERVE); env_var_list_add (MPX_RT_BNDPRESERVE, env); validate_bndpreserve (env, bndpreserve); @@ -487,6 +517,22 @@ __mpxrt_mode (void) return mode; } +mpx_rt_mode_t +__mpxrt_stop_handler (void) +{ + return stop_handler; +} + +void __attribute__ ((noreturn)) +__mpxrt_stop (void) +{ + if (__mpxrt_stop_handler () == MPX_RT_STOP_HANDLER_ABORT) + abort (); + else if (__mpxrt_stop_handler () == MPX_RT_STOP_HANDLER_EXIT) + exit (255); + __builtin_unreachable (); +} + void __mpxrt_print_summary (uint64_t num_brs, uint64_t l1_size) { diff --git a/libmpx/mpxrt/mpxrt-utils.h b/libmpx/mpxrt/mpxrt-utils.h index d62937df7d0..6da12ccb803 100644 --- a/libmpx/mpxrt/mpxrt-utils.h +++ b/libmpx/mpxrt/mpxrt-utils.h @@ -54,6 +54,11 @@ typedef enum { MPX_RT_STOP } mpx_rt_mode_t; +typedef enum { + MPX_RT_STOP_HANDLER_ABORT, + MPX_RT_STOP_HANDLER_EXIT +} mpx_rt_stop_mode_handler_t; + void __mpxrt_init_env_vars (int* bndpreserve); void __mpxrt_write_uint (verbose_type vt, uint64_t val, unsigned base); void __mpxrt_write (verbose_type vt, const char* str); diff --git a/libmpx/mpxrt/mpxrt.c b/libmpx/mpxrt/mpxrt.c index b52906bb9e8..76d11f71fd1 100644 --- a/libmpx/mpxrt/mpxrt.c +++ b/libmpx/mpxrt/mpxrt.c @@ -252,7 +252,7 @@ handler (int sig __attribute__ ((unused)), uctxt->uc_mcontext.gregs[REG_IP_IDX] = (greg_t)get_next_inst_ip ((uint8_t *)ip); if (__mpxrt_mode () == MPX_RT_STOP) - exit (255); + __mpxrt_stop (); return; default: @@ -269,7 +269,7 @@ handler (int sig __attribute__ ((unused)), __mpxrt_write (VERB_ERROR, ", ip = 0x"); __mpxrt_write_uint (VERB_ERROR, ip, 16); __mpxrt_write (VERB_ERROR, "\n"); - exit (255); + __mpxrt_stop (); } else { @@ -278,7 +278,7 @@ handler (int sig __attribute__ ((unused)), __mpxrt_write (VERB_ERROR, "! at 0x"); __mpxrt_write_uint (VERB_ERROR, ip, 16); __mpxrt_write (VERB_ERROR, "\n"); - exit (255); + __mpxrt_stop (); } }