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/powerpc | |
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/powerpc')
-rw-r--r-- | sys/powerpc/powerpc/procfs_machdep.c | 44 |
1 files changed, 16 insertions, 28 deletions
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 |