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>
