The handling logic is fully shared between AMD and Intel CPUs.
Consolidate it.
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
bool vcpu_handle_msr_read(struct registers *guest_regs);
bool vcpu_handle_msr_write(struct registers *guest_regs);
+bool vcpu_handle_xsetbv(struct registers *guest_regs);
+
void vcpu_reset(struct registers *guest_regs);
#endif
vmcb->exitinfo1 & 0xf);
break;
case VMEXIT_XSETBV:
- cpu_data->stats[JAILHOUSE_CPU_STAT_VMEXITS_XSETBV]++;
- if ((guest_regs->rax & X86_XCR0_FP) &&
- (guest_regs->rax & ~cpuid_eax(0x0d)) == 0 &&
- guest_regs->rcx == 0 && guest_regs->rdx == 0) {
- vcpu_skip_emulated_instruction(X86_INST_LEN_XSETBV);
- asm volatile(
- "xsetbv"
- : /* no output */
- : "a" (guest_regs->rax), "c" (0), "d" (0));
+ if (vcpu_handle_xsetbv(guest_regs))
return;
- }
- panic_printk("FATAL: Invalid xsetbv parameters: "
- "xcr[%d] = %x:%x\n", guest_regs->rcx,
- guest_regs->rdx, guest_regs->rax);
break;
case VMEXIT_IOIO:
cpu_data->stats[JAILHOUSE_CPU_STAT_VMEXITS_PIO]++;
return true;
}
+bool vcpu_handle_xsetbv(struct registers *guest_regs)
+{
+ this_cpu_data()->stats[JAILHOUSE_CPU_STAT_VMEXITS_XSETBV]++;
+
+ if (cpuid_ecx(1) & X86_FEATURE_XSAVE &&
+ guest_regs->rax & X86_XCR0_FP &&
+ (guest_regs->rax & ~cpuid_eax(0x0d)) == 0 &&
+ guest_regs->rcx == 0 && guest_regs->rdx == 0) {
+ vcpu_skip_emulated_instruction(X86_INST_LEN_XSETBV);
+ asm volatile(
+ "xsetbv"
+ : /* no output */
+ : "a" (guest_regs->rax), "c" (0), "d" (0));
+ return true;
+ }
+ panic_printk("FATAL: Invalid xsetbv parameters: xcr[%d] = %08x:%08x\n",
+ guest_regs->rcx, guest_regs->rdx, guest_regs->rax);
+ return false;
+}
+
void vcpu_reset(struct registers *guest_regs)
{
struct per_cpu *cpu_data = this_cpu_data();
return;
break;
case EXIT_REASON_XSETBV:
- cpu_data->stats[JAILHOUSE_CPU_STAT_VMEXITS_XSETBV]++;
- if (cpuid_ecx(1) & X86_FEATURE_XSAVE &&
- guest_regs->rax & X86_XCR0_FP &&
- (guest_regs->rax & ~cpuid_eax(0x0d)) == 0 &&
- guest_regs->rcx == 0 && guest_regs->rdx == 0) {
- vcpu_skip_emulated_instruction(X86_INST_LEN_XSETBV);
- asm volatile(
- "xsetbv"
- : /* no output */
- : "a" (guest_regs->rax), "c" (0), "d" (0));
+ if (vcpu_handle_xsetbv(guest_regs))
return;
- }
- panic_printk("FATAL: Invalid xsetbv parameters: "
- "xcr[%d] = %08x:%08x\n", guest_regs->rcx,
- guest_regs->rdx, guest_regs->rax);
break;
case EXIT_REASON_IO_INSTRUCTION:
cpu_data->stats[JAILHOUSE_CPU_STAT_VMEXITS_PIO]++;