]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
kvm: x86: Add has_payload and payload to kvm_queued_exception
authorJim Mattson <jmattson@google.com>
Tue, 16 Oct 2018 21:29:19 +0000 (14:29 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 16 Oct 2018 22:30:22 +0000 (00:30 +0200)
The payload associated with a #PF exception is the linear address of
the fault to be loaded into CR2 when the fault is delivered. The
payload associated with a #DB exception is a mask of the DR6 bits to
be set (or in the case of DR6.RTM, cleared) when the fault is
delivered. Add fields has_payload and payload to kvm_queued_exception
to track payloads for pending exceptions.

The new fields are introduced here, but for now, they are just cleared.

Reported-by: Jim Mattson <jmattson@google.com>
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Jim Mattson <jmattson@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/x86.c

index 258fc2c8530179e9a8800843822ebf5c691b1a44..20f7c994afebf212d01fee9c9fbbfaaf41445ccf 100644 (file)
@@ -628,6 +628,8 @@ struct kvm_vcpu_arch {
                bool has_error_code;
                u8 nr;
                u32 error_code;
+               unsigned long payload;
+               bool has_payload;
                u8 nested_apf;
        } exception;
 
index 0fe1e3762e826c9a1ec0d26b61642ca175c531e1..532b660fe4976fb34795f157c3722da827293a88 100644 (file)
@@ -431,6 +431,8 @@ static void kvm_multiple_exception(struct kvm_vcpu *vcpu,
                vcpu->arch.exception.has_error_code = has_error;
                vcpu->arch.exception.nr = nr;
                vcpu->arch.exception.error_code = error_code;
+               vcpu->arch.exception.has_payload = false;
+               vcpu->arch.exception.payload = 0;
                return;
        }
 
@@ -455,6 +457,8 @@ static void kvm_multiple_exception(struct kvm_vcpu *vcpu,
                vcpu->arch.exception.has_error_code = true;
                vcpu->arch.exception.nr = DF_VECTOR;
                vcpu->arch.exception.error_code = 0;
+               vcpu->arch.exception.has_payload = false;
+               vcpu->arch.exception.payload = 0;
        } else
                /* replace previous exception with a new one in a hope
                   that instruction re-execution will regenerate lost
@@ -3436,6 +3440,8 @@ static int kvm_vcpu_ioctl_x86_set_vcpu_events(struct kvm_vcpu *vcpu,
        vcpu->arch.exception.nr = events->exception.nr;
        vcpu->arch.exception.has_error_code = events->exception.has_error_code;
        vcpu->arch.exception.error_code = events->exception.error_code;
+       vcpu->arch.exception.has_payload = false;
+       vcpu->arch.exception.payload = 0;
 
        vcpu->arch.interrupt.injected = events->interrupt.injected;
        vcpu->arch.interrupt.nr = events->interrupt.nr;
@@ -9486,6 +9492,8 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
                        vcpu->arch.exception.nr = 0;
                        vcpu->arch.exception.has_error_code = false;
                        vcpu->arch.exception.error_code = 0;
+                       vcpu->arch.exception.has_payload = false;
+                       vcpu->arch.exception.payload = 0;
                } else if (!apf_put_user(vcpu, KVM_PV_REASON_PAGE_READY)) {
                        fault.vector = PF_VECTOR;
                        fault.error_code_valid = true;