Add support for multiple microarchitectures in single binary
[vpp.git] / vpp / vnet / main.c
index 290b5c0..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)
@@ -63,6 +61,36 @@ int main (int argc, char * argv[])
     u32 size;
     void vlib_set_get_handoff_structure_cb (void *cb);
 
+#if __x86_64__
+    const char * msg = "ERROR: This binary requires CPU with %s extensions.\n";
+#define _(a,b) \
+    if (!clib_cpu_supports_ ## a ())   \
+      {                                        \
+       fprintf(stderr, msg, b);        \
+       exit(1);                        \
+      }
+
+#if __AVX2__
+      _(avx2, "AVX2")
+#endif
+#if __AVX__
+      _(avx, "AVX")
+#endif
+#if __SSE4_2__
+      _(sse42, "SSE4.2")
+#endif
+#if __SSE4_1__
+      _(sse41, "SSE4.1")
+#endif
+#if __SSSE3__
+      _(ssse3, "SSSE3")
+#endif
+#if __SSE3__
+      _(sse3, "SSE3")
+#endif
+#undef _
+#endif
+
     /*
      * Load startup config from file.
      * usage: vpp -c /etc/vpp/startup.conf
@@ -166,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 {