diff options
author | Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com> | 2012-07-26 01:12:22 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-07-26 05:10:58 -0400 |
commit | f23b070e662ca55a8fdaaa28537af06cab664499 (patch) | |
tree | 1b15d4cc5f1d8cbbffbc3dd7e332e2dcad76cba0 | |
parent | a2766325cf9f9e36d1225145f1ce1b066f001837 (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.c | 31 |
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 | |||
1181 | read_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 | ||