summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordchagin <dchagin@FreeBSD.org>2015-05-24 15:03:09 +0000
committerdchagin <dchagin@FreeBSD.org>2015-05-24 15:03:09 +0000
commite28b659be100a1b8e59d531e5347c9ffc526602c (patch)
tree1ba902a4457e06d281c70ad8f64cef362aa177c3
parent3445f2f9f244d28847011b406ff49c43ae88834a (diff)
downloadFreeBSD-src-e28b659be100a1b8e59d531e5347c9ffc526602c.zip
FreeBSD-src-e28b659be100a1b8e59d531e5347c9ffc526602c.tar.gz
To reduce code duplication introduce linux_copyout_rusage() method.
Use it in linux_wait4() system call and move linux_wait4() to the MI path. While here add a prototype for the static bsd_to_linux_rusage(). Differential Revision: https://reviews.freebsd.org/D2138 Reviewed by: trasz
-rw-r--r--sys/amd64/linux32/linux.h1
-rw-r--r--sys/amd64/linux32/linux32_genassym.c1
-rw-r--r--sys/amd64/linux32/linux32_machdep.c53
-rw-r--r--sys/compat/linux/linux_misc.c29
-rw-r--r--sys/i386/linux/linux.h2
-rw-r--r--sys/i386/linux/linux_machdep.c31
6 files changed, 47 insertions, 70 deletions
diff --git a/sys/amd64/linux32/linux.h b/sys/amd64/linux32/linux.h
index 5e8b748..1c9cb0c 100644
--- a/sys/amd64/linux32/linux.h
+++ b/sys/amd64/linux32/linux.h
@@ -780,6 +780,7 @@ struct l_iovec32 {
int linux32_copyiniov(struct l_iovec32 *iovp32, l_ulong iovcnt,
struct iovec **iovp, int error);
+int linux_copyout_rusage(struct rusage *ru, void *uaddr);
/* robust futexes */
struct linux_robust_list {
diff --git a/sys/amd64/linux32/linux32_genassym.c b/sys/amd64/linux32/linux32_genassym.c
index a022fac..bea846d 100644
--- a/sys/amd64/linux32/linux32_genassym.c
+++ b/sys/amd64/linux32/linux32_genassym.c
@@ -3,6 +3,7 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/assym.h>
+#include <sys/resource.h>
#include <sys/systm.h>
#include <amd64/linux32/linux.h>
diff --git a/sys/amd64/linux32/linux32_machdep.c b/sys/amd64/linux32/linux32_machdep.c
index 5833f42..288a481 100644
--- a/sys/amd64/linux32/linux32_machdep.c
+++ b/sys/amd64/linux32/linux32_machdep.c
@@ -72,6 +72,8 @@ __FBSDID("$FreeBSD$");
#include <compat/linux/linux_util.h>
#include <compat/linux/linux_emul.h>
+static void bsd_to_linux_rusage(struct rusage *ru, struct l_rusage *lru);
+
struct l_old_select_argv {
l_int nfds;
l_uintptr_t readfds;
@@ -133,6 +135,16 @@ bsd_to_linux_rusage(struct rusage *ru, struct l_rusage *lru)
}
int
+linux_copyout_rusage(struct rusage *ru, void *uaddr)
+{
+ struct l_rusage lru;
+
+ bsd_to_linux_rusage(ru, &lru);
+
+ return (copyout(&lru, uaddr, sizeof(struct l_rusage)));
+}
+
+int
linux_execve(struct thread *td, struct linux_execve_args *args)
{
struct image_args eargs;
@@ -908,17 +920,14 @@ linux_settimeofday(struct thread *td, struct linux_settimeofday_args *uap)
int
linux_getrusage(struct thread *td, struct linux_getrusage_args *uap)
{
- struct l_rusage s32;
struct rusage s;
int error;
error = kern_getrusage(td, uap->who, &s);
if (error != 0)
return (error);
- if (uap->rusage != NULL) {
- bsd_to_linux_rusage(&s, &s32);
- error = copyout(&s32, uap->rusage, sizeof(s32));
- }
+ if (uap->rusage != NULL)
+ error = linux_copyout_rusage(&s, uap->rusage);
return (error);
}
@@ -1024,37 +1033,3 @@ linux_set_thread_area(struct thread *td,
return (0);
}
-
-int
-linux_wait4(struct thread *td, struct linux_wait4_args *args)
-{
- int error, options;
- struct rusage ru, *rup;
- struct l_rusage lru;
-
-#ifdef DEBUG
- if (ldebug(wait4))
- printf(ARGS(wait4, "%d, %p, %d, %p"),
- args->pid, (void *)args->status, args->options,
- (void *)args->rusage);
-#endif
-
- options = (args->options & (WNOHANG | WUNTRACED));
- /* WLINUXCLONE should be equal to __WCLONE, but we make sure */
- if (args->options & __WCLONE)
- options |= WLINUXCLONE;
-
- if (args->rusage != NULL)
- rup = &ru;
- else
- rup = NULL;
- error = linux_common_wait(td, args->pid, args->status, options, rup);
- if (error)
- return (error);
- if (args->rusage != NULL) {
- bsd_to_linux_rusage(rup, &lru);
- error = copyout(&lru, args->rusage, sizeof(lru));
- }
-
- return (error);
-}
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index e3b619c..1129996 100644
--- a/sys/compat/linux/linux_misc.c
+++ b/sys/compat/linux/linux_misc.c
@@ -886,6 +886,35 @@ linux_waitpid(struct thread *td, struct linux_waitpid_args *args)
return (linux_common_wait(td, args->pid, args->status, options, NULL));
}
+int
+linux_wait4(struct thread *td, struct linux_wait4_args *args)
+{
+ int error, options;
+ struct rusage ru, *rup;
+
+#ifdef DEBUG
+ if (ldebug(wait4))
+ printf(ARGS(wait4, "%d, %p, %d, %p"),
+ args->pid, (void *)args->status, args->options,
+ (void *)args->rusage);
+#endif
+
+ options = (args->options & (WNOHANG | WUNTRACED));
+ /* WLINUXCLONE should be equal to __WCLONE, but we make sure */
+ if (args->options & __WCLONE)
+ options |= WLINUXCLONE;
+
+ if (args->rusage != NULL)
+ rup = &ru;
+ else
+ rup = NULL;
+ error = linux_common_wait(td, args->pid, args->status, options, rup);
+ if (error != 0)
+ return (error);
+ if (args->rusage != NULL)
+ error = linux_copyout_rusage(&ru, args->rusage);
+ return (error);
+}
int
linux_mknod(struct thread *td, struct linux_mknod_args *args)
diff --git a/sys/i386/linux/linux.h b/sys/i386/linux/linux.h
index 6f0ad29..6a20a68 100644
--- a/sys/i386/linux/linux.h
+++ b/sys/i386/linux/linux.h
@@ -741,6 +741,8 @@ struct l_desc_struct {
#define LINUX_GET_USEABLE(desc) \
(((desc)->b >> LINUX_ENTRY_B_USEABLE) & 1)
+#define linux_copyout_rusage(r, u) copyout(r, u, sizeof(*r))
+
/* robust futexes */
struct linux_robust_list {
struct linux_robust_list *next;
diff --git a/sys/i386/linux/linux_machdep.c b/sys/i386/linux/linux_machdep.c
index d3013e1..cd8bf0d 100644
--- a/sys/i386/linux/linux_machdep.c
+++ b/sys/i386/linux/linux_machdep.c
@@ -1047,34 +1047,3 @@ linux_mq_getsetattr(struct thread *td, struct linux_mq_getsetattr_args *args)
return (ENOSYS);
#endif
}
-
-int
-linux_wait4(struct thread *td, struct linux_wait4_args *args)
-{
- int error, options;
- struct rusage ru, *rup;
-
-#ifdef DEBUG
- if (ldebug(wait4))
- printf(ARGS(wait4, "%d, %p, %d, %p"),
- args->pid, (void *)args->status, args->options,
- (void *)args->rusage);
-#endif
-
- options = (args->options & (WNOHANG | WUNTRACED));
- /* WLINUXCLONE should be equal to __WCLONE, but we make sure */
- if (args->options & __WCLONE)
- options |= WLINUXCLONE;
-
- if (args->rusage != NULL)
- rup = &ru;
- else
- rup = NULL;
- error = linux_common_wait(td, args->pid, args->status, options, rup);
- if (error)
- return (error);
- if (args->rusage != NULL)
- error = copyout(&ru, args->rusage, sizeof(ru));
-
- return (error);
-}
OpenPOWER on IntegriCloud