KVM: x86: Make kvm_get_dr() return a value, not use an out parameter
authorSean Christopherson <seanjc@google.com>
Fri, 9 Feb 2024 22:07:51 +0000 (14:07 -0800)
committerSean Christopherson <seanjc@google.com>
Fri, 23 Feb 2024 00:14:47 +0000 (16:14 -0800)
Convert kvm_get_dr()'s output parameter to a return value, and clean up
most of the mess that was created by forcing callers to provide a pointer.

No functional change intended.

Acked-by: Mathias Krause <minipli@grsecurity.net>
Reviewed-by: Mathias Krause <minipli@grsecurity.net>
Link: https://lore.kernel.org/r/20240209220752.388160-2-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/emulate.c
arch/x86/kvm/kvm_emulate.h
arch/x86/kvm/smm.c
arch/x86/kvm/svm/svm.c
arch/x86/kvm/vmx/nested.c
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/x86.c

index b5b2d0fde5796894534f0cb98f96d3076b6bf27d..7a59043a6ab067945ac7c2916e80ebfceae7a94b 100644 (file)
@@ -2045,7 +2045,7 @@ int kvm_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3);
 int kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4);
 int kvm_set_cr8(struct kvm_vcpu *vcpu, unsigned long cr8);
 int kvm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long val);
-void kvm_get_dr(struct kvm_vcpu *vcpu, int dr, unsigned long *val);
+unsigned long kvm_get_dr(struct kvm_vcpu *vcpu, int dr);
 unsigned long kvm_get_cr8(struct kvm_vcpu *vcpu);
 void kvm_lmsw(struct kvm_vcpu *vcpu, unsigned long msw);
 int kvm_emulate_xsetbv(struct kvm_vcpu *vcpu);
index eafb48f0b745c5c3e29a062f7ada81eb1aeee151..3328c7c7f2f9c0bfd0113edc7f754fbc58acfb73 100644 (file)
@@ -3013,7 +3013,7 @@ static int emulator_do_task_switch(struct x86_emulate_ctxt *ctxt,
                ret = em_push(ctxt);
        }
 
-       ops->get_dr(ctxt, 7, &dr7);
+       dr7 = ops->get_dr(ctxt, 7);
        ops->set_dr(ctxt, 7, dr7 & ~(DR_LOCAL_ENABLE_MASK | DR_LOCAL_SLOWDOWN));
 
        return ret;
@@ -3868,15 +3868,6 @@ static int check_cr_access(struct x86_emulate_ctxt *ctxt)
        return X86EMUL_CONTINUE;
 }
 
