From owner-p4-projects@FreeBSD.ORG Sun Apr 4 11:02:23 2004 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 9665516A4D1; Sun, 4 Apr 2004 11:02:23 -0700 (PDT) Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 706E516A4CE for ; Sun, 4 Apr 2004 11:02:23 -0700 (PDT) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 51FE743D5D for ; Sun, 4 Apr 2004 11:02:23 -0700 (PDT) (envelope-from marcel@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.12.10/8.12.10) with ESMTP id i34I2NGe080424 for ; Sun, 4 Apr 2004 11:02:23 -0700 (PDT) (envelope-from marcel@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.12.10/8.12.10/Submit) id i34I2MQG080418 for perforce@freebsd.org; Sun, 4 Apr 2004 11:02:22 -0700 (PDT) (envelope-from marcel@freebsd.org) Date: Sun, 4 Apr 2004 11:02:22 -0700 (PDT) Message-Id: <200404041802.i34I2MQG080418@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to marcel@freebsd.org using -f From: Marcel Moolenaar To: Perforce Change Reviews Subject: PERFORCE change 50340 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 04 Apr 2004 18:02:24 -0000 http://perforce.freebsd.org/chv.cgi?CH=50340 Change 50340 by marcel@marcel_nfs on 2004/04/04 11:01:35 Make backtraces work on sparc64. Note that continuing does not work yet, because we need to increment the PC. Now we simply re-execute the "ta" instruction again and reenter the debugger. Affected files ... .. //depot/projects/gdb/sys/sparc64/include/gdb_machdep.h#4 edit .. //depot/projects/gdb/sys/sparc64/sparc64/gdb_machdep.c#4 edit .. //depot/projects/gdb/sys/sparc64/sparc64/trap.c#4 edit Differences ... ==== //depot/projects/gdb/sys/sparc64/include/gdb_machdep.h#4 (text+ko) ==== @@ -30,13 +30,13 @@ #define _MACHINE_GDB_MACHDEP_H_ #define GDB_BUFSZ 600 -#define GDB_NREGS 462 +#define GDB_NREGS 86 #define GDB_REG_PC 80 static __inline size_t gdb_cpu_regsz(int regnum) { - return (sizeof(long)); /* XXX not really. */ + return ((regnum >= 32 && regnum < 64) ? sizeof(float) : sizeof(long)); } static __inline int ==== //depot/projects/gdb/sys/sparc64/sparc64/gdb_machdep.c#4 (text+ko) ==== @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -41,9 +42,36 @@ void * gdb_cpu_getreg(int regnum, size_t *regsz) { + struct trapframe *tf = kdb_frame; *regsz = gdb_cpu_regsz(regnum); switch (regnum) { + case 0: return (&tf->tf_global[0]); + case 1: return (&tf->tf_global[1]); + case 2: return (&tf->tf_global[2]); + case 3: return (&tf->tf_global[3]); + case 4: return (&tf->tf_global[4]); + case 5: return (&tf->tf_global[5]); + case 6: return (&tf->tf_global[6]); + case 7: return (&tf->tf_global[7]); + /* 8-15: o0-o7 */ + /* 16-23: l0-l7 */ + case 24: return (&tf->tf_out[0]); + case 25: return (&tf->tf_out[1]); + case 26: return (&tf->tf_out[2]); + case 27: return (&tf->tf_out[3]); + case 28: return (&tf->tf_out[4]); + case 29: return (&tf->tf_out[5]); + case 30: return (&tf->tf_out[6]); + case 31: return (&tf->tf_out[7]); + /* 32-63: f0-f31 */ + /* 64-79: f32-f62 (16 double FP) */ + case 80: return (&tf->tf_tpc); + case 81: return (&tf->tf_tnpc); + case 82: return (&tf->tf_tstate); + case 83: return (&tf->tf_fsr); + case 84: return (&tf->tf_fprs); + case 85: return (&tf->tf_y); } return (NULL); } ==== //depot/projects/gdb/sys/sparc64/sparc64/trap.c#4 (text+ko) ==== @@ -242,6 +242,7 @@ (TRAPF_USERMODE(tf) ? "user" : "kernel"), rdpr(pil)); atomic_add_int(&cnt.v_trap, 1); + td->td_last_frame = tf; if ((tf->tf_tstate & TSTATE_PRIV) == 0) { KASSERT(td != NULL, ("trap: curthread NULL")); @@ -515,6 +516,7 @@ sticks = td->td_sticks; td->td_frame = tf; + td->td_last_frame = tf; if (td->td_ucred != p->p_ucred) cred_update_thread(td); if (p->p_flag & P_SA)