x86/vdso: Add PUT_LE to store little-endian values
authorAndy Lutomirski <luto@amacapital.net>
Fri, 13 Jun 2014 00:53:11 +0000 (17:53 -0700)
committerH. Peter Anvin <hpa@zytor.com>
Fri, 13 Jun 2014 02:01:51 +0000 (19:01 -0700)
Add PUT_LE() by analogy with GET_LE() to write littleendian values in
addition to reading them.

Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Link: http://lkml.kernel.org/r/3d9b27e92745b27b6fda1b9a98f70dc9c1246c7a.1402620737.git.luto@amacapital.net
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
arch/x86/vdso/vdso2c.c

index 450ac6eaf613cda997e4d8032b0a5e45a39d0732..7a6bf50f9165fb6afe1a7f00537c081a9aed0024 100644 (file)
@@ -54,7 +54,7 @@ static void fail(const char *format, ...)
 }
 
 /*
- * Evil macros to do a little-endian read.
+ * Evil macros for little-endian reads and writes
  */
 #define GLE(x, bits, ifnot)                                            \
        __builtin_choose_expr(                                          \
@@ -62,11 +62,24 @@ static void fail(const char *format, ...)
                (__typeof__(*(x)))get_unaligned_le##bits(x), ifnot)
 
 extern void bad_get_le(void);
-#define LAST_LE(x)                                                     \
+#define LAST_GLE(x)                                                    \
        __builtin_choose_expr(sizeof(*(x)) == 1, *(x), bad_get_le())
 
 #define GET_LE(x)                                                      \
-       GLE(x, 64, GLE(x, 32, GLE(x, 16, LAST_LE(x))))
+       GLE(x, 64, GLE(x, 32, GLE(x, 16, LAST_GLE(x))))
+
+#define PLE(x, val, bits, ifnot)                                       \
+       __builtin_choose_expr(                                          \
+               (sizeof(*(x)) == bits/8),                               \
+               put_unaligned_le##bits((val), (x)), ifnot)
+
+extern void bad_put_le(void);
+#define LAST_PLE(x, val)                                               \
+       __builtin_choose_expr(sizeof(*(x)) == 1, *(x) = (val), bad_put_le())
+
+#define PUT_LE(x, val)                                 \
+       PLE(x, val, 64, PLE(x, val, 32, PLE(x, val, 16, LAST_PLE(x, val))))
+
 
 #define NSYMS (sizeof(required_syms) / sizeof(required_syms[0]))