diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2013-01-07 22:47:19 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2013-01-07 22:47:19 +0000 |
commit | 7651ba744afee68bf52b751d205928cd5a04d924 (patch) | |
tree | 7a47728af5cf9ab7167bf71f8eab15e8c2ab66fc /sys/arch/m88k | |
parent | 61d1ac075528509885ab5b04ebfc411ea7d73408 (diff) |
Correctly signal SIGSEGV, instead of SIGBUS, for faults caused by access to
pages mapped without read (or write) permissions.
The existing logic would incorrectly match uvm_fault() returning EACCES with
the CMMU fault logic reporting a bus error (which will still cause SIGBUS
to be sent).
Diffstat (limited to 'sys/arch/m88k')
-rw-r--r-- | sys/arch/m88k/m88k/trap.c | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/sys/arch/m88k/m88k/trap.c b/sys/arch/m88k/m88k/trap.c index e8cca8c357e..b8ec416551f 100644 --- a/sys/arch/m88k/m88k/trap.c +++ b/sys/arch/m88k/m88k/trap.c @@ -1,4 +1,4 @@ -/* $OpenBSD: trap.c,v 1.83 2012/12/31 06:46:13 guenther Exp $ */ +/* $OpenBSD: trap.c,v 1.84 2013/01/07 22:47:18 miod Exp $ */ /* * Copyright (c) 2004, Miodrag Vallat. * Copyright (c) 1998 Steve Murphree, Jr. @@ -424,17 +424,15 @@ user_fault: break; default: result = uvm_fault(map, va, VM_FAULT_INVALID, ftype); + if (result == EACCES) + result = EFAULT; break; } p->p_addr->u_pcb.pcb_onfault = pcb_onfault; - if ((caddr_t)va >= vm->vm_maxsaddr) { - if (result == 0) - uvm_grow(p, va); - else if (result == EACCES) - result = EFAULT; - } + if (result == 0 && (caddr_t)va >= vm->vm_maxsaddr) + uvm_grow(p, va); /* * This could be a fault caused in copyin*() @@ -903,6 +901,8 @@ m88110_user_fault: if (frame->tf_isr & (CMMU_ISR_SI | CMMU_ISR_PI)) { /* segment or page fault */ result = uvm_fault(map, va, VM_FAULT_INVALID, ftype); + if (result == EACCES) + result = EFAULT; } else { #ifdef TRAPDEBUG printf("Unexpected Instruction fault isr %x\n", @@ -920,6 +920,8 @@ m88110_user_fault: if (frame->tf_dsr & (CMMU_DSR_SI | CMMU_DSR_PI)) { /* segment or page fault */ result = uvm_fault(map, va, VM_FAULT_INVALID, ftype); + if (result == EACCES) + result = EFAULT; } else if (frame->tf_dsr & (CMMU_DSR_CP | CMMU_DSR_WA)) { /* copyback or write allocate error */ @@ -950,6 +952,8 @@ m88110_user_fault: map->pmap, va); #endif result = uvm_fault(map, va, VM_FAULT_INVALID, ftype); + if (result == EACCES) + result = EFAULT; } } else { #ifdef TRAPDEBUG @@ -962,12 +966,8 @@ m88110_user_fault: } p->p_addr->u_pcb.pcb_onfault = pcb_onfault; - if ((caddr_t)va >= vm->vm_maxsaddr) { - if (result == 0) - uvm_grow(p, va); - else if (result == EACCES) - result = EFAULT; - } + if (result == 0 && (caddr_t)va >= vm->vm_maxsaddr) + uvm_grow(p, va); KERNEL_UNLOCK(); /* |