Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 Jul 2011 17:32:23 +1000 (EST)
From:      Peter Jeremy <peterjeremy@acm.org>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   gnu/158719: [patch] Fix kgdb on sparc64
Message-ID:  <201107080732.p687WNRw090826@server.vk2pj.dyndns.org>
Resent-Message-ID: <201107080740.p687e1GP095747@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         158719
>Category:       gnu
>Synopsis:       [patch] Fix kgdb on sparc64
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Jul 08 07:40:01 UTC 2011
>Closed-Date:
>Last-Modified:
>Originator:     Peter Jeremy
>Release:        FreeBSD 8.2-STABLE amd64
>Organization:
n/a
>Environment:
System: FreeBSD sb1500.vk2pj.dyndns.org 9.0-CURRENT FreeBSD 9.0-CURRENT #1: Wed\
 Jun 22 17:53:58 EST 2011 root@sb1500.vk2pj.dyndns.org:/usr/obj/usr/src/sys/sb1\
500 sparc64

Patch also tested on: FreeBSD server.vk2pj.dyndns.org 8.2-STABLE FreeBSD 8.2-STABLE #11: Fri Apr 22 11:55:58 EST 2011 root@server.vk2pj.dyndns.org:/var/obj/usr/src/sys/server amd64

>Description:
	kgdb does not work on sparc64.  Following some investigation,
	the problem is that the sparc64 kgdb has two "core_stratum"
	target_ops structures active - the default "Local core dump file"
	defined in contrib/gdb/gdb/corelow.c and the FreeBSD-specific
	"kernel core dump file" defined in gnu/usr.bin/gdb/kgdb/trgt.c

	On at least i386 and amd64, the "Local core dump file" is
	inhibited by statically defining coreops_suppress_target as
	non-zero in gnu/usr.bin/gdb/libgdb/fbsd-threads.c (this file
	defines "FreeBSD multithreaded core dump file" target_ops
	which is itself inhibited by fbsdcoreops_suppress_target in
	gnu/usr.bin/gdb/kgdb/trgt.c).

	sparc64 does not include fbsd-threads.c and therefore
	the "Local core dump file" is not inhibited.  As a result,
	contrib/gdb/gdb/target.c::find_core_target() finds multiple
	targets and returns NULL.

	Note that it's possible that similar problems exist on other
	architectures.

>How-To-Repeat:
	Run "kgdb /boot/kernel/kernel /dev/mem" as root on sparc64.
	It will report "GDB can't read core files on this machine."

>Fix:
	It's not possible to directly inhibit the "Local core dump file"
	by defining coreops_suppress_target in trgt.c because that
	results in a duplicate definition on (eg) amd64.  Likewise a
	weak DATA symbol does not override a strong BSS symbol.

	The following patch therefore defines coreops_suppress_target
	in a file that is only active on sparc64 kgdb.

Index: gnu/usr.bin/gdb/kgdb/trgt_sparc64.c
===================================================================
RCS file: /usr/ncvs/src/gnu/usr.bin/gdb/kgdb/trgt_sparc64.c,v
retrieving revision 1.8
diff -u -r1.8 trgt_sparc64.c
--- gnu/usr.bin/gdb/kgdb/trgt_sparc64.c	1 May 2008 20:36:48 -0000	1.8
+++ gnu/usr.bin/gdb/kgdb/trgt_sparc64.c	8 Jul 2011 06:17:55 -0000
@@ -197,3 +197,9 @@
 	/* printf("%s: %lx =%s\n", __func__, pc, pname); */
 	return (NULL);
 }
+/* 
+** Disable the default "Local core dump file" target.  This is done in
+** libgdb/fbsd-threads.c for most targets but that file is not used on
+** sparc64
+*/
+int coreops_suppress_target = 1;
>Release-Note:
>Audit-Trail:
>Unformatted:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201107080732.p687WNRw090826>