From: Jan Beulich Date: Thu, 28 Apr 2016 13:09:26 +0000 (+0200) Subject: x86/HVM: fix forwarding of internally cached requests (part 2) X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~1211 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=670ee15ac1e3de7c15381fdaab0e531489b48939;p=xen.git x86/HVM: fix forwarding of internally cached requests (part 2) Commit 96ae556569 ("x86/HVM: fix forwarding of internally cached requests") wasn't quite complete: hvmemul_do_io() also needs to propagate up the clipped count. (I really should have re-tested the forward port resulting in the earlier change, instead of relying on the testing done on the older version of Xen which the fix was first needed for.) Signed-off-by: Jan Beulich Reviewed-by: Paul Durrant Reviewed-by: Andrew Cooper --- diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index 1384a4234b..be1e7c2968 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -137,7 +137,7 @@ static int hvmemul_do_io( if ( (p.type != (is_mmio ? IOREQ_TYPE_COPY : IOREQ_TYPE_PIO)) || (p.addr != addr) || (p.size != size) || - (p.count != *reps) || + (p.count > *reps) || (p.dir != dir) || (p.df != df) || (p.data_is_ptr != data_is_addr) ) @@ -145,6 +145,8 @@ static int hvmemul_do_io( if ( data_is_addr ) return X86EMUL_UNHANDLEABLE; + + *reps = p.count; goto finish_access; default: return X86EMUL_UNHANDLEABLE; @@ -162,6 +164,13 @@ static int hvmemul_do_io( rc = hvm_io_intercept(&p); + /* + * p.count may have got reduced (see hvm_process_io_intercept()) - inform + * our callers and mirror this into latched state. + */ + ASSERT(p.count <= *reps); + *reps = vio->io_req.count = p.count; + switch ( rc ) { case X86EMUL_OKAY: