diff options
author | Rusty Russell <rusty@rustcorp.com.au> | 2013-03-18 13:22:19 +1030 |
---|---|---|
committer | Rusty Russell <rusty@rustcorp.com.au> | 2013-03-20 14:00:42 +1030 |
commit | 61d0b5a4b2777dcf5daef245e212b3c1fa8091ca (patch) | |
tree | 647f8fd729d5400341e5701d0d1eb668aad97f89 /tools/virtio/linux/uaccess.h | |
parent | a9a0fef779074838230e04a322fd2bdc921f4f4f (diff) | |
download | lwn-61d0b5a4b2777dcf5daef245e212b3c1fa8091ca.tar.gz lwn-61d0b5a4b2777dcf5daef245e212b3c1fa8091ca.zip |
tools/virtio: separate headers more.
This makes them a bit more like the kernel headers, so we can include more
real kernel headers in our tests.
In addition this means that we don't break tools/virtio with the next
patch.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
Diffstat (limited to 'tools/virtio/linux/uaccess.h')
-rw-r--r-- | tools/virtio/linux/uaccess.h | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/tools/virtio/linux/uaccess.h b/tools/virtio/linux/uaccess.h new file mode 100644 index 000000000000..0a578fe18653 --- /dev/null +++ b/tools/virtio/linux/uaccess.h @@ -0,0 +1,50 @@ +#ifndef UACCESS_H +#define UACCESS_H +extern void *__user_addr_min, *__user_addr_max; + +#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) + +static inline void __chk_user_ptr(const volatile void *p, size_t size) +{ + assert(p >= __user_addr_min && p + size <= __user_addr_max); +} + +#define put_user(x, ptr) \ +({ \ + typeof(ptr) __pu_ptr = (ptr); \ + __chk_user_ptr(__pu_ptr, sizeof(*__pu_ptr)); \ + ACCESS_ONCE(*(__pu_ptr)) = x; \ + 0; \ +}) + +#define get_user(x, ptr) \ +({ \ + typeof(ptr) __pu_ptr = (ptr); \ + __chk_user_ptr(__pu_ptr, sizeof(*__pu_ptr)); \ + x = ACCESS_ONCE(*(__pu_ptr)); \ + 0; \ +}) + +static void volatile_memcpy(volatile char *to, const volatile char *from, + unsigned long n) +{ + while (n--) + *(to++) = *(from++); +} + +static inline int copy_from_user(void *to, const void __user volatile *from, + unsigned long n) +{ + __chk_user_ptr(from, n); + volatile_memcpy(to, from, n); + return 0; +} + +static inline int copy_to_user(void __user volatile *to, const void *from, + unsigned long n) +{ + __chk_user_ptr(to, n); + volatile_memcpy(to, from, n); + return 0; +} +#endif /* UACCESS_H */ |