[lxc-devel] [lxc/master] raw_syscalls: lxc_raw_clone() account for different trap number on 32bit SPARC
brauner on Github
lxc-bot at linuxcontainers.org
Tue Apr 16 21:36:12 UTC 2019
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 455 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190416/47270e6c/attachment.bin>
-------------- next part --------------
From 6dfb146378f24768980d6c1d600e6b2f44075d51 Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Tue, 16 Apr 2019 23:32:03 +0200
Subject: [PATCH] raw_syscalls: lxc_raw_clone()
Account for different trap number on 32bit SPARC.
Link: https://bugs.gentoo.org/656368
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/raw_syscalls.c | 42 ++++++++++++++++++++++++++----------------
1 file changed, 26 insertions(+), 16 deletions(-)
diff --git a/src/lxc/raw_syscalls.c b/src/lxc/raw_syscalls.c
index 4ac51ac253..a4db306919 100644
--- a/src/lxc/raw_syscalls.c
+++ b/src/lxc/raw_syscalls.c
@@ -47,7 +47,7 @@ pid_t lxc_raw_clone(unsigned long flags)
/* On s390/s390x and cris the order of the first and second arguments
* of the system call is reversed.
*/
- return (int)syscall(__NR_clone, NULL, flags | SIGCHLD);
+ return syscall(__NR_clone, NULL, flags | SIGCHLD);
#elif defined(__sparc__) && defined(__arch64__)
{
/*
@@ -55,28 +55,38 @@ pid_t lxc_raw_clone(unsigned long flags)
* boolean flag whether this is the child or the parent in %o1.
* Inline assembly is needed to get the flag returned in %o1.
*/
- int in_child;
- int child_pid;
- asm volatile("mov %2, %%g1\n\t"
- "mov %3, %%o0\n\t"
- "mov 0 , %%o1\n\t"
- "t 0x6d\n\t"
- "mov %%o1, %0\n\t"
- "mov %%o0, %1"
- : "=r"(in_child), "=r"(child_pid)
- : "i"(__NR_clone), "r"(flags | SIGCHLD)
- : "%o1", "%o0", "%g1");
+ int child_pid, in_child, ret;
+
+ asm volatile("mov %3, %%g1\n\t"
+ "mov %4, %%o0\n\t"
+ "mov 0 , %%o1\n\t"
+#if defined(__arch64__)
+ "t 0x6d\n\t"
+#else
+ "t 0x10\n\t"
+#endif
+ "addx %%g0, 0, %2\n\t"
+ "mov %%o1, %0\n\t"
+ "mov %%o0, %1" :
+ "=r"(in_child), "=r"(child_pid), "=r"(ret) :
+ "i"(__NR_clone), "r"(flags | SIGCHLD) :
+ "%o1", "%o0", "%g1", "cc" );
+
+ if (ret) {
+ errno = child_pid;
+ return -1;
+ }
if (in_child)
return 0;
- else
- return child_pid;
+
+ return child_pid;
}
#elif defined(__ia64__)
/* On ia64 the stack and stack size are passed as separate arguments. */
- return (int)syscall(__NR_clone, flags | SIGCHLD, NULL, prctl_arg(0));
+ return syscall(__NR_clone, flags | SIGCHLD, NULL, prctl_arg(0));
#else
- return (int)syscall(__NR_clone, flags | SIGCHLD, NULL);
+ return syscall(__NR_clone, flags | SIGCHLD, NULL);
#endif
}
More information about the lxc-devel
mailing list