summaryrefslogtreecommitdiff
path: root/libmpx/mpxrt/mpxrt-utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmpx/mpxrt/mpxrt-utils.c')
-rw-r--r--libmpx/mpxrt/mpxrt-utils.c551
1 files changed, 0 insertions, 551 deletions
diff --git a/libmpx/mpxrt/mpxrt-utils.c b/libmpx/mpxrt/mpxrt-utils.c
deleted file mode 100644
index 63ee7c6ae63..00000000000
--- a/libmpx/mpxrt/mpxrt-utils.c
+++ /dev/null
@@ -1,551 +0,0 @@
-/* mpxrt-utils.c -*-C++-*-
- *
- *************************************************************************
- *
- * @copyright
- * Copyright (C) 2014, Intel Corporation
- * All rights reserved.
- *
- * @copyright
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Intel Corporation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * @copyright
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
- * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
- * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
- * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- **************************************************************************/
-
-#define __STDC_FORMAT_MACROS
-#include "config.h"
-#include <inttypes.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <pthread.h>
-#include "mpxrt-utils.h"
-
-#ifndef HAVE_SECURE_GETENV
-#define secure_getenv __secure_getenv
-#endif
-
-#define MPX_RT_OUT "CHKP_RT_OUT_FILE"
-#define MPX_RT_ERR "CHKP_RT_ERR_FILE"
-#define MPX_RT_VERBOSE "CHKP_RT_VERBOSE"
-#define MPX_RT_VERBOSE_DEFAULT VERB_BR
-#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"
-#define MPX_RT_BNDPRESERVE_DEFAULT 0
-#define MPX_RT_PRINT_SUMMARY "CHKP_RT_PRINT_SUMMARY"
-
-#define MAX_FILE_NAME PATH_MAX
-
-typedef struct env_var_s {
- char *env_name;
- char *env_val;
- struct env_var_s *next;
-} env_var_t;
-
-typedef struct {
- env_var_t *first;
- env_var_t *last;
-} env_var_list_t;
-
-/* Following vars are initialized at process startup only
- and thus are considered to be thread safe. */
-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;
-static FILE *err;
-static char out_name[MAX_FILE_NAME];
-static char err_name[MAX_FILE_NAME];
-
-/* Following vars are read at process finalization only.
- All write accesses use the same value and thus are
- considered to be thread safe. */
-static int out_file_dirty;
-static int err_file_dirty;
-static int files_overwritten;
-
-/* Mutex used to sync output. */
-static pthread_mutex_t lock;
-
-static void *
-malloc_check (size_t size)
-{
- void *res = malloc (size);
- if (!res)
- __mpxrt_print (VERB_ERROR, "Couldn't allocate %zu bytes.", size);
- else
- memset (res, 0, size);
- return res;
-}
-
-static void
-env_var_list_add (const char* env, const char* val)
-{
- env_var_t* n;
-
- if (val == 0)
- return;
-
- n = (env_var_t *)malloc_check (sizeof (env_var_t));
- if (!n)
- return;
-
- if (env_var_list.first == 0)
- env_var_list.first = n;
-
- if (env_var_list.last)
- env_var_list.last->next = n;
-
- env_var_list.last = n;
-
- n->env_name = (char *)malloc_check (strlen (env) + 1);
- n->env_val = (char *)malloc_check (strlen (val) + 1);
-
- if (!n->env_name || !n->env_val)
- return;
-
- strcpy (n->env_name, env);
- strcpy (n->env_val, val);
-}
-
-static void
-set_file_stream (FILE** file, char* file_name,
- const char* env, FILE* deflt)
-{
- int pid;
- if (env != 0)
- {
- if (add_pid)
- {
- pid = getpid ();
- snprintf (file_name, MAX_FILE_NAME, "%s.%d", env, pid);
- }
- else
- snprintf (file_name, MAX_FILE_NAME, "%s", env);
-
- *file = fopen (file_name, "we");
- if (*file != 0)
- return;
- }
- *file = deflt;
-}
-
-/*
- * this function will be called after fork in the child
- * open new files with pid of the process
- */
-static void
-open_child_files ()
-{
- char *out_env;
- char *err_env;
-
- out_env = secure_getenv (MPX_RT_OUT);
- err_env = secure_getenv (MPX_RT_ERR);
-
- if (add_pid == 0 && (out_env != 0 || err_env != 0))
- {
- __mpxrt_print (VERB_ERROR, "MPX RUNTIME WARNING: out/err files are "
- "overwritten in new processes since %s was not set.\n",
- MPX_RT_ADDPID);
- files_overwritten = 1;
- }
-
- set_file_stream (&out, out_name, out_env, stdout);
- if (out_env == 0 || err_env == 0 || (strcmp (out_env, err_env) != 0))
- set_file_stream (&err, err_name, err_env, stderr);
- else
- /* in case we get the same file name for err and out */
- err = out;
-}
-
-/*
- * this function is called after fork in the parent
- */
-static void
-at_fork_check (void)
-{
- char *out_env;
- char *err_env;
-
- out_env = secure_getenv (MPX_RT_OUT);
- err_env = secure_getenv (MPX_RT_ERR);
-
- if (add_pid == 0 && (out_env != 0 || err_env != 0))
- files_overwritten = 1;
-}
-
-static mpx_rt_mode_t
-set_mpx_rt_mode (const char *env)
-{
- if (env == 0)
- return MPX_RT_MODE_DEFAULT;
- else if (strcmp (env, "stop") == 0)
- return MPX_RT_STOP;
- else if (strcmp (env,"count") == 0)
- return MPX_RT_COUNT;
- {
- __mpxrt_print (VERB_ERROR, "Illegal value '%s' for %s. Legal values are"
- "[stop | count]\nUsing default value %s\n",
- env, MPX_RT_MODE, MPX_RT_MODE_DEFAULT_STR);
- return MPX_RT_MODE_DEFAULT;
- }
-}
-
-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)
-{
- fprintf (out, "MPX Runtime environment variables help.\n");
-
- fprintf (out, "%s \t set output file for info & debug [default: stdout]\n",
- MPX_RT_OUT);
- fprintf (out, "%s \t set output file for error [default: stderr]\n",
- MPX_RT_ERR);
- fprintf (out, "%s \t set verbosity type [default: %d]\n"
- "\t\t\t 0 - print only internal run time errors\n"
- "\t\t\t 1 - just print summary\n"
- "\t\t\t 2 - print summary and bound violation information\n "
- "\t\t\t 3 - print debug information\n",
- MPX_RT_VERBOSE, MPX_RT_VERBOSE_DEFAULT);
- 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);
- fprintf (out, "%s \t set value for BNDPRESERVE bit.\n"
- "\t\t\t BNDPRESERVE = 0 flush bounds on unprefixed call/ret/jmp\n"
- "\t\t\t BNDPRESERVE = 1 do NOT flush bounds\n"
- "\t\t\t [default: %d]\n", MPX_RT_BNDPRESERVE,
- MPX_RT_BNDPRESERVE_DEFAULT);
- fprintf (out, "%s \t print summary at the end of the run\n"
- "\t\t\t [default: no]\n", MPX_RT_PRINT_SUMMARY);
-
- fprintf (out, "%s \t\t print this help and exit.\n"
- "\t\t\t [default: no]\n", MPX_RT_HELP);
-
- exit (0);
-}
-
-static void
-validate_bndpreserve (const char *env, int *bndpreserve)
-{
- if (env == 0)
- bndpreserve = MPX_RT_BNDPRESERVE_DEFAULT;
- else if (strcmp (env, "0") == 0)
- *bndpreserve = 0;
- else if (strcmp (env, "1") == 0)
- *bndpreserve = 1;
- else
- {
- __mpxrt_print (VERB_ERROR, "Illegal value '%s' for %s. Legal values "
- "are [0 | 1]\nUsing default value %d\n",
- env, MPX_RT_BNDPRESERVE, MPX_RT_BNDPRESERVE_DEFAULT);
- *bndpreserve = MPX_RT_BNDPRESERVE_DEFAULT;
- }
-}
-
-static verbose_type
-init_verbose_val (const char *env)
-{
- if (env == 0)
- return MPX_RT_VERBOSE_DEFAULT;
- else if (strcmp(env, "0") == 0)
- return VERB_ERROR;
- else if (strcmp(env, "1") == 0)
- return VERB_INFO;
- else if (strcmp(env, "2") == 0)
- return VERB_BR;
- else if (strcmp(env, "3") == 0)
- return VERB_DEBUG;
-
- __mpxrt_print (VERB_ERROR, "Illegal value '%s' for %s. Legal values "
- "are [0..3]\nUsing default value %d\n",
- env, MPX_RT_VERBOSE, (int)MPX_RT_VERBOSE_DEFAULT);
-
- return MPX_RT_VERBOSE_DEFAULT;
-}
-
-static void
-env_var_print_summary (void)
-{
- env_var_t* node;
-
- __mpxrt_print (VERB_DEBUG, "Used environment variables:\n");
-
- node = env_var_list.first;
- while (node != 0)
- {
- __mpxrt_print (VERB_DEBUG, " %s = %s\n", node->env_name, node->env_val);
- node = node->next;
- }
-}
-
-/* Return 1 if passes env var value should enable feature. */
-
-static int
-check_yes (const char *val)
-{
- return val && (!strcmp (val, "yes") || !strcmp (val, "1"));
-}
-
-void
-__mpxrt_init_env_vars (int* bndpreserve)
-{
- char *out_env;
- char *err_env;
- char *env;
-
- pthread_mutex_init (&lock, NULL);
-
- out_env = secure_getenv (MPX_RT_OUT);
- env_var_list_add (MPX_RT_OUT, out_env);
-
- err_env = secure_getenv (MPX_RT_ERR);
- env_var_list_add (MPX_RT_ERR, err_env);
-
- env = secure_getenv (MPX_RT_ADDPID);
- env_var_list_add (MPX_RT_ADDPID, env);
- add_pid = check_yes (env);
-
- set_file_stream (&out, out_name, out_env, stdout);
- if (out_env == 0 || err_env == 0 || (strcmp (out_env, err_env) != 0))
- set_file_stream (&err, err_name, err_env, stderr);
- else
- /* in case we get the same file name for err and out */
- err = out;
-
- env = secure_getenv (MPX_RT_VERBOSE);
- env_var_list_add (MPX_RT_VERBOSE, env);
- verbose_val = init_verbose_val (env);
-
- env = secure_getenv (MPX_RT_MODE);
- 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);
-
- env = secure_getenv (MPX_RT_PRINT_SUMMARY);
- env_var_list_add (MPX_RT_PRINT_SUMMARY, env);
- summary = check_yes (env);
-
- env = secure_getenv (MPX_RT_HELP);
- if (check_yes (env))
- print_help ();
-
- /*
- * at fork - create new files for output and err according
- * to the env vars.
- */
- pthread_atfork (NULL, at_fork_check, open_child_files);
-
- env_var_print_summary ();
-}
-
-void
-__mpxrt_utils_free (void)
-{
- if (files_overwritten)
- __mpxrt_print (VERB_INFO, "\nMPX RUNTIME WARNING: out/err files are"
- " overwritten in new processes since %s was not set.\n",
- MPX_RT_ADDPID);
-
- if (out != stdout)
- {
- fclose (out);
- if (out_file_dirty != 1)
- remove (out_name);
- }
-
- if (err != stderr)
- {
- fclose (err);
- if (err_file_dirty != 1)
- remove (err_name);
- }
-
- pthread_mutex_destroy (&lock);
-}
-
-void
-__mpxrt_write_uint (verbose_type vt, uint64_t val, unsigned base)
-{
- static const char digits[] = {
- '0', '1', '2', '3', '4', '5', '6', '7',
- '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
- char str[65];
- int pos = 64;;
-
- str[pos--] = 0;
-
- if (vt > verbose_val || base <= 1 || base > sizeof (digits))
- return;
-
- if (val < base)
- str[pos--] = digits[val];
- else
- while (val)
- {
- str[pos--] = digits[val % base];
- val = val / base;
- }
-
- __mpxrt_write (vt, str + pos + 1);
-}
-
-void
-__mpxrt_write (verbose_type vt, const char* str)
-{
- va_list argp;
- FILE *print_to;
-
- if (vt > verbose_val)
- return;
-
- if (vt == VERB_ERROR)
- {
- print_to = err;
- err_file_dirty = 1;
- }
- else
- {
- print_to = out;
- out_file_dirty = 1;
- }
- pthread_mutex_lock (&lock);
- write (fileno (print_to), str, strlen (str));
- pthread_mutex_unlock (&lock);
- va_end (argp);
-}
-
-void
-__mpxrt_print (verbose_type vt, const char* frmt, ...)
-{
- va_list argp;
- FILE *print_to;
-
- if (vt > verbose_val)
- return;
-
- va_start (argp, frmt);
- if (vt == VERB_ERROR)
- {
- print_to = err;
- err_file_dirty = 1;
- }
- else
- {
- print_to = out;
- out_file_dirty = 1;
- }
- pthread_mutex_lock (&lock);
- vfprintf (print_to, frmt, argp);
- fflush (print_to);
- pthread_mutex_unlock (&lock);
- va_end (argp);
-}
-
-mpx_rt_mode_t
-__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)
-{
-
- if (summary == 0)
- return;
-
- out_file_dirty = 1;
-
- pthread_mutex_lock (&lock);
- fprintf (out, "MPX runtime summary:\n");
- fprintf (out, " Number of bounds violations: %" PRIu64 ".\n", num_brs);
- fprintf (out, " Size of allocated L1: %" PRIu64 "B\n", l1_size);
- fflush (out);
- pthread_mutex_unlock (&lock);
-}