Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 579e633e authored by Anton Blanchard's avatar Anton Blanchard Committed by Michael Ellerman
Browse files

powerpc: create flush_all_to_thread()



Create a single function that flushes everything (FP, VMX, VSX, SPE).
Doing this all at once means we only do one MSR write.

Signed-off-by: default avatarAnton Blanchard <anton@samba.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent c2085059
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@ extern void giveup_vsx(struct task_struct *);
extern void enable_kernel_spe(void);
extern void enable_kernel_spe(void);
extern void load_up_spe(struct task_struct *);
extern void load_up_spe(struct task_struct *);
extern void giveup_all(struct task_struct *);
extern void giveup_all(struct task_struct *);
extern void flush_all_to_thread(struct task_struct *);
extern void switch_booke_debug_regs(struct debug_reg *new_debug);
extern void switch_booke_debug_regs(struct debug_reg *new_debug);


#ifdef CONFIG_PPC_FPU
#ifdef CONFIG_PPC_FPU
+18 −4
Original line number Original line Diff line number Diff line
@@ -367,6 +367,23 @@ void giveup_all(struct task_struct *tsk)
}
}
EXPORT_SYMBOL(giveup_all);
EXPORT_SYMBOL(giveup_all);


void flush_all_to_thread(struct task_struct *tsk)
{
	if (tsk->thread.regs) {
		preempt_disable();
		BUG_ON(tsk != current);
		giveup_all(tsk);

#ifdef CONFIG_SPE
		if (tsk->thread.regs->msr & MSR_SPE)
			tsk->thread.spefscr = mfspr(SPRN_SPEFSCR);
#endif

		preempt_enable();
	}
}
EXPORT_SYMBOL(flush_all_to_thread);

#ifdef CONFIG_PPC_ADV_DEBUG_REGS
#ifdef CONFIG_PPC_ADV_DEBUG_REGS
void do_send_trap(struct pt_regs *regs, unsigned long address,
void do_send_trap(struct pt_regs *regs, unsigned long address,
		  unsigned long error_code, int signal_code, int breakpt)
		  unsigned long error_code, int signal_code, int breakpt)
@@ -1137,10 +1154,7 @@ release_thread(struct task_struct *t)
 */
 */
int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
{
{
	flush_fp_to_thread(src);
	flush_all_to_thread(src);
	flush_altivec_to_thread(src);
	flush_vsx_to_thread(src);
	flush_spe_to_thread(src);
	/*
	/*
	 * Flush TM state out so we can copy it.  __switch_to_tm() does this
	 * Flush TM state out so we can copy it.  __switch_to_tm() does this
	 * flush but it removes the checkpointed state from the current CPU and
	 * flush but it removes the checkpointed state from the current CPU and
+1 −3
Original line number Original line Diff line number Diff line
@@ -20,9 +20,7 @@ void save_processor_state(void)
	 * flush out all the special registers so we don't need
	 * flush out all the special registers so we don't need
	 * to save them in the snapshot
	 * to save them in the snapshot
	 */
	 */
	flush_fp_to_thread(current);
	flush_all_to_thread(current);
	flush_altivec_to_thread(current);
	flush_spe_to_thread(current);


#ifdef CONFIG_PPC64
#ifdef CONFIG_PPC64
	hard_irq_disable();
	hard_irq_disable();
+2 −3
Original line number Original line Diff line number Diff line
@@ -2700,9 +2700,8 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
			goto out;
			goto out;
	}
	}


	flush_fp_to_thread(current);
	flush_all_to_thread(current);
	flush_altivec_to_thread(current);

	flush_vsx_to_thread(current);
	vcpu->arch.wqp = &vcpu->arch.vcore->wq;
	vcpu->arch.wqp = &vcpu->arch.vcore->wq;
	vcpu->arch.pgdir = current->mm->pgd;
	vcpu->arch.pgdir = current->mm->pgd;
	vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST;
	vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST;