KVM: x86: Push potential exception error code on task switches
When a fault triggers a task switch, the error code, if existent, has to be pushed on the new task's stack. Implement the missing bits. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
This commit is contained in:

zatwierdzone przez
Avi Kivity

rodzic
0760d44868
commit
e269fb2189
@@ -3271,6 +3271,8 @@ static int handle_task_switch(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct vcpu_vmx *vmx = to_vmx(vcpu);
|
||||
unsigned long exit_qualification;
|
||||
bool has_error_code = false;
|
||||
u32 error_code = 0;
|
||||
u16 tss_selector;
|
||||
int reason, type, idt_v;
|
||||
|
||||
@@ -3293,6 +3295,13 @@ static int handle_task_switch(struct kvm_vcpu *vcpu)
|
||||
kvm_clear_interrupt_queue(vcpu);
|
||||
break;
|
||||
case INTR_TYPE_HARD_EXCEPTION:
|
||||
if (vmx->idt_vectoring_info &
|
||||
VECTORING_INFO_DELIVER_CODE_MASK) {
|
||||
has_error_code = true;
|
||||
error_code =
|
||||
vmcs_read32(IDT_VECTORING_ERROR_CODE);
|
||||
}
|
||||
/* fall through */
|
||||
case INTR_TYPE_SOFT_EXCEPTION:
|
||||
kvm_clear_exception_queue(vcpu);
|
||||
break;
|
||||
@@ -3307,7 +3316,8 @@ static int handle_task_switch(struct kvm_vcpu *vcpu)
|
||||
type != INTR_TYPE_NMI_INTR))
|
||||
skip_emulated_instruction(vcpu);
|
||||
|
||||
if (!kvm_task_switch(vcpu, tss_selector, reason))
|
||||
if (!kvm_task_switch(vcpu, tss_selector, reason, has_error_code,
|
||||
error_code))
|
||||
return 0;
|
||||
|
||||
/* clear all local breakpoint enable flags */
|
||||
|
Reference in New Issue
Block a user