--- /dev/null
+// SPDX-FileCopyrightText: 2024 Michael Jeanson <mjeanson@efficios.com>
+// SPDX-License-Identifier: GPL-2.0-only
+
+#ifndef _LTTNG_WRAPPER_BITOPS_H
+#define _LTTNG_WRAPPER_BITOPS_H
+
+#include <linux/bitops.h>
+#include <linux/bits.h>
+#include <lttng/kernel-version.h>
+
+#if LTTNG_LINUX_VERSION_CODE < LTTNG_KERNEL_VERSION(5,4,0)
+
+/* Set bits in the first 'n' bytes when loaded from memory */
+# ifdef __LITTLE_ENDIAN
+# define lttng_aligned_byte_mask(n) ((1UL << 8*(n))-1)
+# else
+# define lttng_aligned_byte_mask(n) (~0xffUL << (BITS_PER_LONG - 8 - 8*(n)))
+# endif
+
+#endif
+
+#endif /* _LTTNG_WRAPPER_BITOPS_H */
#define _LTTNG_WRAPPER_UACCESS_H
#include <linux/uaccess.h>
+#include <wrapper/bitops.h>
#include <lttng/kernel-version.h>
#if (LTTNG_LINUX_VERSION_CODE >= LTTNG_KERNEL_VERSION(5,0,0) || \
* * 1: The buffer was full of zero bytes.
* * -EFAULT: access to userspace failed.
*/
+static inline
int lttng_check_zeroed_user(const void __user *from, size_t size)
{
unsigned long val;
from -= align;
size += align;
- if (!lttng_access_ok(VERIFY_READ, from, size)
+ if (!lttng_access_ok(VERIFY_READ, from, size))
return -EFAULT;
ret = get_user(val, (unsigned long __user *) from);
if (ret)
return ret;
if (align)
- val &= ~aligned_byte_mask(align);
+ val &= ~lttng_aligned_byte_mask(align);
while (size > sizeof(unsigned long)) {
if (unlikely(val))
}
if (size < sizeof(unsigned long))
- val &= aligned_byte_mask(size);
+ val &= lttng_aligned_byte_mask(size);
done:
return (val == 0);