Date: Sun, 4 Apr 2004 11:02:22 -0700 (PDT) From: Marcel Moolenaar <marcel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 50340 for review Message-ID: <200404041802.i34I2MQG080418@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 <sys/param.h> #include <sys/systm.h> +#include <sys/kdb.h> #include <sys/kernel.h> #include <sys/signal.h> @@ -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)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200404041802.i34I2MQG080418>
