* [PATCH] Expose range-checking functions from arch-specific uaccess.h
@ 2007-04-04 2:28 Rusty Russell
2007-04-04 3:22 ` Randy Dunlap
0 siblings, 1 reply; 3+ messages in thread
From: Rusty Russell @ 2007-04-04 2:28 UTC (permalink / raw)
To: lkml - Kernel Mailing List; +Cc: Andrew Morton
lguest wants range checking, but unless there are other users I'm not
sure this is worth the pain. Putting it out there in case it's useful.
Cheers,
Rusty.
==
There are some places where we want to check if a value + length is
within a range. This can be tricky, so it's nice to have a single
routine.
Also, this can be done more efficiently (with arch-dependent) carry
bits, as shown by the __range_ok() implementation on several archs.
This patch exposes arch-specific "val_outside(val, len, limit)" and a
generic "range_within(start, len, base, limit)" function. As a
side-effect, it fixes the comment in i386/uaccess.h: __range_ok
doesn't test "(u33)addr + (u33)size >= (u33)current->addr_limit.seg",
it tests "(u33)addr + (u33)size > (u33)current->addr_limit.seg".
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
diff -r 4272a6d4f27c include/asm-generic/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-generic/range.h Wed Apr 04 12:18:15 2007 +1000
@@ -0,0 +1,20 @@
+#ifndef _ASM_GENERIC_RANGE_H
+#define _ASM_GENERIC_RANGE_H
+
+/**
+ * val_outside - is a value and length past a limit?
+ * @val: the start value
+ * @len: the length from the start
+ * @limit: the first invalid value
+ *
+ * Like val + len > limit, except with overflow checking.
+ */
+static inline bool val_outside(unsigned long val, unsigned long len,
+ unsigned long limit)
+
+{
+ return val + len > limit || val + len < val;
+}
+
+#endif /* _ASM_GENERIC_RANGE_H */
+
diff -r 4272a6d4f27c include/asm-i386/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-i386/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,14 @@
+#ifndef __ASM_RANGE_H
+#define __ASM_RANGE_H
+
+/* Is val + size > limit? This needs 33-bit arithmetic. We have a carry... */
+static inline bool val_outside(unsigned long val, unsigned long len,
+ unsigned long limit)
+{
+ unsigned long flag, roksum;
+ asm("addl %3,%1 ; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0"
+ :"=&r" (flag), "=r" (roksum)
+ :"1" (val), "g" (len), "rm" (limit));
+ return flag;
+}
+#endif /* __ASM_RANGE_H */
diff -r 4272a6d4f27c include/asm-i386/uaccess.h
--- a/include/asm-i386/uaccess.h Wed Apr 04 12:05:49 2007 +1000
+++ b/include/asm-i386/uaccess.h Wed Apr 04 12:14:45 2007 +1000
@@ -49,17 +49,12 @@ extern struct movsl_mask {
* Returns 0 if the range is valid, nonzero otherwise.
*
* This is equivalent to the following test:
- * (u33)addr + (u33)size >= (u33)current->addr_limit.seg
- *
- * This needs 33-bit arithmetic. We have a carry...
- */
-#define __range_ok(addr,size) ({ \
- unsigned long flag,roksum; \
- __chk_user_ptr(addr); \
- asm("addl %3,%1 ; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0" \
- :"=&r" (flag), "=r" (roksum) \
- :"1" (addr),"g" ((int)(size)),"rm" (current_thread_info()->addr_limit.seg)); \
- flag; })
+ * (u33)addr + (u33)size > (u33)current->addr_limit.seg
+ */
+#define __range_ok(addr,size) ({ \
+ __chk_user_ptr(addr); \
+ val_outside((int)(addr),(size),current_thread_info()->addr_limit.seg); \
+})
/**
* access_ok: - Checks if a user space pointer is valid
diff -r 4272a6d4f27c include/linux/kernel.h
--- a/include/linux/kernel.h Wed Apr 04 12:05:49 2007 +1000
+++ b/include/linux/kernel.h Wed Apr 04 12:22:52 2007 +1000
@@ -16,6 +16,7 @@
#include <linux/log2.h>
#include <asm/byteorder.h>
#include <asm/bug.h>
+#include <asm/range.h>
extern const char linux_banner[];
extern const char linux_proc_banner[];
@@ -311,6 +312,26 @@ static inline int __attribute__ ((format
(void)__tmp; \
})
+/**
+ * range_within - is one range within another?
+ * @start: the start value
+ * @len: the length from the start
+ * @base: the first valid value
+ * @limit: the first invalid value
+ *
+ * This is usually used for memory range testing. The common cases of
+ * constant 0 start and constant 0 len cases are optimized out.
+ */
+static inline bool range_within(unsigned long start, unsigned long len,
+ unsigned long base, unsigned long limit)
+{
+ if (start < base)
+ return false;
+ if (__builtin_constant_p(len) && len == 0)
+ return start - base <= limit - base;
+ return !val_outside(limit, start, len);
+}
+
struct sysinfo;
extern int do_sysinfo(struct sysinfo *info);
diff -r 4272a6d4f27c include/asm-alpha/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-alpha/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-arm/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-arm/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-arm26/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-arm26/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-avr32/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-avr32/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-blackfin/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-blackfin/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-cris/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-cris/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-frv/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-frv/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-h8300/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-h8300/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-ia64/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-ia64/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-m32r/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-m32r/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-m68k/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-m68k/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-m68knommu/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-m68knommu/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-mips/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-mips/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-parisc/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-parisc/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-powerpc/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-powerpc/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-ppc/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-ppc/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-s390/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-s390/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-sh/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-sh/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-sh64/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-sh64/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-sparc/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-sparc/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-sparc64/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-sparc64/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-um/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-um/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-v850/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-v850/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-x86_64/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-x86_64/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
diff -r 4272a6d4f27c include/asm-xtensa/range.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/include/asm-xtensa/range.h Wed Apr 04 12:14:45 2007 +1000
@@ -0,0 +1,6 @@
+#ifndef __ALPHA_RANGE_H
+#define __ALPHA_RANGE_H
+
+#include <asm-generic/range.h>
+
+#endif /* __ALPHA_RANGE_H */
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] Expose range-checking functions from arch-specific uaccess.h 2007-04-04 2:28 [PATCH] Expose range-checking functions from arch-specific uaccess.h Rusty Russell @ 2007-04-04 3:22 ` Randy Dunlap 2007-04-04 6:41 ` Rusty Russell 0 siblings, 1 reply; 3+ messages in thread From: Randy Dunlap @ 2007-04-04 3:22 UTC (permalink / raw) To: Rusty Russell; +Cc: lkml - Kernel Mailing List, Andrew Morton On Wed, 04 Apr 2007 12:28:38 +1000 Rusty Russell wrote: > lguest wants range checking, but unless there are other users I'm not > sure this is worth the pain. Putting it out there in case it's useful. > > Cheers, > Rusty. > == > There are some places where we want to check if a value + length is > within a range. This can be tricky, so it's nice to have a single > routine. > > Also, this can be done more efficiently (with arch-dependent) carry > bits, as shown by the __range_ok() implementation on several archs. > > This patch exposes arch-specific "val_outside(val, len, limit)" and a > generic "range_within(start, len, base, limit)" function. As a > side-effect, it fixes the comment in i386/uaccess.h: __range_ok > doesn't test "(u33)addr + (u33)size >= (u33)current->addr_limit.seg", > it tests "(u33)addr + (u33)size > (u33)current->addr_limit.seg". > > Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> > > diff -r 4272a6d4f27c include/asm-generic/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-generic/range.h Wed Apr 04 12:18:15 2007 +1000 > @@ -0,0 +1,20 @@ > +#ifndef _ASM_GENERIC_RANGE_H > +#define _ASM_GENERIC_RANGE_H > + > +/** > + * val_outside - is a value and length past a limit? > + * @val: the start value > + * @len: the length from the start > + * @limit: the first invalid value > + * > + * Like val + len > limit, except with overflow checking. > + */ > +static inline bool val_outside(unsigned long val, unsigned long len, > + unsigned long limit) > + > +{ > + return val + len > limit || val + len < val; why isn't that return val + len >= limit || val + len < val; > +} > + > +#endif /* _ASM_GENERIC_RANGE_H */ > + > diff -r 4272a6d4f27c include/asm-i386/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-i386/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,14 @@ > +#ifndef __ASM_RANGE_H > +#define __ASM_RANGE_H > + > +/* Is val + size > limit? This needs 33-bit arithmetic. We have a carry... */ > +static inline bool val_outside(unsigned long val, unsigned long len, > + unsigned long limit) > +{ > + unsigned long flag, roksum; > + asm("addl %3,%1 ; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0" > + :"=&r" (flag), "=r" (roksum) > + :"1" (val), "g" (len), "rm" (limit)); > + return flag; > +} > +#endif /* __ASM_RANGE_H */ > diff -r 4272a6d4f27c include/asm-i386/uaccess.h > --- a/include/asm-i386/uaccess.h Wed Apr 04 12:05:49 2007 +1000 > +++ b/include/asm-i386/uaccess.h Wed Apr 04 12:14:45 2007 +1000 > @@ -49,17 +49,12 @@ extern struct movsl_mask { > * Returns 0 if the range is valid, nonzero otherwise. > * > * This is equivalent to the following test: > - * (u33)addr + (u33)size >= (u33)current->addr_limit.seg > - * > - * This needs 33-bit arithmetic. We have a carry... > - */ > -#define __range_ok(addr,size) ({ \ > - unsigned long flag,roksum; \ > - __chk_user_ptr(addr); \ > - asm("addl %3,%1 ; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0" \ > - :"=&r" (flag), "=r" (roksum) \ > - :"1" (addr),"g" ((int)(size)),"rm" (current_thread_info()->addr_limit.seg)); \ > - flag; }) > + * (u33)addr + (u33)size > (u33)current->addr_limit.seg > + */ > +#define __range_ok(addr,size) ({ \ > + __chk_user_ptr(addr); \ > + val_outside((int)(addr),(size),current_thread_info()->addr_limit.seg); \ space after commas, please. > +}) > > /** > * access_ok: - Checks if a user space pointer is valid > diff -r 4272a6d4f27c include/linux/kernel.h > --- a/include/linux/kernel.h Wed Apr 04 12:05:49 2007 +1000 > +++ b/include/linux/kernel.h Wed Apr 04 12:22:52 2007 +1000 > @@ -16,6 +16,7 @@ > #include <linux/log2.h> > #include <asm/byteorder.h> > #include <asm/bug.h> > +#include <asm/range.h> > > extern const char linux_banner[]; > extern const char linux_proc_banner[]; > @@ -311,6 +312,26 @@ static inline int __attribute__ ((format > (void)__tmp; \ > }) > > +/** > + * range_within - is one range within another? > + * @start: the start value > + * @len: the length from the start > + * @base: the first valid value > + * @limit: the first invalid value > + * > + * This is usually used for memory range testing. The common cases of > + * constant 0 start and constant 0 len cases are optimized out. > + */ Where is constant 0 start optimized out? > +static inline bool range_within(unsigned long start, unsigned long len, > + unsigned long base, unsigned long limit) > +{ > + if (start < base) > + return false; > + if (__builtin_constant_p(len) && len == 0) I don't see what the builtin_constant_p() adds here. If len == 0, this return <expression> is still OK, isn't it? > + return start - base <= limit - base; > + return !val_outside(limit, start, len); > +} > + > struct sysinfo; > extern int do_sysinfo(struct sysinfo *info); > > diff -r 4272a6d4f27c include/asm-alpha/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-alpha/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-arm/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-arm/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H why ALPHA ? > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-arm26/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-arm26/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H ditto > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-avr32/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-avr32/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H tritto etc. etc. > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-blackfin/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-blackfin/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-cris/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-cris/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-frv/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-frv/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-h8300/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-h8300/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-ia64/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-ia64/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-m32r/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-m32r/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-m68k/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-m68k/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-m68knommu/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-m68knommu/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-mips/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-mips/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-parisc/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-parisc/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-powerpc/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-powerpc/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-ppc/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-ppc/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-s390/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-s390/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-sh/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-sh/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-sh64/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-sh64/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-sparc/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-sparc/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-sparc64/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-sparc64/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-um/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-um/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-v850/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-v850/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-x86_64/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-x86_64/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ > diff -r 4272a6d4f27c include/asm-xtensa/range.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/include/asm-xtensa/range.h Wed Apr 04 12:14:45 2007 +1000 > @@ -0,0 +1,6 @@ > +#ifndef __ALPHA_RANGE_H > +#define __ALPHA_RANGE_H > + > +#include <asm-generic/range.h> > + > +#endif /* __ALPHA_RANGE_H */ --- ~Randy *** Remember to use Documentation/SubmitChecklist when testing your code *** ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Expose range-checking functions from arch-specific uaccess.h 2007-04-04 3:22 ` Randy Dunlap @ 2007-04-04 6:41 ` Rusty Russell 0 siblings, 0 replies; 3+ messages in thread From: Rusty Russell @ 2007-04-04 6:41 UTC (permalink / raw) To: Randy Dunlap; +Cc: lkml - Kernel Mailing List, Andrew Morton On Tue, 2007-04-03 at 20:22 -0700, Randy Dunlap wrote: > > +/** > > + * val_outside - is a value and length past a limit? > > + * @val: the start value > > + * @len: the length from the start > > + * @limit: the first invalid value > > + * > > + * Like val + len > limit, except with overflow checking. > > + */ > > +static inline bool val_outside(unsigned long val, unsigned long len, > > + unsigned long limit) > > + > > +{ > > + return val + len > limit || val + len < val; > > why isn't that > return val + len >= limit || val + len < val; Hi Randy! Good question! Mainly because that's what the existing __range_ok() function does: limit is the first *invalid* value, not the last valid value. Say your limit is 0xC000 0000. You want to be able to write 1 byte to 0xBFFF FFFF. So it's only outside if val + len > limit. > > +#define __range_ok(addr,size) ({ \ > > + __chk_user_ptr(addr); \ > > + val_outside((int)(addr),(size),current_thread_info()->addr_limit.seg); \ > > space after commas, please. Yeah, I copied the existing code (but gladly: spaces pushes us onto another line). Fixed. > > + * This is usually used for memory range testing. The common cases of > > + * constant 0 start and constant 0 len cases are optimized out. > > + */ > > Where is constant 0 start optimized out? The start < base is optimized out if base is known to be 0 (they're both unsigned): gcc realizes that can never be true so kills that whole branch. > > +static inline bool range_within(unsigned long start, unsigned long len, > > + unsigned long base, unsigned long limit) > > +{ > > + if (start < base) > > + return false; > > + if (__builtin_constant_p(len) && len == 0) > > I don't see what the builtin_constant_p() adds here. > If len == 0, this return <expression> is still OK, isn't it? We don't really want a branch in this code: __builtin_constant_p() ensures we end up only with "start - base <= limit - base" or "! val_outside(limit, start, len)" in the binary. > > diff -r 4272a6d4f27c include/asm-arm/range.h > > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > > +++ b/include/asm-arm/range.h Wed Apr 04 12:14:45 2007 +1000 > > @@ -0,0 +1,6 @@ > > +#ifndef __ALPHA_RANGE_H > > +#define __ALPHA_RANGE_H > > why ALPHA ? Oops. Because I coded this with a "for d in include/asm-*...". Fixed. Thanks! Rusty. == There are some places where we want to check if a value + length is within a range. This can be tricky, so it's nice to have a single routine. Also, this can be done more efficiently (with arch-dependent) carry bits, as shown by the __range_ok() implementation on several archs. This patch exposes arch-specific "val_outside(val, len, limit)" and a generic "range_within(start, len, base, limit)" function. As a side-effect, it fixes the comment in i386/uaccess.h: __range_ok doesn't test "(u33)addr + (u33)size >= (u33)current->addr_limit.seg", it tests "(u33)addr + (u33)size > (u33)current->addr_limit.seg". Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> diff -r 4815a24d0254 include/linux/kernel.h --- a/include/linux/kernel.h Wed Apr 04 16:35:57 2007 +1000 +++ b/include/linux/kernel.h Wed Apr 04 16:36:00 2007 +1000 @@ -16,6 +16,7 @@ #include <linux/log2.h> #include <asm/byteorder.h> #include <asm/bug.h> +#include <asm/range.h> extern const char linux_banner[]; extern const char linux_proc_banner[]; @@ -311,6 +312,26 @@ static inline int __attribute__ ((format (void)__tmp; \ }) +/** + * range_within - is one range within another? + * @start: the start value + * @len: the length from the start + * @base: the first valid value + * @limit: the first invalid value + * + * This is usually used for memory range testing. The common cases of + * constant 0 start and constant 0 len cases are optimized out. + */ +static inline bool range_within(unsigned long start, unsigned long len, + unsigned long base, unsigned long limit) +{ + if (start < base) + return false; + if (__builtin_constant_p(len) && len == 0) + return start - base <= limit - base; + return !val_outside(limit, start, len); +} + struct sysinfo; extern int do_sysinfo(struct sysinfo *info); diff -r 4815a24d0254 include/asm-i386/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-i386/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,14 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +/* Is val + size > limit? This needs 33-bit arithmetic. We have a carry... */ +static inline bool val_outside(unsigned long val, unsigned long len, + unsigned long limit) +{ + unsigned long flag, roksum; + asm("addl %3,%1 ; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0" + :"=&r" (flag), "=r" (roksum) + :"1" (val), "g" (len), "rm" (limit)); + return flag; +} +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-i386/uaccess.h --- a/include/asm-i386/uaccess.h Wed Apr 04 16:35:57 2007 +1000 +++ b/include/asm-i386/uaccess.h Wed Apr 04 16:36:34 2007 +1000 @@ -49,17 +49,13 @@ extern struct movsl_mask { * Returns 0 if the range is valid, nonzero otherwise. * * This is equivalent to the following test: - * (u33)addr + (u33)size >= (u33)current->addr_limit.seg - * - * This needs 33-bit arithmetic. We have a carry... - */ -#define __range_ok(addr,size) ({ \ - unsigned long flag,roksum; \ - __chk_user_ptr(addr); \ - asm("addl %3,%1 ; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0" \ - :"=&r" (flag), "=r" (roksum) \ - :"1" (addr),"g" ((int)(size)),"rm" (current_thread_info()->addr_limit.seg)); \ - flag; }) + * (u33)addr + (u33)size > (u33)current->addr_limit.seg + */ +#define __range_ok(addr, size) ({ \ + __chk_user_ptr(addr); \ + val_outside((int)(addr), (size), \ + current_thread_info()->addr_limit.seg); \ +}) /** * access_ok: - Checks if a user space pointer is valid diff -r 4815a24d0254 include/asm-generic/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-generic/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,20 @@ +#ifndef _ASM_GENERIC_RANGE_H +#define _ASM_GENERIC_RANGE_H + +/** + * val_outside - is a value and length past a limit? + * @val: the start value + * @len: the length from the start + * @limit: the first invalid value + * + * Like val + len > limit, except with overflow checking. + */ +static inline bool val_outside(unsigned long val, unsigned long len, + unsigned long limit) + +{ + return val + len > limit || val + len < val; +} + +#endif /* _ASM_GENERIC_RANGE_H */ + diff -r 4815a24d0254 include/asm-alpha/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-alpha/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-arm/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-arm/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-arm26/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-arm26/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-avr32/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-avr32/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-blackfin/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-blackfin/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-cris/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-cris/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-frv/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-frv/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-h8300/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-h8300/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-ia64/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-ia64/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-m32r/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-m32r/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-m68k/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-m68k/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-m68knommu/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-m68knommu/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-mips/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-mips/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-parisc/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-parisc/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-powerpc/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-powerpc/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-ppc/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-ppc/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-s390/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-s390/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-sh/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-sh/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-sh64/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-sh64/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-sparc/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-sparc/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-sparc64/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-sparc64/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-um/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-um/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-v850/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-v850/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-x86_64/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-x86_64/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ diff -r 4815a24d0254 include/asm-xtensa/range.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/asm-xtensa/range.h Wed Apr 04 16:36:00 2007 +1000 @@ -0,0 +1,6 @@ +#ifndef __ASM_RANGE_H +#define __ASM_RANGE_H + +#include <asm-generic/range.h> + +#endif /* __ASM_RANGE_H */ ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2007-04-04 6:41 UTC | newest] Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2007-04-04 2:28 [PATCH] Expose range-checking functions from arch-specific uaccess.h Rusty Russell 2007-04-04 3:22 ` Randy Dunlap 2007-04-04 6:41 ` Rusty Russell
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®