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
This commit is contained in:
Martin Cracauer 2000-06-15 09:57:34 +00:00
parent 7d02379e48
commit 6f6b2cd019
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=61702
2 changed files with 20 additions and 4 deletions

View File

@ -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);
}

View File

@ -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);
}