eal/freebsd: support option --base-virtaddr
[dpdk.git] / lib / librte_eal / freebsd / eal / eal.c
index f86e9aa..c7e1264 100644 (file)
@@ -226,6 +226,14 @@ rte_eal_config_create(void)
        if (internal_config.no_shconf)
                return 0;
 
+       /* map the config before base address so that we don't waste a page */
+       if (internal_config.base_virtaddr != 0)
+               rte_mem_cfg_addr = (void *)
+                       RTE_ALIGN_FLOOR(internal_config.base_virtaddr -
+                       sizeof(struct rte_mem_config), sysconf(_SC_PAGE_SIZE));
+       else
+               rte_mem_cfg_addr = NULL;
+
        if (mem_cfg_fd < 0){
                mem_cfg_fd = open(pathname, O_RDWR | O_CREAT, 0600);
                if (mem_cfg_fd < 0) {
@@ -253,8 +261,9 @@ rte_eal_config_create(void)
                return -1;
        }
 
-       rte_mem_cfg_addr = mmap(NULL, sizeof(*rte_config.mem_config),
-                               PROT_READ | PROT_WRITE, MAP_SHARED, mem_cfg_fd, 0);
+       rte_mem_cfg_addr = mmap(rte_mem_cfg_addr,
+                       sizeof(*rte_config.mem_config), PROT_READ | PROT_WRITE,
+                       MAP_SHARED, mem_cfg_fd, 0);
 
        if (rte_mem_cfg_addr == MAP_FAILED){
                RTE_LOG(ERR, EAL, "Cannot mmap memory for rte_config\n");
@@ -332,15 +341,17 @@ rte_eal_config_reattach(void)
        close(mem_cfg_fd);
        mem_cfg_fd = -1;
 
-       if (mem_config == MAP_FAILED) {
+       if (mem_config == MAP_FAILED || mem_config != rte_mem_cfg_addr) {
+               if (mem_config != MAP_FAILED) {
+                       /* errno is stale, don't use */
+                       RTE_LOG(ERR, EAL, "Cannot mmap memory for rte_config at [%p], got [%p]"
+                                         " - please use '--base-virtaddr' option\n",
+                               rte_mem_cfg_addr, mem_config);
+                       munmap(mem_config, sizeof(struct rte_mem_config));
+                       return -1;
+               }
                RTE_LOG(ERR, EAL, "Cannot mmap memory for rte_config! error %i (%s)\n",
-                               errno, strerror(errno));
-               return -1;
-       } else if (mem_config != rte_mem_cfg_addr) {
-               /* errno is stale, don't use */
-               RTE_LOG(ERR, EAL, "Cannot mmap memory for rte_config at [%p], got [%p]\n",
-                         rte_mem_cfg_addr, mem_config);
-               munmap(mem_config, sizeof(struct rte_mem_config));
+                       errno, strerror(errno));
                return -1;
        }