aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>2012-07-26 01:12:22 -0400
committerAvi Kivity <avi@redhat.com>2012-07-26 05:10:58 -0400
commitf23b070e662ca55a8fdaaa28537af06cab664499 (patch)
tree1b15d4cc5f1d8cbbffbc3dd7e332e2dcad76cba0
parenta2766325cf9f9e36d1225145f1ce1b066f001837 (diff)
KVM: x86 emulator: simplify read_emulated
No need split mmio read region into 8-bits pieces since we do it in emulator_read_write_onepage Changelog: Add a WARN_ON to check read-cache overflow Acked-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r--arch/x86/kvm/emulate.c31
1 files changed, 14 insertions, 17 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 85b611e13e84..2c5d1e65d9d1 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -1166,24 +1166,21 @@ static int read_emulated(struct x86_emulate_ctxt *ctxt,
1166 int rc; 1166 int rc;
1167 struct read_cache *mc = &ctxt->mem_read; 1167 struct read_cache *mc = &ctxt->mem_read;
1168 1168
1169 while (size) { 1169 if (mc->pos < mc->end)
1170 int n = min(size, 8u); 1170 goto read_cached;
1171 size -= n;
1172 if (mc->pos < mc->end)
1173 goto read_cached;
1174
1175 rc = ctxt->ops->read_emulated(ctxt, addr, mc->data + mc->end, n,
1176 &ctxt->exception);
1177 if (rc != X86EMUL_CONTINUE)
1178 return rc;
1179 mc->end += n;
1180 1171
1181 read_cached: 1172 WARN_ON((mc->end + size) >= sizeof(mc->data));
1182 memcpy(dest, mc->data + mc->pos, n); 1173
1183 mc->pos += n; 1174 rc = ctxt->ops->read_emulated(ctxt, addr, mc->data + mc->end, size,
1184 dest += n; 1175 &ctxt->exception);
1185 addr += n; 1176 if (rc != X86EMUL_CONTINUE)
1186 } 1177 return rc;
1178
1179 mc->end += size;
1180
1181read_cached:
1182 memcpy(dest, mc->data + mc->pos, size);
1183 mc->pos += size;
1187 return X86EMUL_CONTINUE; 1184 return X86EMUL_CONTINUE;
1188} 1185}
1189 1186