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