]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
x86: Factor out vcpu_handle_xsetbv
authorJan Kiszka <jan.kiszka@siemens.com>
Fri, 3 Apr 2015 13:04:33 +0000 (15:04 +0200)
committerJan Kiszka <jan.kiszka@siemens.com>
Fri, 10 Apr 2015 07:00:52 +0000 (09:00 +0200)
The handling logic is fully shared between AMD and Intel CPUs.
Consolidate it.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
hypervisor/arch/x86/include/asm/vcpu.h
hypervisor/arch/x86/svm.c
hypervisor/arch/x86/vcpu.c
hypervisor/arch/x86/vmx.c

index b21da001f6010cfd2deb2866e750be85dab65c75..6a5f5d3064f1fc20c897eac65c5f1bc6c286c6a0 100644 (file)
@@ -114,6 +114,8 @@ bool vcpu_handle_mmio_access(struct registers *guest_regs);
 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
index 418746193ab66b8582ec4ad93666658ca0a1e06b..8e5152d7dd0428d85cb57c1e862e3032b503f1a4 100644 (file)
@@ -989,20 +989,8 @@ void vcpu_handle_exit(struct registers *guest_regs, struct per_cpu *cpu_data)
                             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]++;
index d809f408ef16d172cd622be85297ce8b60a097ef..c9893e85ebe4088d511a08588febb465f92aa2ee 100644 (file)
@@ -311,6 +311,26 @@ bool vcpu_handle_msr_write(struct registers *guest_regs)
        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();
index 015e62be016f27843664d4748103ecbfe1ae417e..cc8582b77779349aa7d9c2959789cac6388e067e 100644 (file)
@@ -1098,21 +1098,8 @@ void vcpu_handle_exit(struct registers *guest_regs, struct per_cpu *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]++;