From: Jan Kiszka <jan.kiszka@xxxxxxxxxxx> The access size of an in/ins is reported in dst_bytes, and that of out/outs in src_bytes. Signed-off-by: Jan Kiszka <jan.kiszka@xxxxxxxxxxx> --- I'm seeing one more issue now: on emulation of "in (%dx),%eax", we leave to user space several times and check interception also several times after returning. We use dx to calculate the port number for the interception check. But at some point, user space (QEMU) decides to update that register during vmport access - and now we check the wrong port in the bitmap (namely port 0). Ideas? In general, the same interception checks are done multiple times. Once after the exit, then again during emulation. Can't we avoid this somehow? arch/x86/kvm/svm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c index 3483ac9..1824949 100644 --- a/arch/x86/kvm/svm.c +++ b/arch/x86/kvm/svm.c @@ -4261,9 +4261,9 @@ static int svm_check_intercept(struct kvm_vcpu *vcpu, if (info->intercept == x86_intercept_in || info->intercept == x86_intercept_ins) { exit_info |= SVM_IOIO_TYPE_MASK; - bytes = info->src_bytes; - } else { bytes = info->dst_bytes; + } else { + bytes = info->src_bytes; } if (info->intercept == x86_intercept_outs || -- 1.8.4.5
Attachment:
signature.asc
Description: OpenPGP digital signature