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

igt_mmap.c (1241B)


      1/*
      2 * SPDX-License-Identifier: MIT
      3 *
      4 * Copyright © 2019 Intel Corporation
      5 */
      6
      7#include <drm/drm_file.h>
      8
      9#include "i915_drv.h"
     10#include "igt_mmap.h"
     11
     12unsigned long igt_mmap_offset(struct drm_i915_private *i915,
     13			      u64 offset,
     14			      unsigned long size,
     15			      unsigned long prot,
     16			      unsigned long flags)
     17{
     18	struct drm_vma_offset_node *node;
     19	struct file *file;
     20	unsigned long addr;
     21	int err;
     22
     23	/* no need to refcount, we own this object */
     24	drm_vma_offset_lock_lookup(i915->drm.vma_offset_manager);
     25	node = drm_vma_offset_exact_lookup_locked(i915->drm.vma_offset_manager,
     26						  offset / PAGE_SIZE, size / PAGE_SIZE);
     27	drm_vma_offset_unlock_lookup(i915->drm.vma_offset_manager);
     28
     29	if (GEM_WARN_ON(!node)) {
     30		pr_info("Failed to lookup %llx\n", offset);
     31		return -ENOENT;
     32	}
     33
     34	/* Pretend to open("/dev/dri/card0") */
     35	file = mock_drm_getfile(i915->drm.primary, O_RDWR);
     36	if (IS_ERR(file))
     37		return PTR_ERR(file);
     38
     39	err = drm_vma_node_allow(node, file->private_data);
     40	if (err) {
     41		addr = err;
     42		goto out_file;
     43	}
     44
     45	addr = vm_mmap(file, 0, drm_vma_node_size(node) << PAGE_SHIFT,
     46		       prot, flags, drm_vma_node_offset_addr(node));
     47
     48	drm_vma_node_revoke(node, file->private_data);
     49out_file:
     50	fput(file);
     51	return addr;
     52}