diff --git a/src/util/os_memory_fd.c b/src/util/os_memory_fd.c index eaf31bd45c4..fb45105d9c2 100644 --- a/src/util/os_memory_fd.c +++ b/src/util/os_memory_fd.c @@ -105,6 +105,25 @@ os_import_memory_fd(int fd, void **ptr, uint64_t *size, char const *driver_id) return true; } +/** + * Map memory from a file descriptor at placed address + */ +bool +os_map_memory_fd_placed(int fd, void *addr, uint64_t size, uint64_t offset, + char const *driver_id) +{ + struct memory_header header; + + if (!get_fd_header(fd, &header, driver_id)) + return false; + + if (header.size - header.offset < size + offset) + return false; + + return mmap(addr, size, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, + offset + header.offset) != MAP_FAILED; +} + /** * Return memory on given byte alignment */ diff --git a/src/util/os_memory_fd.h b/src/util/os_memory_fd.h index 936e3911bbd..05be18c350c 100644 --- a/src/util/os_memory_fd.h +++ b/src/util/os_memory_fd.h @@ -40,6 +40,12 @@ bool os_import_memory_fd(int fd, void **ptr, uint64_t *size, char const *driver_id); +/** + * Map memory from a file descriptor at placed address + */ +bool +os_map_memory_fd_placed(int fd, void *addr, uint64_t size, uint64_t offset, char const *driver_id); + /** * Return memory on given byte alignment */