All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Serge E. Hallyn" <serue-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
To: Linux Containers <containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org>
Cc: linux-s390-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Subject: [PATCH 2/2] clone_with_pids: define the s390 syscall
Date: Mon, 15 Jun 2009 12:05:24 -0500	[thread overview]
Message-ID: <20090615170524.GA14950@us.ibm.com> (raw)
In-Reply-To: <20090615170443.GA14808-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>

Hook up the clone_with_pids system call for s390x.  clone_with_pids()
takes an additional argument over clone(), which we pass in through
register 7.  Stub code for using the syscall looks like:

struct target_pid_set {
        int num_pids;
        pid_t *target_pids;
        unsigned long flags;
};

        register unsigned long int __r2 asm ("2") = (unsigned long int)(stack);\
        register unsigned long int __r3 asm ("3") = (unsigned long int)(flags);\
        register unsigned long int __r4 asm ("4") = (unsigned long int)(NULL); \
        register unsigned long int __r5 asm ("5") = (unsigned long int)(NULL); \
        register unsigned long int __r6 asm ("6") = (unsigned long int)(NULL); \
        register unsigned long int __r7 asm ("7") = (unsigned long int)(setp); \
        register unsigned long int __result asm ("2"); \
        __asm__ __volatile__( \
                " lghi %%r1,332\n" \
                " svc 0\n" \
                : "=d" (__result) \
                : "0" (__r2), "d" (__r3), \
                  "d" (__r4), "d" (__r5), "d" (__r6), "d" (__r7) \
                : "1", "cc", "memory" \
        ); \
                __result; \
        })

        struct target_pid_set pid_set;
        int pids[1] = { 19799 };
        pid_set.num_pids = 1;
        pid_set.target_pids = &pids[0];
        pid_set.flags = 0;

        rc = do_clone_with_pids(topstack, clone_flags, setp);
	if (rc == 0)
		printf("Child\n");
	else if (rc > 0)
		printf("Parent: child pid %d\n", rc);
	else
		printf("Error %d\n", rc);

Signed-off-by: Serge E. Hallyn <serue-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
---
 arch/s390/include/asm/unistd.h    |    3 ++-
 arch/s390/kernel/compat_wrapper.S |   10 ++++++++++
 arch/s390/kernel/process.c        |   19 +++++++++++++++++++
 3 files changed, 31 insertions(+), 1 deletions(-)

diff --git a/arch/s390/include/asm/unistd.h b/arch/s390/include/asm/unistd.h
index 3d22f17..d2facab 100644
--- a/arch/s390/include/asm/unistd.h
+++ b/arch/s390/include/asm/unistd.h
@@ -269,7 +269,8 @@
 #define	__NR_pwritev		329
 #define __NR_checkpoint		330
 #define __NR_restart		331
-#define NR_syscalls 332
+#define __NR_clone_with_pids	332
+#define NR_syscalls 333
 
 /* 
  * There are some system calls that are not present on 64 bit, some
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S
index c2228b2..bf13315 100644
--- a/arch/s390/kernel/compat_wrapper.S
+++ b/arch/s390/kernel/compat_wrapper.S
@@ -1837,3 +1837,13 @@ sys_restore_wrapper:
 	lgfr	%r3,%r3			# int
 	llgfr	%r4,%r4			# unsigned long
 	jg	compat_sys_restore
+
+	.globl sys_clone_with_pids_wrapper
+sys_clone_with_pids_wrapper:
+	llgfr	%r2,%r2			# unsigned long
+	llgfr	%r3,%r3			# unsigned long
+	llgtr	%r4,%r4			# int *
+	llgtr	%r5,%r5			# int *
+	llgtr	%r6,%r6			# void *
+	llgtr	%r7,%r7			# void *
+	jg	compat_sys_clone_with_pids
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
index a3acd8e..fa187bf 100644
--- a/arch/s390/kernel/process.c
+++ b/arch/s390/kernel/process.c
@@ -246,6 +246,25 @@ SYSCALL_DEFINE0(clone)
 		       parent_tidptr, child_tidptr);
 }
 
+SYSCALL_DEFINE0(clone_with_pids)
+{
+	struct pt_regs *regs = task_pt_regs(current);
+	unsigned long clone_flags;
+	unsigned long newsp;
+	int __user *parent_tidptr, *child_tidptr;
+	void __user *upid_setp;
+
+	clone_flags = regs->gprs[3];
+	newsp = regs->orig_gpr2;
+	parent_tidptr = (int __user *) regs->gprs[4];
+	child_tidptr = (int __user *) regs->gprs[5];
+	upid_setp = (void __user *) regs->gprs[7];
+	if (!newsp)
+		newsp = regs->gprs[15];
+	return do_fork_with_pids(clone_flags, newsp, regs, 0, parent_tidptr,
+			child_tidptr, upid_setp);
+}
+
 /*
  * This is trivial, and on the face of it looks like it
  * could equally well be done in user mode.
-- 
1.6.1

  parent reply	other threads:[~2009-06-15 17:05 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-15 17:04 [PATCH 1/2] s390: fix checkpoint and restart compat wrappers Serge E. Hallyn
     [not found] ` <20090615170443.GA14808-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-06-15 17:05   ` Serge E. Hallyn [this message]
     [not found]     ` <20090615170524.GA14950-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-06-15 17:16       ` [PATCH 2/2] clone_with_pids: define the s390 syscall Serge E. Hallyn
2009-06-15 17:16         ` Serge E. Hallyn
     [not found]         ` <20090615171645.GA15217-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-06-19  6:56           ` Oren Laadan
2009-06-19 11:16           ` Martin Schwidefsky
2009-06-19 15:13             ` Serge E. Hallyn
     [not found]               ` <20090619151341.GC22381-r/Jw6+rmf7HQT0dZR+AlfA@public.gmane.org>
2009-06-22  7:21                 ` Martin Schwidefsky

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090615170524.GA14950@us.ibm.com \
    --to=serue-r/jw6+rmf7hqt0dzr+alfa@public.gmane.org \
    --cc=containers-qjLDD68F18O7TbgM5vRIOg@public.gmane.org \
    --cc=linux-s390-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.