| 2414 | } |
| 2415 | |
| 2416 | static int |
| 2417 | set_fpcontext(struct thread *td, mcontext_t *mcp, char *xfpustate, |
| 2418 | size_t xfpustate_len) |
| 2419 | { |
| 2420 | int error; |
| 2421 | |
| 2422 | if (mcp->mc_fpformat == _MC_FPFMT_NODEV) |
| 2423 | return (0); |
| 2424 | else if (mcp->mc_fpformat != _MC_FPFMT_XMM) |
| 2425 | return (EINVAL); |
| 2426 | else if (mcp->mc_ownedfp == _MC_FPOWNED_NONE) { |
| 2427 | /* We don't care what state is left in the FPU or PCB. */ |
| 2428 | fpstate_drop(td); |
| 2429 | error = 0; |
| 2430 | } else if (mcp->mc_ownedfp == _MC_FPOWNED_FPU || |
| 2431 | mcp->mc_ownedfp == _MC_FPOWNED_PCB) { |
| 2432 | error = fpusetregs(td, (struct savefpu *)&mcp->mc_fpstate, |
| 2433 | xfpustate, xfpustate_len); |
| 2434 | } else |
| 2435 | return (EINVAL); |
| 2436 | return (error); |
| 2437 | } |
| 2438 | |
| 2439 | void |
| 2440 | fpstate_drop(struct thread *td) |
no test coverage detected