L4B_REDIRECT_3(int, madvise, void *, size_t, int);
L4B_REDIRECT_3(int, msync, void *, size_t, int);
-void *mremap(void *old_address, size_t old_size, size_t new_size,
- int flags) L4_NOTHROW
+void *mremap(void *old_addr, size_t old_size, size_t new_size,
+ int flags, ...) L4_NOTHROW
{
- printf("mremap(%p, %zd, %zd, %x) called: unimplemented!\n",
- old_address, old_size, new_size, flags);
- errno = EINVAL;
- return MAP_FAILED;
+ void *resptr;
+ if (flags & MREMAP_FIXED)
+ {
+ va_list a;
+ va_start(a, flags);
+ resptr = va_arg(a, void *);
+ va_end(a);
+ }
+
+ int r = L4B(mremap(old_addr, old_size, new_size, flags, &resptr));
+ if (r < 0)
+ {
+ errno = -r;
+ return MAP_FAILED;
+ }
+
+ return resptr;
}