]> rtime.felk.cvut.cz Git - jailhouse.git/commitdiff
x86: Refactor VCPU reset functions
authorJan Kiszka <jan.kiszka@siemens.com>
Tue, 22 Dec 2015 13:31:49 +0000 (14:31 +0100)
committerJan Kiszka <jan.kiszka@siemens.com>
Tue, 22 Dec 2015 13:31:49 +0000 (14:31 +0100)
Make vcpu_reset() the one-stop solution by factoring out
vcpu_vendor_reset() that is called by the former and replaces
svm/vmx_vcpu_reset().

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 b75e8601ae418df857983b5e710b26c7b58154e9..f1d7a4d2937916cf85219630c71b4bd62f4b3f93 100644 (file)
@@ -116,6 +116,7 @@ void vcpu_handle_cpuid(void);
 
 bool vcpu_handle_xsetbv(void);
 
-void vcpu_reset(bool hard_reset);
+void vcpu_reset(unsigned int sipi_vector);
+void vcpu_vendor_reset(unsigned int sipi_vector);
 
 #endif
index 0af5786c8f77a03f86572194cf3a6b467afc6a75..d9b375c9d857f30fc37a0d38cfb78ae277c3b069 100644 (file)
@@ -509,7 +509,7 @@ void __attribute__((noreturn)) vcpu_deactivate_vmm(void)
        __builtin_unreachable();
 }
 
-static void svm_vcpu_reset(struct per_cpu *cpu_data, unsigned int sipi_vector)
+void vcpu_vendor_reset(unsigned int sipi_vector)
 {
        static const struct svm_segment dataseg_reset_state = {
                .selector = 0,
@@ -523,6 +523,7 @@ static void svm_vcpu_reset(struct per_cpu *cpu_data, unsigned int sipi_vector)
                .limit = 0xffff,
                .access_rights = 0,
        };
+       struct per_cpu *cpu_data = this_cpu_data();
        struct vmcb *vmcb = &cpu_data->vmcb;
        unsigned long val;
 
@@ -877,8 +878,7 @@ void vcpu_handle_exit(struct per_cpu *cpu_data)
                if (sipi_vector >= 0) {
                        printk("CPU %d received SIPI, vector %x\n",
                               cpu_data->cpu_id, sipi_vector);
-                       svm_vcpu_reset(cpu_data, sipi_vector);
-                       vcpu_reset(sipi_vector == APIC_BSP_PSEUDO_SIPI);
+                       vcpu_reset(sipi_vector);
                }
                iommu_check_pending_faults();
                goto vmentry;
@@ -941,8 +941,9 @@ vmentry:
 
 void vcpu_park(void)
 {
-       svm_vcpu_reset(this_cpu_data(), APIC_BSP_PSEUDO_SIPI);
-       /* No need to clear VMCB Clean bit: vcpu_reset() already does this */
+       vcpu_vendor_reset(APIC_BSP_PSEUDO_SIPI);
+       /* No need to clear VMCB Clean bit: vcpu_vendor_reset() already does
+        * this. */
        this_cpu_data()->vmcb.n_cr3 = paging_hvirt2phys(parked_mode_npt);
 
        vcpu_tlb_flush();
index 0e269db1f05271a6e3de03f1d21370a2cd74f589..7cb101a6d1806bb5d0774e3de9dc7d1471025e47 100644 (file)
@@ -361,13 +361,15 @@ bool vcpu_handle_xsetbv(void)
        return false;
 }
 
-void vcpu_reset(bool hard_reset)
+void vcpu_reset(unsigned int sipi_vector)
 {
        struct per_cpu *cpu_data = this_cpu_data();
 
+       vcpu_vendor_reset(sipi_vector);
+
        memset(&cpu_data->guest_regs, 0, sizeof(cpu_data->guest_regs));
 
-       if (hard_reset) {
+       if (sipi_vector == APIC_BSP_PSEUDO_SIPI) {
                cpu_data->pat = PAT_RESET_VALUE;
                cpu_data->mtrr_def_type = 0;
                vcpu_vendor_set_guest_pat(0);
index 30069383745ac977ac33315d412b7aa1e4579216..6e3bc6a087480bde280f0c3172ab785a7c19c46a 100644 (file)
@@ -767,7 +767,7 @@ void __attribute__((noreturn)) vcpu_deactivate_vmm(void)
        __builtin_unreachable();
 }
 
-static void vmx_vcpu_reset(unsigned int sipi_vector)
+void vcpu_vendor_reset(unsigned int sipi_vector)
 {
        unsigned long val;
        bool ok = true;
@@ -878,7 +878,7 @@ void vcpu_nmi_handler(void)
 
 void vcpu_park(void)
 {
-       vmx_vcpu_reset(0);
+       vcpu_vendor_reset(0);
        vmcs_write32(GUEST_ACTIVITY_STATE, GUEST_ACTIVITY_HLT);
 }
 
@@ -1060,8 +1060,7 @@ void vcpu_handle_exit(struct per_cpu *cpu_data)
                if (sipi_vector >= 0) {
                        printk("CPU %d received SIPI, vector %x\n",
                               cpu_data->cpu_id, sipi_vector);
-                       vmx_vcpu_reset(sipi_vector);
-                       vcpu_reset(sipi_vector == APIC_BSP_PSEUDO_SIPI);
+                       vcpu_reset(sipi_vector);
                }
                iommu_check_pending_faults();
                return;