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.
Showing the changes to include/uapi (1 of 3 files). Show all
Unified · Split
| @@ -38,6 +38,123 @@ struct acrn_vm_creation { · 37 unmodified lines | ||
| 38 | 38 | __u64 cpu_affinity; |
| 39 | 39 | }; |
| 40 | 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 | + | |
| 41 | 158 | /* The ioctl type, documented in ioctl-number.rst */ |
| 42 | 159 | #define ACRN_IOCTL_TYPE 0xA2 |
| 43 | 160 | |
| @@ -54,5 +171,7 @@ struct acrn_vm_creation { · 10 unmodified lines | ||
| 54 | 171 | _IO(ACRN_IOCTL_TYPE, 0x13) |
| 55 | 172 | #define ACRN_IOCTL_RESET_VM \ |
| 56 | 173 | _IO(ACRN_IOCTL_TYPE, 0x15) |
| 174 | +#define ACRN_IOCTL_SET_VCPU_REGS \ | |
| 175 | + _IOW(ACRN_IOCTL_TYPE, 0x16, struct acrn_vcpu_regs) | |
| 57 | 176 | |
| 58 | 177 | #endif /* _UAPI_ACRN_H */ |