diff options
Diffstat (limited to 'sys/powerpc/aim/trap.c')
-rw-r--r-- | sys/powerpc/aim/trap.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/sys/powerpc/aim/trap.c b/sys/powerpc/aim/trap.c index 22f55a7..de4c6d8 100644 --- a/sys/powerpc/aim/trap.c +++ b/sys/powerpc/aim/trap.c @@ -455,6 +455,13 @@ syscall(struct trapframe *frame) td = PCPU_GET(curthread); td->td_frame = frame; + /* + * Speculatively restore last user SLB segment, which we know is + * invalid already, since we are likely to do copyin()/copyout(). + */ + __asm __volatile ("slbmte %0, %1; isync" :: + "r"(td->td_pcb->pcb_cpu.aim.usr_vsid), "r"(USER_SLB_SLBE)); + error = syscallenter(td, &sa); syscallret(td, error, &sa); } @@ -532,13 +539,7 @@ trap_pfault(struct trapframe *frame, int user) map = &p->p_vmspace->vm_map; - #ifdef __powerpc64__ user_sr = td->td_pcb->pcb_cpu.aim.usr_segm; - #else - __asm ("mfsr %0, %1" - : "=r"(user_sr) - : "K"(USER_SR)); - #endif eva &= ADDR_PIDX | ADDR_POFF; eva |= user_sr << ADDR_SR_SHFT; } else { |