2016-12-08 12:21 GMT+03:00 Alexander Ivchenko <aivch...@gmail.com>:
> I've tested the patch on MPX HW, no new regressions. Attached the
> final version below, would that be ok to submit?

The patch is OK.

Ilya

>
>
> 2016-11-29  Alexander Ivchenko  <alexander.ivche...@intel.com>
>
> * 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.
>
> diff --git a/libmpx/mpxrt/libtool-version b/libmpx/mpxrt/libtool-version
> index 7d99255..736d763 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 057a355..63ee7c6 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 d62937d..6da12cc 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 b52906b..76d11f7 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 ();
>      }
>  }
>
>
> 2016-12-01 23:32 GMT+03:00 Ilya Enkovich <enkovich....@gmail.com>:
>> 2016-12-01 17:10 GMT+03:00 Alexander Ivchenko <aivch...@gmail.com>:
>>> Should changing minor version of the library be enough?
>>
>> Yes.
>>
>>>
>>> diff --git a/libmpx/mpxrt/libtool-version b/libmpx/mpxrt/libtool-version
>>> index 7d99255..736d763 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
>>>
>>> (otherwise - no difference).
>>>
>>> I've run make check on a non-mpx-enabled machine (no new regressions)
>>> and manually tested newly added environment variable on the mpx
>>> machine. It looks like there is no explicit tests for libmpx, so I'm
>>> not sure what tests should I add. What do you think would be the right
>>> testing process here?
>>
>> Some current tests use MPX runtime now. Please check your change
>> in MPX runtime doesn't break them on MPX HW (on legacy HW tests
>> are just skipped)
>>
>> Currently all MPX tests are in i386 part of gcc.target which is not great.
>> Having new testsuite right in libmpx would be great but I won't require
>> it as a prerequisite for this patch.
>>
>> Ilya
>>
>>>
>>> 2016-11-29 20:22 GMT+03:00 Ilya Enkovich <enkovich....@gmail.com>:
>>>> 2016-11-29 17:43 GMT+03:00 Alexander Ivchenko <aivch...@gmail.com>:
>>>>> Hi,
>>>>>
>>>>> Attached patch is addressing PR67520. Would that approach work for the
>>>>> problem? Should I also change the version of the library?
>>>>
>>>> Hi!
>>>>
>>>> Overall patch is OK. But you need to change version because you
>>>> change default behavior. How did you test it? Did you check default
>>>> behavior change doesn't affect existing runtime MPX tests? Can we
>>>> add new ones?
>>>>
>>>> Thanks,
>>>> Ilya
>>>>
>>>>>
>>>>> 2016-11-29  Alexander Ivchenko  <alexander.ivche...@intel.com>
>>>>>
>>>>> * 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.
>>>>>
>>>>>
>>>>>
>>>>> diff --git a/libmpx/mpxrt/mpxrt-utils.c b/libmpx/mpxrt/mpxrt-utils.c
>>>>> index 057a355..63ee7c6 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 d62937d..6da12cc 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 b52906b..0bc069c 100644
>>>>> --- a/libmpx/mpxrt/mpxrt.c
>>>>> +++ b/libmpx/mpxrt/mpxrt.c
>>>>> @@ -252,7 +251,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 +268,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 +277,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 ();
>>>>>      }
>>>>>  }
>>>>>
>>>>> thanks,
>>>>> Alexander

Reply via email to