doc: whitespace changes in licenses
[dpdk.git] / lib / librte_eal / linuxapp / eal / eal.c
index 759f198..5a9d7b9 100644 (file)
@@ -1,35 +1,34 @@
 /*-
  *   BSD LICENSE
  * 
- *   Copyright(c) 2010-2012 Intel Corporation. All rights reserved.
+ *   Copyright(c) 2010-2013 Intel Corporation. All rights reserved.
  *   All rights reserved.
  * 
- *   Redistribution and use in source and binary forms, with or without 
- *   modification, are permitted provided that the following conditions 
+ *   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 
+ *     * 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 
+ *     * 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 
+ *     * 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.
  * 
- *   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 
- *   OWNER 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 
+ *   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
+ *   OWNER 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.
- * 
  */
 
 #include <stdio.h>
@@ -39,6 +38,7 @@
 #include <stdarg.h>
 #include <unistd.h>
 #include <pthread.h>
+#include <syslog.h>
 #include <getopt.h>
 #include <sys/file.h>
 #include <stddef.h>
@@ -68,6 +68,7 @@
 #include <rte_common.h>
 #include <rte_version.h>
 #include <rte_atomic.h>
+#include <malloc_heap.h>
 
 #include "eal_private.h"
 #include "eal_thread.h"
 #define OPT_PROC_TYPE   "proc-type"
 #define OPT_NO_SHCONF   "no-shconf"
 #define OPT_NO_HPET     "no-hpet"
+#define OPT_VMWARE_TSC_MAP   "vmware-tsc-map"
 #define OPT_NO_PCI      "no-pci"
 #define OPT_NO_HUGE     "no-huge"
 #define OPT_FILE_PREFIX "file-prefix"
 #define OPT_SOCKET_MEM  "socket-mem"
+#define OPT_SYSLOG      "syslog"
 
 #define RTE_EAL_BLACKLIST_SIZE 0x100
 
        (in) = end + 1;                                         \
 }
 
+/* Allow the application to print its usage message too if set */
+static rte_usage_hook_t        rte_application_usage_hook = NULL;
 /* early configuration structure, when memory config is not mmapped */
 static struct rte_mem_config early_mem_config;
 
@@ -129,6 +134,9 @@ struct lcore_config lcore_config[RTE_MAX_LCORE];
 /* internal configuration */
 struct internal_config internal_config;
 
+/* used by rte_rdtsc() */
+int rte_cycles_vmware_tsc_map;
+
 /* Return a pointer to the configuration structure */
 struct rte_config *
 rte_eal_get_configuration(void)
@@ -317,17 +325,38 @@ eal_usage(const char *prgname)
               "                 (multiple -b options are allowed)\n"
               "  -m MB        : memory to allocate (see also --"OPT_SOCKET_MEM")\n"
               "  -r NUM       : force number of memory ranks (don't detect)\n"
+              "  --"OPT_SYSLOG"     : set syslog facility\n"
               "  --"OPT_SOCKET_MEM" : memory to allocate on specific \n"
                   "                 sockets (use comma separated values)\n"
               "  --"OPT_HUGE_DIR"   : directory where hugetlbfs is mounted\n"
               "  --"OPT_PROC_TYPE"  : type of this process\n"
               "  --"OPT_FILE_PREFIX": prefix for hugepage filenames\n"
+              "  --"OPT_VMWARE_TSC_MAP": use VMware TSC map instead of "
+                          "native RDTSC\n"
               "\nEAL options for DEBUG use only:\n"
               "  --"OPT_NO_HUGE"  : use malloc instead of hugetlbfs\n"
               "  --"OPT_NO_PCI"   : disable pci\n"
               "  --"OPT_NO_HPET"  : disable hpet\n"
               "  --"OPT_NO_SHCONF": no shared config (mmap'd files)\n\n",
               prgname);
