static int protected_restore_fp_context32(struct sigcontext32 __user *sc, unsigned used_math) { int err, tmp __maybe_unused; bool restore_msa = cpu_has_msa && (used_math & USEDMATH_MSA); while (1) { lock_fpu_owner(); if (is_fpu_owner()) { err = restore_fp_context32(sc); if (restore_msa && !err) { enable_msa(); err = _restore_msa_context32(sc); } else { /* signal handler may have used MSA */ disable_msa(); } unlock_fpu_owner(); } else { unlock_fpu_owner(); err = copy_fp_from_sigcontext32(sc); if (restore_msa && !err) err = copy_msa_from_sigcontext32(sc); } if (likely(!err)) break; /* touch the sigcontext and try again */ err = __get_user(tmp, &sc->sc_fpregs[0]) | __get_user(tmp, &sc->sc_fpregs[31]) | __get_user(tmp, &sc->sc_fpc_csr); if (err) break; /* really bad sigcontext */ } return err; }
/* * sigcontext handlers */ static int protected_save_fp_context32(struct sigcontext32 __user *sc, unsigned used_math) { int err; bool save_msa = cpu_has_msa && (used_math & USEDMATH_MSA); while (1) { lock_fpu_owner(); if (is_fpu_owner()) { err = save_fp_context32(sc); if (save_msa && !err) err = _save_msa_context32(sc); unlock_fpu_owner(); } else { unlock_fpu_owner(); err = copy_fp_to_sigcontext32(sc); if (save_msa && !err) err = copy_msa_to_sigcontext32(sc); } if (likely(!err)) break; /* touch the sigcontext and try again */ err = __put_user(0, &sc->sc_fpregs[0]) | __put_user(0, &sc->sc_fpregs[31]) | __put_user(0, &sc->sc_fpc_csr); if (err) break; /* really bad sigcontext */ } return err; }
static int protected_restore_fp_context(struct sigcontext __user *sc) { int err, tmp __maybe_unused; #ifndef CONFIG_EVA while (1) { lock_fpu_owner(); if (is_fpu_owner()) { err = restore_fp_context(sc); unlock_fpu_owner(); } else { unlock_fpu_owner(); err = copy_fp_from_sigcontext(sc); } if (likely(!err)) break; /* touch the sigcontext and try again */ err = __get_user(tmp, &sc->sc_fpregs[0]) | __get_user(tmp, &sc->sc_fpregs[31]) | __get_user(tmp, &sc->sc_fpc_csr); if (err) break; /* really bad sigcontext */ } #else /* * EVA does not have FPU EVA instructions so restoring fpu context * directly does not work. */ lose_fpu(0); err = restore_fp_context(sc); /* this might fail */ #endif return err; }
/* * Helper routines */ static int protected_save_fp_context(struct sigcontext __user *sc) { int err; #ifndef CONFIG_EVA while (1) { lock_fpu_owner(); if (is_fpu_owner()) { err = save_fp_context(sc); unlock_fpu_owner(); } else { unlock_fpu_owner(); err = copy_fp_to_sigcontext(sc); } if (likely(!err)) break; /* touch the sigcontext and try again */ err = __put_user(0, &sc->sc_fpregs[0]) | __put_user(0, &sc->sc_fpregs[31]) | __put_user(0, &sc->sc_fpc_csr); if (err) break; /* really bad sigcontext */ } #else /* * EVA does not have FPU EVA instructions so saving fpu context directly * does not work. */ lose_fpu(1); err = save_fp_context(sc); /* this might fail */ #endif return err; }
static int protected_restore_fp_context(struct sigcontext __user *sc, unsigned used_math) { int err, tmp __maybe_unused; bool restore_msa = cpu_has_msa && (used_math & USEDMATH_MSA); #ifndef CONFIG_EVA while (1) { lock_fpu_owner(); if (is_fpu_owner()) { err = restore_fp_context(sc); if (restore_msa && !err) { enable_msa(); err = _restore_msa_context(sc); } else { /* signal handler may have used MSA */ disable_msa(); } unlock_fpu_owner(); } else { unlock_fpu_owner(); err = copy_fp_from_sigcontext(sc); if (!err && (used_math & USEDMATH_MSA)) err = copy_msa_from_sigcontext(sc); } if (likely(!err)) break; /* touch the sigcontext and try again */ err = __get_user(tmp, &sc->sc_fpregs[0]) | __get_user(tmp, &sc->sc_fpregs[31]) | __get_user(tmp, &sc->sc_fpc_csr); if (err) break; /* really bad sigcontext */ } #else /* * EVA does not have FPU EVA instructions so restoring fpu context * directly does not work. */ enable_msa(); lose_fpu(0); err = restore_fp_context(sc); /* this might fail */ if (restore_msa && !err) err = copy_msa_from_sigcontext(sc); #endif return err; }
/* * Helper routines */ static int protected_save_fp_context(struct sigcontext __user *sc, unsigned used_math) { int err; bool save_msa = cpu_has_msa && (used_math & USEDMATH_MSA); #ifndef CONFIG_EVA while (1) { lock_fpu_owner(); if (is_fpu_owner()) { err = save_fp_context(sc); if (save_msa && !err) err = _save_msa_context(sc); unlock_fpu_owner(); } else { unlock_fpu_owner(); err = copy_fp_to_sigcontext(sc); if (save_msa && !err) err = copy_msa_to_sigcontext(sc); } if (likely(!err)) break; /* touch the sigcontext and try again */ err = __put_user(0, &sc->sc_fpregs[0]) | __put_user(0, &sc->sc_fpregs[31]) | __put_user(0, &sc->sc_fpc_csr); if (err) break; /* really bad sigcontext */ } #else /* * EVA does not have FPU EVA instructions so saving fpu context directly * does not work. */ disable_msa(); lose_fpu(1); err = save_fp_context(sc); /* this might fail */ if (save_msa && !err) err = copy_msa_to_sigcontext(sc); #endif return err; }
static int protected_restore_fp_context32(struct sigcontext32 __user *sc) { int err, tmp __maybe_unused; while (1) { lock_fpu_owner(); if (is_fpu_owner()) { err = restore_fp_context32(sc); unlock_fpu_owner(); } else { unlock_fpu_owner(); err = copy_fp_from_sigcontext32(sc); } if (likely(!err)) break; /* touch the sigcontext and try again */ err = __get_user(tmp, &sc->sc_fpregs[0]) | __get_user(tmp, &sc->sc_fpregs[31]) | __get_user(tmp, &sc->sc_fpc_csr); if (err) break; /* really bad sigcontext */ } return err; }
/* * sigcontext handlers */ static int protected_save_fp_context32(struct sigcontext32 __user *sc) { int err; while (1) { lock_fpu_owner(); if (is_fpu_owner()) { err = save_fp_context32(sc); unlock_fpu_owner(); } else { unlock_fpu_owner(); err = copy_fp_to_sigcontext32(sc); } if (likely(!err)) break; /* touch the sigcontext and try again */ err = __put_user(0, &sc->sc_fpregs[0]) | __put_user(0, &sc->sc_fpregs[31]) | __put_user(0, &sc->sc_fpc_csr); if (err) break; /* really bad sigcontext */ } return err; }
static int protected_restore_fp_context(struct sigcontext __user *sc) { int err, tmp __maybe_unused; while (1) { lock_fpu_owner(); own_fpu_inatomic(0); err = restore_fp_context(sc); /* this might fail */ unlock_fpu_owner(); if (likely(!err)) break; /* touch the sigcontext and try again */ err = __get_user(tmp, &sc->sc_fpregs[0]) | __get_user(tmp, &sc->sc_fpregs[31]) | __get_user(tmp, &sc->sc_fpc_csr); if (err) break; /* really bad sigcontext */ } return err; }
/* * Helper routines */ static int protected_save_fp_context(struct sigcontext __user *sc) { int err; while (1) { lock_fpu_owner(); own_fpu_inatomic(1); err = save_fp_context(sc); /* this might fail */ unlock_fpu_owner(); if (likely(!err)) break; /* touch the sigcontext and try again */ err = __put_user(0, &sc->sc_fpregs[0]) | __put_user(0, &sc->sc_fpregs[31]) | __put_user(0, &sc->sc_fpc_csr); if (err) break; /* really bad sigcontext */ } return err; }