From 604ff9ca2c50dd2b20e3c4b13908e25f23944363 Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 25 Jul 2017 18:53:01 -0500 Subject: [PATCH] msync and Sytem V semaphore dummies Ref #2467 --- repos/libports/include/libc-plugin/plugin.h | 1 + repos/libports/lib/symbols/libc | 4 ++++ repos/libports/src/lib/libc/dummies.cc | 2 ++ .../libports/src/lib/libc/file_operations.cc | 24 +++++++++++++++++++ repos/libports/src/lib/libc/plugin.cc | 1 + 5 files changed, 32 insertions(+) diff --git a/repos/libports/include/libc-plugin/plugin.h b/repos/libports/include/libc-plugin/plugin.h index 976268648..b65da0fdd 100644 --- a/repos/libports/include/libc-plugin/plugin.h +++ b/repos/libports/include/libc-plugin/plugin.h @@ -120,6 +120,7 @@ namespace Libc { virtual void *mmap(void *addr, ::size_t length, int prot, int flags, File_descriptor *, ::off_t offset); virtual int munmap(void *addr, ::size_t length); + virtual int msync(void *addr, ::size_t len, int flags); virtual File_descriptor *open(const char *pathname, int flags); virtual int pipe(File_descriptor *pipefd[2]); virtual ssize_t read(File_descriptor *, void *buf, ::size_t count); diff --git a/repos/libports/lib/symbols/libc b/repos/libports/lib/symbols/libc index 6a55afe81..e9fa1f5a9 100644 --- a/repos/libports/lib/symbols/libc +++ b/repos/libports/lib/symbols/libc @@ -428,6 +428,7 @@ mktime T mmap T mprotect W mrand48 T +msync T munmap T nanosleep W nextwctype T @@ -594,6 +595,8 @@ seekdir T select W semctl T semctl T +semget W +semop W send T sendto T setbuf T @@ -1002,6 +1005,7 @@ _ZN4Libc6Plugin5ioctlEPNS_15File_descriptorEiPc T _ZN4Libc6Plugin5lseekEPNS_15File_descriptorEli T _ZN4Libc6Plugin5lseekEPNS_15File_descriptorExi T _ZN4Libc6Plugin5mkdirEPKct T +_ZN4Libc6Plugin5msyncEPvmi T _ZN4Libc6Plugin5rmdirEPKc T _ZN4Libc6Plugin5writeEPNS_15File_descriptorEPKvj T _ZN4Libc6Plugin5writeEPNS_15File_descriptorEPKvm T diff --git a/repos/libports/src/lib/libc/dummies.cc b/repos/libports/src/lib/libc/dummies.cc index 6d1bc2417..d2c1e1039 100644 --- a/repos/libports/src/lib/libc/dummies.cc +++ b/repos/libports/src/lib/libc/dummies.cc @@ -124,6 +124,8 @@ DUMMY(mode_t, 0, umask, (mode_t)) DUMMY(int , 0, utimes, (const char *, const timeval *)) DUMMY(pid_t , -1, vfork, (void)) DUMMY(pid_t , -1, _wait4, (pid_t, int *, int, struct rusage *)) +DUMMY(int, -1, semget, (key_t, int, int)) +DUMMY(int, -1, semop, (key_t, int, int)) void ksem_init(void) diff --git a/repos/libports/src/lib/libc/file_operations.cc b/repos/libports/src/lib/libc/file_operations.cc index 30f67dc41..ffa750777 100644 --- a/repos/libports/src/lib/libc/file_operations.cc +++ b/repos/libports/src/lib/libc/file_operations.cc @@ -472,6 +472,30 @@ extern "C" int munmap(void *start, ::size_t length) } +extern "C" int msync(void *start, ::size_t len, int flags) +{ + if (!mmap_registry()->registered(start)) { + Genode::warning("munmap: could not lookup plugin for address ", start); + errno = EINVAL; + return -1; + } + + /* + * Lookup plugin that was used for mmap + * + * If the pointer is NULL, 'start' refers to an anonymous mmap. + */ + Plugin *plugin = mmap_registry()->lookup_plugin_by_addr(start); + + int ret = 0; + if (plugin) + ret = plugin->msync(start, len, flags); + + return ret; +} + + + extern "C" int _open(const char *pathname, int flags, ::mode_t mode) { Absolute_path resolved_path; diff --git a/repos/libports/src/lib/libc/plugin.cc b/repos/libports/src/lib/libc/plugin.cc index ffdeb8cff..258abaf55 100644 --- a/repos/libports/src/lib/libc/plugin.cc +++ b/repos/libports/src/lib/libc/plugin.cc @@ -203,6 +203,7 @@ DUMMY(int, -1, mkdir, (const char*, mode_t)); DUMMY(void *, (void *)(-1), mmap, (void *addr, ::size_t length, int prot, int flags, File_descriptor *, ::off_t offset)); DUMMY(int, -1, munmap, (void *, ::size_t)); +DUMMY(int, -1, msync, (void *addr, ::size_t len, int flags)); DUMMY(int, -1, pipe, (File_descriptor*[2])); DUMMY(ssize_t, -1, readlink, (const char *, char *, ::size_t)); DUMMY(int, -1, rename, (const char *, const char *));