savefpu
typedef struct savefpu savex86_t;
sizeof(struct savefpu)) {
fpu_save_area_free((struct savefpu *)xfpustate);
fpu_save_area_free((struct savefpu *)xfpustate);
fill_fpregs_xmm(struct savefpu *sv_xmm, struct fpreg *fpregs)
set_fpregs_xmm(struct fpreg *fpregs, struct savefpu *sv_xmm)
sizeof(struct savefpu))
fpu_save_area_free((struct savefpu *)xfpustate);
fpu_save_area_free((struct savefpu *)xfpustate);
if (!use_xsave || cpu_max_ext_state_size <= sizeof(struct savefpu)) {
cpu_max_ext_state_size - sizeof(struct savefpu);
error = fpusetregs(td, (struct savefpu *)&mcp->mc_fpstate,
struct savefpu *prev;
static struct savefpu *
return ((struct savefpu *)p);
struct savefpu *
fpu_save_area_free(struct savefpu *fsa)
fpu_save_area_reset(struct savefpu *fsa)
offs = sizeof(struct savefpu) + sizeof(struct xstate_hdr);
return (sizeof(struct savefpu));
CTASSERT(sizeof(struct savefpu) == 512);
CTASSERT(X86_XSTATE_XCR0_OFFSET >= offsetof(struct savefpu, sv_pad) &&
X86_XSTATE_XCR0_OFFSET + sizeof(uint64_t) <= sizeof(struct savefpu));
static struct savefpu *fpu_initialstate;
cpu_max_ext_state_size = sizeof(struct savefpu);
struct savefpu *pcb_save;
struct savefpu *s;
xstate_bv = (uint64_t *)(sa + sizeof(struct savefpu) +
s = (struct savefpu *)sa;
max_len = cpu_max_ext_state_size - sizeof(struct savefpu);
fpusetregs(struct thread *td, struct savefpu *addr, char *xfpustate,
cpu_max_ext_state_size = sizeof(struct savefpu);
char *savefpu;
savefpu = (char *)(get_pcb_user_save_td(td) + 1);
error = copyout(savefpu, addr,
cpu_max_ext_state_size - sizeof(struct savefpu));
if (data > cpu_max_ext_state_size - sizeof(struct savefpu)) {
savefpu = malloc(data, M_TEMP, M_WAITOK);
error = copyin(addr, savefpu, data);
error = fpusetxstate(td, savefpu, data);
free(savefpu, M_TEMP);
savefpu = (char *)(get_pcb_user_save_td(td));
error = copyout(savefpu, addr, cpu_max_ext_state_size);
if (data < sizeof(struct savefpu) ||
savefpu = malloc(data, M_TEMP, M_WAITOK);
error = copyin(addr, savefpu, data);
error = fpusetregs(td, (struct savefpu *)savefpu,
savefpu + sizeof(struct savefpu), data -
sizeof(struct savefpu));
free(savefpu, M_TEMP);
struct savefpu *fpstate;
sizeof(struct savefpu))
struct savefpu *
struct savefpu *
struct savefpu *sv_fpu;
struct savefpu *sv_fpu = get_pcb_user_save_td(td);
if (!use_xsave || cpu_max_ext_state_size <= sizeof(struct savefpu)) {
cpu_max_ext_state_size - sizeof(struct savefpu);
error = fpusetregs(td, (struct savefpu *)&mcp->mc_fpstate,
sizeof(struct savefpu))
fpu_save_area_free((struct savefpu *)xfpustate);
fpu_save_area_free((struct savefpu *)xfpustate);
sizeof(struct savefpu)) {
fpu_save_area_free((struct savefpu *)xfpustate);
fpu_save_area_free((struct savefpu *)xfpustate);
int fpusetregs(struct thread *td, struct savefpu *addr,
struct savefpu *fpu_save_area_alloc(void);
void fpu_save_area_free(struct savefpu *fsa);
void fpu_save_area_reset(struct savefpu *fsa);
struct savefpu;
struct savefpu *get_pcb_user_save_td(struct thread *td);
struct savefpu *get_pcb_user_save_pcb(struct pcb *pcb);
struct savefpu *pcb_save;
struct savefpu *guestfpu; /* (a,i) guest fpu state */ \
struct savefpu *fp = (struct savefpu *)&mcp->mc_fpstate[0];
struct savefpu *fp = (struct savefpu *)&mcp->mc_fpstate[0];
mcp->mc_xfpustate_len = cpu_max_ext_state_size - sizeof(struct savefpu);
fpu_save_area_free((struct savefpu *)xfpustate);
fpu_save_area_free((struct savefpu *)xfpustate);
fpu_save_area_free((struct savefpu *)xfpustate);
sizeof(union savefpu))
max_len = cpu_max_ext_state_size - sizeof(union savefpu);
error = npxsetregs(td, (union savefpu *)&mcp->mc_fpstate,
if (cpu_max_ext_state_size > sizeof(union savefpu) && use_xsave) {
xfpusave_len = cpu_max_ext_state_size - sizeof(union savefpu);
sizeof(union savefpu)) {
xstate_bv = (uint64_t *)(sa + sizeof(union savefpu) +
s = (union savefpu *)sa;
max_len = cpu_max_ext_state_size - sizeof(union savefpu);
npxsetregs(struct thread *td, union savefpu *addr, char *xfpustate,
union savefpu *sv;
union savefpu sv;
fpurstor(union savefpu *addr)
#define SET_FPU_CW(savefpu, value) do { \
(savefpu)->sv_xmm.sv_env.en_cw = (value); \
(savefpu)->sv_87.sv_env.en_cw = (value); \
union savefpu *prev;
CTASSERT(sizeof(union savefpu) == 512);
static union savefpu *
return ((union savefpu *)p);
union savefpu *
fpu_save_area_free(union savefpu *fsa)
fpu_save_area_reset(union savefpu *fsa)
static void fpurstor(union savefpu *);
static union savefpu *npx_initialstate;
fpusave_xsaveopt(union savefpu *addr)
fpusave_xsave(union savefpu *addr)
fpusave_fxsave(union savefpu *addr)
fpusave_fnsave(union savefpu *addr)
DEFINE_IFUNC(, void, fpusave, (union savefpu *))
cpu_max_ext_state_size = sizeof(union savefpu);
static union savefpu dummy;
npxsave(union savefpu *addr)
npxsuspend(union savefpu *addr)
npxresume(union savefpu *addr)
union savefpu *s;
savefpu = (char *)(get_pcb_user_save_td(td) + 1);
error = copyout(savefpu, addr,
cpu_max_ext_state_size - sizeof(union savefpu));
if (data > cpu_max_ext_state_size - sizeof(union savefpu)) {
savefpu = malloc(data, M_TEMP, M_WAITOK);
error = copyin(addr, savefpu, data);
error = npxsetxstate(td, savefpu, data);
free(savefpu, M_TEMP);
savefpu = (char *)(get_pcb_user_save_td(td));
error = copyout(savefpu, addr, cpu_max_ext_state_size);
if (data < sizeof(union savefpu) ||
savefpu = malloc(data, M_TEMP, M_WAITOK);
error = copyin(addr, savefpu, data);
error = npxsetregs(td, (union savefpu *)savefpu,
savefpu + sizeof(union savefpu), data -
sizeof(union savefpu));
free(savefpu, M_TEMP);
char *savefpu;
sizeof(union savefpu))
return ((union savefpu *)p);
union savefpu *
return ((union savefpu *)p);
union savefpu *
union savefpu;
union savefpu *get_pcb_user_save_td(struct thread *td);
union savefpu *get_pcb_user_save_pcb(struct pcb *pcb);
void npxresume(union savefpu *addr);
void npxsave(union savefpu *addr);
int npxsetregs(struct thread *td, union savefpu *addr,
void npxsuspend(union savefpu *addr);
union savefpu *fpu_save_area_alloc(void);
void fpu_save_area_free(union savefpu *fsa);
void fpu_save_area_reset(union savefpu *fsa);
union savefpu *pcb_save;