summaryrefslogtreecommitdiff
path: root/debian/patches/libgo-fix-getrandom-clone-sparc64.diff
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/libgo-fix-getrandom-clone-sparc64.diff')
-rw-r--r--debian/patches/libgo-fix-getrandom-clone-sparc64.diff343
1 files changed, 343 insertions, 0 deletions
diff --git a/debian/patches/libgo-fix-getrandom-clone-sparc64.diff b/debian/patches/libgo-fix-getrandom-clone-sparc64.diff
new file mode 100644
index 0000000..7df5d9b
--- /dev/null
+++ b/debian/patches/libgo-fix-getrandom-clone-sparc64.diff
@@ -0,0 +1,343 @@
+# DP: Backport r241072 from trunk
+
+syscall, internal/syscall/unix: Fix getrandom, clone on sparc64
+
+Since sparc is a valid architecture, the name of
+getrandom_linux_sparc.go means that it will be ignored on sparc64,
+even though it's whitelisted with a +build line.
+
+On SPARC, clone has a unique return value convention which requires
+some inline assembly to convert it to the normal convention.
+
+Reviewed-on: https://go-review.googlesource.com/30873
+
+Index: b/src/libgo/mksysinfo.sh
+===================================================================
+--- a/src/libgo/mksysinfo.sh
++++ b/src/libgo/mksysinfo.sh
+@@ -603,8 +603,10 @@ fi
+ sizeof_long=`grep '^const ___SIZEOF_LONG__ = ' gen-sysinfo.go | sed -e 's/.*= //'`
+ if test "$sizeof_long" = "4"; then
+ echo "type _C_long int32" >> ${OUT}
++ echo "type _C_ulong uint32" >> ${OUT}
+ elif test "$sizeof_long" = "8"; then
+ echo "type _C_long int64" >> ${OUT}
++ echo "type _C_ulong uint64" >> ${OUT}
+ else
+ echo 1>&2 "mksysinfo.sh: could not determine size of long (got $sizeof_long)"
+ exit 1
+Index: b/src/libgo/go/internal/syscall/unix/getrandom_linux_sparc.go
+===================================================================
+--- a/src/libgo/go/internal/syscall/unix/getrandom_linux_sparc.go
++++ b/src/libgo/go/internal/syscall/unix/getrandom_linux_sparc.go
+@@ -1,11 +0,0 @@
+-// Copyright 2016 The Go Authors. All rights reserved.
+-// Use of this source code is governed by a BSD-style
+-// license that can be found in the LICENSE file.
+-
+-// +build sparc sparc64
+-
+-package unix
+-
+-// Linux getrandom system call number.
+-// See GetRandom in getrandom_linux.go.
+-const randomTrap uintptr = 347
+Index: b/src/libgo/go/internal/syscall/unix/getrandom_linux_sparcx.go
+===================================================================
+--- /dev/null
++++ b/src/libgo/go/internal/syscall/unix/getrandom_linux_sparcx.go
+@@ -0,0 +1,11 @@
++// Copyright 2016 The Go Authors. All rights reserved.
++// Use of this source code is governed by a BSD-style
++// license that can be found in the LICENSE file.
++
++// +build sparc sparc64
++
++package unix
++
++// Linux getrandom system call number.
++// See GetRandom in getrandom_linux.go.
++const randomTrap uintptr = 347
+Index: b/src/libgo/go/syscall/clone_linux.c
+===================================================================
+--- /dev/null
++++ b/src/libgo/go/syscall/clone_linux.c
+@@ -0,0 +1,100 @@
++/* clone_linux.c -- consistent wrapper around Linux clone syscall
++
++ Copyright 2016 The Go Authors. All rights reserved.
++ Use of this source code is governed by a BSD-style
++ license that can be found in the LICENSE file. */
++
++#include <errno.h>
++#include <asm/ptrace.h>
++#include <sys/syscall.h>
++
++#include "runtime.h"
++
++long rawClone (unsigned long flags, void *child_stack, void *ptid, void *ctid, struct pt_regs *regs) __asm__ (GOSYM_PREFIX "syscall.rawClone");
++
++long
++rawClone (unsigned long flags, void *child_stack, void *ptid, void *ctid, struct pt_regs *regs)
++{
++#if defined(__arc__) || defined(__aarch64__) || defined(__arm__) || defined(__mips__) || defined(__hppa__) || defined(__powerpc__) || defined(__score__) || defined(__i386__) || defined(__xtensa__)
++ // CLONE_BACKWARDS
++ return syscall(__NR_clone, flags, child_stack, ptid, regs, ctid);
++#elif defined(__s390__) || defined(__cris__)
++ // CLONE_BACKWARDS2
++ return syscall(__NR_clone, child_stack, flags, ptid, ctid, regs);
++#elif defined(__microblaze__)
++ // CLONE_BACKWARDS3
++ return syscall(__NR_clone, flags, child_stack, 0, ptid, ctid, regs);
++#elif defined(__sparc__)
++
++ /* SPARC has a unique return value convention:
++
++ Parent --> %o0 == child's pid, %o1 == 0
++ Child --> %o0 == parent's pid, %o1 == 1
++
++ Translate this to look like a normal clone. */
++
++# if defined(__arch64__)
++
++# define SYSCALL_STRING \
++ "ta 0x6d;" \
++ "bcc,pt %%xcc, 1f;" \
++ " mov 0, %%g1;" \
++ "sub %%g0, %%o0, %%o0;" \
++ "mov 1, %%g1;" \
++ "1:"
++
++# define SYSCALL_CLOBBERS \
++ "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
++ "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
++ "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \
++ "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \
++ "f32", "f34", "f36", "f38", "f40", "f42", "f44", "f46", \
++ "f48", "f50", "f52", "f54", "f56", "f58", "f60", "f62", \
++ "cc", "memory"
++
++# else /* __arch64__ */
++
++# define SYSCALL_STRING \
++ "ta 0x10;" \
++ "bcc 1f;" \
++ " mov 0, %%g1;" \
++ "sub %%g0, %%o0, %%o0;" \
++ "mov 1, %%g1;" \
++ "1:"
++
++# define SYSCALL_CLOBBERS \
++ "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
++ "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
++ "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \
++ "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \
++ "cc", "memory"
++
++# endif /* __arch64__ */
++
++ register long o0 __asm__ ("o0") = (long)flags;
++ register long o1 __asm__ ("o1") = (long)child_stack;
++ register long o2 __asm__ ("o2") = (long)ptid;
++ register long o3 __asm__ ("o3") = (long)ctid;
++ register long o4 __asm__ ("o4") = (long)regs;
++ register long g1 __asm__ ("g1") = __NR_clone;
++
++ __asm __volatile (SYSCALL_STRING :
++ "=r" (g1), "=r" (o0), "=r" (o1) :
++ "0" (g1), "1" (o0), "2" (o1),
++ "r" (o2), "r" (o3), "r" (o4) :
++ SYSCALL_CLOBBERS);
++
++ if (__builtin_expect(g1 != 0, 0))
++ {
++ errno = -o0;
++ o0 = -1L;
++ }
++ else
++ o0 &= (o1 - 1);
++
++ return o0;
++
++#else
++ return syscall(__NR_clone, flags, child_stack, ptid, ctid, regs);
++#endif
++}
+Index: b/src/libgo/go/syscall/exec_linux.go
+===================================================================
+--- a/src/libgo/go/syscall/exec_linux.go
++++ b/src/libgo/go/syscall/exec_linux.go
+@@ -7,7 +7,6 @@
+ package syscall
+
+ import (
+- "runtime"
+ "unsafe"
+ )
+
+@@ -48,6 +47,9 @@ type SysProcAttr struct {
+ func runtime_BeforeFork()
+ func runtime_AfterFork()
+
++// Implemented in clone_linux.c
++func rawClone(flags _C_ulong, child_stack *byte, ptid *Pid_t, ctid *Pid_t, regs unsafe.Pointer) _C_long
++
+ // Fork, dup fd onto 0..len(fd), and exec(argv0, argvv, envv) in child.
+ // If a dup or exec fails, write the errno error to pipe.
+ // (Pipe is close-on-exec so if exec succeeds, it will be closed.)
+@@ -63,6 +65,7 @@ func forkAndExecInChild(argv0 *byte, arg
+ // declarations require heap allocation (e.g., err1).
+ var (
+ r1 uintptr
++ r2 _C_long
+ err1 Errno
+ err2 Errno
+ nextfd int
+@@ -97,20 +100,16 @@ func forkAndExecInChild(argv0 *byte, arg
+ // About to call fork.
+ // No more allocation or calls of non-assembly functions.
+ runtime_BeforeFork()
+- if runtime.GOARCH == "s390x" || runtime.GOARCH == "s390" {
+- r1, _, err1 = RawSyscall6(SYS_CLONE, 0, uintptr(SIGCHLD)|sys.Cloneflags, 0, 0, 0, 0)
+- } else {
+- r1, _, err1 = RawSyscall6(SYS_CLONE, uintptr(SIGCHLD)|sys.Cloneflags, 0, 0, 0, 0, 0)
+- }
+- if err1 != 0 {
++ r2 = rawClone(_C_ulong(uintptr(SIGCHLD)|sys.Cloneflags), nil, nil, nil, unsafe.Pointer(nil))
++ if r2 < 0 {
+ runtime_AfterFork()
+- return 0, err1
++ return 0, GetErrno()
+ }
+
+- if r1 != 0 {
++ if r2 != 0 {
+ // parent; return PID
+ runtime_AfterFork()
+- pid = int(r1)
++ pid = int(r2)
+
+ if sys.UidMappings != nil || sys.GidMappings != nil {
+ Close(p[0])
+Index: b/src/libgo/Makefile.am
+===================================================================
+--- a/src/libgo/Makefile.am
++++ b/src/libgo/Makefile.am
+@@ -2145,6 +2145,12 @@ else
+ os_lib_inotify_lo =
+ endif
+
++if LIBGO_IS_LINUX
++syscall_lib_clone_lo = syscall/clone_linux.lo
++else
++syscall_lib_clone_lo =
++endif
++
+ libgo_go_objs = \
+ bufio.lo \
+ bytes.lo \
+@@ -2175,6 +2181,7 @@ libgo_go_objs = \
+ strings/index.lo \
+ sync.lo \
+ syscall.lo \
++ $(syscall_lib_clone_lo) \
+ syscall/errno.lo \
+ syscall/signame.lo \
+ syscall/wait.lo \
+@@ -3820,6 +3827,9 @@ syscall.lo.dep: $(go_syscall_files)
+ $(BUILDDEPS)
+ syscall.lo: $(go_syscall_files)
+ $(BUILDPACKAGE)
++syscall/clone_linux.lo: go/syscall/clone_linux.c
++ @$(MKDIR_P) syscall
++ $(LTCOMPILE) -c -o $@ $<
+ syscall/errno.lo: go/syscall/errno.c
+ @$(MKDIR_P) syscall
+ $(LTCOMPILE) -c -o $@ $<
+Index: b/src/libgo/Makefile.in
+===================================================================
+--- a/src/libgo/Makefile.in
++++ b/src/libgo/Makefile.in
+@@ -173,15 +173,16 @@ am__objects_3 = $(am__objects_2)
+ am_libnetgo_a_OBJECTS = $(am__objects_3)
+ libnetgo_a_OBJECTS = $(am_libnetgo_a_OBJECTS)
+ LTLIBRARIES = $(toolexeclib_LTLIBRARIES)
+-am__DEPENDENCIES_1 =
+-am__DEPENDENCIES_2 = bufio.lo bytes.lo bytes/index.lo crypto.lo \
++@LIBGO_IS_LINUX_TRUE@am__DEPENDENCIES_1 = syscall/clone_linux.lo
++am__DEPENDENCIES_2 =
++am__DEPENDENCIES_3 = bufio.lo bytes.lo bytes/index.lo crypto.lo \
+ encoding.lo errors.lo expvar.lo flag.lo fmt.lo hash.lo html.lo \
+ image.lo io.lo log.lo math.lo mime.lo net.lo os.lo path.lo \
+ reflect-go.lo reflect/makefunc_ffi_c.lo regexp.lo \
+ runtime-go.lo sort.lo strconv.lo strings.lo strings/index.lo \
+- sync.lo syscall.lo syscall/errno.lo syscall/signame.lo \
+- syscall/wait.lo testing.lo time-go.lo unicode.lo \
+- archive/tar.lo archive/zip.lo compress/bzip2.lo \
++ sync.lo syscall.lo $(am__DEPENDENCIES_1) syscall/errno.lo \
++ syscall/signame.lo syscall/wait.lo testing.lo time-go.lo \
++ unicode.lo archive/tar.lo archive/zip.lo compress/bzip2.lo \
+ compress/flate.lo compress/gzip.lo compress/lzw.lo \
+ compress/zlib.lo container/heap.lo container/list.lo \
+ container/ring.lo crypto/aes.lo crypto/cipher.lo crypto/des.lo \
+@@ -213,18 +214,18 @@ am__DEPENDENCIES_2 = bufio.lo bytes.lo b
+ math/rand.lo mime/multipart.lo mime/quotedprintable.lo \
+ net/http.lo net/internal/socktest.lo net/mail.lo net/rpc.lo \
+ net/smtp.lo net/textproto.lo net/url.lo old/regexp.lo \
+- old/template.lo os/exec.lo $(am__DEPENDENCIES_1) os/signal.lo \
++ old/template.lo os/exec.lo $(am__DEPENDENCIES_2) os/signal.lo \
+ os/user.lo path/filepath.lo regexp/syntax.lo \
+ net/rpc/jsonrpc.lo runtime/debug.lo runtime/pprof.lo \
+ sync/atomic.lo sync/atomic_c.lo text/scanner.lo \
+ text/tabwriter.lo text/template.lo text/template/parse.lo \
+ testing/iotest.lo testing/quick.lo unicode/utf16.lo \
+ unicode/utf8.lo
+-am__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) \
+- ../libbacktrace/libbacktrace.la $(am__DEPENDENCIES_1) \
+- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+-libgo_llgo_la_DEPENDENCIES = $(am__DEPENDENCIES_3)
++am__DEPENDENCIES_4 = $(am__DEPENDENCIES_3) \
++ ../libbacktrace/libbacktrace.la $(am__DEPENDENCIES_2) \
++ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_2) \
++ $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_2)
++libgo_llgo_la_DEPENDENCIES = $(am__DEPENDENCIES_4)
+ @LIBGO_IS_LINUX_FALSE@am__objects_4 = lock_sema.lo thread-sema.lo
+ @LIBGO_IS_LINUX_TRUE@am__objects_4 = lock_futex.lo thread-linux.lo
+ @HAVE_SYS_MMAN_H_FALSE@am__objects_5 = mem_posix_memalign.lo
+@@ -276,7 +277,7 @@ libgo_llgo_la_LINK = $(LIBTOOL) --tag=CC
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(libgo_llgo_la_LDFLAGS) $(LDFLAGS) -o $@
+ @GOC_IS_LLGO_TRUE@am_libgo_llgo_la_rpath = -rpath $(toolexeclibdir)
+-libgo_la_DEPENDENCIES = $(am__DEPENDENCIES_3)
++libgo_la_DEPENDENCIES = $(am__DEPENDENCIES_4)
+ am_libgo_la_OBJECTS = $(am__objects_9)
+ libgo_la_OBJECTS = $(am_libgo_la_OBJECTS)
+ libgo_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+@@ -2156,6 +2157,8 @@ go_syscall_test_files = \
+
+ # os_lib_inotify_lo = os/inotify.lo
+ @LIBGO_IS_LINUX_TRUE@os_lib_inotify_lo =
++@LIBGO_IS_LINUX_FALSE@syscall_lib_clone_lo =
++@LIBGO_IS_LINUX_TRUE@syscall_lib_clone_lo = syscall/clone_linux.lo
+ libgo_go_objs = \
+ bufio.lo \
+ bytes.lo \
+@@ -2186,6 +2189,7 @@ libgo_go_objs = \
+ strings/index.lo \
+ sync.lo \
+ syscall.lo \
++ $(syscall_lib_clone_lo) \
+ syscall/errno.lo \
+ syscall/signame.lo \
+ syscall/wait.lo \
+@@ -6197,6 +6201,9 @@ syscall.lo.dep: $(go_syscall_files)
+ $(BUILDDEPS)
+ syscall.lo: $(go_syscall_files)
+ $(BUILDPACKAGE)
++syscall/clone_linux.lo: go/syscall/clone_linux.c
++ @$(MKDIR_P) syscall
++ $(LTCOMPILE) -c -o $@ $<
+ syscall/errno.lo: go/syscall/errno.c
+ @$(MKDIR_P) syscall
+ $(LTCOMPILE) -c -o $@ $<