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

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

powerpc: Create disable_kernel_{fp,altivec,vsx,spe}()



The enable_kernel_*() functions leave the relevant MSR bits enabled
until we exit the kernel sometime later. Create disable versions
that wrap the kernel use of FP, Altivec VSX or SPE.

While we don't want to disable it normally for performance reasons
(MSR writes are slow), it will be used for a debug boot option that
does this and catches bad uses in other areas of the kernel.

Signed-off-by: default avatarAnton Blanchard <anton@samba.org>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent a0e72cf1
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -85,6 +85,7 @@ static void spe_begin(void)


static void spe_end(void)
static void spe_end(void)
{
{
	disable_kernel_spe();
	/* reenable preemption */
	/* reenable preemption */
	preempt_enable();
	preempt_enable();
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -46,6 +46,7 @@ static void spe_begin(void)


static void spe_end(void)
static void spe_end(void)
{
{
	disable_kernel_spe();
	/* reenable preemption */
	/* reenable preemption */
	preempt_enable();
	preempt_enable();
}
}
+1 −0
Original line number Original line Diff line number Diff line
@@ -47,6 +47,7 @@ static void spe_begin(void)


static void spe_end(void)
static void spe_end(void)
{
{
	disable_kernel_spe();
	/* reenable preemption */
	/* reenable preemption */
	preempt_enable();
	preempt_enable();
}
}
+5 −0
Original line number Original line Diff line number Diff line
@@ -26,6 +26,11 @@ extern void enable_kernel_spe(void);
extern void load_up_spe(struct task_struct *);
extern void load_up_spe(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);


static inline void disable_kernel_fp(void) { }
static inline void disable_kernel_altivec(void) { }
static inline void disable_kernel_spe(void) { }
static inline void disable_kernel_vsx(void) { }

#ifdef CONFIG_PPC_FPU
#ifdef CONFIG_PPC_FPU
extern void flush_fp_to_thread(struct task_struct *);
extern void flush_fp_to_thread(struct task_struct *);
extern void giveup_fpu(struct task_struct *);
extern void giveup_fpu(struct task_struct *);
+2 −0
Original line number Original line Diff line number Diff line
@@ -960,6 +960,7 @@ int fix_alignment(struct pt_regs *regs)
			preempt_disable();
			preempt_disable();
			enable_kernel_fp();
			enable_kernel_fp();
			cvt_df(&data.dd, (float *)&data.x32.low32);
			cvt_df(&data.dd, (float *)&data.x32.low32);
			disable_kernel_fp();
			preempt_enable();
			preempt_enable();
#else
#else
			return 0;
			return 0;
@@ -1000,6 +1001,7 @@ int fix_alignment(struct pt_regs *regs)
		preempt_disable();
		preempt_disable();
		enable_kernel_fp();
		enable_kernel_fp();
		cvt_fd((float *)&data.x32.low32, &data.dd);
		cvt_fd((float *)&data.x32.low32, &data.dd);
		disable_kernel_fp();
		preempt_enable();
		preempt_enable();
#else
#else
		return 0;
		return 0;
Loading