Add support for multiple microarchitectures in single binary
[vpp.git] / vpp / vnet / main.c
index 9d89ce7..2540083 100644 (file)
@@ -12,6 +12,8 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+
+#include <vppinfra/cpu.h>
 #include <vlib/vlib.h>
 #include <vlib/unix/unix.h>
 #include <vnet/plugin/plugin.h>
 
 #include <api/vpe_msg_enum.h>
 
-/** \mainpage Virtual Packet Edge Documentation
- * \section intro_sec Introduction
- * 
- * VPE is a specific vector packet processing application,
- * designed to steer packets to/from tenant virtual machines.
- *
- */
+#if DPDK
+#include <vnet/devices/dpdk/dpdk.h>
+#endif
 
 static void
 vpe_main_init (vlib_main_t * vm)
@@ -64,33 +62,33 @@ int main (int argc, char * argv[])
     void vlib_set_get_handoff_structure_cb (void *cb);
 
 #if __x86_64__
-    __builtin_cpu_init ();
     const char * msg = "ERROR: This binary requires CPU with %s extensions.\n";
 #define _(a,b) \
-    if (!__builtin_cpu_supports(a))    \
+    if (!clib_cpu_supports_ ## a ())   \
       {                                        \
        fprintf(stderr, msg, b);        \
        exit(1);                        \
       }
 
 #if __AVX2__
-      _("avx2", "AVX2")
+      _(avx2, "AVX2")
 #endif
 #if __AVX__
-      _("avx", "AVX")
+      _(avx, "AVX")
 #endif
 #if __SSE4_2__
-      _("sse4.2", "SSE4.2")
+      _(sse42, "SSE4.2")
 #endif
 #if __SSE4_1__
-      _("sse4.1", "SSE4.1")
+      _(sse41, "SSE4.1")
 #endif
 #if __SSSE3__
-      _("ssse3", "SSSE3")
+      _(ssse3, "SSSE3")
 #endif
 #if __SSE3__
-      _("sse3", "SSE3")
+      _(sse3, "SSE3")
 #endif
+#undef _
 #endif
 
     /*
@@ -196,6 +194,13 @@ defaulted:
     if (clib_mem_init (0, main_heap_size)) {
         vm->init_functions_called = hash_create (0, /* value bytes */ 0);
         vpe_main_init(vm);
+#if DPDK
+#if !DPDK_SHARED_LIB
+       dpdk_pmd_constructor_init();
+#endif
+#else
+        unix_physmem_init(vm, 0 /* fail_if_physical_memory_not_present */);
+#endif
         vlib_set_get_handoff_structure_cb (&vnet_get_handoff_structure);
         return vlib_unix_main (argc, argv);
     } else {