示例#1
0
int
process_read_fpregs(struct lwp *l, struct fpreg *regs)
{
	struct fpframe *frame = process_fpframe(l);

	memcpy(regs->r_regs, frame->fpf_regs, sizeof(frame->fpf_regs));
	regs->r_fpcr = frame->fpf_fpcr;
	regs->r_fpsr = frame->fpf_fpsr;
	regs->r_fpiar = frame->fpf_fpiar;

	return 0;
}
示例#2
0
int
process_write_fpregs(struct lwp *l, const struct fpreg *regs)
{
	struct fpframe *frame = process_fpframe(l);

	memcpy(frame->fpf_regs, regs->r_regs, sizeof(frame->fpf_regs));
	frame->fpf_fpcr = regs->r_fpcr;
	frame->fpf_fpsr = regs->r_fpsr;
	frame->fpf_fpiar = regs->r_fpiar;

	return 0;
}
int
process_write_fpregs(struct proc *p, struct fpreg *regs)
{
	struct fxsave64 *frame = process_fpframe(p);

	if (p->p_md.md_flags & MDP_USEDFPU) {
		fpusave_proc(p, 0);
	} else {
		p->p_md.md_flags |= MDP_USEDFPU;
	}

	memcpy(frame, &regs->fxstate, sizeof(*regs));
	frame->fx_mxcsr &= fpu_mxcsr_mask;
	return (0);
}
int
process_read_fpregs(struct proc *p, struct fpreg *regs)
{
	struct fxsave64 *frame = process_fpframe(p);

	if (p->p_md.md_flags & MDP_USEDFPU) {
		fpusave_proc(p, 1);
	} else {
		/* Fake a FNINIT. */
		memset(frame, 0, sizeof(*regs));
		frame->fx_fcw = __INITIAL_NPXCW__;
		frame->fx_fsw = 0x0000;
		frame->fx_ftw = 0xff;
		frame->fx_mxcsr = __INITIAL_MXCSR__;
		frame->fx_mxcsr_mask = fpu_mxcsr_mask;
		p->p_md.md_flags |= MDP_USEDFPU;
	}

	memcpy(&regs->fxstate, frame, sizeof(*regs));
	return (0);
}