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 | __u64 cpu_affinity; | 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 | /* The ioctl type, documented in ioctl-number.rst */ | 158 | /* The ioctl type, documented in ioctl-number.rst */ |
| 42 | #define ACRN_IOCTL_TYPE 0xA2 | 159 | #define ACRN_IOCTL_TYPE 0xA2 |
| 43 | 160 | ||
| @@ -54,5 +171,7 @@ struct acrn_vm_creation { · 10 unmodified lines | |||
| 54 | _IO(ACRN_IOCTL_TYPE, 0x13) | 171 | _IO(ACRN_IOCTL_TYPE, 0x13) |
| 55 | #define ACRN_IOCTL_RESET_VM \ | 172 | #define ACRN_IOCTL_RESET_VM \ |
| 56 | _IO(ACRN_IOCTL_TYPE, 0x15) | 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 | #endif /* _UAPI_ACRN_H */ | 177 | #endif /* _UAPI_ACRN_H */ |