powerpc: Prepare for splitting giveup_{fpu, altivec, vsx} in two
This prepares for the decoupling of saving {fpu,altivec,vsx} registers and
marking {fpu,altivec,vsx} as being unused by a thread.
Currently giveup_{fpu,altivec,vsx}() does both however optimisations to
task switching can be made if these two operations are decoupled.
save_all() will permit the saving of registers to thread structs and leave
threads MSR with bits enabled.
This patch introduces no functional change.
Signed-off-by: Cyril Bur <cyrilbur@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
committed by
Michael Ellerman
parent
70fe3d980f
commit
de2a20aa72
@@ -444,12 +444,41 @@ void restore_math(struct pt_regs *regs)
|
||||
regs->msr = msr;
|
||||
}
|
||||
|
||||
void save_all(struct task_struct *tsk)
|
||||
{
|
||||
unsigned long usermsr;
|
||||
|
||||
if (!tsk->thread.regs)
|
||||
return;
|
||||
|
||||
usermsr = tsk->thread.regs->msr;
|
||||
|
||||
if ((usermsr & msr_all_available) == 0)
|
||||
return;
|
||||
|
||||
msr_check_and_set(msr_all_available);
|
||||
|
||||
if (usermsr & MSR_FP)
|
||||
__giveup_fpu(tsk);
|
||||
|
||||
if (usermsr & MSR_VEC)
|
||||
__giveup_altivec(tsk);
|
||||
|
||||
if (usermsr & MSR_VSX)
|
||||
__giveup_vsx(tsk);
|
||||
|
||||
if (usermsr & MSR_SPE)
|
||||
__giveup_spe(tsk);
|
||||
|
||||
msr_check_and_clear(msr_all_available);
|
||||
}
|
||||
|
||||
void flush_all_to_thread(struct task_struct *tsk)
|
||||
{
|
||||
if (tsk->thread.regs) {
|
||||
preempt_disable();
|
||||
BUG_ON(tsk != current);
|
||||
giveup_all(tsk);
|
||||
save_all(tsk);
|
||||
|
||||
#ifdef CONFIG_SPE
|
||||
if (tsk->thread.regs->msr & MSR_SPE)
|
||||
|
||||
Reference in New Issue
Block a user