]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: x86: Move op_prefix to struct x86_emulate_ctxt (from x86_decode_insn())
authorPaolo Bonzini <pbonzini@redhat.com>
Fri, 14 Nov 2025 00:36:27 +0000 (19:36 -0500)
committerSean Christopherson <seanjc@google.com>
Wed, 19 Nov 2025 22:28:30 +0000 (14:28 -0800)
VEX decode will need to set it based on the "pp" bits, so make it
a field in the struct rather than a local variable.

No functional change intended.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Chang S. Bae <chang.seok.bae@intel.com>
Link: https://patch.msgid.link/20251114003633.60689-5-pbonzini@redhat.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/emulate.c
arch/x86/kvm/kvm_emulate.h

index 70d0f8561097df68dde33f5b4aeb547569fa7e25..23019928734a6285d99ec754d151bc5d7e87293f 100644 (file)
@@ -4761,7 +4761,6 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len, int
        int rc = X86EMUL_CONTINUE;
        int mode = ctxt->mode;
        int def_op_bytes, def_ad_bytes, goffset, simd_prefix;
-       bool op_prefix = false;
        bool has_seg_override = false;
        struct opcode opcode;
        u16 dummy;
@@ -4813,7 +4812,7 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len, int
        for (;;) {
                switch (ctxt->b = insn_fetch(u8, ctxt)) {
                case 0x66:      /* operand-size override */
-                       op_prefix = true;
+                       ctxt->op_prefix = true;
                        /* switch between 2/4 bytes */
                        ctxt->op_bytes = def_op_bytes ^ 6;
                        break;
@@ -4920,9 +4919,9 @@ done_prefixes:
                        opcode = opcode.u.group[goffset];
                        break;
                case Prefix:
-                       if (ctxt->rep_prefix && op_prefix)
+                       if (ctxt->rep_prefix && ctxt->op_prefix)
                                return EMULATION_FAILED;
-                       simd_prefix = op_prefix ? 0x66 : ctxt->rep_prefix;
+                       simd_prefix = ctxt->op_prefix ? 0x66 : ctxt->rep_prefix;
                        switch (simd_prefix) {
                        case 0x00: opcode = opcode.u.gprefix->pfx_no; break;
                        case 0x66: opcode = opcode.u.gprefix->pfx_66; break;
@@ -5140,6 +5139,7 @@ void init_decode_cache(struct x86_emulate_ctxt *ctxt)
        ctxt->rip_relative = false;
        ctxt->rex_prefix = 0;
        ctxt->lock_prefix = 0;
+       ctxt->op_prefix = false;
        ctxt->rep_prefix = 0;
        ctxt->regs_valid = 0;
        ctxt->regs_dirty = 0;
index 7b5ddb787a251e92c17cc1612b989552ae82875c..83af019620e3fa29dc074368127a926eae3031bf 100644 (file)
@@ -348,6 +348,7 @@ struct x86_emulate_ctxt {
        u8 opcode_len;
        u8 b;
        u8 intercept;
+       bool op_prefix;
        u8 op_bytes;
        u8 ad_bytes;
        union {