Module Name: src Committed By: chs Date: Sun Mar 21 00:10:15 UTC 2010
Modified Files: src/sys/arch/arm/arm32: fault.c src/sys/arch/powerpc/powerpc: trap.c Log Message: assert that pcb_onfault is NULL in places where it should be. To generate a diff of this commit: cvs rdiff -u -r1.75 -r1.76 src/sys/arch/arm/arm32/fault.c cvs rdiff -u -r1.133 -r1.134 src/sys/arch/powerpc/powerpc/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/arm/arm32/fault.c diff -u src/sys/arch/arm/arm32/fault.c:1.75 src/sys/arch/arm/arm32/fault.c:1.76 --- src/sys/arch/arm/arm32/fault.c:1.75 Wed Feb 3 13:51:00 2010 +++ src/sys/arch/arm/arm32/fault.c Sun Mar 21 00:10:14 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: fault.c,v 1.75 2010/02/03 13:51:00 wiz Exp $ */ +/* $NetBSD: fault.c,v 1.76 2010/03/21 00:10:14 chs Exp $ */ /* * Copyright 2003 Wasabi Systems, Inc. @@ -82,7 +82,7 @@ #include "opt_sa.h" #include <sys/types.h> -__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.75 2010/02/03 13:51:00 wiz Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.76 2010/03/21 00:10:14 chs Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -868,6 +868,7 @@ } #endif + KASSERT(pcb->pcb_onfault == NULL); error = uvm_fault(map, va, VM_PROT_READ); #ifdef KERN_SA Index: src/sys/arch/powerpc/powerpc/trap.c diff -u src/sys/arch/powerpc/powerpc/trap.c:1.133 src/sys/arch/powerpc/powerpc/trap.c:1.134 --- src/sys/arch/powerpc/powerpc/trap.c:1.133 Thu Feb 25 23:31:48 2010 +++ src/sys/arch/powerpc/powerpc/trap.c Sun Mar 21 00:10:14 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.133 2010/02/25 23:31:48 matt Exp $ */ +/* $NetBSD: trap.c,v 1.134 2010/03/21 00:10:14 chs Exp $ */ /* * Copyright (C) 1995, 1996 Wolfgang Solfrank. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.133 2010/02/25 23:31:48 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.134 2010/03/21 00:10:14 chs Exp $"); #include "opt_altivec.h" #include "opt_ddb.h" @@ -84,7 +84,6 @@ struct proc *p = l ? l->l_proc : NULL; struct pcb *pcb = curpcb; struct vm_map *map; - struct faultbuf *onfault; ksiginfo_t ksi; int type = frame->exc; int ftype, rv; @@ -121,7 +120,9 @@ case EXC_DSI: { struct faultbuf *fb; vaddr_t va = frame->dar; + ci->ci_ev_kdsi.ev_count++; + fb = pcb->pcb_onfault; /* * Only query UVM if no interrupts are active. @@ -169,10 +170,9 @@ else ftype = VM_PROT_READ; - onfault = pcb->pcb_onfault; pcb->pcb_onfault = NULL; rv = uvm_fault(map, trunc_page(va), ftype); - pcb->pcb_onfault = onfault; + pcb->pcb_onfault = fb; if (map != kernel_map) { /* @@ -193,7 +193,7 @@ */ rv = EFAULT; } - if ((fb = pcb->pcb_onfault) != NULL) { + if (fb != NULL) { frame->srr0 = fb->fb_pc; frame->fixreg[1] = fb->fb_sp; frame->fixreg[2] = fb->fb_r2; @@ -241,6 +241,7 @@ l->l_savp->savp_faultaddr = (vaddr_t)frame->dar; l->l_pflag |= LP_SA_PAGEFAULT; } + KASSERT(pcb->pcb_onfault == NULL); rv = uvm_fault(map, trunc_page(frame->dar), ftype); if (rv == 0) { /* @@ -311,6 +312,7 @@ l->l_pflag |= LP_SA_PAGEFAULT; } ftype = VM_PROT_EXECUTE; + KASSERT(pcb->pcb_onfault == NULL); rv = uvm_fault(map, trunc_page(frame->srr0), ftype); if (rv == 0) { l->l_pflag &= ~LP_SA_PAGEFAULT;