xen-4.6.0-testing-src.tar.bz2 mini-os.tar.bz2 blktap2-no-uninit.patch stubdom-have-iovec.patch - Renamed xsa149.patch to CVE-2015-7969-xsa149.patch - Dropped patches now contained in tarball or unnecessary xen-4.5.2-testing-src.tar.bz2 54c2553c-grant-table-use-uint16_t-consistently-for-offset-and-length.patch 54ca33bc-grant-table-refactor-grant-copy-to-reduce-duplicate-code.patch 54ca340e-grant-table-defer-releasing-pages-acquired-in-a-grant-copy.patch 54f4985f-libxl-fix-libvirtd-double-free.patch 55103616-vm-assist-prepare-for-discontiguous-used-bit-numbers.patch 551ac326-xentop-add-support-for-qdisk.patch 552d0fd2-x86-hvm-don-t-include-asm-spinlock-h.patch 552d0fe8-x86-mtrr-include-asm-atomic.h.patch 552d293b-x86-vMSI-X-honor-all-mask-requests.patch 552d2966-x86-vMSI-X-add-valid-bits-for-read-acceleration.patch 5537a4d8-libxl-use-DEBUG-log-level-instead-of-INFO.patch 5548e903-domctl-don-t-truncate-XEN_DOMCTL_max_mem-requests.patch 5548e95d-x86-allow-to-suppress-M2P-user-mode-exposure.patch 554c7aee-x86-provide-arch_fetch_and_add.patch 554c7b00-arm-provide-arch_fetch_and_add.patch 554cc211-libxl-add-qxl.patch 55534b0a-x86-provide-add_sized.patch 55534b25-arm-provide-add_sized.patch 5555a4f8-use-ticket-locks-for-spin-locks.patch 5555a5b9-x86-arm-remove-asm-spinlock-h.patch 5555a8ec-introduce-non-contiguous-allocation.patch 556d973f-unmodified-drivers-tolerate-IRQF_DISABLED-being-undefined.patch OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=387
136 lines
5.3 KiB
Diff
136 lines
5.3 KiB
Diff
References: bsc#953527 CVE-2015-5307 XSA-156
|
|
|
|
x86/HVM: always intercept #AC and #DB
|
|
|
|
Both being benign exceptions, and both being possible to get triggered
|
|
by exception delivery, this is required to prevent a guest from locking
|
|
up a CPU (resulting from no other VM exits occurring once getting into
|
|
such a loop).
|
|
|
|
The specific scenarios:
|
|
|
|
1) #AC may be raised during exception delivery if the handler is set to
|
|
be a ring-3 one by a 32-bit guest, and the stack is misaligned.
|
|
|
|
2) #DB may be raised during exception delivery when a breakpoint got
|
|
placed on a data structure involved in delivering the exception. This
|
|
can result in an endless loop when a 64-bit guest uses a non-zero IST
|
|
for the vector 1 IDT entry, but even without use of IST the time it
|
|
takes until a contributory fault would get raised (results depending
|
|
on the handler) may be quite long.
|
|
|
|
This is XSA-156.
|
|
|
|
Reported-by: Benjamin Serebrin <serebrin@google.com>
|
|
Signed-off-by: Jan Beulich <jbeulich@suse.com>
|
|
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
|
Tested-by: Andrew Cooper <andrew.cooper3@citrix.com>
|
|
|
|
Index: xen-4.6.0-testing/xen/arch/x86/hvm/svm/svm.c
|
|
===================================================================
|
|
--- xen-4.6.0-testing.orig/xen/arch/x86/hvm/svm/svm.c
|
|
+++ xen-4.6.0-testing/xen/arch/x86/hvm/svm/svm.c
|
|
@@ -1043,10 +1043,11 @@ static void noreturn svm_do_resume(struc
|
|
unlikely(v->arch.hvm_vcpu.debug_state_latch != debug_state) )
|
|
{
|
|
uint32_t intercepts = vmcb_get_exception_intercepts(vmcb);
|
|
- uint32_t mask = (1U << TRAP_debug) | (1U << TRAP_int3);
|
|
+
|
|
v->arch.hvm_vcpu.debug_state_latch = debug_state;
|
|
vmcb_set_exception_intercepts(
|
|
- vmcb, debug_state ? (intercepts | mask) : (intercepts & ~mask));
|
|
+ vmcb, debug_state ? (intercepts | (1U << TRAP_int3))
|
|
+ : (intercepts & ~(1U << TRAP_int3)));
|
|
}
|
|
|
|
if ( v->arch.hvm_svm.launch_core != smp_processor_id() )
|
|
@@ -2434,8 +2435,9 @@ void svm_vmexit_handler(struct cpu_user_
|
|
|
|
case VMEXIT_EXCEPTION_DB:
|
|
if ( !v->domain->debugger_attached )
|
|
- goto unexpected_exit_type;
|
|
- domain_pause_for_debugger();
|
|
+ hvm_inject_hw_exception(TRAP_debug, HVM_DELIVER_NO_ERROR_CODE);
|
|
+ else
|
|
+ domain_pause_for_debugger();
|
|
break;
|
|
|
|
case VMEXIT_EXCEPTION_BP:
|
|
@@ -2483,6 +2485,11 @@ void svm_vmexit_handler(struct cpu_user_
|
|
break;
|
|
}
|
|
|
|
+ case VMEXIT_EXCEPTION_AC:
|
|
+ HVMTRACE_1D(TRAP, TRAP_alignment_check);
|
|
+ hvm_inject_hw_exception(TRAP_alignment_check, vmcb->exitinfo1);
|
|
+ break;
|
|
+
|
|
case VMEXIT_EXCEPTION_UD:
|
|
svm_vmexit_ud_intercept(regs);
|
|
break;
|
|
Index: xen-4.6.0-testing/xen/arch/x86/hvm/vmx/vmx.c
|
|
===================================================================
|
|
--- xen-4.6.0-testing.orig/xen/arch/x86/hvm/vmx/vmx.c
|
|
+++ xen-4.6.0-testing/xen/arch/x86/hvm/vmx/vmx.c
|
|
@@ -1224,16 +1224,10 @@ static void vmx_update_host_cr3(struct v
|
|
|
|
void vmx_update_debug_state(struct vcpu *v)
|
|
{
|
|
- unsigned long mask;
|
|
-
|
|
- mask = 1u << TRAP_int3;
|
|
- if ( !cpu_has_monitor_trap_flag )
|
|
- mask |= 1u << TRAP_debug;
|
|
-
|
|
if ( v->arch.hvm_vcpu.debug_state_latch )
|
|
- v->arch.hvm_vmx.exception_bitmap |= mask;
|
|
+ v->arch.hvm_vmx.exception_bitmap |= 1U << TRAP_int3;
|
|
else
|
|
- v->arch.hvm_vmx.exception_bitmap &= ~mask;
|
|
+ v->arch.hvm_vmx.exception_bitmap &= ~(1U << TRAP_int3);
|
|
|
|
vmx_vmcs_enter(v);
|
|
vmx_update_exception_bitmap(v);
|
|
@@ -3041,9 +3035,10 @@ void vmx_vmexit_handler(struct cpu_user_
|
|
__vmread(EXIT_QUALIFICATION, &exit_qualification);
|
|
HVMTRACE_1D(TRAP_DEBUG, exit_qualification);
|
|
write_debugreg(6, exit_qualification | DR_STATUS_RESERVED_ONE);
|
|
- if ( !v->domain->debugger_attached || cpu_has_monitor_trap_flag )
|
|
- goto exit_and_crash;
|
|
- domain_pause_for_debugger();
|
|
+ if ( !v->domain->debugger_attached )
|
|
+ hvm_inject_hw_exception(vector, HVM_DELIVER_NO_ERROR_CODE);
|
|
+ else
|
|
+ domain_pause_for_debugger();
|
|
break;
|
|
case TRAP_int3:
|
|
{
|
|
@@ -3108,6 +3103,11 @@ void vmx_vmexit_handler(struct cpu_user_
|
|
|
|
hvm_inject_page_fault(regs->error_code, exit_qualification);
|
|
break;
|
|
+ case TRAP_alignment_check:
|
|
+ HVMTRACE_1D(TRAP, vector);
|
|
+ __vmread(VM_EXIT_INTR_ERROR_CODE, &ecode);
|
|
+ hvm_inject_hw_exception(vector, ecode);
|
|
+ break;
|
|
case TRAP_nmi:
|
|
if ( MASK_EXTR(intr_info, INTR_INFO_INTR_TYPE_MASK) !=
|
|
X86_EVENTTYPE_NMI )
|
|
Index: xen-4.6.0-testing/xen/include/asm-x86/hvm/hvm.h
|
|
===================================================================
|
|
--- xen-4.6.0-testing.orig/xen/include/asm-x86/hvm/hvm.h
|
|
+++ xen-4.6.0-testing/xen/include/asm-x86/hvm/hvm.h
|
|
@@ -384,7 +384,10 @@ static inline int hvm_event_pending(stru
|
|
(X86_CR4_VMXE | X86_CR4_PAE | X86_CR4_MCE))
|
|
|
|
/* These exceptions must always be intercepted. */
|
|
-#define HVM_TRAP_MASK ((1U << TRAP_machine_check) | (1U << TRAP_invalid_op))
|
|
+#define HVM_TRAP_MASK ((1U << TRAP_debug) | \
|
|
+ (1U << TRAP_invalid_op) | \
|
|
+ (1U << TRAP_alignment_check) | \
|
|
+ (1U << TRAP_machine_check))
|
|
|
|
/*
|
|
* x86 event types. This enumeration is valid for:
|