162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) IBM Corporation, 2010 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Author: Anton Blanchard <anton@au.ibm.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci#include <linux/export.h> 962306a36Sopenharmony_ci#include <linux/compiler.h> 1062306a36Sopenharmony_ci#include <linux/types.h> 1162306a36Sopenharmony_ci#include <asm/checksum.h> 1262306a36Sopenharmony_ci#include <linux/uaccess.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci__wsum csum_and_copy_from_user(const void __user *src, void *dst, 1562306a36Sopenharmony_ci int len) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci __wsum csum; 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci if (unlikely(!user_read_access_begin(src, len))) 2062306a36Sopenharmony_ci return 0; 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci csum = csum_partial_copy_generic((void __force *)src, dst, len); 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci user_read_access_end(); 2562306a36Sopenharmony_ci return csum; 2662306a36Sopenharmony_ci} 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci__wsum csum_and_copy_to_user(const void *src, void __user *dst, int len) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci __wsum csum; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci if (unlikely(!user_write_access_begin(dst, len))) 3362306a36Sopenharmony_ci return 0; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci csum = csum_partial_copy_generic(src, (void __force *)dst, len); 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci user_write_access_end(); 3862306a36Sopenharmony_ci return csum; 3962306a36Sopenharmony_ci} 40