#include <linux/compiler.h>
#include <linux/export.h>
#include <linux/kasan-checks.h>
#include <linux/thread_info.h>
#include <linux/uaccess.h>
#include <linux/kernel.h>
#include <asm/byteorder.h>
#include <asm/word-at-a-time.h>
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
#define IS_UNALIGNED(src, dst) 0
#define IS_UNALIGNED(src, dst) \
(((long) dst | (long) src) & (sizeof(long) - 1))
static inline long do_strncpy_from_user(char *dst, const char __user *src, long count, unsigned long max)
const struct word_at_a_time constants = WORD_AT_A_TIME_CONSTANTS;
if (IS_UNALIGNED(src, dst))
while (max >= sizeof(unsigned long)) {
unsafe_get_user(c, (unsigned long __user *)(src+res), byte_at_a_time);
*(unsigned long *)(dst+res) = c;
if (has_zero(c, &data, &constants)) {
data = prep_zero_mask(c, data, &constants);
data = create_zero_mask(data);
return res + find_zero(data);
res += sizeof(unsigned long);
max -= sizeof(unsigned long);
unsafe_get_user(c,src+res, efault);