1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 /* 3 * Userspace interface for /dev/acrn_hsm - ACRN Hypervisor Service Module 4 * 5 * This file can be used by applications that need to communicate with the HSM 6 * via the ioctl interface. 7 * 8 * Copyright (C) 2021 Intel Corporation. All rights reserved. 9 */ 10 11 #ifndef _UAPI_ACRN_H 12 #define _UAPI_ACRN_H 13 14 #include <linux/types.h> 15 #include <linux/uuid.h> 16 17 /** 18 * struct acrn_vm_creation - Info to create a User VM 19 * @vmid: User VM ID returned from the hypervisor 20 * @reserved0: Reserved and must be 0 21 * @vcpu_num: Number of vCPU in the VM. Return from hypervisor. 22 * @reserved1: Reserved and must be 0 23 * @uuid: UUID of the VM. Pass to hypervisor directly. 24 * @vm_flag: Flag of the VM creating. Pass to hypervisor directly. 25 * @ioreq_buf: Service VM GPA of I/O request buffer. Pass to 26 * hypervisor directly. 27 * @cpu_affinity: CPU affinity of the VM. Pass to hypervisor directly. 28 * It's a bitmap which indicates CPUs used by the VM. 29 */ 30 struct acrn_vm_creation { 31 __u16 vmid; 32 __u16 reserved0; 33 __u16 vcpu_num; 34 __u16 reserved1; 35 guid_t uuid; 36 __u64 vm_flag; 37 __u64 ioreq_buf; 38 __u64 cpu_affinity; 39 }; 40 41 /** 42 * struct acrn_gp_regs - General registers of a User VM 43 * @rax: Value of register RAX 44 * @rcx: Value of register RCX 45 * @rdx: Value of register RDX 46 * @rbx: Value of register RBX 47 * @rsp: Value of register RSP 48 * @rbp: Value of register RBP 49 * @rsi: Value of register RSI 50 * @rdi: Value of register RDI 51 * @r8: Value of register R8 52 * @r9: Value of register R9 53 * @r10: Value of register R10 54 * @r11: Value of register R11 55 * @r12: Value of register R12 56 * @r13: Value of register R13 57 * @r14: Value of register R14 58 * @r15: Value of register R15 59 */ 60 struct acrn_gp_regs { 61 __le64 rax; 62 __le64 rcx; 63 __le64 rdx; 64 __le64 rbx; 65 __le64 rsp; 66 __le64 rbp; 67 __le64 rsi; 68 __le64 rdi; 69 __le64 r8; 70 __le64 r9; 71 __le64 r10; 72 __le64 r11; 73 __le64 r12; 74 __le64 r13; 75 __le64 r14; 76 __le64 r15; 77 }; 78 79 /** 80 * struct acrn_descriptor_ptr - Segment descriptor table of a User VM. 81 * @limit: Limit field. 82 * @base: Base field. 83 * @reserved: Reserved and must be 0. 84 */ 85 struct acrn_descriptor_ptr { 86 __le16 limit; 87 __le64 base; 88 __le16 reserved[3]; 89 } __attribute__ ((__packed__)); 90 91 /** 92 * struct acrn_regs - Registers structure of a User VM 93 * @gprs: General registers 94 * @gdt: Global Descriptor Table 95 * @idt: Interrupt Descriptor Table 96 * @rip: Value of register RIP 97 * @cs_base: Base of code segment selector 98 * @cr0: Value of register CR0 99 * @cr4: Value of register CR4 100 * @cr3: Value of register CR3 101 * @ia32_efer: Value of IA32_EFER MSR 102 * @rflags: Value of regsiter RFLAGS 103 * @reserved_64: Reserved and must be 0 104 * @cs_ar: Attribute field of code segment selector 105 * @cs_limit: Limit field of code segment selector 106 * @reserved_32: Reserved and must be 0 107 * @cs_sel: Value of code segment selector 108 * @ss_sel: Value of stack segment selector 109 * @ds_sel: Value of data segment selector 110 * @es_sel: Value of extra segment selector 111 * @fs_sel: Value of FS selector 112 * @gs_sel: Value of GS selector 113 * @ldt_sel: Value of LDT descriptor selector 114 * @tr_sel: Value of TSS descriptor selector 115 */ 116 struct acrn_regs { 117 struct acrn_gp_regs gprs; 118 struct acrn_descriptor_ptr gdt; 119 struct acrn_descriptor_ptr idt; 120 121 __le64 rip; 122 __le64 cs_base; 123 __le64 cr0; 124 __le64 cr4; 125 __le64 cr3; 126 __le64 ia32_efer; 127 __le64 rflags; 128 __le64 reserved_64[4]; 129 130 __le32 cs_ar; 131 __le32 cs_limit; 132 __le32 reserved_32[3]; 133 134 __le16 cs_sel; 135 __le16 ss_sel; 136 __le16 ds_sel; 137 __le16 es_sel; 138 __le16 fs_sel; 139 __le16 gs_sel; 140 __le16 ldt_sel; 141 __le16 tr_sel; 142 }; 143 144 /** 145 * struct acrn_vcpu_regs - Info of vCPU registers state 146 * @vcpu_id: vCPU ID 147 * @reserved: Reserved and must be 0 148 * @vcpu_regs: vCPU registers state 149 * 150 * This structure will be passed to hypervisor directly. 151 */ 152 struct acrn_vcpu_regs { 153 __u16 vcpu_id; 154 __u16 reserved[3]; 155 struct acrn_regs vcpu_regs; 156 }; 157 158 #define ACRN_MEM_ACCESS_RIGHT_MASK 0x00000007U 159 #define ACRN_MEM_ACCESS_READ 0x00000001U 160 #define ACRN_MEM_ACCESS_WRITE 0x00000002U 161 #define ACRN_MEM_ACCESS_EXEC 0x00000004U 162 #define ACRN_MEM_ACCESS_RWX (ACRN_MEM_ACCESS_READ | \ 163 ACRN_MEM_ACCESS_WRITE | \ 164 ACRN_MEM_ACCESS_EXEC) 165 166 #define ACRN_MEM_TYPE_MASK 0x000007C0U 167 #define ACRN_MEM_TYPE_WB 0x00000040U 168 #define ACRN_MEM_TYPE_WT 0x00000080U 169 #define ACRN_MEM_TYPE_UC 0x00000100U 170 #define ACRN_MEM_TYPE_WC 0x00000200U 171 #define ACRN_MEM_TYPE_WP 0x00000400U 172 173 /* Memory mapping types */ 174 #define ACRN_MEMMAP_RAM 0 175 #define ACRN_MEMMAP_MMIO 1 176 177 /** 178 * struct acrn_vm_memmap - A EPT memory mapping info for a User VM. 179 * @type: Type of the memory mapping (ACRM_MEMMAP_*). 180 * Pass to hypervisor directly. 181 * @attr: Attribute of the memory mapping. 182 * Pass to hypervisor directly. 183 * @user_vm_pa: Physical address of User VM. 184 * Pass to hypervisor directly. 185 * @service_vm_pa: Physical address of Service VM. 186 * Pass to hypervisor directly. 187 * @vma_base: VMA address of Service VM. Pass to hypervisor directly. 188 * @len: Length of the memory mapping. 189 * Pass to hypervisor directly. 190 */ 191 struct acrn_vm_memmap { 192 __u32 type; 193 __u32 attr; 194 __u64 user_vm_pa; 195 union { 196 __u64 service_vm_pa; 197 __u64 vma_base; 198 }; 199 __u64 len; 200 }; 201 202 /* The ioctl type, documented in ioctl-number.rst */ 203 #define ACRN_IOCTL_TYPE 0xA2 204 205 /* 206 * Common IOCTL IDs definition for ACRN userspace 207 */ 208 #define ACRN_IOCTL_CREATE_VM \ 209 _IOWR(ACRN_IOCTL_TYPE, 0x10, struct acrn_vm_creation) 210 #define ACRN_IOCTL_DESTROY_VM \ 211 _IO(ACRN_IOCTL_TYPE, 0x11) 212 #define ACRN_IOCTL_START_VM \ 213 _IO(ACRN_IOCTL_TYPE, 0x12) 214 #define ACRN_IOCTL_PAUSE_VM \ 215 _IO(ACRN_IOCTL_TYPE, 0x13) 216 #define ACRN_IOCTL_RESET_VM \ 217 _IO(ACRN_IOCTL_TYPE, 0x15) 218 #define ACRN_IOCTL_SET_VCPU_REGS \ 219 _IOW(ACRN_IOCTL_TYPE, 0x16, struct acrn_vcpu_regs) 220 221 #define ACRN_IOCTL_SET_MEMSEG \ 222 _IOW(ACRN_IOCTL_TYPE, 0x41, struct acrn_vm_memmap) 223 #define ACRN_IOCTL_UNSET_MEMSEG \ 224 _IOW(ACRN_IOCTL_TYPE, 0x42, struct acrn_vm_memmap) 225 226 #endif /* _UAPI_ACRN_H */ 227