Date: Thu, 18 Jan 2007 22:58:53 GMT From: Jung-uk Kim <jkim@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 113146 for review Message-ID: <200701182258.l0IMwrOJ088352@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=113146 Change 113146 by jkim@jkim_hammer on 2007/01/18 22:58:37 Clean up mmap and sync amd64 with i386. Now they are almost identical. Affected files ... .. //depot/projects/linuxolator/src/sys/amd64/linux32/linux.h#13 edit .. //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_machdep.c#25 edit .. //depot/projects/linuxolator/src/sys/i386/linux/linux.h#11 edit .. //depot/projects/linuxolator/src/sys/i386/linux/linux_machdep.c#18 edit Differences ... ==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux.h#13 (text+ko) ==== @@ -167,6 +167,15 @@ #define LINUX_MAP_ANON 0x0020 #define LINUX_MAP_GROWSDOWN 0x0100 +struct l_mmap_argv { + l_uintptr_t addr; + l_size_t len; + l_int prot; + l_int flags; + l_int fd; + l_off_t pgoff; +} __packed; + /* * stat family of syscalls */ ==== //depot/projects/linuxolator/src/sys/amd64/linux32/linux32_machdep.c#25 (text+ko) ==== @@ -739,16 +739,6 @@ return (0); } -/* XXX move */ -struct l_mmap_argv { - l_ulong addr; - l_ulong len; - l_ulong prot; - l_ulong flags; - l_ulong fd; - l_ulong pgoff; -}; - #define STACK_SIZE (2 * 1024 * 1024) #define GUARD_SIZE (4 * PAGE_SIZE) @@ -834,10 +824,13 @@ bsd_args.flags |= MAP_PRIVATE; if (linux_args->flags & LINUX_MAP_FIXED) bsd_args.flags |= MAP_FIXED; - if (linux_args->flags & LINUX_MAP_ANON) + if (linux_args->flags & LINUX_MAP_ANON) { bsd_args.flags |= MAP_ANON; - else + bsd_args.fd = -1; + } else { bsd_args.flags |= MAP_NOSYNC; + bsd_args.fd = linux_args->fd; + } if (linux_args->flags & LINUX_MAP_GROWSDOWN) { bsd_args.flags |= MAP_STACK; @@ -863,11 +856,7 @@ * fixed size of (STACK_SIZE - GUARD_SIZE). */ - /* This gives us TOS */ - bsd_args.addr = (caddr_t)PTRIN(linux_args->addr) + - linux_args->len; - - if ((caddr_t)PTRIN(bsd_args.addr) > + if ((caddr_t)PTRIN(linux_args->addr) + linux_args->len > p->p_vmspace->vm_maxsaddr) { /* * Some linux apps will attempt to mmap @@ -905,7 +894,8 @@ * not using VM_STACK we map the full stack, since we * don't have a way to autogrow it. */ - bsd_args.addr -= bsd_args.len; + bsd_args.addr = (caddr_t)PTRIN(linux_args->addr) - + bsd_args.len; } else { bsd_args.addr = (caddr_t)PTRIN(linux_args->addr); bsd_args.len = linux_args->len; @@ -918,9 +908,7 @@ if (linux_args->prot & PROT_READ) bsd_args.prot = linux_args->prot | PROT_EXEC; - if (linux_args->flags & LINUX_MAP_ANON) - bsd_args.fd = -1; - else { + if (bsd_args.fd != -1) { /* * Linux follows Solaris mmap(2) description: * The file descriptor fildes is opened with @@ -933,7 +921,7 @@ * argument as described below. */ - if ((error = fget(td, linux_args->fd, &fp)) != 0) + if ((error = fget(td, bsd_args.fd, &fp)) != 0) return (error); if (fp->f_type != DTYPE_VNODE) { fdrop(fp, td); @@ -946,7 +934,6 @@ return (EACCES); } - bsd_args.fd = linux_args->fd; fdrop(fp, td); } bsd_args.pos = (off_t)linux_args->pgoff * PAGE_SIZE; ==== //depot/projects/linuxolator/src/sys/i386/linux/linux.h#11 (text+ko) ==== @@ -142,6 +142,15 @@ #define LINUX_MAP_ANON 0x0020 #define LINUX_MAP_GROWSDOWN 0x0100 +struct l_mmap_argv { + l_uintptr_t addr; + l_size_t len; + l_int prot; + l_int flags; + l_int fd; + l_off_t pgoff; +} __packed; + /* * stat family of syscalls */ ==== //depot/projects/linuxolator/src/sys/i386/linux/linux_machdep.c#18 (text+ko) ==== @@ -576,16 +576,6 @@ return (0); } -/* XXX move */ -struct l_mmap_argv { - l_caddr_t addr; - l_int len; - l_int prot; - l_int flags; - l_int fd; - l_int pos; -}; - #define STACK_SIZE (2 * 1024 * 1024) #define GUARD_SIZE (4 * PAGE_SIZE) @@ -667,10 +657,13 @@ bsd_args.flags |= MAP_PRIVATE; if (linux_args->flags & LINUX_MAP_FIXED) bsd_args.flags |= MAP_FIXED; - if (linux_args->flags & LINUX_MAP_ANON) + if (linux_args->flags & LINUX_MAP_ANON) { bsd_args.flags |= MAP_ANON; - else + bsd_args.fd = -1; + } else { bsd_args.flags |= MAP_NOSYNC; + bsd_args.fd = linux_args->fd; + } if (linux_args->flags & LINUX_MAP_GROWSDOWN) { bsd_args.flags |= MAP_STACK; @@ -696,10 +689,8 @@ * fixed size of (STACK_SIZE - GUARD_SIZE). */ - /* This gives us TOS */ - bsd_args.addr = linux_args->addr + linux_args->len; - - if (bsd_args.addr > p->p_vmspace->vm_maxsaddr) { + if ((caddr_t)PTRIN(linux_args->addr) + linux_args->len > + p->p_vmspace->vm_maxsaddr) { /* * Some linux apps will attempt to mmap * thread stacks near the top of their @@ -735,16 +726,15 @@ * not using VM_STACK we map the full stack, since we * don't have a way to autogrow it. */ - bsd_args.addr -= bsd_args.len; + bsd_args.addr = (caddr_t)PTRIN(linux_args->addr) - + bsd_args.len; } else { - bsd_args.addr = linux_args->addr; + bsd_args.addr = (caddr_t)PTRIN(linux_args->addr); bsd_args.len = linux_args->len; } bsd_args.prot = linux_args->prot; - if (linux_args->flags & LINUX_MAP_ANON) - bsd_args.fd = -1; - else { + if (bsd_args.fd != -1) { /* * Linux follows Solaris mmap(2) description: * The file descriptor fildes is opened with @@ -757,7 +747,7 @@ * argument as described below. */ - if ((error = fget(td, linux_args->fd, &fp)) != 0) + if ((error = fget(td, bsd_args.fd, &fp)) != 0) return (error); if (fp->f_type != DTYPE_VNODE) { fdrop(fp, td); @@ -770,7 +760,6 @@ return (EACCES); } - bsd_args.fd = linux_args->fd; fdrop(fp, td); } bsd_args.pos = linux_args->pos;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200701182258.l0IMwrOJ088352>