Fix: use unaligned pointer accesses for lttng_inline_memcpy
[lttng-ust.git] / libringbuffer / backend_internal.h
index e597cf4dd42be43d344b29dc31c89b8b90fea83c..8b0fb9d3b92482726dad4a6db6e85c8a8bbed205 100644 (file)
@@ -592,7 +592,26 @@ int update_read_sb_index(const struct lttng_ust_lib_ring_buffer_config *config,
 #define inline_memcpy(dest, src, n)    memcpy(dest, src, n)
 #endif
 
-static inline __attribute__((always_inline))
+#define LOAD_UNALIGNED_INT(type, p) \
+       ({ \
+               struct packed_struct { type __v; } __attribute__((packed)); \
+               (((const struct packed_struct *) (p))->__v); \
+       })
+
+#define STORE_UNALIGNED_INT(type, p, v)        \
+       do { \
+               struct packed_struct { type __v; } __attribute__((packed)); \
+               ((struct packed_struct *) (p))->__v = (v); \
+       } while (0)
+
+/*
+ * Copy from src into dest, assuming unaligned src and dest.
+ */
+static inline
+void lttng_inline_memcpy(void *dest, const void *src,
+               unsigned long len)
+       __attribute__((always_inline));
+static inline
 void lttng_inline_memcpy(void *dest, const void *src,
                unsigned long len)
 {
@@ -601,13 +620,13 @@ void lttng_inline_memcpy(void *dest, const void *src,
                *(uint8_t *) dest = *(const uint8_t *) src;
                break;
        case 2:
-               *(uint16_t *) dest = *(const uint16_t *) src;
+               STORE_UNALIGNED_INT(uint16_t, dest, LOAD_UNALIGNED_INT(uint16_t, src));
                break;
        case 4:
-               *(uint32_t *) dest = *(const uint32_t *) src;
+               STORE_UNALIGNED_INT(uint32_t, dest, LOAD_UNALIGNED_INT(uint32_t, src));
                break;
        case 8:
-               *(uint64_t *) dest = *(const uint64_t *) src;
+               STORE_UNALIGNED_INT(uint64_t, dest, LOAD_UNALIGNED_INT(uint64_t, src));
                break;
        default:
                inline_memcpy(dest, src, len);
This page took 0.028199 seconds and 4 git commands to generate.