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

ubd_user.c (1590B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (C) 2016 Anton Ivanov (aivanov@brocade.com)
      4 * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com)
      5 * Copyright (C) 2001 Ridgerun,Inc (glonnon@ridgerun.com)
      6 */
      7
      8#include <stddef.h>
      9#include <unistd.h>
     10#include <errno.h>
     11#include <sched.h>
     12#include <signal.h>
     13#include <string.h>
     14#include <netinet/in.h>
     15#include <sys/time.h>
     16#include <sys/socket.h>
     17#include <sys/mman.h>
     18#include <sys/param.h>
     19#include <endian.h>
     20#include <byteswap.h>
     21
     22#include "ubd.h"
     23#include <os.h>
     24#include <poll.h>
     25
     26struct pollfd kernel_pollfd;
     27
     28int start_io_thread(unsigned long sp, int *fd_out)
     29{
     30	int pid, fds[2], err;
     31
     32	err = os_pipe(fds, 1, 1);
     33	if(err < 0){
     34		printk("start_io_thread - os_pipe failed, err = %d\n", -err);
     35		goto out;
     36	}
     37
     38	kernel_fd = fds[0];
     39	kernel_pollfd.fd = kernel_fd;
     40	kernel_pollfd.events = POLLIN;
     41	*fd_out = fds[1];
     42
     43	err = os_set_fd_block(*fd_out, 0);
     44	err = os_set_fd_block(kernel_fd, 0);
     45	if (err) {
     46		printk("start_io_thread - failed to set nonblocking I/O.\n");
     47		goto out_close;
     48	}
     49
     50	pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM, NULL);
     51	if(pid < 0){
     52		err = -errno;
     53		printk("start_io_thread - clone failed : errno = %d\n", errno);
     54		goto out_close;
     55	}
     56
     57	return(pid);
     58
     59 out_close:
     60	os_close_file(fds[0]);
     61	os_close_file(fds[1]);
     62	kernel_fd = -1;
     63	*fd_out = -1;
     64 out:
     65	return err;
     66}
     67
     68int ubd_read_poll(int timeout)
     69{
     70	kernel_pollfd.events = POLLIN;
     71	return poll(&kernel_pollfd, 1, timeout);
     72}
     73int ubd_write_poll(int timeout)
     74{
     75	kernel_pollfd.events = POLLOUT;
     76	return poll(&kernel_pollfd, 1, timeout);
     77}
     78