+       /* Allow the application to print its usage message too if hook is set */
+       if ( rte_application_usage_hook ) {
+               printf("===== Application Usage =====\n\n");
+               rte_application_usage_hook(prgname);
+       }
+}
+
+/* Set a per-application usage message */
+rte_usage_hook_t
+rte_set_application_usage_hook( rte_usage_hook_t usage_func )
+{
+       rte_usage_hook_t        old_func;
+
+       /* Will be NULL on the first call to denote the last usage routine. */
+       old_func                                        = rte_application_usage_hook;
+       rte_application_usage_hook      = usage_func;
+
+       return old_func;
 }
 
 /*
@@ -365,6 +394,45 @@ eal_parse_coremask(const char *coremask)
        return 0;
 }
 
+static int
+eal_parse_syslog(const char *facility)
+{
+       int i;
+       static struct {
+               const char *name;
+               int value;
+       } map[] = {
+               { "auth", LOG_AUTH },
+               { "cron", LOG_CRON },
+               { "daemon", LOG_DAEMON },
+               { "ftp", LOG_FTP },
+               { "kern", LOG_KERN },
+               { "lpr", LOG_LPR },
+               { "mail", LOG_MAIL },
+               { "news", LOG_NEWS },
+               { "syslog", LOG_SYSLOG },
+               { "user", LOG_USER },
+               { "uucp", LOG_UUCP },
+               { "local0", LOG_LOCAL0 },
+               { "local1", LOG_LOCAL1 },
+               { "local2", LOG_LOCAL2 },
+               { "local3", LOG_LOCAL3 },
+               { "local4", LOG_LOCAL4 },
+               { "local5", LOG_LOCAL5 },
+               { "local6", LOG_LOCAL6 },
+               { "local7", LOG_LOCAL7 },
+               { NULL, 0 }
+       };
+
+       for (i = 0; map[i].name; i++) {
+               if (!strcmp(facility, map[i].name)) {
+                       internal_config.syslog_facility = map[i].value;
+                       return 0;
+               }
+       }
+       return -1;
+}
+
 static int
 eal_parse_socket_mem(char *socket_mem)
 {
@@ -415,7 +483,7 @@ eal_parse_socket_mem(char *socket_mem)
        return 0;
 }
 
-static inline uint64_t
+static inline size_t
 eal_get_hugepage_mem_size(void)
 {
        uint64_t size = 0;
@@ -430,7 +498,7 @@ eal_get_hugepage_mem_size(void)
                }
        }
 
-       return (size);
+       return (size < SIZE_MAX) ? (size_t)(size) : SIZE_MAX;
 }
 
 static enum rte_proc_type_t
@@ -490,11 +558,13 @@ eal_parse_args(int argc, char **argv)
                {OPT_NO_HUGE, 0, 0, 0},
                {OPT_NO_PCI, 0, 0, 0},
                {OPT_NO_HPET, 0, 0, 0},
+               {OPT_VMWARE_TSC_MAP, 0, 0, 0},
                {OPT_HUGE_DIR, 1, 0, 0},
                {OPT_NO_SHCONF, 0, 0, 0},
                {OPT_PROC_TYPE, 1, 0, 0},
                {OPT_FILE_PREFIX, 1, 0, 0},
                {OPT_SOCKET_MEM, 1, 0, 0},
+               {OPT_SYSLOG, 1, NULL, 0},
                {0, 0, 0, 0}
        };
 
@@ -506,6 +576,7 @@ eal_parse_args(int argc, char **argv)
        internal_config.hugefile_prefix = HUGEFILE_PREFIX_DEFAULT;
        internal_config.hugepage_dir = NULL;
        internal_config.force_sockets = 0;
+       internal_config.syslog_facility = LOG_DAEMON;
 #ifdef RTE_LIBEAL_USE_HPET
        internal_config.no_hpet = 0;
 #else
@@ -519,6 +590,8 @@ eal_parse_args(int argc, char **argv)
        for (i = 0; i < MAX_HUGEPAGE_SIZES; i++)
                internal_config.hugepage_info[i].lock_descriptor = 0;
 
+       internal_config.vmware_tsc_map = 0;
+
        while ((opt = getopt_long(argc, argvopt, "b:c:m:n:r:v",
                                  lgopts, &option_index)) != EOF) {
 
@@ -584,6 +657,9 @@ eal_parse_args(int argc, char **argv)
                        else if (!strcmp(lgopts[option_index].name, OPT_NO_HPET)) {
                                internal_config.no_hpet = 1;
                        }
+                       else if (!strcmp(lgopts[option_index].name, OPT_VMWARE_TSC_MAP)) {
+                               internal_config.vmware_tsc_map = 1;
+                       }
                        else if (!strcmp(lgopts[option_index].name, OPT_NO_SHCONF)) {
                                internal_config.no_shconf = 1;
                        }
@@ -604,6 +680,14 @@ eal_parse_args(int argc, char **argv)
                                        return -1;
                                }
                        }
+                       else if (!strcmp(lgopts[option_index].name, OPT_SYSLOG)) {
+                               if (eal_parse_syslog(optarg) < 0) {
+                                       RTE_LOG(ERR, EAL, "invalid parameters for --"
+                                                       OPT_SYSLOG "\n");
+                                       eal_usage(prgname);
+                                       return -1;
+                               }
+                       }
                        break;
 
                default:
@@ -734,6 +818,17 @@ rte_eal_init(int argc, char **argv)
                        internal_config.memory = eal_get_hugepage_mem_size();
        }
 
+       if (internal_config.vmware_tsc_map == 1) {
+#ifdef RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT
+               rte_cycles_vmware_tsc_map = 1;
+               RTE_LOG (DEBUG, EAL, "Using VMWARE TSC MAP, "
+                               "you must have monitor_control.pseudo_perfctr = TRUE\n");
+#else
+               RTE_LOG (WARNING, EAL, "Ignoring --vmware-tsc-map because "
+                               "RTE_LIBRTE_EAL_VMWARE_TSC_MAP_SUPPORT is not set\n");
+#endif
+       }
+
        rte_srand(rte_rdtsc());
 
        rte_config_init();
@@ -753,7 +848,7 @@ rte_eal_init(int argc, char **argv)
        if (rte_eal_tailqs_init() < 0)
                rte_panic("Cannot init tail queues for objects\n");
 
-       if (rte_eal_log_init() < 0)
+       if (rte_eal_log_init(argv[0], internal_config.syslog_facility) < 0)
                rte_panic("Cannot init logs\n");
 
        if (rte_eal_alarm_init() < 0)
@@ -762,8 +857,8 @@ rte_eal_init(int argc, char **argv)
        if (rte_eal_intr_init() < 0)
                rte_panic("Cannot init interrupt-handling thread\n");
 
-       if (rte_eal_hpet_init() < 0)
-               rte_panic("Cannot init HPET\n");
+       if (rte_eal_timer_init() < 0)
+               rte_panic("Cannot init HPET or TSC timers\n");
 
        if (rte_eal_pci_init() < 0)
                rte_panic("Cannot init PCI\n");