X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_eal%2Flinuxapp%2Feal%2Feal_xen_memory.c;h=0b612bb1f4c57b401c44f830a03d839a22e13743;hb=bd6aa172cf35046e197b3a42a79069d4da15813a;hp=7fd9e8398af6c5d6ea2b6aeb65e7f204051b0338;hpb=719dbebceb811b4fa5a4c001d89ca516e4b274c8;p=dpdk.git diff --git a/lib/librte_eal/linuxapp/eal/eal_xen_memory.c b/lib/librte_eal/linuxapp/eal/eal_xen_memory.c index 7fd9e8398a..0b612bb1f4 100644 --- a/lib/librte_eal/linuxapp/eal/eal_xen_memory.c +++ b/lib/librte_eal/linuxapp/eal/eal_xen_memory.c @@ -156,13 +156,27 @@ get_xen_memory_size(void) * Based on physical address to caculate MFN in Xen Dom0. */ phys_addr_t -rte_xen_mem_phy2mch(uint32_t memseg_id, const phys_addr_t phy_addr) +rte_xen_mem_phy2mch(int32_t memseg_id, const phys_addr_t phy_addr) { - int mfn_id; + int mfn_id, i; uint64_t mfn, mfn_offset; struct rte_mem_config *mcfg = rte_eal_get_configuration()->mem_config; struct rte_memseg *memseg = mcfg->memseg; + /* find the memory segment owning the physical address */ + if (memseg_id == -1) { + for (i = 0; i < RTE_MAX_MEMSEG; i++) { + if ((phy_addr >= memseg[i].phys_addr) && + (phys_addr < memseg[i].phys_addr + + memseg[i].size)) { + memseg_id = i; + break; + } + } + if (memseg_id == -1) + return RTE_BAD_PHYS_ADDR; + } + mfn_id = (phy_addr - memseg[memseg_id].phys_addr) / RTE_PGSIZE_2M; /*the MFN is contiguous in 2M */ @@ -171,7 +185,7 @@ rte_xen_mem_phy2mch(uint32_t memseg_id, const phys_addr_t phy_addr) mfn = mfn_offset + memseg[memseg_id].mfn[mfn_id]; /** return mechine address */ - return (mfn * PAGE_SIZE + phy_addr % PAGE_SIZE); + return mfn * PAGE_SIZE + phy_addr % PAGE_SIZE; } int