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

io.c (1506B)


      1// SPDX-License-Identifier: GPL-2.0
      2
      3#include <linux/export.h>
      4#include <linux/types.h>
      5#include <linux/io.h>
      6
      7/*
      8 * Copy data from IO memory space to "real" memory space.
      9 */
     10void __memcpy_fromio(void *to, const volatile void __iomem *from, size_t count)
     11{
     12	while (count && !IS_ALIGNED((unsigned long)from, 4)) {
     13		*(u8 *)to = __raw_readb(from);
     14		from++;
     15		to++;
     16		count--;
     17	}
     18
     19	while (count >= 4) {
     20		*(u32 *)to = __raw_readl(from);
     21		from += 4;
     22		to += 4;
     23		count -= 4;
     24	}
     25
     26	while (count) {
     27		*(u8 *)to = __raw_readb(from);
     28		from++;
     29		to++;
     30		count--;
     31	}
     32}
     33EXPORT_SYMBOL(__memcpy_fromio);
     34
     35/*
     36 * Copy data from "real" memory space to IO memory space.
     37 */
     38void __memcpy_toio(volatile void __iomem *to, const void *from, size_t count)
     39{
     40	while (count && !IS_ALIGNED((unsigned long)to, 4)) {
     41		__raw_writeb(*(u8 *)from, to);
     42		from++;
     43		to++;
     44		count--;
     45	}
     46
     47	while (count >= 4) {
     48		__raw_writel(*(u32 *)from, to);
     49		from += 4;
     50		to += 4;
     51		count -= 4;
     52	}
     53
     54	while (count) {
     55		__raw_writeb(*(u8 *)from, to);
     56		from++;
     57		to++;
     58		count--;
     59	}
     60}
     61EXPORT_SYMBOL(__memcpy_toio);
     62
     63/*
     64 * "memset" on IO memory space.
     65 */
     66void __memset_io(volatile void __iomem *dst, int c, size_t count)
     67{
     68	u32 qc = (u8)c;
     69
     70	qc |= qc << 8;
     71	qc |= qc << 16;
     72
     73	while (count && !IS_ALIGNED((unsigned long)dst, 4)) {
     74		__raw_writeb(c, dst);
     75		dst++;
     76		count--;
     77	}
     78
     79	while (count >= 4) {
     80		__raw_writel(qc, dst);
     81		dst += 4;
     82		count -= 4;
     83	}
     84
     85	while (count) {
     86		__raw_writeb(c, dst);
     87		dst++;
     88		count--;
     89	}
     90}
     91EXPORT_SYMBOL(__memset_io);