MFC: r203185

Implement handling of the third argument of cpu_switch().

PR:		143215
This commit is contained in:
Marius Strobl 2010-02-06 17:33:39 +00:00
parent 1cddf840fb
commit 901c651d7b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/stable/8/; revision=203554
2 changed files with 50 additions and 40 deletions

View File

@ -239,6 +239,7 @@ ASSYM(P_VMSPACE, offsetof(struct proc, p_vmspace));
ASSYM(TD_FLAGS, offsetof(struct thread, td_flags));
ASSYM(TD_FRAME, offsetof(struct thread, td_frame));
ASSYM(TD_KSTACK, offsetof(struct thread, td_kstack));
ASSYM(TD_LOCK, offsetof(struct thread, td_lock));
ASSYM(TD_PCB, offsetof(struct thread, td_pcb));
ASSYM(TD_PROC, offsetof(struct thread, td_proc));
ASSYM(TD_MD, offsetof(struct thread, td_md));

View File

@ -46,15 +46,14 @@ ENTRY(cpu_throw)
save %sp, -CCFSZ, %sp
flushw
ba %xcc, .Lsw1
mov %i1, %i0
mov %g0, %i2
END(cpu_throw)
/*
* void cpu_switch(struct thread *old, struct thread *new)
* void cpu_switch(struct thread *old, struct thread *new, struct mtx *mtx)
*/
ENTRY(cpu_switch)
save %sp, -CCFSZ, %sp
mov %i1, %i0
/*
* If the current thread was using floating point in the kernel, save
@ -63,7 +62,7 @@ ENTRY(cpu_switch)
*/
rd %fprs, %l2
andcc %l2, FPRS_FEF, %g0
bz,a,pt %xcc, 1f
bz,a,pt %xcc, 1f
nop
call savefpctx
add PCB_REG, PCB_KFP, %o0
@ -104,24 +103,24 @@ ENTRY(cpu_switch)
.Lsw1:
#if KTR_COMPILE & KTR_PROC
CATR(KTR_PROC, "cpu_switch: new td=%p pc=%#lx fp=%#lx"
, %g1, %g2, %g3, 7, 8, 9)
stx %i0, [%g1 + KTR_PARM1]
ldx [%i0 + TD_PCB], %g2
, %g1, %g2, %g3, 8, 9, 10)
stx %i1, [%g1 + KTR_PARM1]
ldx [%i1 + TD_PCB], %g2
ldx [%g2 + PCB_PC], %g3
stx %g3, [%g1 + KTR_PARM2]
ldx [%g2 + PCB_SP], %g3
stx %g3, [%g1 + KTR_PARM3]
9:
10:
#endif
ldx [%i0 + TD_PCB], %i1
ldx [%i1 + TD_PCB], %l0
stx %i0, [PCPU(CURTHREAD)]
stx %i1, [PCPU(CURPCB)]
stx %i1, [PCPU(CURTHREAD)]
stx %l0, [PCPU(CURPCB)]
wrpr %g0, PSTATE_NORMAL, %pstate
mov %i1, PCB_REG
mov %l0, PCB_REG
wrpr %g0, PSTATE_ALT, %pstate
mov %i1, PCB_REG
mov %l0, PCB_REG
wrpr %g0, PSTATE_KERNEL, %pstate
ldx [PCB_REG + PCB_SP], %fp
@ -132,24 +131,24 @@ ENTRY(cpu_switch)
* Point to the pmaps of the new process, and of the last non-kernel
* process to run.
*/
ldx [%i0 + TD_PROC], %i2
ldx [%i1 + TD_PROC], %l1
ldx [PCPU(PMAP)], %l2
ldx [%i2 + P_VMSPACE], %i5
add %i5, VM_PMAP, %i2
ldx [%l1 + P_VMSPACE], %i5
add %i5, VM_PMAP, %l1
#if KTR_COMPILE & KTR_PROC
CATR(KTR_PROC, "cpu_switch: new pmap=%p old pmap=%p"
, %g1, %g2, %g3, 7, 8, 9)
stx %i2, [%g1 + KTR_PARM1]
, %g1, %g2, %g3, 8, 9, 10)
stx %l1, [%g1 + KTR_PARM1]
stx %l2, [%g1 + KTR_PARM2]
9:
10:
#endif
/*
* If they are the same we are done.
*/
cmp %l2, %i2
be,a,pn %xcc, 5f
cmp %l2, %l1
be,a,pn %xcc, 7f
nop
/*
@ -158,21 +157,20 @@ ENTRY(cpu_switch)
*/
SET(vmspace0, %i4, %i3)
cmp %i5, %i3
be,a,pn %xcc, 5f
be,a,pn %xcc, 7f
nop
/*
* If there was no non-kernel pmap, don't try to deactivate it.
*/
brz,a,pn %l2, 3f
nop
brz,pn %l2, 3f
lduw [PCPU(CPUMASK)], %l4
/*
* Mark the pmap of the last non-kernel vmspace to run as no longer
* active on this CPU.
*/
lduw [%l2 + PM_ACTIVE], %l3
lduw [PCPU(CPUMASK)], %l4
andn %l3, %l4, %l3
stw %l3, [%l2 + PM_ACTIVE]
@ -185,25 +183,28 @@ ENTRY(cpu_switch)
mov -1, %l5
stw %l5, [%l3 + %l4]
3: cmp %i2, %g0
be,pn %xcc, 4f
lduw [PCPU(TLB_CTX_MAX)], %i4
stx %i2, [%i0 + TD_LOCK]
/*
* Find a new TLB context. If we've run out we have to flush all
* user mappings from the TLB and reset the context numbers.
*/
3: lduw [PCPU(TLB_CTX)], %i3
lduw [PCPU(TLB_CTX_MAX)], %i4
4: lduw [PCPU(TLB_CTX)], %i3
cmp %i3, %i4
bne,a,pt %xcc, 4f
bne,a,pt %xcc, 5f
nop
SET(tlb_flush_user, %i5, %i4)
ldx [%i4], %i5
call %i5
nop
lduw [PCPU(TLB_CTX_MIN)], %i3
lduw [PCPU(TLB_CTX_MIN)], %i3
/*
* Advance next free context.
*/
4: add %i3, 1, %i4
5: add %i3, 1, %i4
stw %i4, [PCPU(TLB_CTX)]
/*
@ -211,36 +212,36 @@ ENTRY(cpu_switch)
*/
lduw [PCPU(CPUID)], %i4
sllx %i4, INT_SHIFT, %i4
add %i2, PM_CONTEXT, %i5
add %l1, PM_CONTEXT, %i5
stw %i3, [%i4 + %i5]
/*
* Mark the pmap as active on this CPU.
*/
lduw [%i2 + PM_ACTIVE], %i4
lduw [%l1 + PM_ACTIVE], %i4
lduw [PCPU(CPUMASK)], %i5
or %i4, %i5, %i4
stw %i4, [%i2 + PM_ACTIVE]
stw %i4, [%l1 + PM_ACTIVE]
/*
* Make note of the change in pmap.
*/
stx %i2, [PCPU(PMAP)]
stx %l1, [PCPU(PMAP)]
/*
* Fiddle the hardware bits. Set the TSB registers and install the
* new context number in the CPU.
*/
ldx [%i2 + PM_TSB], %i4
ldx [%l1 + PM_TSB], %i4
mov AA_DMMU_TSB, %i5
stxa %i4, [%i5] ASI_DMMU
mov AA_IMMU_TSB, %i5
stxa %i4, [%i5] ASI_IMMU
setx TLB_PCXR_PGSZ_MASK, %i5, %i4
mov AA_DMMU_PCXR, %i5
ldxa [%i5] ASI_DMMU, %i2
and %i2, %i4, %i2
or %i3, %i2, %i3
ldxa [%i5] ASI_DMMU, %l1
and %l1, %i4, %l1
or %i3, %l1, %i3
sethi %hi(KERNBASE), %i4
stxa %i3, [%i5] ASI_DMMU
flush %i4
@ -248,7 +249,15 @@ ENTRY(cpu_switch)
/*
* Done, return and load the new process's window from the stack.
*/
5: ret
6: ret
restore
7: cmp %i2, %g0
be,a,pn %xcc, 6b
nop
stx %i2, [%i0 + TD_LOCK]
ret
restore
END(cpu_switch)