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

Commit 332fd57b authored by Paul Mundt's avatar Paul Mundt
Browse files

sh: Bring the SH-5 FPU in line with the SH-4 FPU API.



Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent b6d7b666
Loading
Loading
Loading
Loading
+7 −9
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ static union sh_fpu_union init_fpuregs = {
	}
};

inline void fpsave(struct sh_fpu_hard_struct *fpregs)
void save_fpu(struct task_struct *tsk, struct pt_regs *regs)
{
	asm volatile("fst.p     %0, (0*8), fp0\n\t"
		     "fst.p     %0, (1*8), fp2\n\t"
@@ -73,11 +73,10 @@ inline void fpsave(struct sh_fpu_hard_struct *fpregs)
		     "fgetscr   fr63\n\t"
		     "fst.s     %0, (32*8), fr63\n\t"
		: /* no output */
		: "r" (fpregs)
		: "r" (&tsk->thread.fpu.hard)
		: "memory");
}


static inline void
fpload(struct sh_fpu_hard_struct *fpregs)
{
@@ -153,10 +152,10 @@ do_fpu_state_restore(unsigned long ex, struct pt_regs *regs)
		return;

	enable_fpu();
	if (last_task_used_math != NULL) {
	if (last_task_used_math != NULL)
		/* Other processes fpu state, save away */
		fpsave(&last_task_used_math->thread.fpu.hard);
        }
		save_fpu(last_task_used_math, regs);

        last_task_used_math = current;
        if (used_math()) {
                fpload(&current->thread.fpu.hard);
@@ -167,4 +166,3 @@ do_fpu_state_restore(unsigned long ex, struct pt_regs *regs)
        }
	disable_fpu();
}
+2 −2
Original line number Diff line number Diff line
@@ -480,7 +480,7 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu)
	if (fpvalid) {
		if (current == last_task_used_math) {
			enable_fpu();
			fpsave(&tsk->thread.fpu.hard);
			save_fpu(tsk, regs);
			disable_fpu();
			last_task_used_math = 0;
			regs->sr |= SR_FD;
@@ -507,7 +507,7 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
#ifdef CONFIG_SH_FPU
	if(last_task_used_math == current) {
		enable_fpu();
		fpsave(&current->thread.fpu.hard);
		save_fpu(current, regs);
		disable_fpu();
		last_task_used_math = NULL;
		regs->sr |= SR_FD;
+2 −2
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ get_fpu_long(struct task_struct *task, unsigned long addr)

	if (last_task_used_math == task) {
		enable_fpu();
		fpsave(&task->thread.fpu.hard);
		save_fpu(task, regs);
		disable_fpu();
		last_task_used_math = 0;
		regs->sr |= SR_FD;
@@ -111,7 +111,7 @@ put_fpu_long(struct task_struct *task, unsigned long addr, unsigned long data)
		set_stopped_child_used_math(task);
	} else if (last_task_used_math == task) {
		enable_fpu();
		fpsave(&task->thread.fpu.hard);
		save_fpu(task, regs);
		disable_fpu();
		last_task_used_math = 0;
		regs->sr |= SR_FD;
+1 −1
Original line number Diff line number Diff line
@@ -212,7 +212,7 @@ setup_sigcontext_fpu(struct pt_regs *regs, struct sigcontext __user *sc)

	if (current == last_task_used_math) {
		enable_fpu();
		fpsave(&current->thread.fpu.hard);
		save_fpu(current, regs);
		disable_fpu();
		last_task_used_math = NULL;
		regs->sr |= SR_FD;
+2 −2
Original line number Diff line number Diff line
@@ -618,7 +618,7 @@ static int misaligned_fpu_load(struct pt_regs *regs,
		   indexed by register number. */
		if (last_task_used_math == current) {
			enable_fpu();
			fpsave(&current->thread.fpu.hard);
			save_fpu(current, regs);
			disable_fpu();
			last_task_used_math = NULL;
			regs->sr |= SR_FD;
@@ -691,7 +691,7 @@ static int misaligned_fpu_store(struct pt_regs *regs,
		   indexed by register number. */
		if (last_task_used_math == current) {
			enable_fpu();
			fpsave(&current->thread.fpu.hard);
			save_fpu(current, regs);
			disable_fpu();
			last_task_used_math = NULL;
			regs->sr |= SR_FD;
Loading