subr_trap.c (2578) | subr_trap.c (2660) |
---|---|
1/*- 2 * Copyright (C) 1994, David Greenman 3 * Copyright (c) 1990, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the University of Utah, and William Jolitz. 8 * --- 21 unchanged lines hidden (view full) --- 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 * 37 * from: @(#)trap.c 7.4 (Berkeley) 5/13/91 | 1/*- 2 * Copyright (C) 1994, David Greenman 3 * Copyright (c) 1990, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * the University of Utah, and William Jolitz. 8 * --- 21 unchanged lines hidden (view full) --- 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35 * SUCH DAMAGE. 36 * 37 * from: @(#)trap.c 7.4 (Berkeley) 5/13/91 |
38 * $Id: trap.c,v 1.32 1994/08/28 16:16:33 bde Exp $ | 38 * $Id: trap.c,v 1.33 1994/09/08 11:48:52 bde Exp $ |
39 */ 40 41/* 42 * 386 Trap and System call handling 43 */ 44 45#include <sys/param.h> 46#include <sys/systm.h> --- 285 unchanged lines hidden (view full) --- 332} 333 334int 335trap_pfault(frame, usermode) 336 struct trapframe *frame; 337 int usermode; 338{ 339 vm_offset_t va; | 39 */ 40 41/* 42 * 386 Trap and System call handling 43 */ 44 45#include <sys/param.h> 46#include <sys/systm.h> --- 285 unchanged lines hidden (view full) --- 332} 333 334int 335trap_pfault(frame, usermode) 336 struct trapframe *frame; 337 int usermode; 338{ 339 vm_offset_t va; |
340 struct vmspace *vm; | 340 struct vmspace *vm = NULL; |
341 vm_map_t map = 0; 342 int rv = 0, oldflags; 343 vm_prot_t ftype; 344 extern vm_map_t kernel_map; 345 int eva; 346 struct proc *p = curproc; 347 348 eva = rcr2(); 349 va = trunc_page((vm_offset_t)eva); 350 | 341 vm_map_t map = 0; 342 int rv = 0, oldflags; 343 vm_prot_t ftype; 344 extern vm_map_t kernel_map; 345 int eva; 346 struct proc *p = curproc; 347 348 eva = rcr2(); 349 va = trunc_page((vm_offset_t)eva); 350 |
351 /* 352 * Don't allow user-mode faults in kernel address space 353 */ 354 if (usermode && (va >= KERNBASE)) { 355 goto nogo; 356 } | 351 if (va >= KERNBASE) { 352 /* 353 * Don't allow user-mode faults in kernel address space. 354 */ 355 if (usermode) 356 goto nogo; |
357 | 357 |
358 if ((p == 0) || (va >= KERNBASE)) { 359 vm = 0; | |
360 map = kernel_map; 361 } else { | 358 map = kernel_map; 359 } else { |
362 vm = p->p_vmspace; | 360 /* 361 * This is a fault on non-kernel virtual memory. 362 * vm is initialized above to NULL. If curproc is NULL 363 * or curproc->p_vmspace is NULL the fault is fatal. 364 */ 365 if (p != NULL) 366 vm = p->p_vmspace; 367 368 if (vm == NULL) 369 goto nogo; 370 |
363 map = &vm->vm_map; 364 } 365 366 if (frame->tf_err & PGEX_W) 367 ftype = VM_PROT_READ | VM_PROT_WRITE; 368 else 369 ftype = VM_PROT_READ; 370 --- 57 unchanged lines hidden (view full) --- 428 */ 429 rv = vm_fault(map, va, ftype, FALSE); 430 } 431 432 if (rv == KERN_SUCCESS) 433 return (0); 434nogo: 435 if (!usermode) { | 371 map = &vm->vm_map; 372 } 373 374 if (frame->tf_err & PGEX_W) 375 ftype = VM_PROT_READ | VM_PROT_WRITE; 376 else 377 ftype = VM_PROT_READ; 378 --- 57 unchanged lines hidden (view full) --- 436 */ 437 rv = vm_fault(map, va, ftype, FALSE); 438 } 439 440 if (rv == KERN_SUCCESS) 441 return (0); 442nogo: 443 if (!usermode) { |
436 if (curpcb->pcb_onfault) { | 444 if (curpcb && curpcb->pcb_onfault) { |
437 frame->tf_eip = (int)curpcb->pcb_onfault; 438 return (0); 439 } 440 trap_fatal(frame); 441 } 442 443 /* kludge to pass faulting virtual address to sendsig */ 444 frame->tf_err = eva; --- 243 unchanged lines hidden --- | 445 frame->tf_eip = (int)curpcb->pcb_onfault; 446 return (0); 447 } 448 trap_fatal(frame); 449 } 450 451 /* kludge to pass faulting virtual address to sendsig */ 452 frame->tf_err = eva; --- 243 unchanged lines hidden --- |