_odp_ishmphy_dumpphy() prints the virtual to physical address mapping of some memory region (defined by virtuall address + length).
Signed-off-by: Christophe Milard <christophe.mil...@linaro.org> --- platform/linux-generic/_ishmphy.c | 57 ++++++++++++++++++++++ platform/linux-generic/include/_ishmphy_internal.h | 5 ++ 2 files changed, 62 insertions(+) diff --git a/platform/linux-generic/_ishmphy.c b/platform/linux-generic/_ishmphy.c index beb213c..c9f0fac 100644 --- a/platform/linux-generic/_ishmphy.c +++ b/platform/linux-generic/_ishmphy.c @@ -265,3 +265,60 @@ int _odp_ishmphy_can_getphy(void) return 1; } + +/* + * dump the physical mapping from virtual address addr, length len. + */ +void _odp_ishmphy_dumpphy(void *curr_addr, uint64_t len) +{ + int page_sz; + phys_addr_t curr_phy; + phys_addr_t start_phy; + void *start_address = 0; + uint32_t curr_len = 0; + uint32_t pfn_count = 0; + + /* get normal page sizes: */ + page_sz = odp_sys_page_size(); + + curr_phy = _odp_ishmphy_getphy(curr_addr); + if (curr_phy == PHYS_ADDR_INVALID) { + ODP_DBG("Phy Dump failed (permission?).\n"); + return; + } + + ODP_DBG("Phy Dump:\n"); + start_address = curr_addr; + start_phy = curr_phy; + + curr_len += page_sz; + curr_addr = (void *)((char *)curr_addr + page_sz); + pfn_count++; + while (curr_len < len) { + if (_odp_ishmphy_getphy(curr_addr) == curr_phy + page_sz) { + curr_len += page_sz; + curr_addr = (void *)((char *)curr_addr + page_sz); + curr_phy += page_sz; + pfn_count++; + continue; + } + + ODP_DBG("Virtual: %08" PRIx64 " <--> Phy: %08" PRIx64 + " %" PRIu32 " PFNs, %" PRIu32 " bytes\n", + (uint64_t)start_address, start_phy, + pfn_count, pfn_count * page_sz); + curr_phy = _odp_ishmphy_getphy(curr_addr); + start_address = curr_addr; + start_phy = curr_phy; + pfn_count = 0; + curr_len += page_sz; + curr_addr = (void *)((char *)curr_addr + page_sz); + pfn_count++; + } + + if (pfn_count) + ODP_DBG("Virtual: %08" PRIx64 " <--> Phy: %08" PRIx64 + " %" PRIu32 " PFNs, %" PRIu32 " bytes\n", + (uint64_t)start_address, start_phy, + pfn_count, pfn_count * page_sz); +} diff --git a/platform/linux-generic/include/_ishmphy_internal.h b/platform/linux-generic/include/_ishmphy_internal.h index 31b154b..bb61ab4 100644 --- a/platform/linux-generic/include/_ishmphy_internal.h +++ b/platform/linux-generic/include/_ishmphy_internal.h @@ -32,6 +32,11 @@ int _odp_ishmphy_can_getphy(void); */ phys_addr_t _odp_ishmphy_getphy(const void *addr); +/* + * dump the physical mapping from virtual address addr, length len. + */ +void _odp_ishmphy_dumpphy(void *addr, uint64_t len); + #ifdef __cplusplus } #endif -- 2.7.4