aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyle McMartin <kyle@shortfin.cabal.ca>2008-03-01 10:25:52 -0800
committerKyle McMartin <kyle@shortfin.cabal.ca>2008-03-15 19:12:17 -0700
commitc20a84c91048c76c1379011c96b1a5cee5c7d9a0 (patch)
treeffc1f1795b9e156ce54f3f9d8915730d1c60635a
parentdc39455e7948ec9bc5f3f2dced5c2f5ac8a8dfd9 (diff)
[PARISC] futex: special case cmpxchg NULL in kernel space
Commit a0c1e9073ef7428a14309cba010633a6cd6719ea added code to futex.c to detect whether futex_atomic_cmpxchg_inatomic was implemented at run time: + curval = cmpxchg_futex_value_locked(NULL, 0, 0); + if (curval == -EFAULT) + futex_cmpxchg_enabled = 1; This is bogus on parisc, since page zero in kernel virtual space is the gateway page for syscall entry, and should not be read from the kernel. (That, and we really don't like the kernel faulting on its own address space...) Signed-off-by: Kyle McMartin <kyle@mcmartin.ca>
-rw-r--r--include/asm-parisc/futex.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/include/asm-parisc/futex.h b/include/asm-parisc/futex.h
index dbee6e60aa8..fdc6d055ef7 100644
--- a/include/asm-parisc/futex.h
+++ b/include/asm-parisc/futex.h
@@ -56,6 +56,12 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
int err = 0;
int uval;
+ /* futex.c wants to do a cmpxchg_inatomic on kernel NULL, which is
+ * our gateway page, and causes no end of trouble...
+ */
+ if (segment_eq(KERNEL_DS, get_fs()) && !uaddr)
+ return -EFAULT;
+
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
return -EFAULT;
@@ -67,5 +73,5 @@ futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval, int newval)
return uval;
}
-#endif
-#endif
+#endif /*__KERNEL__*/
+#endif /*_ASM_PARISC_FUTEX_H*/