Module Name: src
Committed By: rmind
Date: Sat Jun 30 23:33:10 UTC 2012
Modified Files:
src/sys/arch/amd64/amd64: trap.c
src/sys/arch/i386/i386: trap.c
Log Message:
trap: move out info printing to trap_print() on amd64, reduce the differences
between amd64 and i386, add lowest kernel stack address.
To generate a diff of this commit:
cvs rdiff -u -r1.71 -r1.72 src/sys/arch/amd64/amd64/trap.c
cvs rdiff -u -r1.263 -r1.264 src/sys/arch/i386/i386/trap.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/amd64/amd64/trap.c
diff -u src/sys/arch/amd64/amd64/trap.c:1.71 src/sys/arch/amd64/amd64/trap.c:1.72
--- src/sys/arch/amd64/amd64/trap.c:1.71 Tue May 22 21:14:37 2012
+++ src/sys/arch/amd64/amd64/trap.c Sat Jun 30 23:33:10 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.71 2012/05/22 21:14:37 dsl Exp $ */
+/* $NetBSD: trap.c,v 1.72 2012/06/30 23:33:10 rmind Exp $ */
/*-
* Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.71 2012/05/22 21:14:37 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.72 2012/06/30 23:33:10 rmind Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@@ -184,6 +184,27 @@ onfault_handler(const struct pcb *pcb, c
return NULL;
}
+static void
+trap_print(const struct trapframe *frame, const lwp_t *l)
+{
+ const int type = frame->tf_trapno;
+
+ if (frame->tf_trapno < trap_types) {
+ printf("fatal %s", trap_type[type]);
+ } else {
+ printf("unknown trap %d", type);
+ }
+ printf(" in %s mode\n", (type & T_USER) ? "user" : "supervisor");
+
+ printf("trap type %d code %lx rip %lx cs %lx rflags %lx cr2 %lx "
+ "ilevel %x rsp %lx\n",
+ type, frame->tf_err, (u_long)frame->tf_rip, frame->tf_cs,
+ frame->tf_rflags, rcr2(), curcpu()->ci_ilevel, frame->tf_rsp);
+
+ printf("curlwp %p pid %d lid %d lowest kstack %p\n",
+ l, l->l_proc->p_pid, l->l_lid, KSTACK_LOWEST_ADDR(l));
+}
+
/*
* trap(frame): exception, fault, and trap interface to BSD kernel.
*
@@ -192,7 +213,6 @@ onfault_handler(const struct pcb *pcb, c
* exception has been processed. Note that the effect is as if the arguments
* were passed call by reference.
*/
-
void
trap(struct trapframe *frame)
{
@@ -226,13 +246,7 @@ trap(struct trapframe *frame)
#ifdef DEBUG
if (trapdebug) {
- printf("trap %d code %lx eip %lx cs %lx rflags %lx cr2 %lx "
- "cpl %x\n",
- type, frame->tf_err, frame->tf_rip, frame->tf_cs,
- frame->tf_rflags, rcr2(), curcpu()->ci_ilevel);
- printf("curlwp %p%s", curlwp, curlwp ? " " : "\n");
- if (curlwp)
- printf("pid %d lid %d\n", l->l_proc->p_pid, l->l_lid);
+ trap_print(frame, l);
}
#endif
if (type != T_NMI && !KERNELMODE(frame->tf_cs, frame->tf_rflags)) {
@@ -266,15 +280,8 @@ trap(struct trapframe *frame)
default:
we_re_toast:
- if (frame->tf_trapno < trap_types)
- printf("fatal %s", trap_type[frame->tf_trapno]);
- else
- printf("unknown trap %ld", (u_long)frame->tf_trapno);
- printf(" in %s mode\n", (type & T_USER) ? "user" : "supervisor");
- printf("trap type %d code %lx rip %lx cs %lx rflags %lx cr2 "
- " %lx cpl %x rsp %lx\n",
- type, frame->tf_err, (u_long)frame->tf_rip, frame->tf_cs,
- frame->tf_rflags, rcr2(), curcpu()->ci_ilevel, frame->tf_rsp);
+ trap_print(frame, l);
+
if (kdb_trap(type, 0, frame))
return;
if (kgdb_trap(type, frame))
Index: src/sys/arch/i386/i386/trap.c
diff -u src/sys/arch/i386/i386/trap.c:1.263 src/sys/arch/i386/i386/trap.c:1.264
--- src/sys/arch/i386/i386/trap.c:1.263 Sun Feb 19 21:06:11 2012
+++ src/sys/arch/i386/i386/trap.c Sat Jun 30 23:33:10 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.263 2012/02/19 21:06:11 rmind Exp $ */
+/* $NetBSD: trap.c,v 1.264 2012/06/30 23:33:10 rmind Exp $ */
/*-
* Copyright (c) 1998, 2000, 2005, 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.263 2012/02/19 21:06:11 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.264 2012/06/30 23:33:10 rmind Exp $");
#include "opt_ddb.h"
#include "opt_kgdb.h"
@@ -262,16 +262,24 @@ onfault_handler(const struct pcb *pcb, c
}
static void
-trap_print(int type, struct trapframe *frame)
+trap_print(const struct trapframe *frame, const lwp_t *l)
{
- if (frame->tf_trapno < trap_types)
- printf("fatal %s", trap_type[frame->tf_trapno]);
- else
- printf("unknown trap %d", frame->tf_trapno);
+ const int type = frame->tf_trapno;
+
+ if (frame->tf_trapno < trap_types) {
+ printf("fatal %s", trap_type[type]);
+ } else {
+ printf("unknown trap %d", type);
+ }
printf(" in %s mode\n", (type & T_USER) ? "user" : "supervisor");
- printf("trap type %d code %x eip %x cs %x eflags %x cr2 %lx ilevel %x\n",
- type, frame->tf_err, frame->tf_eip, frame->tf_cs,
- frame->tf_eflags, (long)rcr2(), curcpu()->ci_ilevel);
+
+ printf("trap type %d code %x eip %x cs %x eflags %x cr2 %lx "
+ "ilevel %x esp %x\n",
+ type, frame->tf_err, frame->tf_eip, frame->tf_cs, frame->tf_eflags,
+ (long)rcr2(), curcpu()->ci_ilevel, frame->tf_esp);
+
+ printf("curlwp %p pid %d lid %d lowest kstack %p\n",
+ l, l->l_proc->p_pid, l->l_lid, KSTACK_LOWEST_ADDR(l));
}
static void
@@ -329,12 +337,7 @@ trap(struct trapframe *frame)
#ifdef DEBUG
if (trapdebug) {
- printf("trap %d code %x eip %x cs %x eflags %x cr2 %lx cpl %x\n",
- type, frame->tf_err, frame->tf_eip, frame->tf_cs,
- frame->tf_eflags, rcr2(), curcpu()->ci_ilevel);
- printf("curlwp %p%s", curlwp, curlwp ? " " : "\n");
- if (curlwp)
- printf("pid %d lid %d\n", l->l_proc->p_pid, l->l_lid);
+ trap_print(frame, l);
}
#endif
if (type != T_NMI && !KVM86MODE &&
@@ -379,7 +382,8 @@ trap(struct trapframe *frame)
if (type == T_TRCTRAP)
check_dr0();
else
- trap_print(type, frame);
+ trap_print(frame, l);
+
if (kdb_trap(type, 0, frame))
return;
if (kgdb_trap(type, frame))