u32 intr_info = nr | INTR_INFO_VALID_MASK;
 
        if (vcpu->arch.exception.has_error_code) {
-               vmcs12->vm_exit_intr_error_code = vcpu->arch.exception.error_code;
+               /*
+                * Intel CPUs do not generate error codes with bits 31:16 set,
+                * and more importantly VMX disallows setting bits 31:16 in the
+                * injected error code for VM-Entry.  Drop the bits to mimic
+                * hardware and avoid inducing failure on nested VM-Entry if L1
+                * chooses to inject the exception back to L2.  AMD CPUs _do_
+                * generate "full" 32-bit error codes, so KVM allows userspace
+                * to inject exception error codes with bits 31:16 set.
+                */
+               vmcs12->vm_exit_intr_error_code = (u16)vcpu->arch.exception.error_code;
                intr_info |= INTR_INFO_DELIVER_CODE_MASK;
        }
 
 
        kvm_deliver_exception_payload(vcpu);
 
        if (has_error_code) {
-               vmcs_write32(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code);
+               /*
+                * Despite the error code being architecturally defined as 32
+                * bits, and the VMCS field being 32 bits, Intel CPUs and thus
+                * VMX don't actually supporting setting bits 31:16.  Hardware
+                * will (should) never provide a bogus error code, but AMD CPUs
+                * do generate error codes with bits 31:16 set, and so KVM's
+                * ABI lets userspace shove in arbitrary 32-bit values.  Drop
+                * the upper bits to avoid VM-Fail, losing information that
+                * does't really exist is preferable to killing the VM.
+                */
+               vmcs_write32(VM_ENTRY_EXCEPTION_ERROR_CODE, (u16)error_code);
                intr_info |= INTR_INFO_DELIVER_CODE_MASK;
        }