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 /* The ioctl type, documented in ioctl-number.rst */ 159 #define ACRN_IOCTL_TYPE 0xA2 160 161 /* 162 * Common IOCTL IDs definition for ACRN userspace 163 */ 164 #define ACRN_IOCTL_CREATE_VM \ 165 _IOWR(ACRN_IOCTL_TYPE, 0x10, struct acrn_vm_creation) 166 #define ACRN_IOCTL_DESTROY_VM \ 167 _IO(ACRN_IOCTL_TYPE, 0x11) 168 #define ACRN_IOCTL_START_VM \ 169 _IO(ACRN_IOCTL_TYPE, 0x12) 170 #define ACRN_IOCTL_PAUSE_VM \ 171 _IO(ACRN_IOCTL_TYPE, 0x13) 172 #define ACRN_IOCTL_RESET_VM \ 173 _IO(ACRN_IOCTL_TYPE, 0x15) 174 #define ACRN_IOCTL_SET_VCPU_REGS \ 175 _IOW(ACRN_IOCTL_TYPE, 0x16, struct acrn_vcpu_regs) 176 177 #endif /* _UAPI_ACRN_H */ 178