{
int rc;
struct read_cache *mc = &ctxt->decode.mem_read;
+ u32 err;
while (size) {
int n = min(size, 8u);
if (mc->pos < mc->end)
goto read_cached;
- rc = ops->read_emulated(addr, mc->data + mc->end, n, ctxt->vcpu);
+ rc = ops->read_emulated(addr, mc->data + mc->end, n, &err,
+ ctxt->vcpu);
+ if (rc == X86EMUL_PROPAGATE_FAULT)
+ kvm_inject_page_fault(ctxt->vcpu, addr, err);
if (rc != X86EMUL_CONTINUE)
return rc;
mc->end += n;
{
int rc;
struct decode_cache *c = &ctxt->decode;
+ u32 err;
switch (c->dst.type) {
case OP_REG:
&c->dst.orig_val,
&c->dst.val,
c->dst.bytes,
+ &err,
ctxt->vcpu);
else
rc = ops->write_emulated(
(unsigned long)c->dst.ptr,
&c->dst.val,
c->dst.bytes,
+ &err,
ctxt->vcpu);
+ if (rc == X86EMUL_PROPAGATE_FAULT)
+ kvm_inject_page_fault(ctxt->vcpu,
+ (unsigned long)c->dst.ptr, err);
if (rc != X86EMUL_CONTINUE)
return rc;
break;