Implement i386's (o)sigreturn() like the alpha's: Use copyin() to read

the osigcontext or ucontext_t rather than useracc() followed by direct user-
space memory accesses.  This reduces (o)sigreturn()'s execution time by 5-
50%.

Submitted by:	bde
This commit is contained in:
Alan Cox 2002-03-31 01:13:21 +00:00
parent 5e20c11f19
commit ca19a2d68c
2 changed files with 24 additions and 16 deletions

View File

@ -553,15 +553,17 @@ osigreturn(td, uap)
} */ *uap;
{
#ifdef COMPAT_43
struct osigcontext sc;
struct trapframe *regs;
struct osigcontext *scp;
struct proc *p = td->td_proc;
int eflags;
int eflags, error;
regs = td->td_frame;
scp = uap->sigcntxp;
if (!useracc((caddr_t)scp, sizeof(*scp), VM_PROT_READ))
return (EFAULT);
error = copyin(uap->sigcntxp, &sc, sizeof(sc));
if (error != 0)
return (error);
scp = ≻
eflags = scp->sc_ps;
if (eflags & PSL_VM) {
struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
@ -667,14 +669,16 @@ sigreturn(td, uap)
const __ucontext *sigcntxp;
} */ *uap;
{
ucontext_t uc;
struct proc *p = td->td_proc;
struct trapframe *regs;
const ucontext_t *ucp;
int cs, eflags;
int cs, eflags, error;
ucp = uap->sigcntxp;
if (!useracc((caddr_t)(uintptr_t)ucp, sizeof(*ucp), VM_PROT_READ))
return (EFAULT);
error = copyin(uap->sigcntxp, &uc, sizeof(uc));
if (error != 0)
return (error);
ucp = &uc;
regs = td->td_frame;
eflags = ucp->uc_mcontext.mc_eflags;
if (eflags & PSL_VM) {

View File

@ -553,15 +553,17 @@ osigreturn(td, uap)
} */ *uap;
{
#ifdef COMPAT_43
struct osigcontext sc;
struct trapframe *regs;
struct osigcontext *scp;
struct proc *p = td->td_proc;
int eflags;
int eflags, error;
regs = td->td_frame;
scp = uap->sigcntxp;
if (!useracc((caddr_t)scp, sizeof(*scp), VM_PROT_READ))
return (EFAULT);
error = copyin(uap->sigcntxp, &sc, sizeof(sc));
if (error != 0)
return (error);
scp = ≻
eflags = scp->sc_ps;
if (eflags & PSL_VM) {
struct trapframe_vm86 *tf = (struct trapframe_vm86 *)regs;
@ -667,14 +669,16 @@ sigreturn(td, uap)
const __ucontext *sigcntxp;
} */ *uap;
{
ucontext_t uc;
struct proc *p = td->td_proc;
struct trapframe *regs;
const ucontext_t *ucp;
int cs, eflags;
int cs, eflags, error;
ucp = uap->sigcntxp;
if (!useracc((caddr_t)(uintptr_t)ucp, sizeof(*ucp), VM_PROT_READ))
return (EFAULT);
error = copyin(uap->sigcntxp, &uc, sizeof(uc));
if (error != 0)
return (error);
ucp = &uc;
regs = td->td_frame;
eflags = ucp->uc_mcontext.mc_eflags;
if (eflags & PSL_VM) {