-static int check_dr7_gd(struct x86_emulate_ctxt *ctxt)
-{
-       unsigned long dr7;
-
-       ctxt->ops->get_dr(ctxt, 7, &dr7);
-
-       return dr7 & DR7_GD;
-}
-
 static int check_dr_read(struct x86_emulate_ctxt *ctxt)
 {
        int dr = ctxt->modrm_reg;
@@ -3889,10 +3880,10 @@ static int check_dr_read(struct x86_emulate_ctxt *ctxt)
        if ((cr4 & X86_CR4_DE) && (dr == 4 || dr == 5))
                return emulate_ud(ctxt);
 
-       if (check_dr7_gd(ctxt)) {
+       if (ctxt->ops->get_dr(ctxt, 7) & DR7_GD) {
                ulong dr6;
 
-               ctxt->ops->get_dr(ctxt, 6, &dr6);
+               dr6 = ctxt->ops->get_dr(ctxt, 6);
                dr6 &= ~DR_TRAP_BITS;
                dr6 |= DR6_BD | DR6_ACTIVE_LOW;
                ctxt->ops->set_dr(ctxt, 6, dr6);
@@ -5451,7 +5442,7 @@ twobyte_insn:
                ctxt->dst.val = ops->get_cr(ctxt, ctxt->modrm_reg);
                break;
        case 0x21: /* mov from dr to reg */
-               ops->get_dr(ctxt, ctxt->modrm_reg, &ctxt->dst.val);
+               ctxt->dst.val = ops->get_dr(ctxt, ctxt->modrm_reg);
                break;
        case 0x40 ... 0x4f:     /* cmov */
                if (test_cc(ctxt->b, ctxt->eflags))
index e6d149825169dda3ace396ca979923c4a2d108e8..153977c556f4469b801ecb2f14eee51df336ea68 100644 (file)
@@ -203,7 +203,7 @@ struct x86_emulate_ops {
        ulong (*get_cr)(struct x86_emulate_ctxt *ctxt, int cr);
        int (*set_cr)(struct x86_emulate_ctxt *ctxt, int cr, ulong val);
        int (*cpl)(struct x86_emulate_ctxt *ctxt);
-       void (*get_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong *dest);
+       ulong (*get_dr)(struct x86_emulate_ctxt *ctxt, int dr);
        int (*set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value);
        int (*set_msr_with_filter)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 data);
        int (*get_msr_with_filter)(struct x86_emulate_ctxt *ctxt, u32 msr_index, u64 *pdata);
index dc3d95fdca7d337ef4305123b8f439d2103c8b30..19a7a0a31953734b224927eea945b027f1738776 100644 (file)
@@ -184,7 +184,6 @@ static void enter_smm_save_state_32(struct kvm_vcpu *vcpu,
                                    struct kvm_smram_state_32 *smram)
 {
        struct desc_ptr dt;
-       unsigned long val;
        int i;
 
        smram->cr0     = kvm_read_cr0(vcpu);
@@ -195,10 +194,8 @@ static void enter_smm_save_state_32(struct kvm_vcpu *vcpu,
        for (i = 0; i < 8; i++)
                smram->gprs[i] = kvm_register_read_raw(vcpu, i);
 
-       kvm_get_dr(vcpu, 6, &val);
-       smram->dr6     = (u32)val;
-       kvm_get_dr(vcpu, 7, &val);
-       smram->dr7     = (u32)val;
+       smram->dr6     = (u32)kvm_get_dr(vcpu, 6);
+       smram->dr7     = (u32)kvm_get_dr(vcpu, 7);
 
        enter_smm_save_seg_32(vcpu, &smram->tr, &smram->tr_sel, VCPU_SREG_TR);
        enter_smm_save_seg_32(vcpu, &smram->ldtr, &smram->ldtr_sel, VCPU_SREG_LDTR);
@@ -231,7 +228,6 @@ static void enter_smm_save_state_64(struct kvm_vcpu *vcpu,
                                    struct kvm_smram_state_64 *smram)
 {
        struct desc_ptr dt;
-       unsigned long val;
        int i;
 
        for (i = 0; i < 16; i++)
@@ -240,11 +236,8 @@ static void enter_smm_save_state_64(struct kvm_vcpu *vcpu,
        smram->rip    = kvm_rip_read(vcpu);
        smram->rflags = kvm_get_rflags(vcpu);
 
-
-       kvm_get_dr(vcpu, 6, &val);
-       smram->dr6 = val;
-       kvm_get_dr(vcpu, 7, &val);
-       smram->dr7 = val;
+       smram->dr6 = kvm_get_dr(vcpu, 6);
+       smram->dr7 = kvm_get_dr(vcpu, 7);
 
        smram->cr0 = kvm_read_cr0(vcpu);
        smram->cr3 = kvm_read_cr3(vcpu);
index e90b429c84f158bdd8d4348172d56eac1e80763b..dda91f7cd71b5ac335a29fa485d6ef3965c67990 100644 (file)
@@ -2735,7 +2735,6 @@ static int dr_interception(struct kvm_vcpu *vcpu)
 {
        struct vcpu_svm *svm = to_svm(vcpu);
        int reg, dr;
-       unsigned long val;
        int err = 0;
 
        /*
@@ -2763,11 +2762,9 @@ static int dr_interception(struct kvm_vcpu *vcpu)
        dr = svm->vmcb->control.exit_code - SVM_EXIT_READ_DR0;
        if (dr >= 16) { /* mov to DRn  */
                dr -= 16;
-               val = kvm_register_read(vcpu, reg);
-               err = kvm_set_dr(vcpu, dr, val);
+               err = kvm_set_dr(vcpu, dr, kvm_register_read(vcpu, reg));
        } else {
-               kvm_get_dr(vcpu, dr, &val);
-               kvm_register_write(vcpu, reg, val);
+               kvm_register_write(vcpu, reg, kvm_get_dr(vcpu, dr));
        }
 
        return kvm_complete_insn_gp(vcpu, err);
index 6329a306856b28972ca32af5f708bb9408c60896..692fd559f0864457b01c7bfc07c8123a2ac4c38e 100644 (file)
@@ -4433,7 +4433,7 @@ static void sync_vmcs02_to_vmcs12(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12)
                (vm_entry_controls_get(to_vmx(vcpu)) & VM_ENTRY_IA32E_MODE);
 
        if (vmcs12->vm_exit_controls & VM_EXIT_SAVE_DEBUG_CONTROLS)
-               kvm_get_dr(vcpu, 7, (unsigned long *)&vmcs12->guest_dr7);
+               vmcs12->guest_dr7 = kvm_get_dr(vcpu, 7);
 
        if (vmcs12->vm_exit_controls & VM_EXIT_SAVE_IA32_EFER)
                vmcs12->guest_ia32_efer = vcpu->arch.efer;
index e262bc2ba4e569983a94c3db5c13e1f0dabd9951..aa47433d0c9b6007ea5b02beaf7a8a50547aad30 100644 (file)
@@ -5566,10 +5566,7 @@ static int handle_dr(struct kvm_vcpu *vcpu)
 
        reg = DEBUG_REG_ACCESS_REG(exit_qualification);
        if (exit_qualification & TYPE_MOV_FROM_DR) {
-               unsigned long val;
-
-               kvm_get_dr(vcpu, dr, &val);
-               kvm_register_write(vcpu, reg, val);
+               kvm_register_write(vcpu, reg, kvm_get_dr(vcpu, dr));
                err = 0;
        } else {
                err = kvm_set_dr(vcpu, dr, kvm_register_read(vcpu, reg));
index 7eb7736cfd767f17ab13744d586b5fa0c1a5e78e..b195eb21639cee40e2cebc33ec2d1091eb1e04ed 100644 (file)
@@ -1399,22 +1399,19 @@ int kvm_set_dr(struct kvm_vcpu *vcpu, int dr, unsigned long val)
 }
 EXPORT_SYMBOL_GPL(kvm_set_dr);
 
-void kvm_get_dr(struct kvm_vcpu *vcpu, int dr, unsigned long *val)
+unsigned long kvm_get_dr(struct kvm_vcpu *vcpu, int dr)
 {
        size_t size = ARRAY_SIZE(vcpu->arch.db);
 
        switch (dr) {
        case 0 ... 3:
-               *val = vcpu->arch.db[array_index_nospec(dr, size)];
-               break;
+               return vcpu->arch.db[array_index_nospec(dr, size)];
        case 4:
        case 6:
-               *val = vcpu->arch.dr6;
-               break;
+               return vcpu->arch.dr6;
        case 5:
        default: /* 7 */
-               *val = vcpu->arch.dr7;
-               break;
+               return vcpu->arch.dr7;
        }
 }
 EXPORT_SYMBOL_GPL(kvm_get_dr);
@@ -5509,7 +5506,6 @@ static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu,
 static void kvm_vcpu_ioctl_x86_get_debugregs(struct kvm_vcpu *vcpu,
                                             struct kvm_debugregs *dbgregs)
 {
-       unsigned long val;
        unsigned int i;
 
        memset(dbgregs, 0, sizeof(*dbgregs));
@@ -5518,8 +5514,7 @@ static void kvm_vcpu_ioctl_x86_get_debugregs(struct kvm_vcpu *vcpu,
        for (i = 0; i < ARRAY_SIZE(vcpu->arch.db); i++)
                dbgregs->db[i] = vcpu->arch.db[i];
 
-       kvm_get_dr(vcpu, 6, &val);
-       dbgregs->dr6 = val;
+       dbgregs->dr6 = kvm_get_dr(vcpu, 6);
        dbgregs->dr7 = vcpu->arch.dr7;
 }
 
@@ -8173,10 +8168,9 @@ static void emulator_wbinvd(struct x86_emulate_ctxt *ctxt)
        kvm_emulate_wbinvd_noskip(emul_to_vcpu(ctxt));
 }
 
-static void emulator_get_dr(struct x86_emulate_ctxt *ctxt, int dr,
-                           unsigned long *dest)
+static unsigned long emulator_get_dr(struct x86_emulate_ctxt *ctxt, int dr)
 {
-       kvm_get_dr(emul_to_vcpu(ctxt), dr, dest);
+       return kvm_get_dr(emul_to_vcpu(ctxt), dr);
 }
 
 static int emulator_set_dr(struct x86_emulate_ctxt *ctxt, int dr,