On 04/15/2011 06:27 AM, Nelson Elhage wrote:
This means that the truncation behavior in linearize needs to grow an additional
slight piece of complexity: when fetching, truncation is dependent on the
execution mode, instead of the current address size.

diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index a5f63d4..d3d43a7 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -542,7 +542,7 @@ static int emulate_nm(struct x86_emulate_ctxt *ctxt)

  static int linearize(struct x86_emulate_ctxt *ctxt,
                     struct segmented_address addr,
-                    unsigned size, bool write,
+                    unsigned size, bool write, bool fetch,

Calls to functions with strings of bool arguments are confusing. Please make this __linearize, and introduce a new linearize() which doesn't have a fetch argument.

                ulong *linear)
  {
        struct decode_cache *c =&ctxt->decode;
@@ -602,7 +602,7 @@ static int linearize(struct x86_emulate_ctxt *ctxt,
                }
                break;
        }

linearize() will currently fault on an unreadable code segment. Need to avoid that on instruction fetches.

-       if (c->ad_bytes != 8)
+       if (fetch ? ctxt->mode != X86EMUL_MODE_PROT64 : c->ad_bytes != 8)
                la&= (u32)-1;
        *linear = la;
        return X86EMUL_CONTINUE;

--
error compiling committee.c: too many arguments to function

--
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

Reply via email to