* Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl>
* Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
* Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
+ * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include "defs.h"
-#ifdef LINUXSPARC
+#ifdef LINUX
#include <linux/mman.h>
-#else
-#include <sys/mman.h>
#endif
+#include <sys/mman.h>
#if defined(LINUX) && defined(__i386__)
#include <asm/ldt.h>
#endif
+#ifdef HAVE_LONG_LONG_OFF_T
+/*
+ * Ugly hacks for systems that have a long long off_t
+ */
+#define sys_mmap64 sys_mmap
+#endif
+
int
sys_brk(tcp)
struct tcb *tcp;
#ifdef MAP_NORESERVE
{ MAP_NORESERVE,"MAP_NORESERVE" },
#endif
+ /*
+ * XXX - this was introduced in SunOS 4.x to distinguish between
+ * the old pre-4.x "mmap()", which:
+ *
+ * only let you map devices with an "mmap" routine (e.g.,
+ * frame buffers) in;
+ *
+ * required you to specify the mapping address;
+ *
+ * returned 0 on success and -1 on failure;
+ *
+ * memory and which, and the 4.x "mmap()" which:
+ *
+ * can map plain files;
+ *
+ * can be asked to pick where to map the file;
+ *
+ * returns the address where it mapped the file on success
+ * and -1 on failure.
+ *
+ * It's not actually used in source code that calls "mmap()"; the
+ * "mmap()" routine adds it for you.
+ *
+ * It'd be nice to come up with some way of eliminating it from
+ * the flags, e.g. reporting calls *without* it as "old_mmap()"
+ * and calls with it as "mmap()".
+ */
#ifdef _MAP_NEW
{ _MAP_NEW, "_MAP_NEW" },
#endif
#ifdef MAP_EXECUTABLE
{ MAP_EXECUTABLE,"MAP_EXECUTABLE"},
#endif
+#ifdef MAP_INHERIT
+ { MAP_INHERIT,"MAP_INHERIT" },
+#endif
#ifdef MAP_FILE
{ MAP_FILE,"MAP_FILE"},
#endif
#ifdef MAP_LOCKED
{ MAP_LOCKED,"MAP_LOCKED"},
+#endif
+ /* FreeBSD ones */
+#ifdef MAP_ANON
+ { MAP_ANON, "MAP_ANON" },
+#endif
+#ifdef MAP_HASSEMAPHORE
+ { MAP_HASSEMAPHORE, "MAP_HASSEMAPHORE" },
+#endif
+#ifdef MAP_STACK
+ { MAP_STACK, "MAP_STACK" },
+#endif
+#ifdef MAP_NOSYNC
+ { MAP_NOSYNC, "MAP_NOSYNC" },
+#endif
+#ifdef MAP_NOCORE
+ { MAP_NOCORE, "MAP_NOCORE" },
#endif
{ 0, NULL },
};
+#if !HAVE_LONG_LONG_OFF_T
+static
int
-sys_mmap(tcp)
+print_mmap(tcp,u_arg)
struct tcb *tcp;
+long *u_arg;
{
+ if (entering(tcp)) {
+ /* addr */
+ if (!u_arg[0])
+ tprintf("NULL, ");
+ else
+ tprintf("%#lx, ", u_arg[0]);
+ /* len */
+ tprintf("%lu, ", u_arg[1]);
+ /* prot */
+ printflags(mmap_prot, u_arg[2]);
+ tprintf(", ");
+ /* flags */
+#ifdef MAP_TYPE
+ printxval(mmap_flags, u_arg[3] & MAP_TYPE, "MAP_???");
+ addflags(mmap_flags, u_arg[3] & ~MAP_TYPE);
+#else
+ printflags(mmap_flags, u_arg[3]);
+#endif
+ /* fd */
+ tprintf(", %ld, ", u_arg[4]);
+ /* offset */
+ tprintf("%#lx", u_arg[5]);
+ }
+ return RVAL_HEX;
+}
+
#ifdef LINUX
-# if defined(ALPHA) || defined(sparc)
+int sys_old_mmap(tcp)
+struct tcb *tcp;
+{
+ long u_arg[6];
+
+#if defined(IA64)
+ int i, v;
+ /*
+ * IA64 processes never call this routine, they only use the
+ * new `sys_mmap' interface. This code converts the integer
+ * arguments that the IA32 process pushed onto the stack into
+ * longs.
+ *
+ * Note that addresses with bit 31 set will be sign extended.
+ * Fortunately, those addresses are not currently being generated
+ * for IA32 processes so it's not a problem.
+ */
+ for (i = 0; i < 6; i++)
+ if (umove(tcp, tcp->u_arg[0] + (i * sizeof(int)), &v) == -1)
+ return 0;
+ else
+ u_arg[i] = v;
+#else // defined(IA64)
+ if (umoven(tcp, tcp->u_arg[0], sizeof u_arg, (char *) u_arg) == -1)
+ return 0;
+#endif // defined(IA64)
+ return print_mmap(tcp, u_arg);
+
+}
+#endif
+
+int
+sys_mmap(tcp)
+struct tcb *tcp;
+{
+ return print_mmap(tcp, tcp->u_arg);
+}
+#endif /* !HAVE_LONG_LONG_OFF_T */
+
+#if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T
+int
+sys_mmap64(tcp)
+struct tcb *tcp;
+{
+#ifdef linux
+#ifdef ALPHA
long *u_arg = tcp->u_arg;
-# else /* !ALPHA */
- long u_arg[6];
-# endif /* !ALPHA */
-#else /* !LINUX */
+#else /* !ALPHA */
+ long u_arg[7];
+#endif /* !ALPHA */
+#else /* !linux */
long *u_arg = tcp->u_arg;
-#endif /* !LINUX */
+#endif /* !linux */
if (entering(tcp)) {
-#if defined(LINUX) && !defined(ALPHA) && !defined(__sparc__)
+#ifdef linux
+#ifndef ALPHA
if (umoven(tcp, tcp->u_arg[0], sizeof u_arg,
(char *) u_arg) == -1)
return 0;
-#endif /* LINUX && !ALPHA && !sparc */
+#endif /* ALPHA */
+#endif /* linux */
+ ALIGN64 (tcp, 5); /* FreeBSD wierdies */
/* addr */
tprintf("%#lx, ", u_arg[0]);
printflags(mmap_prot, u_arg[2]);
tprintf(", ");
/* flags */
+#ifdef MAP_TYPE
printxval(mmap_flags, u_arg[3] & MAP_TYPE, "MAP_???");
addflags(mmap_flags, u_arg[3] & ~MAP_TYPE);
+#else
+ printflags(mmap_flags, u_arg[3]);
+#endif
/* fd */
tprintf(", %ld, ", u_arg[4]);
/* offset */
- tprintf("%#lx", u_arg[5]);
+ tprintf("%#llx", LONG_LONG(u_arg[5], u_arg[6]));
}
return RVAL_HEX;
}
+#endif
+
int
sys_munmap(tcp)
struct tcb *tcp;
return 0;
}
+#ifdef LINUX
+
+static struct xlat mremap_flags[] = {
+ { MREMAP_MAYMOVE, "MREMAP_MAYMOVE" },
+ { 0, NULL }
+};
+
+int
+sys_mremap(tcp)
+struct tcb *tcp;
+{
+ if (entering(tcp)) {
+ tprintf("%#lx, %lu, %lu, ", tcp->u_arg[0], tcp->u_arg[1],
+ tcp->u_arg[2]);
+ printflags(mremap_flags, tcp->u_arg[3]);
+ }
+ return RVAL_HEX;
+}
+
+static struct xlat madvise_flags[] = {
+#ifdef MADV_NORMAL
+ { MADV_NORMAL, "MADV_NORMAL" },
+#endif
+#ifdef MADZV_RANDOM
+ { MADV_RANDOM, "MADV_RANDOM" },
+#endif
+#ifdef MADV_SEQUENTIAL
+ { MADV_SEQUENTIAL, "MADV_SEQUENTIAL" },
+#endif
+#ifdef MADV_WILLNEED
+ { MADV_WILLNEED, "MADV_WILLNEED" },
+#endif
+#ifdef MADV_DONTNED
+ { MADV_DONTNEED, "MADV_DONTNEED" },
+#endif
+ { 0, NULL },
+};
+
+
+int
+sys_madvise(tcp)
+struct tcb *tcp;
+{
+ if (entering(tcp)) {
+ tprintf("%#lx, %lu, ", tcp->u_arg[0], tcp->u_arg[1]);
+ printflags(madvise_flags, tcp->u_arg[2]);
+ }
+ return 0;
+}
+
+
+static struct xlat mlockall_flags[] = {
+#ifdef MCL_CURRENT
+ { MCL_CURRENT, "MCL_CURRENT" },
+#endif
+#ifdef MCL_FUTURE
+ { MCL_FUTURE, "MCL_FUTURE" },
+#endif
+ { 0, NULL}
+};
+
+int
+sys_mlockall(tcp)
+struct tcb *tcp;
+{
+ if (entering(tcp)) {
+ printflags(mlockall_flags, tcp->u_arg[0]);
+ }
+ return 0;
+}
+
+
+#endif /* LINUX */
+
#ifdef MS_ASYNC
static struct xlat mctl_sync[] = {
- { MS_ASYNC, "MS_ASYNC" },
- { MS_INVALIDATE,"MS_INVALIDATE" },
#ifdef MS_SYNC
{ MS_SYNC, "MS_SYNC" },
#endif
+ { MS_ASYNC, "MS_ASYNC" },
+ { MS_INVALIDATE,"MS_INVALIDATE" },
{ 0, NULL },
};