kernel mode EXC_DSE handling depends on td->td_pcb-> not slb faulting in setting up its slbmte use?
Mark Millard
marklmi at yahoo.com
Fri May 3 01:29:03 UTC 2019
[I show other examples of what is accessed in order to
set up a slbmte in some other places and list a question
that I should have asked in the original message.]
On 2019-May-2, at 14:40, Mark Millard <marklmi at yahoo.com> wrote:
> /usr/src/sys/powerpc/powerpc/trap.c has:
>
> } else {
> /* Kernel Mode Traps */
>
> KASSERT(cold || td->td_ucred != NULL,
> ("kernel trap doesn't have ucred"));
> switch (type) {
> . . .
> #if defined(__powerpc64__) && defined(AIM)
> case EXC_DSE:
> if (td->td_pcb->pcb_cpu.aim.usr_vsid != 0 &&
> (frame->dar & SEGMENT_MASK) == USER_ADDR) {
> __asm __volatile ("slbmte %0, %1" ::
> "r"(td->td_pcb->pcb_cpu.aim.usr_vsid),
> "r"(USER_SLB_SLBE));
> return;
> }
> break;
> #endif
>
> in trap(...).
>
> If the kernel mode EXC_DSE code got a slb fault from
> td->td_pcb-> would things still be okay? (Nested trap
> handling.)
>
> If not, does something need to be done to guarantee
> that td->td_pcb-> will not have an slb fault in the
> above code?
I should have asked:
Are all of addresses involved known to stick to to
being DMAP addresses (that there-by avoid slb-miss
issues)?
Similar questions might apply to some or all of the
below. Some are used in slbmte instructions and
others are just closely associated in the code.
src/sys/powerpc/aim/mmu_oea64.c has moea64_activate with:
pmap_t pm;
pm = &td->td_proc->p_vmspace->vm_pmap;
CPU_SET(PCPU_GET(cpuid), &pm->pm_active);
#ifdef __powerpc64__
PCPU_SET(aim.userslb, pm->pm_slb);
__asm __volatile("slbmte %0, %1; isync" ::
"r"(td->td_pcb->pcb_cpu.aim.usr_vsid), "r"(USER_SLB_SLBE));
#else
So:
td->
and:
td->td_proc->
and:
td->td_proc->p_vmspace->
and:
td->td_pcb->
src/sys/powerpc/aim/mmu_oea64.c also has moea64_map_user_ptr with:
curthread->td_pcb->pcb_cpu.aim.usr_segm =
(uintptr_t)uaddr >> ADDR_SR_SHFT;
curthread->td_pcb->pcb_cpu.aim.usr_vsid = slbv;
#ifdef __powerpc64__
__asm __volatile ("slbie %0; slbmte %1, %2; isync" ::
"r"(USER_ADDR), "r"(slbv), "r"(USER_SLB_SLBE));
#else
So:
curhtread->
and:
curthread->td_pcb->
src/sys/powerpc/powerpc/trap.c has syscall with:
td = curthread;
td->td_frame = frame;
#if defined(__powerpc64__) && defined(AIM)
/*
* Speculatively restore last user SLB segment, which we know is
* invalid already, since we are likely to do copyin()/copyout().
*/
if (td->td_pcb->pcb_cpu.aim.usr_vsid != 0) // no slbie needed?
__asm __volatile ("isync; slbmte %0, %1; isync" ::
"r"(td->td_pcb->pcb_cpu.aim.usr_vsid), "r"(USER_SLB_SLBE));
#endif
So:
curthread->
and:
curthread->td_pcb->
===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)
More information about the freebsd-ppc
mailing list