From f0ba29575da79fa7a1533baf8b0bed4037805d9e Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Wed, 16 May 2001 00:47:27 +0000 Subject: [PATCH] Lock the procfs functions for doing a single step and reading/writing registers better. Hold sched_lock not only for checking the flag but also while performing the actual operation to ensure the process doesn't get swapped out by another CPU while we the operation is being performed. --- sys/alpha/alpha/procfs_machdep.c | 44 +++++++----------- sys/i386/i386/procfs_machdep.c | 68 ++++++++-------------------- sys/ia64/ia64/procfs_machdep.c | 43 +++++++----------- sys/powerpc/powerpc/procfs_machdep.c | 44 +++++++----------- 4 files changed, 67 insertions(+), 132 deletions(-) diff --git a/sys/alpha/alpha/procfs_machdep.c b/sys/alpha/alpha/procfs_machdep.c index e18353a6b4b..06869b065cf 100644 --- a/sys/alpha/alpha/procfs_machdep.c +++ b/sys/alpha/alpha/procfs_machdep.c @@ -81,19 +81,25 @@ #include #include +#define PROCFS_ACTION(action) do { \ + int error; \ + \ + mtx_lock_spin(&sched_lock); \ + if ((p->p_sflag & PS_INMEM) == 0) \ + error = EIO; \ + else \ + error = (action); \ + mtx_unlock_spin(&sched_lock); \ + return (error); \ +} while(0) + int procfs_read_regs(p, regs) struct proc *p; struct reg *regs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (fill_regs(p, regs)); + PROCFS_ACTION(fill_regs(p, regs)); } int @@ -102,13 +108,7 @@ procfs_write_regs(p, regs) struct reg *regs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (set_regs(p, regs)); + PROCFS_ACTION(set_regs(p, regs)); } /* @@ -122,13 +122,7 @@ procfs_read_fpregs(p, fpregs) struct fpreg *fpregs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (fill_fpregs(p, fpregs)); + PROCFS_ACTION(fill_fpregs(p, fpregs)); } int @@ -137,13 +131,7 @@ procfs_write_fpregs(p, fpregs) struct fpreg *fpregs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (set_fpregs(p, fpregs)); + PROCFS_ACTION(set_fpregs(p, fpregs)); } int diff --git a/sys/i386/i386/procfs_machdep.c b/sys/i386/i386/procfs_machdep.c index ae285c9a499..44a55648603 100644 --- a/sys/i386/i386/procfs_machdep.c +++ b/sys/i386/i386/procfs_machdep.c @@ -83,19 +83,25 @@ #include #include +#define PROCFS_ACTION(action) do { \ + int error; \ + \ + mtx_lock_spin(&sched_lock); \ + if ((p->p_sflag & PS_INMEM) == 0) \ + error = EIO; \ + else \ + error = (action); \ + mtx_unlock_spin(&sched_lock); \ + return (error); \ +} while(0) + int procfs_read_regs(p, regs) struct proc *p; struct reg *regs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (fill_regs(p, regs)); + PROCFS_ACTION(fill_regs(p, regs)); } int @@ -104,13 +110,7 @@ procfs_write_regs(p, regs) struct reg *regs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (set_regs(p, regs)); + PROCFS_ACTION(set_regs(p, regs)); } int @@ -119,13 +119,7 @@ procfs_read_dbregs(p, dbregs) struct dbreg *dbregs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (fill_dbregs(p, dbregs)); + PROCFS_ACTION(fill_dbregs(p, dbregs)); } int @@ -134,13 +128,7 @@ procfs_write_dbregs(p, dbregs) struct dbreg *dbregs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (set_dbregs(p, dbregs)); + PROCFS_ACTION(set_dbregs(p, dbregs)); } /* @@ -154,13 +142,7 @@ procfs_read_fpregs(p, fpregs) struct fpreg *fpregs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (fill_fpregs(p, fpregs)); + PROCFS_ACTION(fill_fpregs(p, fpregs)); } int @@ -169,13 +151,7 @@ procfs_write_fpregs(p, fpregs) struct fpreg *fpregs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (set_fpregs(p, fpregs)); + PROCFS_ACTION(set_fpregs(p, fpregs)); } int @@ -183,11 +159,5 @@ procfs_sstep(p) struct proc *p; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (ptrace_single_step(p)); + PROCFS_ACTION(ptrace_single_step(p)); } diff --git a/sys/ia64/ia64/procfs_machdep.c b/sys/ia64/ia64/procfs_machdep.c index e771a37e990..6deaafad66a 100644 --- a/sys/ia64/ia64/procfs_machdep.c +++ b/sys/ia64/ia64/procfs_machdep.c @@ -81,19 +81,25 @@ #include +#define PROCFS_ACTION(action) do { \ + int error; \ + \ + mtx_lock_spin(&sched_lock); \ + if ((p->p_sflag & PS_INMEM) == 0) \ + error = EIO; \ + else \ + error = (action); \ + mtx_unlock_spin(&sched_lock); \ + return (error); \ +} while(0) + int procfs_read_regs(p, regs) struct proc *p; struct reg *regs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (fill_regs(p, regs)); + PROCFS_ACTION(fill_regs(p, regs)); } int @@ -102,13 +108,7 @@ procfs_write_regs(p, regs) struct reg *regs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (set_regs(p, regs)); + PROCFS_ACTION(set_regs(p, regs)); } /* @@ -122,12 +122,7 @@ procfs_read_fpregs(p, fpregs) struct fpreg *fpregs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - return (fill_fpregs(p, fpregs)); + PROCFS_ACTION(fill_fpregs(p, fpregs)); } int @@ -136,13 +131,7 @@ procfs_write_fpregs(p, fpregs) struct fpreg *fpregs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (set_fpregs(p, fpregs)); + PROCFS_ACTION(set_fpregs(p, fpregs)); } int diff --git a/sys/powerpc/powerpc/procfs_machdep.c b/sys/powerpc/powerpc/procfs_machdep.c index e18353a6b4b..06869b065cf 100644 --- a/sys/powerpc/powerpc/procfs_machdep.c +++ b/sys/powerpc/powerpc/procfs_machdep.c @@ -81,19 +81,25 @@ #include #include +#define PROCFS_ACTION(action) do { \ + int error; \ + \ + mtx_lock_spin(&sched_lock); \ + if ((p->p_sflag & PS_INMEM) == 0) \ + error = EIO; \ + else \ + error = (action); \ + mtx_unlock_spin(&sched_lock); \ + return (error); \ +} while(0) + int procfs_read_regs(p, regs) struct proc *p; struct reg *regs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (fill_regs(p, regs)); + PROCFS_ACTION(fill_regs(p, regs)); } int @@ -102,13 +108,7 @@ procfs_write_regs(p, regs) struct reg *regs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (set_regs(p, regs)); + PROCFS_ACTION(set_regs(p, regs)); } /* @@ -122,13 +122,7 @@ procfs_read_fpregs(p, fpregs) struct fpreg *fpregs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (fill_fpregs(p, fpregs)); + PROCFS_ACTION(fill_fpregs(p, fpregs)); } int @@ -137,13 +131,7 @@ procfs_write_fpregs(p, fpregs) struct fpreg *fpregs; { - mtx_lock_spin(&sched_lock); - if ((p->p_sflag & PS_INMEM) == 0) { - mtx_unlock_spin(&sched_lock); - return (EIO); - } - mtx_unlock_spin(&sched_lock); - return (set_fpregs(p, fpregs)); + PROCFS_ACTION(set_fpregs(p, fpregs)); } int