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

gntdev-common.h (2413B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2
      3/*
      4 * Common functionality of grant device.
      5 *
      6 * Copyright (c) 2006-2007, D G Murray.
      7 *           (c) 2009 Gerd Hoffmann <kraxel@redhat.com>
      8 *           (c) 2018 Oleksandr Andrushchenko, EPAM Systems Inc.
      9 */
     10
     11#ifndef _GNTDEV_COMMON_H
     12#define _GNTDEV_COMMON_H
     13
     14#include <linux/mm.h>
     15#include <linux/mman.h>
     16#include <linux/mmu_notifier.h>
     17#include <linux/types.h>
     18#include <xen/interface/event_channel.h>
     19#include <xen/grant_table.h>
     20
     21struct gntdev_dmabuf_priv;
     22
     23struct gntdev_priv {
     24	/* Maps with visible offsets in the file descriptor. */
     25	struct list_head maps;
     26	/* lock protects maps and freeable_maps. */
     27	struct mutex lock;
     28
     29#ifdef CONFIG_XEN_GRANT_DMA_ALLOC
     30	/* Device for which DMA memory is allocated. */
     31	struct device *dma_dev;
     32#endif
     33
     34#ifdef CONFIG_XEN_GNTDEV_DMABUF
     35	struct gntdev_dmabuf_priv *dmabuf_priv;
     36#endif
     37};
     38
     39struct gntdev_unmap_notify {
     40	int flags;
     41	/* Address relative to the start of the gntdev_grant_map. */
     42	int addr;
     43	evtchn_port_t event;
     44};
     45
     46struct gntdev_grant_map {
     47	struct mmu_interval_notifier notifier;
     48	struct list_head next;
     49	struct vm_area_struct *vma;
     50	int index;
     51	int count;
     52	int flags;
     53	refcount_t users;
     54	struct gntdev_unmap_notify notify;
     55	struct ioctl_gntdev_grant_ref *grants;
     56	struct gnttab_map_grant_ref   *map_ops;
     57	struct gnttab_unmap_grant_ref *unmap_ops;
     58	struct gnttab_map_grant_ref   *kmap_ops;
     59	struct gnttab_unmap_grant_ref *kunmap_ops;
     60	bool *being_removed;
     61	struct page **pages;
     62	unsigned long pages_vm_start;
     63
     64#ifdef CONFIG_XEN_GRANT_DMA_ALLOC
     65	/*
     66	 * If dmabuf_vaddr is not NULL then this mapping is backed by DMA
     67	 * capable memory.
     68	 */
     69
     70	struct device *dma_dev;
     71	/* Flags used to create this DMA buffer: GNTDEV_DMA_FLAG_XXX. */
     72	int dma_flags;
     73	void *dma_vaddr;
     74	dma_addr_t dma_bus_addr;
     75	/* Needed to avoid allocation in gnttab_dma_free_pages(). */
     76	xen_pfn_t *frames;
     77#endif
     78
     79	/* Number of live grants */
     80	atomic_t live_grants;
     81	/* Needed to avoid allocation in __unmap_grant_pages */
     82	struct gntab_unmap_queue_data unmap_data;
     83};
     84
     85struct gntdev_grant_map *gntdev_alloc_map(struct gntdev_priv *priv, int count,
     86					  int dma_flags);
     87
     88void gntdev_add_map(struct gntdev_priv *priv, struct gntdev_grant_map *add);
     89
     90void gntdev_put_map(struct gntdev_priv *priv, struct gntdev_grant_map *map);
     91
     92bool gntdev_test_page_count(unsigned int count);
     93
     94int gntdev_map_grant_pages(struct gntdev_grant_map *map);
     95
     96#endif