summaryrefslogtreecommitdiffstats
path: root/sys/ia64
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-05-16 00:47:27 +0000
committerjhb <jhb@FreeBSD.org>2001-05-16 00:47:27 +0000
commitc87fc953502f943685199323ece6b3a780ea5426 (patch)
tree4d81f3f42ef909e931d0d7c2d156cfef1fb9de01 /sys/ia64
parent32652db9034eae240ce5ee42ede56bcf9b4ba0db (diff)
downloadFreeBSD-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/ia64')
-rw-r--r--sys/ia64/ia64/procfs_machdep.c43
1 files changed, 16 insertions, 27 deletions
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
OpenPOWER on IntegriCloud