xref: /linux-6.15/include/uapi/linux/acrn.h (revision 2ad2aaee)
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