diff options
author | jhb <jhb@FreeBSD.org> | 2001-05-16 00:47:27 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2001-05-16 00:47:27 +0000 |
commit | c87fc953502f943685199323ece6b3a780ea5426 (patch) | |
tree | 4d81f3f42ef909e931d0d7c2d156cfef1fb9de01 /sys | |
parent | 32652db9034eae240ce5ee42ede56bcf9b4ba0db (diff) | |
download | FreeBSD-src-c87fc953502f943685199323ece6b3a780ea5426.zip FreeBSD-src-c87fc953502f943685199323ece6b3a780ea5426.tar.gz |
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.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/alpha/alpha/procfs_machdep.c | 44 | ||||
-rw-r--r-- | sys/i386/i386/procfs_machdep.c | 68 | ||||
-rw-r--r-- | sys/ia64/ia64/procfs_machdep.c | 43 | ||||
-rw-r--r-- | 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 e18353a..06869b0 100644 --- a/sys/alpha/alpha/procfs_machdep.c +++ b/sys/alpha/alpha/procfs_machdep.c @@ -81,19 +81,25 @@ #include <vm/pmap.h> #include <vm/vm_map.h> +#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 ae285c9a..44a5564 100644 --- a/sys/i386/i386/procfs_machdep.c +++ b/sys/i386/i386/procfs_machdep.c @@ -83,19 +83,25 @@ #include <vm/pmap.h> #include <vm/vm_map.h> +#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 e771a37..6deaafa 100644 --- a/sys/ia64/ia64/procfs_machdep.c +++ b/sys/ia64/ia64/procfs_machdep.c @@ -81,19 +81,25 @@ #include <sys/user.h> +#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 e18353a..06869b0 100644 --- a/sys/powerpc/powerpc/procfs_machdep.c +++ b/sys/powerpc/powerpc/procfs_machdep.c @@ -81,19 +81,25 @@ #include <vm/pmap.h> #include <vm/vm_map.h> +#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 |