diff mbox

libgo patch committed: Fix ptrace implementation on MIPS

Message ID CAOyqgcX_+-FFFb54uOUWgJacsVqAzumHGdMOH6Xn8ySQ634cLA@mail.gmail.com
State New
Headers show

Commit Message

Ian Lance Taylor June 21, 2017, 9:42 p.m. UTC
This patch from James Cowgill fixes the libgo ptrace implementation
for MIPS by modifying mksysinfo.sh to look for the pt_regs struct.
Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu, which
admittedly proves little.  Committed to mainline.

Ian

Comments

Andreas Schwab June 22, 2017, 7:55 a.m. UTC | #1
On Jun 21 2017, Ian Lance Taylor <iant@golang.org> wrote:

> Index: libgo/sysinfo.c
> ===================================================================
> --- libgo/sysinfo.c	(revision 249205)
> +++ libgo/sysinfo.c	(working copy)
> @@ -102,6 +102,9 @@
>  #if defined(HAVE_LINUX_NETLINK_H)
>  #include <linux/netlink.h>
>  #endif
> +#if defined(HAVE_LINUX_PTRACE_H)
> +#include <linux/ptrace.h>
> +#endif
>  #if defined(HAVE_LINUX_RTNETLINK_H)
>  #include <linux/rtnetlink.h>
>  #endif

That breaks ia64:

In file included from /usr/include/asm/ptrace.h:58:0,
                 from /usr/include/linux/ptrace.h:69,
                 from ../../../libgo/sysinfo.c:106:
