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

udmabuf.c (2272B)


      1// SPDX-License-Identifier: GPL-2.0
      2#define _GNU_SOURCE
      3#define __EXPORTED_HEADERS__
      4
      5#include <stdio.h>
      6#include <stdlib.h>
      7#include <unistd.h>
      8#include <string.h>
      9#include <errno.h>
     10#include <fcntl.h>
     11#include <malloc.h>
     12
     13#include <sys/ioctl.h>
     14#include <sys/syscall.h>
     15#include <linux/memfd.h>
     16#include <linux/udmabuf.h>
     17
     18#define TEST_PREFIX	"drivers/dma-buf/udmabuf"
     19#define NUM_PAGES       4
     20
     21static int memfd_create(const char *name, unsigned int flags)
     22{
     23	return syscall(__NR_memfd_create, name, flags);
     24}
     25
     26int main(int argc, char *argv[])
     27{
     28	struct udmabuf_create create;
     29	int devfd, memfd, buf, ret;
     30	off_t size;
     31	void *mem;
     32
     33	devfd = open("/dev/udmabuf", O_RDWR);
     34	if (devfd < 0) {
     35		printf("%s: [skip,no-udmabuf]\n", TEST_PREFIX);
     36		exit(77);
     37	}
     38
     39	memfd = memfd_create("udmabuf-test", MFD_ALLOW_SEALING);
     40	if (memfd < 0) {
     41		printf("%s: [skip,no-memfd]\n", TEST_PREFIX);
     42		exit(77);
     43	}
     44
     45	ret = fcntl(memfd, F_ADD_SEALS, F_SEAL_SHRINK);
     46	if (ret < 0) {
     47		printf("%s: [skip,fcntl-add-seals]\n", TEST_PREFIX);
     48		exit(77);
     49	}
     50
     51
     52	size = getpagesize() * NUM_PAGES;
     53	ret = ftruncate(memfd, size);
     54	if (ret == -1) {
     55		printf("%s: [FAIL,memfd-truncate]\n", TEST_PREFIX);
     56		exit(1);
     57	}
     58
     59	memset(&create, 0, sizeof(create));
     60
     61	/* should fail (offset not page aligned) */
     62	create.memfd  = memfd;
     63	create.offset = getpagesize()/2;
     64	create.size   = getpagesize();
     65	buf = ioctl(devfd, UDMABUF_CREATE, &create);
     66	if (buf >= 0) {
     67		printf("%s: [FAIL,test-1]\n", TEST_PREFIX);
     68		exit(1);
     69	}
     70
     71	/* should fail (size not multiple of page) */
     72	create.memfd  = memfd;
     73	create.offset = 0;
     74	create.size   = getpagesize()/2;
     75	buf = ioctl(devfd, UDMABUF_CREATE, &create);
     76	if (buf >= 0) {
     77		printf("%s: [FAIL,test-2]\n", TEST_PREFIX);
     78		exit(1);
     79	}
     80
     81	/* should fail (not memfd) */
     82	create.memfd  = 0; /* stdin */
     83	create.offset = 0;
     84	create.size   = size;
     85	buf = ioctl(devfd, UDMABUF_CREATE, &create);
     86	if (buf >= 0) {
     87		printf("%s: [FAIL,test-3]\n", TEST_PREFIX);
     88		exit(1);
     89	}
     90
     91	/* should work */
     92	create.memfd  = memfd;
     93	create.offset = 0;
     94	create.size   = size;
     95	buf = ioctl(devfd, UDMABUF_CREATE, &create);
     96	if (buf < 0) {
     97		printf("%s: [FAIL,test-4]\n", TEST_PREFIX);
     98		exit(1);
     99	}
    100
    101	fprintf(stderr, "%s: ok\n", TEST_PREFIX);
    102	close(buf);
    103	close(memfd);
    104	close(devfd);
    105	return 0;
    106}