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

Commit 54f565ea authored by William Lee Irwin III's avatar William Lee Irwin III Committed by David S. Miller
Browse files

[SPARC]: Fix TIF_USEDFPU flag atomicity



From: William Lee Irwin III <wli@holomorphy.com>

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c0a79b22
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -348,7 +348,7 @@ void exit_thread(void)
#ifndef CONFIG_SMP
	if(last_task_used_math == current) {
#else
	if(current_thread_info()->flags & _TIF_USEDFPU) {
	if (test_thread_flag(TIF_USEDFPU)) {
#endif
		/* Keep process from leaving FPU in a bogon state. */
		put_psr(get_psr() | PSR_EF);
@@ -357,7 +357,7 @@ void exit_thread(void)
#ifndef CONFIG_SMP
		last_task_used_math = NULL;
#else
		current_thread_info()->flags &= ~_TIF_USEDFPU;
		clear_thread_flag(TIF_USEDFPU);
#endif
	}
}
@@ -371,7 +371,7 @@ void flush_thread(void)
#ifndef CONFIG_SMP
	if(last_task_used_math == current) {
#else
	if(current_thread_info()->flags & _TIF_USEDFPU) {
	if (test_thread_flag(TIF_USEDFPU)) {
#endif
		/* Clean the fpu. */
		put_psr(get_psr() | PSR_EF);
@@ -380,7 +380,7 @@ void flush_thread(void)
#ifndef CONFIG_SMP
		last_task_used_math = NULL;
#else
		current_thread_info()->flags &= ~_TIF_USEDFPU;
		clear_thread_flag(TIF_USEDFPU);
#endif
	}

@@ -466,13 +466,13 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long sp,
#ifndef CONFIG_SMP
	if(last_task_used_math == current) {
#else
	if(current_thread_info()->flags & _TIF_USEDFPU) {
	if (test_thread_flag(TIF_USEDFPU)) {
#endif
		put_psr(get_psr() | PSR_EF);
		fpsave(&p->thread.float_regs[0], &p->thread.fsr,
		       &p->thread.fpqueue[0], &p->thread.fpqdepth);
#ifdef CONFIG_SMP
		current_thread_info()->flags &= ~_TIF_USEDFPU;
		clear_thread_flag(TIF_USEDFPU);
#endif
	}

@@ -609,13 +609,13 @@ int dump_fpu (struct pt_regs * regs, elf_fpregset_t * fpregs)
		return 1;
	}
#ifdef CONFIG_SMP
	if (current_thread_info()->flags & _TIF_USEDFPU) {
	if (test_thread_flag(TIF_USEDFPU)) {
		put_psr(get_psr() | PSR_EF);
		fpsave(&current->thread.float_regs[0], &current->thread.fsr,
		       &current->thread.fpqueue[0], &current->thread.fpqdepth);
		if (regs != NULL) {
			regs->psr &= ~(PSR_EF);
			current_thread_info()->flags &= ~(_TIF_USEDFPU);
			clear_thread_flag(TIF_USEDFPU);
		}
	}
#else
+3 −3
Original line number Diff line number Diff line
@@ -259,7 +259,7 @@ void do_fpd_trap(struct pt_regs *regs, unsigned long pc, unsigned long npc,
	} else {
		fpload(&current->thread.float_regs[0], &current->thread.fsr);
	}
	current_thread_info()->flags |= _TIF_USEDFPU;
	set_thread_flag(TIF_USEDFPU);
#endif
}

@@ -290,7 +290,7 @@ void do_fpe_trap(struct pt_regs *regs, unsigned long pc, unsigned long npc,
#ifndef CONFIG_SMP
	if(!fpt) {
#else
        if(!(task_thread_info(fpt)->flags & _TIF_USEDFPU)) {
	if (!test_tsk_thread_flag(fpt, TIF_USEDFPU)) {
#endif
		fpsave(&fake_regs[0], &fake_fsr, &fake_queue[0], &fake_depth);
		regs->psr &= ~PSR_EF;
@@ -333,7 +333,7 @@ void do_fpe_trap(struct pt_regs *regs, unsigned long pc, unsigned long npc,
	/* nope, better SIGFPE the offending process... */
	       
#ifdef CONFIG_SMP
	task_thread_info(fpt)->flags &= ~_TIF_USEDFPU;
	clear_tsk_thread_flag(fpt, TIF_USEDFPU);
#endif
	if(psr & PSR_PS) {
		/* The first fsr store/load we tried trapped,