History

virt: acrn: Introduce an ioctl to set vCPU registers state

A virtual CPU of User VM has different context due to the different registers state. ACRN userspace needs to set the virtual CPU registers state (e.g. giving a initial registers state to a virtual BSP of a User VM). HSM provides an ioctl ACRN_IOCTL_SET_VCPU_REGS to do the virtual CPU registers state setting. The ioctl passes the registers state from ACRN userspace to the hypervisor directly.

Shuo Liu committed 5 years ago

Commit 2ad2aae1 parent 9c5137a3 files · +165 −1Browse files

Showing the changes to include/uapi (1 of 3 files). Show all

Unified · Split

include/uapi/linux/acrn.h+119−0
@@ -38,6 +38,123 @@ struct acrn_vm_creation { · 37 unmodified lines
3838 __u64 cpu_affinity;
3939 };
4040
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+
41158 /* The ioctl type, documented in ioctl-number.rst */
42159 #define ACRN_IOCTL_TYPE 0xA2
43160
@@ -54,5 +171,7 @@ struct acrn_vm_creation { · 10 unmodified lines
54171 _IO(ACRN_IOCTL_TYPE, 0x13)
55172 #define ACRN_IOCTL_RESET_VM \
56173 _IO(ACRN_IOCTL_TYPE, 0x15)
174+#define ACRN_IOCTL_SET_VCPU_REGS \
175+ _IOW(ACRN_IOCTL_TYPE, 0x16, struct acrn_vcpu_regs)
57176
58177 #endif /* _UAPI_ACRN_H */