diff options
author | Avi Kivity <avi@redhat.com> | 2011-04-03 04:31:19 -0400 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2011-05-11 07:57:07 -0400 |
commit | 83b8795a29c53a5f9f202933818128aa54c3e8d2 (patch) | |
tree | cb3d43a2d94aa0d88972267e6108bb11d65ad571 /arch/x86/kvm | |
parent | 9fa088f4d24f045d91c37a5e55f0d2be2ef387ad (diff) |
KVM: x86 emulator: pass access size and read/write intent to linearize()
Needed for segment read/write checks.
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r-- | arch/x86/kvm/emulate.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index b46fa374d0f1..a2d343c4c0c1 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c | |||
@@ -491,6 +491,7 @@ static unsigned seg_override(struct x86_emulate_ctxt *ctxt, | |||
491 | 491 | ||
492 | static int linearize(struct x86_emulate_ctxt *ctxt, | 492 | static int linearize(struct x86_emulate_ctxt *ctxt, |
493 | struct segmented_address addr, | 493 | struct segmented_address addr, |
494 | unsigned size, bool write, | ||
494 | ulong *linear) | 495 | ulong *linear) |
495 | { | 496 | { |
496 | struct decode_cache *c = &ctxt->decode; | 497 | struct decode_cache *c = &ctxt->decode; |
@@ -550,7 +551,7 @@ static int segmented_read_std(struct x86_emulate_ctxt *ctxt, | |||
550 | int rc; | 551 | int rc; |
551 | ulong linear; | 552 | ulong linear; |
552 | 553 | ||
553 | rc = linearize(ctxt, addr, &linear); | 554 | rc = linearize(ctxt, addr, size, false, &linear); |
554 | if (rc != X86EMUL_CONTINUE) | 555 | if (rc != X86EMUL_CONTINUE) |
555 | return rc; | 556 | return rc; |
556 | return ctxt->ops->read_std(linear, data, size, ctxt->vcpu, | 557 | return ctxt->ops->read_std(linear, data, size, ctxt->vcpu, |
@@ -973,7 +974,7 @@ static int segmented_read(struct x86_emulate_ctxt *ctxt, | |||
973 | int rc; | 974 | int rc; |
974 | ulong linear; | 975 | ulong linear; |
975 | 976 | ||
976 | rc = linearize(ctxt, addr, &linear); | 977 | rc = linearize(ctxt, addr, size, false, &linear); |
977 | if (rc != X86EMUL_CONTINUE) | 978 | if (rc != X86EMUL_CONTINUE) |
978 | return rc; | 979 | return rc; |
979 | return read_emulated(ctxt, ctxt->ops, linear, data, size); | 980 | return read_emulated(ctxt, ctxt->ops, linear, data, size); |
@@ -987,7 +988,7 @@ static int segmented_write(struct x86_emulate_ctxt *ctxt, | |||
987 | int rc; | 988 | int rc; |
988 | ulong linear; | 989 | ulong linear; |
989 | 990 | ||
990 | rc = linearize(ctxt, addr, &linear); | 991 | rc = linearize(ctxt, addr, size, true, &linear); |
991 | if (rc != X86EMUL_CONTINUE) | 992 | if (rc != X86EMUL_CONTINUE) |
992 | return rc; | 993 | return rc; |
993 | return ctxt->ops->write_emulated(linear, data, size, | 994 | return ctxt->ops->write_emulated(linear, data, size, |
@@ -1002,7 +1003,7 @@ static int segmented_cmpxchg(struct x86_emulate_ctxt *ctxt, | |||
1002 | int rc; | 1003 | int rc; |
1003 | ulong linear; | 1004 | ulong linear; |
1004 | 1005 | ||
1005 | rc = linearize(ctxt, addr, &linear); | 1006 | rc = linearize(ctxt, addr, size, true, &linear); |
1006 | if (rc != X86EMUL_CONTINUE) | 1007 | if (rc != X86EMUL_CONTINUE) |
1007 | return rc; | 1008 | return rc; |
1008 | return ctxt->ops->cmpxchg_emulated(linear, orig_data, data, | 1009 | return ctxt->ops->cmpxchg_emulated(linear, orig_data, data, |
@@ -2509,7 +2510,7 @@ static int em_invlpg(struct x86_emulate_ctxt *ctxt) | |||
2509 | int rc; | 2510 | int rc; |
2510 | ulong linear; | 2511 | ulong linear; |
2511 | 2512 | ||
2512 | rc = linearize(ctxt, c->src.addr.mem, &linear); | 2513 | rc = linearize(ctxt, c->src.addr.mem, 1, false, &linear); |
2513 | if (rc == X86EMUL_CONTINUE) | 2514 | if (rc == X86EMUL_CONTINUE) |
2514 | emulate_invlpg(ctxt->vcpu, linear); | 2515 | emulate_invlpg(ctxt->vcpu, linear); |
2515 | /* Disable writeback. */ | 2516 | /* Disable writeback. */ |