|
@@ -1166,24 +1166,21 @@ static int read_emulated(struct x86_emulate_ctxt *ctxt,
|
|
|
int rc;
|
|
|
struct read_cache *mc = &ctxt->mem_read;
|
|
|
|
|
|
- while (size) {
|
|
|
- int n = min(size, 8u);
|
|
|
- size -= n;
|
|
|
- if (mc->pos < mc->end)
|
|
|
- goto read_cached;
|
|
|
-
|
|
|
- rc = ctxt->ops->read_emulated(ctxt, addr, mc->data + mc->end, n,
|
|
|
- &ctxt->exception);
|
|
|
- if (rc != X86EMUL_CONTINUE)
|
|
|
- return rc;
|
|
|
- mc->end += n;
|
|
|
+ if (mc->pos < mc->end)
|
|
|
+ goto read_cached;
|
|
|
|
|
|
- read_cached:
|
|
|
- memcpy(dest, mc->data + mc->pos, n);
|
|
|
- mc->pos += n;
|
|
|
- dest += n;
|
|
|
- addr += n;
|
|
|
- }
|
|
|
+ WARN_ON((mc->end + size) >= sizeof(mc->data));
|
|
|
+
|
|
|
+ rc = ctxt->ops->read_emulated(ctxt, addr, mc->data + mc->end, size,
|
|
|
+ &ctxt->exception);
|
|
|
+ if (rc != X86EMUL_CONTINUE)
|
|
|
+ return rc;
|
|
|
+
|
|
|
+ mc->end += size;
|
|
|
+
|
|
|
+read_cached:
|
|
|
+ memcpy(dest, mc->data + mc->pos, size);
|
|
|
+ mc->pos += size;
|
|
|
return X86EMUL_CONTINUE;
|
|
|
}
|
|
|
|