This is used in various selftests and will be handy when integrating
those with nolibc.

Signed-off-by: Thomas Weißschuh <thomas.weisssc...@linutronix.de>
---
 tools/include/nolibc/sys/mman.h              | 19 +++++++++++++++++++
 tools/testing/selftests/nolibc/nolibc-test.c | 14 +++++++++++---
 2 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/tools/include/nolibc/sys/mman.h b/tools/include/nolibc/sys/mman.h
index 
ad9d06b6b7919ec76a0652266158366cf639a77a..d1c213c19d7fa55c9db3a9527dd35b6072ca9485
 100644
--- a/tools/include/nolibc/sys/mman.h
+++ b/tools/include/nolibc/sys/mman.h
@@ -45,6 +45,25 @@ void *mmap(void *addr, size_t length, int prot, int flags, 
int fd, off_t offset)
        return ret;
 }
 
+static __attribute__((unused))
+void *sys_mremap(void *old_address, size_t old_size, size_t new_size, int 
flags, void *new_address)
+{
+       return (void *)my_syscall5(__NR_mremap, old_address, old_size,
+                                  new_size, flags, new_address);
+}
+
+static __attribute__((unused))
+void *mremap(void *old_address, size_t old_size, size_t new_size, int flags, 
void *new_address)
+{
+       void *ret = sys_mremap(old_address, old_size, new_size, flags, 
new_address);
+
+       if ((unsigned long)ret >= -4095UL) {
+               SET_ERRNO(-(long)ret);
+               ret = MAP_FAILED;
+       }
+       return ret;
+}
+
 static __attribute__((unused))
 int sys_munmap(void *addr, size_t length)
 {
diff --git a/tools/testing/selftests/nolibc/nolibc-test.c 
b/tools/testing/selftests/nolibc/nolibc-test.c
index 
b7440a667db6b541a2548bdf5182bee0277100ed..abe0ae794208762f6d91ad81e902fbf77253a1c1
 100644
--- a/tools/testing/selftests/nolibc/nolibc-test.c
+++ b/tools/testing/selftests/nolibc/nolibc-test.c
@@ -926,7 +926,7 @@ int test_mmap_munmap(void)
 {
        int ret, fd, i, page_size;
        void *mem;
-       size_t file_size, length;
+       size_t file_size, length, mem_length;
        off_t offset, pa_offset;
        struct stat stat_buf;
        const char * const files[] = {
@@ -966,14 +966,22 @@ int test_mmap_munmap(void)
                offset = 0;
        length = file_size - offset;
        pa_offset = offset & ~(page_size - 1);
+       mem_length = length + offset - pa_offset;
 
-       mem = mmap(NULL, length + offset - pa_offset, PROT_READ, MAP_SHARED, 
fd, pa_offset);
+       mem = mmap(NULL, mem_length, PROT_READ, MAP_SHARED, fd, pa_offset);
        if (mem == MAP_FAILED) {
                ret = 1;
                goto end;
        }
 
-       ret = munmap(mem, length + offset - pa_offset);
+       mem = mremap(mem, mem_length, mem_length * 2, MREMAP_MAYMOVE, 0);
+       if (mem == MAP_FAILED) {
+               munmap(mem, mem_length);
+               ret = 1;
+               goto end;
+       }
+
+       ret = munmap(mem, mem_length * 2);
 
 end:
        close(fd);

-- 
2.49.0


Reply via email to