Module Name: src Committed By: chs Date: Wed Jul 7 01:15:35 UTC 2010
Modified Files: src/sys/arch/amd64/amd64: trap.c Log Message: clean up the check for tracing into a syscall handler. To generate a diff of this commit: cvs rdiff -u -r1.62 -r1.63 src/sys/arch/amd64/amd64/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.62 src/sys/arch/amd64/amd64/trap.c:1.63 --- src/sys/arch/amd64/amd64/trap.c:1.62 Fri Apr 23 19:18:09 2010 +++ src/sys/arch/amd64/amd64/trap.c Wed Jul 7 01:15:34 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.62 2010/04/23 19:18:09 rmind Exp $ */ +/* $NetBSD: trap.c,v 1.63 2010/07/07 01:15:34 chs 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.62 2010/04/23 19:18:09 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.63 2010/07/07 01:15:34 chs Exp $"); #include "opt_ddb.h" #include "opt_kgdb.h" @@ -197,6 +197,7 @@ * exception has been processed. Note that the effect is as if the arguments * were passed call by reference. */ + void trap(struct trapframe *frame) { @@ -206,6 +207,8 @@ extern char fusuintrfailure[], kcopy_fault[], resume_iret[]; extern char IDTVEC(oosyscall)[]; + extern char IDTVEC(osyscall)[]; + extern char IDTVEC(syscall32)[]; #if 0 extern char resume_pop_ds[], resume_pop_es[]; #endif @@ -642,9 +645,9 @@ case T_TRCTRAP: /* Check whether they single-stepped into a lcall. */ - if (frame->tf_rip == (int)IDTVEC(oosyscall)) - return; - if (frame->tf_rip == (int)IDTVEC(oosyscall) + 1) { + if (frame->tf_rip == (uint64_t)IDTVEC(oosyscall) || + frame->tf_rip == (uint64_t)IDTVEC(osyscall) || + frame->tf_rip == (uint64_t)IDTVEC(syscall32)) { frame->tf_rflags &= ~PSL_T; return; } @@ -655,6 +658,7 @@ /* * Don't go single-stepping into a RAS. */ + if (p->p_raslist == NULL || (ras_lookup(p, (void *)frame->tf_rip) == (void *)-1)) { KSI_INIT_TRAP(&ksi);