KVM: nSVM: Set correct port for IOIO interception evaluation
Obtaining the port number from DX is bogus as a) there are immediate port accesses and b) user space may have changed the register content while processing the PIO access. Forward the correct value from the instruction emulator instead. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Родитель
6493f1574e
Коммит
6cbc5f5a80
|
@ -37,6 +37,7 @@ struct x86_instruction_info {
|
|||
u8 modrm_reg; /* index of register used */
|
||||
u8 modrm_rm; /* rm part of modrm */
|
||||
u64 src_val; /* value of source operand */
|
||||
u64 dst_val; /* value of destination operand */
|
||||
u8 src_bytes; /* size of source operand */
|
||||
u8 dst_bytes; /* size of destination operand */
|
||||
u8 ad_bytes; /* size of src/dst address */
|
||||
|
|
|
@ -426,6 +426,7 @@ static int emulator_check_intercept(struct x86_emulate_ctxt *ctxt,
|
|||
.modrm_reg = ctxt->modrm_reg,
|
||||
.modrm_rm = ctxt->modrm_rm,
|
||||
.src_val = ctxt->src.val64,
|
||||
.dst_val = ctxt->dst.val64,
|
||||
.src_bytes = ctxt->src.bytes,
|
||||
.dst_bytes = ctxt->dst.bytes,
|
||||
.ad_bytes = ctxt->ad_bytes,
|
||||
|
|
|
@ -4256,13 +4256,13 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu,
|
|||
u64 exit_info;
|
||||
u32 bytes;
|
||||
|
||||
exit_info = (vcpu->arch.regs[VCPU_REGS_RDX] & 0xffff) << 16;
|
||||
|
||||
if (info->intercept == x86_intercept_in ||
|
||||
info->intercept == x86_intercept_ins) {
|
||||
exit_info |= SVM_IOIO_TYPE_MASK;
|
||||
exit_info = ((info->src_val & 0xffff) << 16) |
|
||||
SVM_IOIO_TYPE_MASK;
|
||||
bytes = info->dst_bytes;
|
||||
} else {
|
||||
exit_info = (info->dst_val & 0xffff) << 16;
|
||||
bytes = info->src_bytes;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче