2015-02-09 09:03:42

by Paolo Bonzini

[permalink] [raw]
Subject: [PATCH] KVM: x86: emulate: correct page fault error code for NoWrite instructions

NoWrite instructions (e.g. cmp or test) never set the "write access"
bit in the error code, even if one of the operands is treated as a
destination.

Fixes: c205fb7d7d4f81e46fc577b707ceb9e356af1456
Cc: Nadav Amit <[email protected]>
Signed-off-by: Paolo Bonzini <[email protected]>
---
arch/x86/kvm/emulate.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 81dcf7964701..a943bf0c06d0 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -4954,7 +4954,8 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt)
rc = segmented_read(ctxt, ctxt->dst.addr.mem,
&ctxt->dst.val, ctxt->dst.bytes);
if (rc != X86EMUL_CONTINUE) {
- if (rc == X86EMUL_PROPAGATE_FAULT &&
+ if (!(ctxt->d & NoWrite) &&
+ rc == X86EMUL_PROPAGATE_FAULT &&
ctxt->exception.vector == PF_VECTOR)
ctxt->exception.error_code |= PFERR_WRITE_MASK;
goto done;
--
1.8.3.1


2015-02-11 00:56:18

by Nadav Amit

[permalink] [raw]
Subject: Re: [PATCH] KVM: x86: emulate: correct page fault error code for NoWrite instructions

Sorry for that. I’ll try to run some few more tests next week.

Nadav

Paolo Bonzini <[email protected]> wrote:

> NoWrite instructions (e.g. cmp or test) never set the "write access"
> bit in the error code, even if one of the operands is treated as a
> destination.
>
> Fixes: c205fb7d7d4f81e46fc577b707ceb9e356af1456
> Cc: Nadav Amit <[email protected]>
> Signed-off-by: Paolo Bonzini <[email protected]>
> ---
> arch/x86/kvm/emulate.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
> index 81dcf7964701..a943bf0c06d0 100644
> --- a/arch/x86/kvm/emulate.c
> +++ b/arch/x86/kvm/emulate.c
> @@ -4954,7 +4954,8 @@ int x86_emulate_insn(struct x86_emulate_ctxt *ctxt)
> rc = segmented_read(ctxt, ctxt->dst.addr.mem,
> &ctxt->dst.val, ctxt->dst.bytes);
> if (rc != X86EMUL_CONTINUE) {
> - if (rc == X86EMUL_PROPAGATE_FAULT &&
> + if (!(ctxt->d & NoWrite) &&
> + rc == X86EMUL_PROPAGATE_FAULT &&
> ctxt->exception.vector == PF_VECTOR)
> ctxt->exception.error_code |= PFERR_WRITE_MASK;
> goto done;
> --
> 1.8.3.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

2015-11-20 02:52:49

by Wanpeng Li

[permalink] [raw]
Subject: Re: [PATCH] KVM: x86: emulate: correct page fault error code for NoWrite instructions

Hi Paolo,
2015-02-09 17:03 GMT+08:00 Paolo Bonzini <[email protected]>:
> NoWrite instructions (e.g. cmp or test) never set the "write access"
> bit in the error code, even if one of the operands is treated as a
> destination.

Sorry to reply to an old commit, btw, could you point out where in SDM
describe above?

Regards,
Wanpeng Li

2015-11-20 03:27:27

by Wanpeng Li

[permalink] [raw]
Subject: Re: [PATCH] KVM: x86: emulate: correct page fault error code for NoWrite instructions

2015-11-20 10:52 GMT+08:00 Wanpeng Li <[email protected]>:
> Hi Paolo,
> 2015-02-09 17:03 GMT+08:00 Paolo Bonzini <[email protected]>:
>> NoWrite instructions (e.g. cmp or test) never set the "write access"
>> bit in the error code, even if one of the operands is treated as a
>> destination.
>
> Sorry to reply to an old commit, btw, could you point out where in SDM
> describe above?

I see.

2015-11-20 07:46:28

by Nadav Amit

[permalink] [raw]
Subject: Re: [PATCH] KVM: x86: emulate: correct page fault error code for NoWrite instructions

Wanpeng Li <[email protected]> wrote:

> 2015-11-20 10:52 GMT+08:00 Wanpeng Li <[email protected]>:
>> Hi Paolo,
>> 2015-02-09 17:03 GMT+08:00 Paolo Bonzini <[email protected]>:
>>> NoWrite instructions (e.g. cmp or test) never set the "write access"
>>> bit in the error code, even if one of the operands is treated as a
>>> destination.
>>
>> Sorry to reply to an old commit, btw, could you point out where in SDM
>> describe above?
>
> I see.

I don’t understand whether you still need my help, so to clarify: on a
page-fault the error code should indicate whether the access was due to a
write access. Previously KVM marked it as “write access” for instructions
such as test and cmp that do not perform write.

Nadav-