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

lib.c (1181B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <unistd.h>
      3#include <stdbool.h>
      4#include <errno.h>
      5#include <linux/kernel.h>
      6#include <internal/lib.h>
      7
      8unsigned int page_size;
      9
     10static ssize_t ion(bool is_read, int fd, void *buf, size_t n)
     11{
     12	void *buf_start = buf;
     13	size_t left = n;
     14
     15	while (left) {
     16		/* buf must be treated as const if !is_read. */
     17		ssize_t ret = is_read ? read(fd, buf, left) :
     18					write(fd, buf, left);
     19
     20		if (ret < 0 && errno == EINTR)
     21			continue;
     22		if (ret <= 0)
     23			return ret;
     24
     25		left -= ret;
     26		buf  += ret;
     27	}
     28
     29	BUG_ON((size_t)(buf - buf_start) != n);
     30	return n;
     31}
     32
     33/*
     34 * Read exactly 'n' bytes or return an error.
     35 */
     36ssize_t readn(int fd, void *buf, size_t n)
     37{
     38	return ion(true, fd, buf, n);
     39}
     40
     41ssize_t preadn(int fd, void *buf, size_t n, off_t offs)
     42{
     43	size_t left = n;
     44
     45	while (left) {
     46		ssize_t ret = pread(fd, buf, left, offs);
     47
     48		if (ret < 0 && errno == EINTR)
     49			continue;
     50		if (ret <= 0)
     51			return ret;
     52
     53		left -= ret;
     54		buf  += ret;
     55		offs += ret;
     56	}
     57
     58	return n;
     59}
     60
     61/*
     62 * Write exactly 'n' bytes or return an error.
     63 */
     64ssize_t writen(int fd, const void *buf, size_t n)
     65{
     66	/* ion does not modify buf. */
     67	return ion(false, fd, (void *)buf, n);
     68}