cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

memory.c (1867B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>
      4 * 
      5 *  Misc memory accessors
      6 */
      7
      8#include <linux/export.h>
      9#include <linux/io.h>
     10#include <linux/uaccess.h>
     11#include <sound/core.h>
     12
     13/**
     14 * copy_to_user_fromio - copy data from mmio-space to user-space
     15 * @dst: the destination pointer on user-space
     16 * @src: the source pointer on mmio
     17 * @count: the data size to copy in bytes
     18 *
     19 * Copies the data from mmio-space to user-space.
     20 *
     21 * Return: Zero if successful, or non-zero on failure.
     22 */
     23int copy_to_user_fromio(void __user *dst, const volatile void __iomem *src, size_t count)
     24{
     25#if defined(__i386__) || defined(CONFIG_SPARC32)
     26	return copy_to_user(dst, (const void __force*)src, count) ? -EFAULT : 0;
     27#else
     28	char buf[256];
     29	while (count) {
     30		size_t c = count;
     31		if (c > sizeof(buf))
     32			c = sizeof(buf);
     33		memcpy_fromio(buf, (void __iomem *)src, c);
     34		if (copy_to_user(dst, buf, c))
     35			return -EFAULT;
     36		count -= c;
     37		dst += c;
     38		src += c;
     39	}
     40	return 0;
     41#endif
     42}
     43EXPORT_SYMBOL(copy_to_user_fromio);
     44
     45/**
     46 * copy_from_user_toio - copy data from user-space to mmio-space
     47 * @dst: the destination pointer on mmio-space
     48 * @src: the source pointer on user-space
     49 * @count: the data size to copy in bytes
     50 *
     51 * Copies the data from user-space to mmio-space.
     52 *
     53 * Return: Zero if successful, or non-zero on failure.
     54 */
     55int copy_from_user_toio(volatile void __iomem *dst, const void __user *src, size_t count)
     56{
     57#if defined(__i386__) || defined(CONFIG_SPARC32)
     58	return copy_from_user((void __force *)dst, src, count) ? -EFAULT : 0;
     59#else
     60	char buf[256];
     61	while (count) {
     62		size_t c = count;
     63		if (c > sizeof(buf))
     64			c = sizeof(buf);
     65		if (copy_from_user(buf, src, c))
     66			return -EFAULT;
     67		memcpy_toio(dst, buf, c);
     68		count -= c;
     69		dst += c;
     70		src += c;
     71	}
     72	return 0;
     73#endif
     74}
     75EXPORT_SYMBOL(copy_from_user_toio);