Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 26 Jun 1998 11:32:01 -0400 (EDT)
From:      Brian Feldman <green@feldman.dyn.ml.org>
To:        freebsd-multimedia@FreeBSD.ORG
Cc:        freebsd-emulation@FreeBSD.ORG
Subject:   full Linux mremap patches (commit these!)
Message-ID:  <Pine.BSF.3.96.980626112649.6986A-200000@localhost>

next in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
These work great, and should be committed (whoever made the original
patch, step forward, good job).

my->name 	= 	"Brian Feldman";
my->email	=	"brianfeldman@hotmail.com";
my->info 	= 	finger("green@feldman.dyn.ml.org");

[-- Attachment #2 --]
diff -u src/sys/i386/linux/linux_misc.c src/sys/i386/linux.new/linux_misc.c
--- src/sys/i386/linux/linux_misc.c	Sun May 17 07:52:26 1998
+++ src/sys/i386/linux.new/linux_misc.c	Fri Jun 26 11:25:27 1998
@@ -615,6 +615,37 @@
     return mmap(p, &bsd_args);
 }
 
+int     
+linux_mremap(struct proc *p, struct linux_mremap_args *args)
+{
+        struct munmap_args /* {
+                void *addr;
+                size_t len;
+        } */ bsd_args; 
+        int error = 0;
+ 
+#ifdef DEBUG
+        printf("Linux-emul(%d): mremap(%08x, %08x, %08x, %08x)\n",
+        p->p_pid, args->addr, args->old_len, args->new_len, args->flags);
+#endif
+        args->new_len = round_page(args->new_len);
+        args->old_len = round_page(args->old_len);
+
+        if (args->new_len > args->old_len) {
+                p->p_retval[0] = 0;
+                return ENOMEM;
+        }
+
+        if (args->new_len < args->old_len) {
+                bsd_args.addr = args->addr + args->new_len;
+                bsd_args.len = args->old_len - args->new_len;
+                error = munmap(p, &bsd_args);
+        }
+
+        p->p_retval[0] = error ? 0 : (int)args->addr;
+        return error;
+}
+
 int
 linux_msync(struct proc *p, struct linux_msync_args *args)
 {
diff -u src/sys/i386/linux/linux_proto.h src/sys/i386/linux.new/linux_proto.h
--- src/sys/i386/linux/linux_proto.h	Mon Jun  8 23:36:56 1998
+++ src/sys/i386/linux.new/linux_proto.h	Fri Jun 26 11:23:25 1998
@@ -367,6 +367,12 @@
 	int	len;	char len_[PAD_(int)];
 	int	fl;	char fl_[PAD_(int)];
 };
+struct	linux_mremap_args {
+	caddr_t	addr;	char addr_[PAD_(caddr_t)];
+	int	old_len;	char old_len_[PAD_(int)];
+	int	new_len;	char new_len_[PAD_(int)];
+	int	flags;	char flags_[PAD_(int)];
+};
 struct	linux_chown_args {
 	char *	path;	char path_[PAD_(char *)];
 	int	uid;	char uid_[PAD_(int)];
@@ -466,6 +472,7 @@
 int	linux_getdents __P((struct proc *, struct linux_getdents_args *));
 int	linux_newselect __P((struct proc *, struct linux_newselect_args *));
 int	linux_msync __P((struct proc *, struct linux_msync_args *));
+int	linux_mremap __P((struct proc *, struct linux_mremap_args *));
 int	linux_chown __P((struct proc *, struct linux_chown_args *));
 
 #ifdef COMPAT_43
diff -u src/sys/i386/linux/linux_syscall.h src/sys/i386/linux.new/linux_syscall.h
--- src/sys/i386/linux/linux_syscall.h	Mon Jun  8 23:36:57 1998
+++ src/sys/i386/linux.new/linux_syscall.h	Fri Jun 26 11:23:25 1998
@@ -161,5 +161,6 @@
 #define	LINUX_SYS_sched_get_priority_min	160
 #define	LINUX_SYS_sched_rr_get_interval	161
 #define	LINUX_SYS_nanosleep	162
+#define	LINUX_SYS_linux_mremap	163
 #define	LINUX_SYS_linux_chown	182
 #define	LINUX_SYS_MAXSYSCALL	183
diff -u src/sys/i386/linux/linux_sysent.c src/sys/i386/linux.new/linux_sysent.c
--- src/sys/i386/linux/linux_sysent.c	Mon Jun  8 23:36:59 1998
+++ src/sys/i386/linux.new/linux_sysent.c	Fri Jun 26 11:23:25 1998
@@ -177,7 +177,7 @@
 	{ 1, (sy_call_t *)sched_get_priority_min },		/* 160 = sched_get_priority_min */
 	{ 2, (sy_call_t *)sched_rr_get_interval },		/* 161 = sched_rr_get_interval */
 	{ 2, (sy_call_t *)nanosleep },			/* 162 = nanosleep */
-	{ 0, (sy_call_t *)nosys },			/* 163 = mremap */
+	{ 4, (sy_call_t *)linux_mremap },		/* 163 = linux_mremap */
 	{ 0, (sy_call_t *)nosys },			/* 164 = setresuid */
 	{ 0, (sy_call_t *)nosys },			/* 165 = getresuid */
 	{ 0, (sy_call_t *)nosys },			/* 166 = new_vm86 */
diff -u src/sys/i386/linux/syscalls.master src/sys/i386/linux.new/syscalls.master
--- src/sys/i386/linux/syscalls.master	Mon Jun  8 23:28:14 1998
+++ src/sys/i386/linux.new/syscalls.master	Fri Jun 26 11:22:11 1998
@@ -233,7 +233,8 @@
 162	NOPROTO	POSIX	{ int nanosleep(const struct timespec *rqtp, \
 			    struct timespec *rmtp); }
 
-163	UNIMPL	LINUX	mremap
+163	STD	LINUX	{ int linux_mremap(caddr_t addr, int old_len, \
+			    int new_len, int flags); }
 164	UNIMPL	LINUX	setresuid
 165	UNIMPL	LINUX	getresuid
 166	UNIMPL	LINUX	new_vm86

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.96.980626112649.6986A-200000>