inline void handle_fpu_exception()

in kernel/fpu.c [204:249]


inline void handle_fpu_exception(struct pt_regs *regs)
{
	unsigned int fpcsr;
	int si_code = 0, si_signo = SIGFPE;
#if IS_ENABLED(CONFIG_SUPPORT_DENORMAL_ARITHMETIC)
	unsigned long redo_except = FPCSR_mskDNIT|FPCSR_mskUDFT|FPCSR_mskIEXT;
#else
	unsigned long redo_except = FPCSR_mskDNIT;
#endif

	lose_fpu();
	fpcsr = current->thread.fpu.fpcsr;

	if (fpcsr & redo_except) {
		si_signo = do_fpuemu(regs, &current->thread.fpu);
		fpcsr = current->thread.fpu.fpcsr;
		if (!si_signo) {
			current->thread.fpu.fpcsr &= ~(redo_except);
			goto done;
		}
	} else if (fpcsr & FPCSR_mskRIT) {
		if (!user_mode(regs))
			make_task_dead(SIGILL);
		si_signo = SIGILL;
	}

	switch (si_signo) {
	case SIGFPE:
		fill_sigfpe_signo(fpcsr, &si_code);
		break;
	case SIGILL:
		show_regs(regs);
		si_code = ILL_COPROC;
		break;
	case SIGBUS:
		si_code = BUS_ADRERR;
		break;
	default:
		break;
	}

	force_sig_fault(si_signo, si_code,
			(void __user *)instruction_pointer(regs));
done:
	own_fpu();
}