trap.c (211515) | trap.c (212715) |
---|---|
1/*- 2 * Copyright (C) 1995, 1996 Wolfgang Solfrank. 3 * Copyright (C) 1995, 1996 TooLs GmbH. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 18 unchanged lines hidden (view full) --- 27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 * 31 * $NetBSD: trap.c,v 1.58 2002/03/04 04:07:35 dbj Exp $ 32 */ 33 34#include <sys/cdefs.h> | 1/*- 2 * Copyright (C) 1995, 1996 Wolfgang Solfrank. 3 * Copyright (C) 1995, 1996 TooLs GmbH. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 18 unchanged lines hidden (view full) --- 27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 * 31 * $NetBSD: trap.c,v 1.58 2002/03/04 04:07:35 dbj Exp $ 32 */ 33 34#include <sys/cdefs.h> |
35__FBSDID("$FreeBSD: head/sys/powerpc/aim/trap.c 211515 2010-08-19 16:41:27Z jhb $"); | 35__FBSDID("$FreeBSD: head/sys/powerpc/aim/trap.c 212715 2010-09-16 00:22:25Z nwhitehorn $"); |
36 37#include <sys/param.h> 38#include <sys/kdb.h> 39#include <sys/proc.h> 40#include <sys/ktr.h> 41#include <sys/lock.h> 42#include <sys/mutex.h> 43#include <sys/pioctl.h> --- 396 unchanged lines hidden (view full) --- 440 error = syscallenter(td, &sa); 441 syscallret(td, error, &sa); 442} 443 444#ifdef __powerpc64__ 445static int 446handle_slb_spill(pmap_t pm, vm_offset_t addr) 447{ | 36 37#include <sys/param.h> 38#include <sys/kdb.h> 39#include <sys/proc.h> 40#include <sys/ktr.h> 41#include <sys/lock.h> 42#include <sys/mutex.h> 43#include <sys/pioctl.h> --- 396 unchanged lines hidden (view full) --- 440 error = syscallenter(td, &sa); 441 syscallret(td, error, &sa); 442} 443 444#ifdef __powerpc64__ 445static int 446handle_slb_spill(pmap_t pm, vm_offset_t addr) 447{ |
448 struct slb slb_entry; 449 int error, i; | 448 struct slb kern_entry, *user_entry; 449 uint64_t esid; 450 int i; |
450 | 451 |
452 esid = (uintptr_t)addr >> ADDR_SR_SHFT; 453 |
|
451 if (pm == kernel_pmap) { | 454 if (pm == kernel_pmap) { |
452 error = va_to_slb_entry(pm, addr, &slb_entry); 453 if (error) 454 return (error); | 455 kern_entry.slbv = kernel_va_to_slbv(addr); 456 kern_entry.slbe = (esid << SLBE_ESID_SHIFT) | SLBE_VALID; |
455 | 457 |
456 slb_insert(pm, PCPU_GET(slb), &slb_entry); | 458 slb_insert(pm, PCPU_GET(slb), &kern_entry); |
457 return (0); 458 } 459 460 PMAP_LOCK(pm); | 459 return (0); 460 } 461 462 PMAP_LOCK(pm); |
461 error = va_to_slb_entry(pm, addr, &slb_entry); 462 if (error != 0) 463 (void)allocate_vsid(pm, (uintptr_t)addr >> ADDR_SR_SHFT, 0); 464 else { | 463 user_entry = user_va_to_slb_entry(pm, addr); 464 465 if (user_entry == NULL) { 466 /* allocate_vsid auto-spills it */ 467 (void)allocate_vsid(pm, esid, 0); 468 } else { |
465 /* 466 * Check that another CPU has not already mapped this. 467 * XXX: Per-thread SLB caches would be better. 468 */ 469 for (i = 0; i < 64; i++) | 469 /* 470 * Check that another CPU has not already mapped this. 471 * XXX: Per-thread SLB caches would be better. 472 */ 473 for (i = 0; i < 64; i++) |
470 if (pm->pm_slb[i].slbe == (slb_entry.slbe | i)) | 474 if (pm->pm_slb[i].slbe == (user_entry->slbe | i)) |
471 break; 472 473 if (i == 64) | 475 break; 476 477 if (i == 64) |
474 slb_insert(pm, pm->pm_slb, &slb_entry); | 478 slb_insert(pm, pm->pm_slb, user_entry); |
475 } 476 PMAP_UNLOCK(pm); 477 478 return (0); 479} 480#endif 481 482static int --- 25 unchanged lines hidden (view full) --- 508 } else { 509 if ((eva >> ADDR_SR_SHFT) == (USER_ADDR >> ADDR_SR_SHFT)) { 510 if (p->p_vmspace == NULL) 511 return (SIGSEGV); 512 513 map = &p->p_vmspace->vm_map; 514 515 #ifdef __powerpc64__ | 479 } 480 PMAP_UNLOCK(pm); 481 482 return (0); 483} 484#endif 485 486static int --- 25 unchanged lines hidden (view full) --- 512 } else { 513 if ((eva >> ADDR_SR_SHFT) == (USER_ADDR >> ADDR_SR_SHFT)) { 514 if (p->p_vmspace == NULL) 515 return (SIGSEGV); 516 517 map = &p->p_vmspace->vm_map; 518 519 #ifdef __powerpc64__ |
516 user_sr = 0; 517 __asm ("slbmfev %0, %1" 518 : "=r"(user_sr) 519 : "r"(USER_SR)); 520 521 PMAP_LOCK(&p->p_vmspace->vm_pmap); 522 user_sr >>= SLBV_VSID_SHIFT; 523 rv = vsid_to_esid(&p->p_vmspace->vm_pmap, user_sr, 524 &user_sr); 525 PMAP_UNLOCK(&p->p_vmspace->vm_pmap); 526 527 if (rv != 0) 528 return (SIGSEGV); | 520 user_sr = td->td_pcb->pcb_cpu.aim.usr_segm; |
529 #else 530 __asm ("mfsr %0, %1" 531 : "=r"(user_sr) 532 : "K"(USER_SR)); 533 #endif 534 eva &= ADDR_PIDX | ADDR_POFF; 535 eva |= user_sr << ADDR_SR_SHFT; 536 } else { --- 157 unchanged lines hidden --- | 521 #else 522 __asm ("mfsr %0, %1" 523 : "=r"(user_sr) 524 : "K"(USER_SR)); 525 #endif 526 eva &= ADDR_PIDX | ADDR_POFF; 527 eva |= user_sr << ADDR_SR_SHFT; 528 } else { --- 157 unchanged lines hidden --- |