18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright (C) IBM Corporation, 2010
58c2ecf20Sopenharmony_ci *
68c2ecf20Sopenharmony_ci * Author: Anton Blanchard <anton@au.ibm.com>
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci#include <linux/export.h>
98c2ecf20Sopenharmony_ci#include <linux/compiler.h>
108c2ecf20Sopenharmony_ci#include <linux/types.h>
118c2ecf20Sopenharmony_ci#include <asm/checksum.h>
128c2ecf20Sopenharmony_ci#include <linux/uaccess.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci__wsum csum_and_copy_from_user(const void __user *src, void *dst,
158c2ecf20Sopenharmony_ci			       int len)
168c2ecf20Sopenharmony_ci{
178c2ecf20Sopenharmony_ci	__wsum csum;
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci	might_sleep();
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	if (unlikely(!access_ok(src, len)))
228c2ecf20Sopenharmony_ci		return 0;
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci	allow_read_from_user(src, len);
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	csum = csum_partial_copy_generic((void __force *)src, dst, len);
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci	prevent_read_from_user(src, len);
298c2ecf20Sopenharmony_ci	return csum;
308c2ecf20Sopenharmony_ci}
318c2ecf20Sopenharmony_ciEXPORT_SYMBOL(csum_and_copy_from_user);
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci__wsum csum_and_copy_to_user(const void *src, void __user *dst, int len)
348c2ecf20Sopenharmony_ci{
358c2ecf20Sopenharmony_ci	__wsum csum;
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	might_sleep();
388c2ecf20Sopenharmony_ci	if (unlikely(!access_ok(dst, len)))
398c2ecf20Sopenharmony_ci		return 0;
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	allow_write_to_user(dst, len);
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci	csum = csum_partial_copy_generic(src, (void __force *)dst, len);
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	prevent_write_to_user(dst, len);
468c2ecf20Sopenharmony_ci	return csum;
478c2ecf20Sopenharmony_ci}
488c2ecf20Sopenharmony_ciEXPORT_SYMBOL(csum_and_copy_to_user);
49