MFi386: revisions 1.539, 1.540 and 1.541.
This commit is contained in:
parent
6d8c8fabad
commit
de62287d07
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=104675
@ -2179,15 +2179,14 @@ get_mcontext(struct thread *td, mcontext_t *mcp)
|
|||||||
/*
|
/*
|
||||||
* Set machine context.
|
* Set machine context.
|
||||||
*
|
*
|
||||||
* However, we don't set any but the user modifyable flags, and
|
* However, we don't set any but the user modifiable flags, and we won't
|
||||||
* we we won't touch the cs selector.
|
* touch the cs selector.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
set_mcontext(struct thread *td, const mcontext_t *mcp)
|
set_mcontext(struct thread *td, const mcontext_t *mcp)
|
||||||
{
|
{
|
||||||
struct trapframe *tp;
|
struct trapframe *tp;
|
||||||
int ret;
|
int eflags, ret;
|
||||||
int eflags;
|
|
||||||
|
|
||||||
tp = td->td_frame;
|
tp = td->td_frame;
|
||||||
if (mcp->mc_len != sizeof(*mcp))
|
if (mcp->mc_len != sizeof(*mcp))
|
||||||
@ -2221,7 +2220,7 @@ get_fpcontext(struct thread *td, mcontext_t *mcp)
|
|||||||
#ifndef DEV_NPX
|
#ifndef DEV_NPX
|
||||||
mcp->mc_fpformat = _MC_FPFMT_NODEV;
|
mcp->mc_fpformat = _MC_FPFMT_NODEV;
|
||||||
mcp->mc_ownedfp = _MC_FPOWNED_NONE;
|
mcp->mc_ownedfp = _MC_FPOWNED_NONE;
|
||||||
#else
|
#else /* DEV_NPX */
|
||||||
union savefpu *addr;
|
union savefpu *addr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2251,8 +2250,9 @@ get_fpcontext(struct thread *td, mcontext_t *mcp)
|
|||||||
bcopy(addr, &mcp->mc_fpstate, sizeof(mcp->mc_fpstate));
|
bcopy(addr, &mcp->mc_fpstate, sizeof(mcp->mc_fpstate));
|
||||||
bzero(&mcp->mc_spare2, sizeof(mcp->mc_spare2));
|
bzero(&mcp->mc_spare2, sizeof(mcp->mc_spare2));
|
||||||
}
|
}
|
||||||
|
bcopy(&mcp->mc_fpstate, &td->td_pcb->pcb_save, sizeof(mcp->mc_fpstate));
|
||||||
mcp->mc_fpformat = npxformat();
|
mcp->mc_fpformat = npxformat();
|
||||||
#endif
|
#endif /* !DEV_NPX */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -2262,10 +2262,7 @@ set_fpcontext(struct thread *td, const mcontext_t *mcp)
|
|||||||
|
|
||||||
if (mcp->mc_fpformat == _MC_FPFMT_NODEV)
|
if (mcp->mc_fpformat == _MC_FPFMT_NODEV)
|
||||||
return (0);
|
return (0);
|
||||||
else if (mcp->mc_fpformat != _MC_FPFMT_387 &&
|
if (mcp->mc_ownedfp == _MC_FPOWNED_NONE)
|
||||||
mcp->mc_fpformat != _MC_FPFMT_XMM)
|
|
||||||
return (EINVAL);
|
|
||||||
else if (mcp->mc_ownedfp == _MC_FPOWNED_NONE)
|
|
||||||
/* We don't care what state is left in the FPU or PCB. */
|
/* We don't care what state is left in the FPU or PCB. */
|
||||||
fpstate_drop(td);
|
fpstate_drop(td);
|
||||||
else if (mcp->mc_ownedfp == _MC_FPOWNED_FPU ||
|
else if (mcp->mc_ownedfp == _MC_FPOWNED_FPU ||
|
||||||
@ -2288,14 +2285,25 @@ set_fpcontext(struct thread *td, const mcontext_t *mcp)
|
|||||||
* be called with interrupts disabled.
|
* be called with interrupts disabled.
|
||||||
*/
|
*/
|
||||||
npxsetregs(td, addr);
|
npxsetregs(td, addr);
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Don't bother putting things back where they were in the
|
* Don't bother putting things back where they were in the
|
||||||
* misaligned case, since we know that the caller won't use
|
* misaligned case, since we know that the caller won't use
|
||||||
* them again.
|
* them again.
|
||||||
*/
|
*/
|
||||||
} else
|
} else {
|
||||||
|
/*
|
||||||
|
* There is no valid FPU state in *mcp, so use the saved
|
||||||
|
* state in the PCB if there is one. XXX the test for
|
||||||
|
* whether there is one seems to be quite broken. We
|
||||||
|
* forcibly drop the state in sendsig().
|
||||||
|
*/
|
||||||
|
if ((td->td_pcb->pcb_flags & PCB_NPXINITDONE) != 0)
|
||||||
|
npxsetregs(td, &td->td_pcb->pcb_save);
|
||||||
|
#endif
|
||||||
|
#if !defined(COMPAT_FREEBSD4) && !defined(COMPAT_43)
|
||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2179,15 +2179,14 @@ get_mcontext(struct thread *td, mcontext_t *mcp)
|
|||||||
/*
|
/*
|
||||||
* Set machine context.
|
* Set machine context.
|
||||||
*
|
*
|
||||||
* However, we don't set any but the user modifyable flags, and
|
* However, we don't set any but the user modifiable flags, and we won't
|
||||||
* we we won't touch the cs selector.
|
* touch the cs selector.
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
set_mcontext(struct thread *td, const mcontext_t *mcp)
|
set_mcontext(struct thread *td, const mcontext_t *mcp)
|
||||||
{
|
{
|
||||||
struct trapframe *tp;
|
struct trapframe *tp;
|
||||||
int ret;
|
int eflags, ret;
|
||||||
int eflags;
|
|
||||||
|
|
||||||
tp = td->td_frame;
|
tp = td->td_frame;
|
||||||
if (mcp->mc_len != sizeof(*mcp))
|
if (mcp->mc_len != sizeof(*mcp))
|
||||||
@ -2221,7 +2220,7 @@ get_fpcontext(struct thread *td, mcontext_t *mcp)
|
|||||||
#ifndef DEV_NPX
|
#ifndef DEV_NPX
|
||||||
mcp->mc_fpformat = _MC_FPFMT_NODEV;
|
mcp->mc_fpformat = _MC_FPFMT_NODEV;
|
||||||
mcp->mc_ownedfp = _MC_FPOWNED_NONE;
|
mcp->mc_ownedfp = _MC_FPOWNED_NONE;
|
||||||
#else
|
#else /* DEV_NPX */
|
||||||
union savefpu *addr;
|
union savefpu *addr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2251,8 +2250,9 @@ get_fpcontext(struct thread *td, mcontext_t *mcp)
|
|||||||
bcopy(addr, &mcp->mc_fpstate, sizeof(mcp->mc_fpstate));
|
bcopy(addr, &mcp->mc_fpstate, sizeof(mcp->mc_fpstate));
|
||||||
bzero(&mcp->mc_spare2, sizeof(mcp->mc_spare2));
|
bzero(&mcp->mc_spare2, sizeof(mcp->mc_spare2));
|
||||||
}
|
}
|
||||||
|
bcopy(&mcp->mc_fpstate, &td->td_pcb->pcb_save, sizeof(mcp->mc_fpstate));
|
||||||
mcp->mc_fpformat = npxformat();
|
mcp->mc_fpformat = npxformat();
|
||||||
#endif
|
#endif /* !DEV_NPX */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -2262,10 +2262,7 @@ set_fpcontext(struct thread *td, const mcontext_t *mcp)
|
|||||||
|
|
||||||
if (mcp->mc_fpformat == _MC_FPFMT_NODEV)
|
if (mcp->mc_fpformat == _MC_FPFMT_NODEV)
|
||||||
return (0);
|
return (0);
|
||||||
else if (mcp->mc_fpformat != _MC_FPFMT_387 &&
|
if (mcp->mc_ownedfp == _MC_FPOWNED_NONE)
|
||||||
mcp->mc_fpformat != _MC_FPFMT_XMM)
|
|
||||||
return (EINVAL);
|
|
||||||
else if (mcp->mc_ownedfp == _MC_FPOWNED_NONE)
|
|
||||||
/* We don't care what state is left in the FPU or PCB. */
|
/* We don't care what state is left in the FPU or PCB. */
|
||||||
fpstate_drop(td);
|
fpstate_drop(td);
|
||||||
else if (mcp->mc_ownedfp == _MC_FPOWNED_FPU ||
|
else if (mcp->mc_ownedfp == _MC_FPOWNED_FPU ||
|
||||||
@ -2288,14 +2285,25 @@ set_fpcontext(struct thread *td, const mcontext_t *mcp)
|
|||||||
* be called with interrupts disabled.
|
* be called with interrupts disabled.
|
||||||
*/
|
*/
|
||||||
npxsetregs(td, addr);
|
npxsetregs(td, addr);
|
||||||
#endif
|
|
||||||
/*
|
/*
|
||||||
* Don't bother putting things back where they were in the
|
* Don't bother putting things back where they were in the
|
||||||
* misaligned case, since we know that the caller won't use
|
* misaligned case, since we know that the caller won't use
|
||||||
* them again.
|
* them again.
|
||||||
*/
|
*/
|
||||||
} else
|
} else {
|
||||||
|
/*
|
||||||
|
* There is no valid FPU state in *mcp, so use the saved
|
||||||
|
* state in the PCB if there is one. XXX the test for
|
||||||
|
* whether there is one seems to be quite broken. We
|
||||||
|
* forcibly drop the state in sendsig().
|
||||||
|
*/
|
||||||
|
if ((td->td_pcb->pcb_flags & PCB_NPXINITDONE) != 0)
|
||||||
|
npxsetregs(td, &td->td_pcb->pcb_save);
|
||||||
|
#endif
|
||||||
|
#if !defined(COMPAT_FREEBSD4) && !defined(COMPAT_43)
|
||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user