PERFORCE change 49942 for review
Marcel Moolenaar
marcel at FreeBSD.org
Mon Mar 29 22:53:13 PST 2004
http://perforce.freebsd.org/chv.cgi?CH=49942
Change 49942 by marcel at marcel_nfs on 2004/03/29 22:53:04
Add kdb_jmpbuf(). Backends use this function to "install"
a jmp_buf. The function returns the previous jmp_buf. When
the trappable code has completed, the previous jmp_buf
can be restored by calling kdb_jmpbuf() again.
In trap(), test early for traps from within the debugger.
Do not print the trap information. Just call kdb_trap()
where recursion is handled by doing a longjmp() for the
most recent jmp_buf.
Protect memory accesses in gdb_tx_mem() with a jmp_buf.
Affected files ...
.. //depot/projects/gdb/sys/gdb/gdb_int.h#6 edit
.. //depot/projects/gdb/sys/gdb/gdb_packet.c#9 edit
.. //depot/projects/gdb/sys/i386/i386/trap.c#7 edit
.. //depot/projects/gdb/sys/ia64/ia64/trap.c#6 edit
.. //depot/projects/gdb/sys/kern/subr_kdb.c#10 edit
.. //depot/projects/gdb/sys/sys/kdb.h#8 edit
Differences ...
==== //depot/projects/gdb/sys/gdb/gdb_int.h#6 (text+ko) ====
@@ -54,7 +54,7 @@
void gdb_tx_begin(char);
int gdb_tx_end(void);
-void gdb_tx_mem(const unsigned char *, size_t);
+int gdb_tx_mem(const unsigned char *, size_t);
void gdb_tx_reg(int);
static __inline void
==== //depot/projects/gdb/sys/gdb/gdb_packet.c#9 (text+ko) ====
@@ -30,6 +30,7 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/ctype.h>
+#include <sys/kdb.h>
#include <machine/gdb_machdep.h>
@@ -224,15 +225,24 @@
return (0);
}
-void
+int
gdb_tx_mem(const unsigned char *addr, size_t size)
{
+ void *prev;
+ jmp_buf jb;
+ int ret;
- while (size-- > 0) {
- *gdb_txp++ = N2C(*addr >> 4);
- *gdb_txp++ = N2C(*addr & 0x0f);
- addr++;
+ prev = kdb_jmpbuf(jb);
+ ret = setjmp(jb);
+ if (ret == 0) {
+ while (size-- > 0) {
+ *gdb_txp++ = N2C(*addr >> 4);
+ *gdb_txp++ = N2C(*addr & 0x0f);
+ addr++;
+ }
}
+ (void)kdb_jmpbuf(prev);
+ return ((ret == 0) ? 1 : 0);
}
void
==== //depot/projects/gdb/sys/i386/i386/trap.c#7 (text+ko) ====
@@ -46,7 +46,6 @@
#include "opt_clock.h"
#include "opt_cpu.h"
-#include "opt_ddb.h"
#include "opt_isa.h"
#include "opt_ktrace.h"
#include "opt_npx.h"
@@ -55,10 +54,10 @@
#include <sys/param.h>
#include <sys/bus.h>
#include <sys/systm.h>
-#include <sys/kdb.h>
#include <sys/proc.h>
#include <sys/pioctl.h>
#include <sys/ptrace.h>
+#include <sys/kdb.h>
#include <sys/kernel.h>
#include <sys/ktr.h>
#include <sys/lock.h>
@@ -97,8 +96,6 @@
#include <machine/clock.h>
#endif
-#include <ddb/ddb.h>
-
extern void trap(struct trapframe frame);
#ifdef I386_CPU
extern int trapwrite(unsigned addr);
@@ -148,10 +145,10 @@
extern int has_f00f_bug;
#endif
-#ifdef DDB
-static int ddb_on_nmi = 1;
-SYSCTL_INT(_machdep, OID_AUTO, ddb_on_nmi, CTLFLAG_RW,
- &ddb_on_nmi, 0, "Go to DDB on NMI");
+#ifdef KDB
+static int kdb_on_nmi = 1;
+SYSCTL_INT(_machdep, OID_AUTO, kdb_on_nmi, CTLFLAG_RW,
+ &kdb_on_nmi, 0, "Go to KDB on NMI");
#endif
static int panic_on_nmi = 1;
SYSCTL_INT(_machdep, OID_AUTO, panic_on_nmi, CTLFLAG_RW,
@@ -191,9 +188,8 @@
td->td_last_frame = &frame;
#ifdef KDB
- if (kdb_active) {
- eva = (type == T_PAGEFLT ? rcr2() : 0);
- trap_fatal(&frame, eva);
+ if (kdb_active && type == T_PAGEFLT) {
+ kdb_trap(type, 0, &frame);
goto out;
}
#endif
@@ -365,16 +361,16 @@
/* machine/parity/power fail/"kitchen sink" faults */
/* XXX Giant */
if (isa_nmi(code) == 0) {
-#ifdef DDB
+#ifdef KDB
/*
* NMI can be hooked up to a pushbutton
* for debugging.
*/
- if (ddb_on_nmi) {
+ if (kdb_on_nmi) {
printf ("NMI ... going to debugger\n");
- kdb_trap (type, 0, &frame);
+ kdb_trap(type, 0, &frame);
}
-#endif /* DDB */
+#endif /* KDB */
goto userout;
} else if (panic_on_nmi)
panic("NMI indicates hardware failure");
@@ -573,12 +569,12 @@
*/
case T_BPTFLT:
/*
- * If DDB is enabled, let it handle the debugger trap.
+ * If KDB is enabled, let it handle the debugger trap.
* Otherwise, debugger traps "can't happen".
*/
-#ifdef DDB
+#ifdef KDB
/* XXX Giant */
- if (kdb_trap (type, 0, &frame))
+ if (kdb_trap(type, 0, &frame))
goto out;
#endif
break;
@@ -598,16 +594,16 @@
/* XXX Giant */
/* machine/parity/power fail/"kitchen sink" faults */
if (isa_nmi(code) == 0) {
-#ifdef DDB
+#ifdef KDB
/*
* NMI can be hooked up to a pushbutton
* for debugging.
*/
- if (ddb_on_nmi) {
+ if (kdb_on_nmi) {
printf ("NMI ... going to debugger\n");
- kdb_trap (type, 0, &frame);
+ kdb_trap(type, 0, &frame);
}
-#endif /* DDB */
+#endif /* KDB */
goto out;
} else if (panic_on_nmi == 0)
goto out;
@@ -809,7 +805,7 @@
}
#ifdef KDB
- if ((debugger_on_panic || kdb_active) && kdb_trap(type, 0, frame))
+ if (kdb_trap(type, 0, frame))
return;
#endif
printf("trap number = %d\n", type);
==== //depot/projects/gdb/sys/ia64/ia64/trap.c#6 (text+ko) ====
@@ -76,10 +76,6 @@
#include <sys/ktrace.h>
#endif
-#ifdef DDB
-#include <ddb/ddb.h>
-#endif
-
static int print_usertrap = 0;
SYSCTL_INT(_machdep, OID_AUTO, print_usertrap,
CTLFLAG_RW, &print_usertrap, 0, "");
@@ -378,6 +374,10 @@
sticks = 0; /* XXX bogus -Wuninitialized warning */
KASSERT(cold || td->td_ucred != NULL,
("kernel trap doesn't have ucred"));
+#ifdef KDB
+ if (kdb_active && vector == IA64_VEC_PAGE_NOT_PRESENT)
+ kdb_trap(vector, 0, tf);
+#endif
}
sig = 0;
==== //depot/projects/gdb/sys/kern/subr_kdb.c#10 (text+ko) ====
@@ -38,6 +38,7 @@
#include <machine/kdb.h>
int kdb_active = 0;
+void *kdb_jmpbufp = NULL;
struct kdb_dbbe *kdb_dbbe = NULL;
struct thread *kdb_thread = NULL;
struct trapframe *kdb_frame = NULL;
@@ -102,6 +103,20 @@
}
/*
+ * Handle contexts.
+ */
+
+void *
+kdb_jmpbuf(jmp_buf new)
+{
+ void *old;
+
+ old = kdb_jmpbufp;
+ kdb_jmpbufp = new;
+ return (old);
+}
+
+/*
* Enter the currently selected debugger. If a message has been provided,
* it is printed first. If the debugger does not support the enter method,
* it is entered by using breakpoint(), which enters the debugger through
@@ -112,7 +127,7 @@
kdb_enter(const char *msg)
{
- if (kdb_dbbe != NULL) {
+ if (kdb_dbbe != NULL && kdb_active == 0) {
if (msg != NULL)
printf("KDB: enter: %s\n", msg);
breakpoint();
@@ -189,6 +204,12 @@
critical_enter();
+ /* Check for recursion. */
+ if (kdb_active && kdb_jmpbufp != NULL) {
+ critical_exit();
+ longjmp(kdb_jmpbufp, 1);
+ }
+
kdb_active++;
kdb_thread = curthread;
kdb_frame = tf;
==== //depot/projects/gdb/sys/sys/kdb.h#8 (text+ko) ====
@@ -29,6 +29,8 @@
#ifndef _SYS_KDB_H_
#define _SYS_KDB_H_
+#include <machine/setjmp.h>
+
typedef int dbbe_init_f(void);
typedef void dbbe_trace_f(void);
typedef int dbbe_trap_f(int, int);
@@ -62,6 +64,7 @@
void kdb_backtrace(void);
void kdb_enter(const char *);
void kdb_init(void);
+void * kdb_jmpbuf(jmp_buf);
int kdb_set_thread(pid_t);
int kdb_trap(int, int, struct trapframe *);
More information about the p4-projects
mailing list