From 8f7543e4500cc71d20505265c11652509688d3ab Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Mon, 27 Oct 2025 20:39:15 -0700 Subject: [PATCH] util: add os_map_memory_fd_placed for placed mapping support This completes the opaque fd api coverage, and is needed by lavapipe for sparse binding support with opaque fd external memory. Reviewed-by: Christian Gmeiner Part-of: --- src/util/os_memory_fd.c | 19 +++++++++++++++++++ src/util/os_memory_fd.h | 6 ++++++ 2 files changed, 25 insertions(+) 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 */