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. Cc: Zhi Wang <zhi.a.wang@intel.com> Cc: Zhenyu Wang <zhenyuw@linux.intel.com> Cc: Yu Wang <yu1.wang@intel.com> Cc: Reinette Chatre <reinette.chatre@intel.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Reviewed-by: Zhi Wang <zhi.a.wang@intel.com> Reviewed-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: Shuo Liu <shuo.a.liu@intel.com> Link: https://lore.kernel.org/r/20210207031040.49576-8-shuo.a.liu@intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
9c5137aedd
commit
2ad2aaee1b
@@ -38,6 +38,123 @@ struct acrn_vm_creation {
|
||||
__u64 cpu_affinity;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct acrn_gp_regs - General registers of a User VM
|
||||
* @rax: Value of register RAX
|
||||
* @rcx: Value of register RCX
|
||||
* @rdx: Value of register RDX
|
||||
* @rbx: Value of register RBX
|
||||
* @rsp: Value of register RSP
|
||||
* @rbp: Value of register RBP
|
||||
* @rsi: Value of register RSI
|
||||
* @rdi: Value of register RDI
|
||||
* @r8: Value of register R8
|
||||
* @r9: Value of register R9
|
||||
* @r10: Value of register R10
|
||||
* @r11: Value of register R11
|
||||
* @r12: Value of register R12
|
||||
* @r13: Value of register R13
|
||||
* @r14: Value of register R14
|
||||
* @r15: Value of register R15
|
||||
*/
|
||||
struct acrn_gp_regs {
|
||||
__le64 rax;
|
||||
__le64 rcx;
|
||||
__le64 rdx;
|
||||
__le64 rbx;
|
||||
__le64 rsp;
|
||||
__le64 rbp;
|
||||
__le64 rsi;
|
||||
__le64 rdi;
|
||||
__le64 r8;
|
||||
__le64 r9;
|
||||
__le64 r10;
|
||||
__le64 r11;
|
||||
__le64 r12;
|
||||
__le64 r13;
|
||||
__le64 r14;
|
||||
__le64 r15;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct acrn_descriptor_ptr - Segment descriptor table of a User VM.
|
||||
* @limit: Limit field.
|
||||
* @base: Base field.
|
||||
* @reserved: Reserved and must be 0.
|
||||
*/
|
||||
struct acrn_descriptor_ptr {
|
||||
__le16 limit;
|
||||
__le64 base;
|
||||
__le16 reserved[3];
|
||||
} __attribute__ ((__packed__));
|
||||
|
||||
/**
|
||||
* struct acrn_regs - Registers structure of a User VM
|
||||
* @gprs: General registers
|
||||
* @gdt: Global Descriptor Table
|
||||
* @idt: Interrupt Descriptor Table
|
||||
* @rip: Value of register RIP
|
||||
* @cs_base: Base of code segment selector
|
||||
* @cr0: Value of register CR0
|
||||
* @cr4: Value of register CR4
|
||||
* @cr3: Value of register CR3
|
||||
* @ia32_efer: Value of IA32_EFER MSR
|
||||
* @rflags: Value of regsiter RFLAGS
|
||||
* @reserved_64: Reserved and must be 0
|
||||
* @cs_ar: Attribute field of code segment selector
|
||||
* @cs_limit: Limit field of code segment selector
|
||||
* @reserved_32: Reserved and must be 0
|
||||
* @cs_sel: Value of code segment selector
|
||||
* @ss_sel: Value of stack segment selector
|
||||
* @ds_sel: Value of data segment selector
|
||||
* @es_sel: Value of extra segment selector
|
||||
* @fs_sel: Value of FS selector
|
||||
* @gs_sel: Value of GS selector
|
||||
* @ldt_sel: Value of LDT descriptor selector
|
||||
* @tr_sel: Value of TSS descriptor selector
|
||||
*/
|
||||
struct acrn_regs {
|
||||
struct acrn_gp_regs gprs;
|
||||
struct acrn_descriptor_ptr gdt;
|
||||
struct acrn_descriptor_ptr idt;
|
||||
|
||||
__le64 rip;
|
||||
__le64 cs_base;
|
||||
__le64 cr0;
|
||||
__le64 cr4;
|
||||
__le64 cr3;
|
||||
__le64 ia32_efer;
|
||||
__le64 rflags;
|
||||
__le64 reserved_64[4];
|
||||
|
||||
__le32 cs_ar;
|
||||
__le32 cs_limit;
|
||||
__le32 reserved_32[3];
|
||||
|
||||
__le16 cs_sel;
|
||||
__le16 ss_sel;
|
||||
__le16 ds_sel;
|
||||
__le16 es_sel;
|
||||
__le16 fs_sel;
|
||||
__le16 gs_sel;
|
||||
__le16 ldt_sel;
|
||||
__le16 tr_sel;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct acrn_vcpu_regs - Info of vCPU registers state
|
||||
* @vcpu_id: vCPU ID
|
||||
* @reserved: Reserved and must be 0
|
||||
* @vcpu_regs: vCPU registers state
|
||||
*
|
||||
* This structure will be passed to hypervisor directly.
|
||||
*/
|
||||
struct acrn_vcpu_regs {
|
||||
__u16 vcpu_id;
|
||||
__u16 reserved[3];
|
||||
struct acrn_regs vcpu_regs;
|
||||
};
|
||||
|
||||
/* The ioctl type, documented in ioctl-number.rst */
|
||||
#define ACRN_IOCTL_TYPE 0xA2
|
||||
|
||||
@@ -54,5 +171,7 @@ struct acrn_vm_creation {
|
||||
_IO(ACRN_IOCTL_TYPE, 0x13)
|
||||
#define ACRN_IOCTL_RESET_VM \
|
||||
_IO(ACRN_IOCTL_TYPE, 0x15)
|
||||
#define ACRN_IOCTL_SET_VCPU_REGS \
|
||||
_IOW(ACRN_IOCTL_TYPE, 0x16, struct acrn_vcpu_regs)
|
||||
|
||||
#endif /* _UAPI_ACRN_H */
|
||||
|
||||
Reference in New Issue
Block a user