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

acrn_drv.h (7821B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2
      3#ifndef __ACRN_HSM_DRV_H
      4#define __ACRN_HSM_DRV_H
      5
      6#include <linux/acrn.h>
      7#include <linux/dev_printk.h>
      8#include <linux/miscdevice.h>
      9#include <linux/types.h>
     10
     11#include "hypercall.h"
     12
     13extern struct miscdevice acrn_dev;
     14
     15#define ACRN_NAME_LEN		16
     16#define ACRN_MEM_MAPPING_MAX	256
     17
     18#define ACRN_MEM_REGION_ADD	0
     19#define ACRN_MEM_REGION_DEL	2
     20
     21struct acrn_vm;
     22struct acrn_ioreq_client;
     23
     24/**
     25 * struct vm_memory_region_op - Hypervisor memory operation
     26 * @type:		Operation type (ACRN_MEM_REGION_*)
     27 * @attr:		Memory attribute (ACRN_MEM_TYPE_* | ACRN_MEM_ACCESS_*)
     28 * @user_vm_pa:		Physical address of User VM to be mapped.
     29 * @service_vm_pa:	Physical address of Service VM to be mapped.
     30 * @size:		Size of this region.
     31 *
     32 * Structure containing needed information that is provided to ACRN Hypervisor
     33 * to manage the EPT mappings of a single memory region of the User VM. Several
     34 * &struct vm_memory_region_op can be batched to ACRN Hypervisor, see &struct
     35 * vm_memory_region_batch.
     36 */
     37struct vm_memory_region_op {
     38	u32	type;
     39	u32	attr;
     40	u64	user_vm_pa;
     41	u64	service_vm_pa;
     42	u64	size;
     43};
     44
     45/**
     46 * struct vm_memory_region_batch - A batch of vm_memory_region_op.
     47 * @vmid:		A User VM ID.
     48 * @reserved:		Reserved.
     49 * @regions_num:	The number of vm_memory_region_op.
     50 * @regions_gpa:	Physical address of a vm_memory_region_op array.
     51 * @regions_op:		Flexible array of vm_memory_region_op.
     52 *
     53 * HC_VM_SET_MEMORY_REGIONS uses this structure to manage EPT mappings of
     54 * multiple memory regions of a User VM. A &struct vm_memory_region_batch
     55 * contains multiple &struct vm_memory_region_op for batch processing in the
     56 * ACRN Hypervisor.
     57 */
     58struct vm_memory_region_batch {
     59	u16			   vmid;
     60	u16			   reserved[3];
     61	u32			   regions_num;
     62	u64			   regions_gpa;
     63	struct vm_memory_region_op regions_op[];
     64};
     65
     66/**
     67 * struct vm_memory_mapping - Memory map between a User VM and the Service VM
     68 * @pages:		Pages in Service VM kernel.
     69 * @npages:		Number of pages.
     70 * @service_vm_va:	Virtual address in Service VM kernel.
     71 * @user_vm_pa:		Physical address in User VM.
     72 * @size:		Size of this memory region.
     73 *
     74 * HSM maintains memory mappings between a User VM GPA and the Service VM
     75 * kernel VA for accelerating the User VM GPA translation.
     76 */
     77struct vm_memory_mapping {
     78	struct page	**pages;
     79	int		npages;
     80	void		*service_vm_va;
     81	u64		user_vm_pa;
     82	size_t		size;
     83};
     84
     85/**
     86 * struct acrn_ioreq_buffer - Data for setting the ioreq buffer of User VM
     87 * @ioreq_buf:	The GPA of the IO request shared buffer of a VM
     88 *
     89 * The parameter for the HC_SET_IOREQ_BUFFER hypercall used to set up
     90 * the shared I/O request buffer between Service VM and ACRN hypervisor.
     91 */
     92struct acrn_ioreq_buffer {
     93	u64	ioreq_buf;
     94};
     95
     96struct acrn_ioreq_range {
     97	struct list_head	list;
     98	u32			type;
     99	u64			start;
    100	u64			end;
    101};
    102
    103#define ACRN_IOREQ_CLIENT_DESTROYING	0U
    104typedef	int (*ioreq_handler_t)(struct acrn_ioreq_client *client,
    105			       struct acrn_io_request *req);
    106/**
    107 * struct acrn_ioreq_client - Structure of I/O client.
    108 * @name:	Client name
    109 * @vm:		The VM that the client belongs to
    110 * @list:	List node for this acrn_ioreq_client
    111 * @is_default:	If this client is the default one
    112 * @flags:	Flags (ACRN_IOREQ_CLIENT_*)
    113 * @range_list:	I/O ranges
    114 * @range_lock:	Lock to protect range_list
    115 * @ioreqs_map:	The pending I/O requests bitmap.
    116 * @handler:	I/O requests handler of this client
    117 * @thread:	The thread which executes the handler
    118 * @wq:		The wait queue for the handler thread parking
    119 * @priv:	Data for the thread
    120 */
    121struct acrn_ioreq_client {
    122	char			name[ACRN_NAME_LEN];
    123	struct acrn_vm		*vm;
    124	struct list_head	list;
    125	bool			is_default;
    126	unsigned long		flags;
    127	struct list_head	range_list;
    128	rwlock_t		range_lock;
    129	DECLARE_BITMAP(ioreqs_map, ACRN_IO_REQUEST_MAX);
    130	ioreq_handler_t		handler;
    131	struct task_struct	*thread;
    132	wait_queue_head_t	wq;
    133	void			*priv;
    134};
    135
    136#define ACRN_INVALID_VMID (0xffffU)
    137
    138#define ACRN_VM_FLAG_DESTROYED		0U
    139#define ACRN_VM_FLAG_CLEARING_IOREQ	1U
    140extern struct list_head acrn_vm_list;
    141extern rwlock_t acrn_vm_list_lock;
    142/**
    143 * struct acrn_vm - Properties of ACRN User VM.
    144 * @list:			Entry within global list of all VMs.
    145 * @vmid:			User VM ID.
    146 * @vcpu_num:			Number of virtual CPUs in the VM.
    147 * @flags:			Flags (ACRN_VM_FLAG_*) of the VM. This is VM
    148 *				flag management in HSM which is different
    149 *				from the &acrn_vm_creation.vm_flag.
    150 * @regions_mapping_lock:	Lock to protect &acrn_vm.regions_mapping and
    151 *				&acrn_vm.regions_mapping_count.
    152 * @regions_mapping:		Memory mappings of this VM.
    153 * @regions_mapping_count:	Number of memory mapping of this VM.
    154 * @ioreq_clients_lock:		Lock to protect ioreq_clients and default_client
    155 * @ioreq_clients:		The I/O request clients list of this VM
    156 * @default_client:		The default I/O request client
    157 * @ioreq_buf:			I/O request shared buffer
    158 * @ioreq_page:			The page of the I/O request shared buffer
    159 * @pci_conf_addr:		Address of a PCI configuration access emulation
    160 * @monitor_page:		Page of interrupt statistics of User VM
    161 * @ioeventfds_lock:		Lock to protect ioeventfds list
    162 * @ioeventfds:			List to link all hsm_ioeventfd
    163 * @ioeventfd_client:		I/O client for ioeventfds of the VM
    164 * @irqfds_lock:		Lock to protect irqfds list
    165 * @irqfds:			List to link all hsm_irqfd
    166 * @irqfd_wq:			Workqueue for irqfd async shutdown
    167 */
    168struct acrn_vm {
    169	struct list_head		list;
    170	u16				vmid;
    171	int				vcpu_num;
    172	unsigned long			flags;
    173	struct mutex			regions_mapping_lock;
    174	struct vm_memory_mapping	regions_mapping[ACRN_MEM_MAPPING_MAX];
    175	int				regions_mapping_count;
    176	spinlock_t			ioreq_clients_lock;
    177	struct list_head		ioreq_clients;
    178	struct acrn_ioreq_client	*default_client;
    179	struct acrn_io_request_buffer	*ioreq_buf;
    180	struct page			*ioreq_page;
    181	u32				pci_conf_addr;
    182	struct page			*monitor_page;
    183	struct mutex			ioeventfds_lock;
    184	struct list_head		ioeventfds;
    185	struct acrn_ioreq_client	*ioeventfd_client;
    186	struct mutex			irqfds_lock;
    187	struct list_head		irqfds;
    188	struct workqueue_struct		*irqfd_wq;
    189};
    190
    191struct acrn_vm *acrn_vm_create(struct acrn_vm *vm,
    192			       struct acrn_vm_creation *vm_param);
    193int acrn_vm_destroy(struct acrn_vm *vm);
    194int acrn_mm_region_add(struct acrn_vm *vm, u64 user_gpa, u64 service_gpa,
    195		       u64 size, u32 mem_type, u32 mem_access_right);
    196int acrn_mm_region_del(struct acrn_vm *vm, u64 user_gpa, u64 size);
    197int acrn_vm_memseg_map(struct acrn_vm *vm, struct acrn_vm_memmap *memmap);
    198int acrn_vm_memseg_unmap(struct acrn_vm *vm, struct acrn_vm_memmap *memmap);
    199int acrn_vm_ram_map(struct acrn_vm *vm, struct acrn_vm_memmap *memmap);
    200void acrn_vm_all_ram_unmap(struct acrn_vm *vm);
    201
    202int acrn_ioreq_init(struct acrn_vm *vm, u64 buf_vma);
    203void acrn_ioreq_deinit(struct acrn_vm *vm);
    204int acrn_ioreq_intr_setup(void);
    205void acrn_ioreq_intr_remove(void);
    206void acrn_ioreq_request_clear(struct acrn_vm *vm);
    207int acrn_ioreq_client_wait(struct acrn_ioreq_client *client);
    208int acrn_ioreq_request_default_complete(struct acrn_vm *vm, u16 vcpu);
    209struct acrn_ioreq_client *acrn_ioreq_client_create(struct acrn_vm *vm,
    210						   ioreq_handler_t handler,
    211						   void *data, bool is_default,
    212						   const char *name);
    213void acrn_ioreq_client_destroy(struct acrn_ioreq_client *client);
    214int acrn_ioreq_range_add(struct acrn_ioreq_client *client,
    215			 u32 type, u64 start, u64 end);
    216void acrn_ioreq_range_del(struct acrn_ioreq_client *client,
    217			  u32 type, u64 start, u64 end);
    218
    219int acrn_msi_inject(struct acrn_vm *vm, u64 msi_addr, u64 msi_data);
    220
    221int acrn_ioeventfd_init(struct acrn_vm *vm);
    222int acrn_ioeventfd_config(struct acrn_vm *vm, struct acrn_ioeventfd *args);
    223void acrn_ioeventfd_deinit(struct acrn_vm *vm);
    224
    225int acrn_irqfd_init(struct acrn_vm *vm);
    226int acrn_irqfd_config(struct acrn_vm *vm, struct acrn_irqfd *args);
    227void acrn_irqfd_deinit(struct acrn_vm *vm);
    228
    229#endif /* __ACRN_HSM_DRV_H */