diff --git a/include/socks/memblock.h b/include/socks/memblock.h index 0f5cdf7..977f13e 100644 --- a/include/socks/memblock.h +++ b/include/socks/memblock.h @@ -301,6 +301,20 @@ extern int memblock_free(void *addr, size_t size); */ extern int memblock_free_phys(phys_addr_t addr, size_t size); +/* convert a virtual pointer returned by memblock + to a physical address. + + @param p the pointer to convert. +*/ +extern phys_addr_t memblock_virt_to_phys(void *p); + +/* convert a physical address returned by memblock + to a virtual pointer. + + @param p the address to convert. +*/ +extern void *memblock_phys_to_virt(phys_addr_t p); + extern void __next_memory_region(memblock_iter_t *it, \ memblock_type_t *type_a, memblock_type_t *type_b, phys_addr_t start, phys_addr_t end); diff --git a/vm/memblock.c b/vm/memblock.c index 0a87167..32b4223 100644 --- a/vm/memblock.c +++ b/vm/memblock.c @@ -404,3 +404,13 @@ void __next_memory_region(memblock_iter_t *it, memblock_type_t *type_a, memblock /* ULLONG_MAX signals the end of the iteration */ it->__idx = ITER_END; } + +phys_addr_t memblock_virt_to_phys(void *p) +{ + return (phys_addr_t)p - memblock.m_voffset; +} + +void *memblock_phys_to_virt(phys_addr_t p) +{ + return (void *)(p + memblock.m_voffset); +}