From 6f6b2cd019d1fbaa22403f47b967e93a7fec25c7 Mon Sep 17 00:00:00 2001 From: Martin Cracauer Date: Thu, 15 Jun 2000 09:57:34 +0000 Subject: [PATCH] Linux allows to mmap annonymous with a file descriptor passed, FreeBSD doesn't. In the Linux emulation layer, ignore the fd passed when MAP_ANON is specified. Known application to be fixed: Xanalys/Harlequin Lispworks Also improve debug output for mmap, now showing what the emulation layer mapped to what (-DDEBUG). Reviewed by: marcel --- sys/compat/linux/linux_misc.c | 12 ++++++++++-- sys/i386/linux/linux_misc.c | 12 ++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c index bb043e47b4e7..1adea544b05e 100644 --- a/sys/compat/linux/linux_misc.c +++ b/sys/compat/linux/linux_misc.c @@ -696,7 +696,7 @@ linux_mmap(struct proc *p, struct linux_mmap_args *args) sizeof(linux_args)))) return error; #ifdef DEBUG - printf("Linux-emul(%ld): mmap(%p, %d, %d, %08x, %d, %d)\n", + printf("Linux-emul(%ld): mmap(%p, %d, %d, 0x%08x, %d, %d)", (long)p->p_pid, (void *)linux_args.addr, linux_args.len, linux_args.prot, linux_args.flags, linux_args.fd, linux_args.pos); #endif @@ -756,9 +756,17 @@ linux_mmap(struct proc *p, struct linux_mmap_args *args) } bsd_args.prot = linux_args.prot | PROT_READ; /* always required */ - bsd_args.fd = linux_args.fd; + if (linux_args.flags & LINUX_MAP_ANON) + bsd_args.fd = -1; + else + bsd_args.fd = linux_args.fd; bsd_args.pos = linux_args.pos; bsd_args.pad = 0; +#ifdef DEBUG + printf("-> (%p, %d, %d, 0x%08x, %d, %d)\n", + (void *)bsd_args.addr, bsd_args.len, + bsd_args.prot, bsd_args.flags, bsd_args.fd, (int)bsd_args.pos); +#endif return mmap(p, &bsd_args); } diff --git a/sys/i386/linux/linux_misc.c b/sys/i386/linux/linux_misc.c index bb043e47b4e7..1adea544b05e 100644 --- a/sys/i386/linux/linux_misc.c +++ b/sys/i386/linux/linux_misc.c @@ -696,7 +696,7 @@ linux_mmap(struct proc *p, struct linux_mmap_args *args) sizeof(linux_args)))) return error; #ifdef DEBUG - printf("Linux-emul(%ld): mmap(%p, %d, %d, %08x, %d, %d)\n", + printf("Linux-emul(%ld): mmap(%p, %d, %d, 0x%08x, %d, %d)", (long)p->p_pid, (void *)linux_args.addr, linux_args.len, linux_args.prot, linux_args.flags, linux_args.fd, linux_args.pos); #endif @@ -756,9 +756,17 @@ linux_mmap(struct proc *p, struct linux_mmap_args *args) } bsd_args.prot = linux_args.prot | PROT_READ; /* always required */ - bsd_args.fd = linux_args.fd; + if (linux_args.flags & LINUX_MAP_ANON) + bsd_args.fd = -1; + else + bsd_args.fd = linux_args.fd; bsd_args.pos = linux_args.pos; bsd_args.pad = 0; +#ifdef DEBUG + printf("-> (%p, %d, %d, 0x%08x, %d, %d)\n", + (void *)bsd_args.addr, bsd_args.len, + bsd_args.prot, bsd_args.flags, bsd_args.fd, (int)bsd_args.pos); +#endif return mmap(p, &bsd_args); }