diff options
author | Artur Grabowski <art@cvs.openbsd.org> | 2001-09-20 11:57:19 +0000 |
---|---|---|
committer | Artur Grabowski <art@cvs.openbsd.org> | 2001-09-20 11:57:19 +0000 |
commit | 624e32f8c16fadf2a7b72afa6a41835e9c1268f4 (patch) | |
tree | b1a17c46e9aeada1a7fdbf4cddb5355e5b58f87f | |
parent | 6404b4e0d313b4c9cadb0d718b9f53189200db76 (diff) |
Be much more careful about pcb_onfault.
Should solve 2026.
-rw-r--r-- | sys/arch/i386/i386/locore.s | 42 | ||||
-rw-r--r-- | sys/arch/i386/i386/trap.c | 6 |
2 files changed, 27 insertions, 21 deletions
diff --git a/sys/arch/i386/i386/locore.s b/sys/arch/i386/i386/locore.s index d1d21d7b44a..9495db81f3b 100644 --- a/sys/arch/i386/i386/locore.s +++ b/sys/arch/i386/i386/locore.s @@ -1,4 +1,4 @@ -/* $OpenBSD: locore.s,v 1.57 2001/08/26 17:45:00 deraadt Exp $ */ +/* $OpenBSD: locore.s,v 1.58 2001/09/20 11:57:18 art Exp $ */ /* $NetBSD: locore.s,v 1.145 1996/05/03 19:41:19 christos Exp $ */ /*- @@ -862,12 +862,11 @@ ENTRY(memcpy) ENTRY(copyout) pushl %esi pushl %edi - movl _curpcb,%eax - movl $_copy_fault,PCB_ONFAULT(%eax) + pushl $0 - movl 12(%esp),%esi - movl 16(%esp),%edi - movl 20(%esp),%eax + movl 16(%esp),%esi + movl 20(%esp),%edi + movl 24(%esp),%eax /* * We check that the end of the destination buffer is not past the end @@ -932,7 +931,10 @@ ENTRY(copyout) jmp _copy_fault #endif /* I386_CPU */ -3: /* bcopy(%esi, %edi, %eax); */ +3: movl _C_LABEL(curpcb),%edx + movl $_C_LABEL(copy_fault),PCB_ONFAULT(%edx) + + /* bcopy(%esi, %edi, %eax); */ cld movl %eax,%ecx shrl $2,%ecx @@ -942,12 +944,11 @@ ENTRY(copyout) andb $3,%cl rep movsb - xorl %eax,%eax + popl PCB_ONFAULT(%edx) popl %edi popl %esi - movl _curpcb,%edx - movl %eax,PCB_ONFAULT(%edx) + xorl %eax,%eax ret /* @@ -957,12 +958,13 @@ ENTRY(copyout) ENTRY(copyin) pushl %esi pushl %edi - movl _curpcb,%eax - movl $_copy_fault,PCB_ONFAULT(%eax) + movl _C_LABEL(curpcb),%eax + pushl $0 + movl $_C_LABEL(copy_fault),PCB_ONFAULT(%eax) - movl 12(%esp),%esi - movl 16(%esp),%edi - movl 20(%esp),%eax + movl 16(%esp),%esi + movl 20(%esp),%edi + movl 24(%esp),%eax /* * We check that the end of the destination buffer is not past the end @@ -985,19 +987,19 @@ ENTRY(copyin) andb $3,%cl rep movsb - xorl %eax,%eax + movl _C_LABEL(curpcb),%edx + popl PCB_ONFAULT(%edx) popl %edi popl %esi - movl _curpcb,%edx - movl %eax,PCB_ONFAULT(%edx) + xorl %eax,%eax ret ENTRY(copy_fault) + movl _C_LABEL(curpcb),%edx + popl PCB_ONFAULT(%edx) popl %edi popl %esi - movl _curpcb,%edx - movl $0,PCB_ONFAULT(%edx) movl $EFAULT,%eax ret diff --git a/sys/arch/i386/i386/trap.c b/sys/arch/i386/i386/trap.c index 6b0a502f528..4e40a39aae1 100644 --- a/sys/arch/i386/i386/trap.c +++ b/sys/arch/i386/i386/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.42 2001/09/13 14:37:52 art Exp $ */ +/* $OpenBSD: trap.c,v 1.43 2001/09/20 11:57:18 art Exp $ */ /* $NetBSD: trap.c,v 1.95 1996/05/05 06:50:02 mycroft Exp $ */ /*- @@ -184,6 +184,7 @@ trap(frame) int resume; vm_prot_t vftype, ftype; union sigval sv; + caddr_t onfault; uvmexp.traps++; @@ -464,7 +465,10 @@ trap(frame) } } + onfault = p->p_addr->u_pcb.pcb_onfault; + p->p_addr->u_pcb.pcb_onfault = NULL; rv = uvm_fault(map, va, 0, ftype); + p->p_addr->u_pcb.pcb_onfault = onfault; if (rv == KERN_SUCCESS) { if (nss > vm->vm_ssize) vm->vm_ssize = nss; |