s390: fix checkpoint and restart compat wrappers
PATCH 1/2 s390: fix checkpoint and restart compat wrappers
They need to actually jump to the real syscall.
Though c/r from 31-bit compat is completely untested and should maybe just be disabled for now...
--- arch/s390/kernel/compat_wrapper.S | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
arch/s390/kernel/compat_wrapper.S +2 -0
@@ -1829,9 +1829,11 @@ sys_checkpoint_wrapper: lgfr %r2,%r2 # pid_t lgfr %r3,%r3 # int llgfr %r4,%r4 # unsigned long + jg compat_sys_checkpoint .globl sys_restore_wrapper sys_restore_wrapper: lgfr %r2,%r2 # int lgfr %r3,%r3 # int llgfr %r4,%r4 # unsigned long + jg compat_sys_restore
Signature · 1 line
1.6.1
A message that is not in the archive (sent off-list or not yet received): 20090615170443.GA14808-r/[email protected]
PATCH 2/2 clone_with_pids: define the s390 syscall
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);--- 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(-)
arch/s390/include/asm/unistd.h +2 -1
@@ -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
arch/s390/kernel/compat_wrapper.S +10 -0
@@ -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
arch/s390/kernel/process.c +19 -0
@@ -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.
Signature · 1 line
1.6.1
A message that is not in the archive (sent off-list or not yet received): 20090615170524.GA14950-r/[email protected]
Re: [PATCH 2/2] clone_with_pids: define the s390 syscall
Gah, sorry, git user error. syscalls.S update was not in the patch. Here is an update:
thanks,
-serge
From 788c5bcc14211608f187f36d327a9d6d87b19755 Mon Sep 17 00:00:00 2001
From: Serge E. Hallyn <serue-r/[email protected]>
Date: Mon, 15 Jun 2009 12:14:11 -0400
Subject: [PATCH 2/2] clone_with_pids: define the s390 syscall
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);--- arch/s390/include/asm/unistd.h | 3 ++- arch/s390/kernel/compat_wrapper.S | 10 ++++++++++ arch/s390/kernel/process.c | 19 +++++++++++++++++++ arch/s390/kernel/syscalls.S | 1 + 4 files changed, 32 insertions(+), 1 deletions(-)
arch/s390/include/asm/unistd.h +2 -1
@@ -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
arch/s390/kernel/compat_wrapper.S +10 -0
@@ -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
arch/s390/kernel/process.c +19 -0
@@ -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.
arch/s390/kernel/syscalls.S +1 -0
@@ -340,3 +340,4 @@ SYSCALL(sys_preadv,sys_preadv,compat_sys_preadv_wrapper) SYSCALL(sys_pwritev,sys_pwritev,compat_sys_pwritev_wrapper) SYSCALL(sys_checkpoint,sys_checkpoint,sys_checkpoint_wrapper) /* 330 */ SYSCALL(sys_restart,sys_restart,sys_restore_wrapper) +SYSCALL(sys_clone_with_pids,sys_clone_with_pids,sys_clone_with_pids_wrapper)
Signature · 1 line
1.6.1
A message that is not in the archive (sent off-list or not yet received): 20090615171645.GA15217-r/[email protected]
Oren Laadan
AppliedRe: [PATCH 2/2] clone_with_pids: define the s390 syscall
Applied.
Quoted 132 lines · Serge E. Hallyn
Gah, sorry, git user error.
syscalls.Supdate was not in the patch. Here is an update:thanks,
-sergeFrom
788c5bcc14211608f187f36d327a9d6d87b19755Mon Sep 17 00:00:00 2001
From: Serge E. Hallyn <serue-r/[email protected]>
Date: Mon, 15 Jun 2009 12:14:11 -0400
Subject: [PATCH 2/2]clone_with_pids: define the s390 syscallHook up the
clone_with_pidssystem call for s390x.clone_with_pids()takes an additional argument overclone(), 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/[email protected]>--- arch/s390/include/asm/unistd.h | 3 ++- arch/s390/kernel/compat_wrapper.S | 10 ++++++++++ arch/s390/kernel/process.c | 19 +++++++++++++++++++ arch/s390/kernel/syscalls.S | 1 + 4 files changed, 32 insertions(+), 1 deletions(-)arch/s390/include/asm/unistd.h +2
-1@@ -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 arch/s390/kernel/compat_wrapper.S +10
-0@@ -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_pidsarch/s390/kernel/process.c +19
-0@@ -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. arch/s390/kernel/syscalls.S +1
-0@@ -340,3 +340,4 @@ SYSCALL(sys_preadv,sys_preadv,compat_sys_preadv_wrapper) SYSCALL(sys_pwritev,sys_pwritev,compat_sys_pwritev_wrapper) SYSCALL(sys_checkpoint,sys_checkpoint,sys_checkpoint_wrapper) /* 330 */ SYSCALL(sys_restart,sys_restart,sys_restore_wrapper) +SYSCALL(sys_clone_with_pids,sys_clone_with_pids,sys_clone_with_pids_wrapper)
Re: [PATCH 2/2] clone_with_pids: define the s390 syscall
In reply to a message not in the archiveHi Serge,
Quoted 8 lines · On Mon, 15 Jun 2009 12:16:45 -0500 "Serge E. Hallyn"…
arch/s390/kernel/compat_wrapper.S +0
-0@@ -1837,3 +1837,13 @@ sys_restore_wrapper: lgfr %r3,%r3 # int llgfr %r4,%r4 # unsigned long jg compat_sys_restore
arch/s390/kernel/compat_wrapper.S sys_restore_wrapper: · line 1849
Quoted 10 lines
arch/s390/kernel/compat_wrapper.S +10
-0+ + .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
This is incorrect. If you have a system call that takes 6 parameters you need to load/store the 6th parameter from the stack. Check out the futex system call wrapper. But before you do that see the next comment.
Quoted 20 lines
arch/s390/kernel/process.c +12
-0@@ -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 ];
arch/s390/kernel/process.c SYSCALL_DEFINE0(clone) · line 270
Quoted 10 lines
arch/s390/kernel/process.c +7
-0+ 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.
clone_with_pids is declared as system call with no paramters. In this case the system call wrapper is not needed (empty) and you have to do the compat conversion inside the system call. See sys32_clone.
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.
Re: [PATCH 2/2] clone_with_pids: define the s390 syscall
Quoted 54 lines · Martin Schwidefsky
Hi Serge,
Quoted 8 lines · On Mon, 15 Jun 2009 12:16:45 -0500 "Serge E. Hallyn"…
arch/s390/kernel/compat_wrapper.S +0
-0@@ -1837,3 +1837,13 @@ sys_restore_wrapper: lgfr %r3,%r3 # int llgfr %r4,%r4 # unsigned long jg compat_sys_restorearch/s390/kernel/compat_wrapper.S sys_restore_wrapper: · line 1849
Quoted 10 lines
arch/s390/kernel/compat_wrapper.S +10
-0+ + .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_pidsThis is incorrect. If you have a system call that takes 6 parameters you need to load/store the 6th parameter from the stack. Check out the futex system call wrapper. But before you do that see the next comment.
Quoted 26 lines
arch/s390/kernel/process.c +18
-0@@ -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); +}
Quoted 8 lines
arch/s390/kernel/process.c SYSCALL_DEFINE0(clone) · line 270
Quoted 4 lines
arch/s390/kernel/process.c +1
-0+/* * This is trivial, and on the face of it looks like it * could equally well be done in user mode.
clone_with_pidsis declared as system call with no paramters. In this case the system call wrapper is not needed (empty) and you have to do the compat conversion inside the system call. Seesys32_clone.
Ah, I see, thanks.
So in that case, is it ok for me to just use gprs[7] to pass in the upid_setp variable?
thanks,
-serge
A message that is not in the archive (sent off-list or not yet received): 20090619151341.GC22381-r/[email protected]
Re: [PATCH 2/2] clone_with_pids: define the s390 syscall
Quoted 8 lines · On Fri, 19 Jun 2009 10:13:41 -0500 "Serge E. Hallyn"…
Quoted 3 lines
clone_with_pidsis declared as system call with no paramters. In this case the system call wrapper is not needed (empty) and you have to do the compat conversion inside the system call. Seesys32_clone.Ah, I see, thanks.
So in that case, is it ok for me to just use gprs[7] to pass in the
upid_setpvariable?
Yes, correct.
Signature · 4 lines
blue skies, Martin. "Reality continues to ruin my life." - Calvin.