Deleted Added
full compact
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 ---