Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Oct 2008 21:31:14 +0000 (UTC)
From:      Marius Strobl <marius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r184376 - in head/sys: sparc64/sparc64 sun4v/sun4v
Message-ID:  <200810272131.m9RLVERs053735@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marius
Date: Mon Oct 27 21:31:14 2008
New Revision: 184376
URL: http://svn.freebsd.org/changeset/base/184376

Log:
  - In GCC 4.2 __builtin_frame_address() was fixed to include the
    V9 stack bias so we no longer need to add it in db_backtrace()
    and stack_capture() respectively. This also reverts r182018,
    which kludged around the resulting unaligned access.
  - Sync the sun4v versions of db_trace.c and stack_machdep.c with
    the sparc64 ones and fix some style bugs.
  
  MFC after:	3 days

Modified:
  head/sys/sparc64/sparc64/db_trace.c
  head/sys/sparc64/sparc64/stack_machdep.c
  head/sys/sun4v/sun4v/db_trace.c
  head/sys/sun4v/sun4v/stack_machdep.c

Modified: head/sys/sparc64/sparc64/db_trace.c
==============================================================================
--- head/sys/sparc64/sparc64/db_trace.c	Mon Oct 27 21:24:34 2008	(r184375)
+++ head/sys/sparc64/sparc64/db_trace.c	Mon Oct 27 21:31:14 2008	(r184376)
@@ -276,10 +276,9 @@ db_backtrace(struct thread *td, struct f
 void
 db_trace_self(void)
 {
-	db_expr_t addr;
 
-	addr = (db_expr_t)__builtin_frame_address(1);
-	db_backtrace(curthread, (struct frame *)(addr + SPOFF), -1);
+	db_backtrace(curthread,
+	    (struct frame *)__builtin_frame_address(1), -1);
 }
 
 int
@@ -288,5 +287,6 @@ db_trace_thread(struct thread *td, int c
 	struct pcb *ctx;
 
 	ctx = kdb_thr_ctx(td);
-	return (db_backtrace(td, (struct frame*)(ctx->pcb_sp + SPOFF), count));
+	return (db_backtrace(td,
+	    (struct frame *)(ctx->pcb_sp + SPOFF), count));
 }

Modified: head/sys/sparc64/sparc64/stack_machdep.c
==============================================================================
--- head/sys/sparc64/sparc64/stack_machdep.c	Mon Oct 27 21:24:34 2008	(r184375)
+++ head/sys/sparc64/sparc64/stack_machdep.c	Mon Oct 27 21:31:14 2008	(r184376)
@@ -28,31 +28,24 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
-#include <sys/endian.h>
 #include <sys/proc.h>
 #include <sys/stack.h>
 #include <sys/systm.h>
 
-#include <vm/vm.h>
-#include <vm/vm_page.h>
-#include <vm/vm_map.h>
-
-#include <machine/cpu.h>
 #include <machine/pcb.h>
 #include <machine/stack.h>
-#include <machine/trap.h>
 #include <machine/vmparam.h>
 
+static void stack_capture(struct stack *st, struct frame *fp);
+
 static void
-stack_capture(struct stack *st, uint64_t addr)
+stack_capture(struct stack *st, struct frame *fp)
 {
 	vm_offset_t callpc;
 
 	stack_zero(st);
 	while (1) {
-		addr += SPOFF;
-		callpc =
-		    be64dec((void *)(addr + offsetof(struct frame, fr_pc)));
+		callpc = fp->fr_pc;
 		if (!INKERNEL(callpc))
 			break;
 		/* Don't bother traversing trap frames. */
@@ -63,30 +56,25 @@ stack_capture(struct stack *st, uint64_t
 			break;
 		if (stack_put(st, callpc) == -1)
 			break;
-		addr =
-		    be64dec((void *)(addr + offsetof(struct frame, fr_fp)));
+		fp = v9next_frame(fp);
 	}
 }
 
 void
 stack_save_td(struct stack *st, struct thread *td)
 {
-	uint64_t addr;
 
 	if (TD_IS_SWAPPED(td))
 		panic("stack_save_td: swapped");
 	if (TD_IS_RUNNING(td))
 		panic("stack_save_td: running");
 
-	addr = td->td_pcb->pcb_sp;
-	stack_capture(st, addr);
+	stack_capture(st, (struct frame *)(td->td_pcb->pcb_sp + SPOFF));
 }
 
 void
 stack_save(struct stack *st)
 {
-	uint64_t addr;
 
-	addr = (uint64_t)__builtin_frame_address(1);
-	stack_capture(st, addr);
+	stack_capture(st, (struct frame *)__builtin_frame_address(1));
 }

Modified: head/sys/sun4v/sun4v/db_trace.c
==============================================================================
--- head/sys/sun4v/sun4v/db_trace.c	Mon Oct 27 21:24:34 2008	(r184375)
+++ head/sys/sun4v/sun4v/db_trace.c	Mon Oct 27 21:31:14 2008	(r184376)
@@ -22,10 +22,11 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- *
- * $FreeBSD$
  */
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kdb.h>
@@ -241,7 +242,6 @@ db_backtrace(struct thread *td, struct f
 	db_addr_t pc;
 	int trap;
 	int user;
-	int quit;
 
 	if (count == -1)
 		count = 1024;
@@ -249,7 +249,6 @@ db_backtrace(struct thread *td, struct f
 	trap = 0;
 	user = 0;
 	npc = 0;
-	quit = 0;
 	while (count-- && !user && !db_pager_quit) {
 		pc = (db_addr_t)db_get_value((db_addr_t)&fp->fr_pc,
 		    sizeof(fp->fr_pc), FALSE);
@@ -288,10 +287,9 @@ db_backtrace(struct thread *td, struct f
 void
 db_trace_self(void)
 {
-	db_expr_t addr;
 
-	addr = (db_expr_t)__builtin_frame_address(1);
-	db_backtrace(curthread, (struct frame *)(addr + SPOFF), -1);
+	db_backtrace(curthread,
+	    (struct frame *)__builtin_frame_address(1), -1);
 }
 
 int
@@ -300,5 +298,6 @@ db_trace_thread(struct thread *td, int c
 	struct pcb *ctx;
 
 	ctx = kdb_thr_ctx(td);
-	return (db_backtrace(td, (struct frame*)(ctx->pcb_sp + SPOFF), count));
+	return (db_backtrace(td,
+	    (struct frame *)(ctx->pcb_sp + SPOFF), count));
 }

Modified: head/sys/sun4v/sun4v/stack_machdep.c
==============================================================================
--- head/sys/sun4v/sun4v/stack_machdep.c	Mon Oct 27 21:24:34 2008	(r184375)
+++ head/sys/sun4v/sun4v/stack_machdep.c	Mon Oct 27 21:31:14 2008	(r184376)
@@ -32,54 +32,43 @@ __FBSDID("$FreeBSD$");
 #include <sys/stack.h>
 #include <sys/systm.h>
 
-#include <vm/vm.h>
-#include <vm/vm_page.h>
-#include <vm/vm_map.h>
-
-#include <machine/cpu.h>
 #include <machine/pcb.h>
 #include <machine/stack.h>
-#include <machine/trap.h>
 #include <machine/vmparam.h>
 
+static void stack_capture(struct stack *st, struct frame *fp);
+
 static void
-stack_capture(struct stack *st, uint64_t addr)
+stack_capture(struct stack *st, struct frame *fp)
 {
-	struct frame *fp;
 	vm_offset_t callpc;
 
 	stack_zero(st);
-	fp = (struct frame *)(addr + SPOFF);
 	while (1) {
 		callpc = fp->fr_pc;
 		if (!INKERNEL(callpc))
 			break;
 		if (stack_put(st, callpc) == -1)
 			break;
-		fp = (struct frame *)(fp->fr_fp + SPOFF);
+		fp = v9next_frame(fp);
 	}
-
 }
 
 void
 stack_save_td(struct stack *st, struct thread *td)
 {
-	uint64_t addr;
 
 	if (TD_IS_SWAPPED(td))
 		panic("stack_save_td: swapped");
 	if (TD_IS_RUNNING(td))
 		panic("stack_save_td: running");
 
-	addr = td->td_pcb->pcb_sp;
-	stack_capture(st, addr);
+	stack_capture(st, (struct frame *)(td->td_pcb->pcb_sp + SPOFF));
 }
 
 void
 stack_save(struct stack *st)
 {
-	uint64_t addr;
 
-	addr = (uint64_t)__builtin_frame_address(1);
-	stack_capture(st, addr);
+	stack_capture(st, (struct frame *)__builtin_frame_address(1));
 }



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