/usr/include/asm/fpu.h:57:8: error: redefinition of 'struct ia64_fpreg'
 struct ia64_fpreg {
        ^~~~~~~~~~
In file included from /usr/include/signal.h:339:0,
                 from /usr/local/gcc/gcc-20170622/Build/gcc/include-fixed/sys/ucontext.h:32,
                 from /usr/include/ucontext.h:27,
                 from ../../../libgo/sysinfo.c:17:
/usr/include/bits/sigcontext.h:32:8: note: originally defined here
 struct ia64_fpreg
        ^~~~~~~~~~
In file included from /usr/include/linux/ptrace.h:69:0,
                 from ../../../libgo/sysinfo.c:106:
/usr/include/asm/ptrace.h:208:8: error: redefinition of 'struct pt_all_user_regs'
 struct pt_all_user_regs {
        ^~~~~~~~~~~~~~~~
In file included from ../../../libgo/sysinfo.c:66:0:
/usr/include/sys/ptrace.h:116:8: note: originally defined here
 struct pt_all_user_regs
        ^~~~~~~~~~~~~~~~

Andreas.
Ian Lance Taylor June 22, 2017, 7:59 p.m. UTC | #2
James, any thoughts?

Ian

On Thu, Jun 22, 2017 at 12:55 AM, Andreas Schwab <schwab@suse.de> wrote:
> On Jun 21 2017, Ian Lance Taylor <iant@golang.org> wrote:
>
>> Index: libgo/sysinfo.c
>> ===================================================================
>> --- libgo/sysinfo.c   (revision 249205)
>> +++ libgo/sysinfo.c   (working copy)
>> @@ -102,6 +102,9 @@
>>  #if defined(HAVE_LINUX_NETLINK_H)
>>  #include <linux/netlink.h>
>>  #endif
>> +#if defined(HAVE_LINUX_PTRACE_H)
>> +#include <linux/ptrace.h>
>> +#endif
>>  #if defined(HAVE_LINUX_RTNETLINK_H)
>>  #include <linux/rtnetlink.h>
>>  #endif
>
> That breaks ia64:
>
> In file included from /usr/include/asm/ptrace.h:58:0,
>                  from /usr/include/linux/ptrace.h:69,
>                  from ../../../libgo/sysinfo.c:106:
> /usr/include/asm/fpu.h:57:8: error: redefinition of 'struct ia64_fpreg'
>  struct ia64_fpreg {
>         ^~~~~~~~~~
> In file included from /usr/include/signal.h:339:0,
>                  from /usr/local/gcc/gcc-20170622/Build/gcc/include-fixed/sys/ucontext.h:32,
>                  from /usr/include/ucontext.h:27,
>                  from ../../../libgo/sysinfo.c:17:
> /usr/include/bits/sigcontext.h:32:8: note: originally defined here
>  struct ia64_fpreg
>         ^~~~~~~~~~
> In file included from /usr/include/linux/ptrace.h:69:0,
>                  from ../../../libgo/sysinfo.c:106:
> /usr/include/asm/ptrace.h:208:8: error: redefinition of 'struct pt_all_user_regs'
>  struct pt_all_user_regs {
>         ^~~~~~~~~~~~~~~~
> In file included from ../../../libgo/sysinfo.c:66:0:
> /usr/include/sys/ptrace.h:116:8: note: originally defined here
>  struct pt_all_user_regs
>         ^~~~~~~~~~~~~~~~
>
> Andreas.
>
> --
> Andreas Schwab, SUSE Labs, schwab@suse.de
> GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
> "And now for something completely different."
James Cowgill June 23, 2017, 9:34 a.m. UTC | #3
Hi,

On 22/06/17 20:59, Ian Lance Taylor wrote:
> James, any thoughts?
> 
> Ian
> 
> On Thu, Jun 22, 2017 at 12:55 AM, Andreas Schwab <schwab@suse.de> wrote:
>> On Jun 21 2017, Ian Lance Taylor <iant@golang.org> wrote:
>>
>>> Index: libgo/sysinfo.c
>>> ===================================================================
>>> --- libgo/sysinfo.c   (revision 249205)
>>> +++ libgo/sysinfo.c   (working copy)
>>> @@ -102,6 +102,9 @@
>>>  #if defined(HAVE_LINUX_NETLINK_H)
>>>  #include <linux/netlink.h>
>>>  #endif
>>> +#if defined(HAVE_LINUX_PTRACE_H)
>>> +#include <linux/ptrace.h>
>>> +#endif
>>>  #if defined(HAVE_LINUX_RTNETLINK_H)
>>>  #include <linux/rtnetlink.h>
>>>  #endif
>>
>> That breaks ia64:
>>
>> In file included from /usr/include/asm/ptrace.h:58:0,
>>                  from /usr/include/linux/ptrace.h:69,
>>                  from ../../../libgo/sysinfo.c:106:
>> /usr/include/asm/fpu.h:57:8: error: redefinition of 'struct ia64_fpreg'
>>  struct ia64_fpreg {
>>         ^~~~~~~~~~
>> In file included from /usr/include/signal.h:339:0,
>>                  from /usr/local/gcc/gcc-20170622/Build/gcc/include-fixed/sys/ucontext.h:32,
>>                  from /usr/include/ucontext.h:27,
>>                  from ../../../libgo/sysinfo.c:17:
>> /usr/include/bits/sigcontext.h:32:8: note: originally defined here
>>  struct ia64_fpreg
>>         ^~~~~~~~~~
>> In file included from /usr/include/linux/ptrace.h:69:0,
>>                  from ../../../libgo/sysinfo.c:106:
>> /usr/include/asm/ptrace.h:208:8: error: redefinition of 'struct pt_all_user_regs'
>>  struct pt_all_user_regs {
>>         ^~~~~~~~~~~~~~~~
>> In file included from ../../../libgo/sysinfo.c:66:0:
>> /usr/include/sys/ptrace.h:116:8: note: originally defined here
>>  struct pt_all_user_regs
>>         ^~~~~~~~~~~~~~~~

This looks like this glibc bug which was fixed in 2.19.
https://sourceware.org/bugzilla/show_bug.cgi?id=762

James
diff mbox

Patch

Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 249208)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@ 
-6449e2832eef94eacf89c88fa16bede637f729ba
+b2bebba1f8a8185546c47f8460a3d5c2e31d0434
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: libgo/configure.ac
===================================================================
--- libgo/configure.ac	(revision 249205)
+++ libgo/configure.ac	(working copy)
@@ -580,7 +580,7 @@  AC_C_BIGENDIAN
 
 GCC_CHECK_UNWIND_GETIPINFO
 
-AC_CHECK_HEADERS(port.h sched.h semaphore.h sys/file.h sys/mman.h syscall.h sys/epoll.h sys/event.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h)
+AC_CHECK_HEADERS(port.h sched.h semaphore.h sys/file.h sys/mman.h syscall.h sys/epoll.h sys/event.h sys/inotify.h sys/ptrace.h sys/syscall.h sys/user.h sys/utsname.h sys/select.h sys/socket.h net/if.h net/if_arp.h net/route.h netpacket/packet.h sys/prctl.h sys/mount.h sys/vfs.h sys/statfs.h sys/timex.h sys/sysinfo.h utime.h linux/ether.h linux/fs.h linux/ptrace.h linux/reboot.h netinet/icmp6.h netinet/in_syst.h netinet/ip.h netinet/ip_mroute.h netinet/if_ether.h)
 
 AC_CHECK_HEADERS([linux/filter.h linux/if_addr.h linux/if_ether.h linux/if_tun.h linux/netlink.h linux/rtnetlink.h], [], [],
 [#ifdef HAVE_SYS_SOCKET_H
Index: libgo/go/syscall/syscall_linux_mipsx.go
===================================================================
--- libgo/go/syscall/syscall_linux_mipsx.go	(revision 249205)
+++ libgo/go/syscall/syscall_linux_mipsx.go	(working copy)
@@ -3,10 +3,24 @@ 
 // license that can be found in the LICENSE file.
 
 // +build linux
-// +build mips mipsle
+// +build mips mipsle mips64 mips64le mips64p32 mips64p32le
 
 package syscall
 
-func (r *PtraceRegs) PC() uint64 { return uint64(r.Regs[64]) }
+import "unsafe"
 
-func (r *PtraceRegs) SetPC(pc uint64) { r.Regs[64] = uint32(pc) }
+func (r *PtraceRegs) PC() uint64 {
+	return r.Cp0_epc
+}
+
+func (r *PtraceRegs) SetPC(pc uint64) {
+	r.Cp0_epc = pc
+}
+
+func PtraceGetRegs(pid int, regsout *PtraceRegs) (err error) {
+	return ptrace(PTRACE_GETREGS, pid, 0, uintptr(unsafe.Pointer(regsout)))
+}
+
+func PtraceSetRegs(pid int, regs *PtraceRegs) (err error) {
+	return ptrace(PTRACE_SETREGS, pid, 0, uintptr(unsafe.Pointer(regs)))
+}
Index: libgo/mksysinfo.sh
===================================================================
--- libgo/mksysinfo.sh	(revision 249205)
+++ libgo/mksysinfo.sh	(working copy)
@@ -317,9 +317,13 @@  if test "$regs" = ""; then
     upcase_fields "__user_psw_struct" "PtracePsw" >> ${OUT} || true
     upcase_fields "__user_fpregs_struct" "PtraceFpregs" >> ${OUT} || true
     upcase_fields "__user_per_struct" "PtracePer" >> ${OUT} || true
+  else
+    # mips*
+    regs=`grep '^type _pt_regs struct' gen-sysinfo.go || true`
   fi
 fi
 if test "$regs" != ""; then
+  regs=`echo $regs | sed -e 's/type _pt_regs struct//'`
   regs=`echo $regs |
     sed -e 's/type __*user_regs_struct struct //' -e 's/[{}]//g'`
   regs=`echo $regs | sed -e s'/^ *//'`
Index: libgo/sysinfo.c
===================================================================
--- libgo/sysinfo.c	(revision 249205)
+++ libgo/sysinfo.c	(working copy)
@@ -102,6 +102,9 @@ 
 #if defined(HAVE_LINUX_NETLINK_H)
 #include <linux/netlink.h>
 #endif
+#if defined(HAVE_LINUX_PTRACE_H)
+#include <linux/ptrace.h>
+#endif
 #if defined(HAVE_LINUX_RTNETLINK_H)
 #include <linux/rtnetlink.h>
 #endif