@@ -40,6 +40,7 @@ enum insn_mmio_type {
INSN_MMIO_READ_ZERO_EXTEND,
INSN_MMIO_READ_SIGN_EXTEND,
INSN_MMIO_MOVS,
+ INSN_MMIO_IGNORE,
};
enum insn_mmio_type insn_decode_mmio(struct insn *insn, int *bytes);
@@ -1164,6 +1164,9 @@ static enum es_result vc_handle_mmio(struct ghcb *ghcb, struct es_em_ctxt *ctxt)
if (mmio == INSN_MMIO_DECODE_FAILED)
return ES_DECODE_FAILED;
+ if (mmio == INSN_MMIO_IGNORE)
+ return ES_OK;
+
if (mmio != INSN_MMIO_WRITE_IMM && mmio != INSN_MMIO_MOVS) {
reg_data = insn_get_modrm_reg_ptr(insn, ctxt->regs);
if (!reg_data)
@@ -897,6 +897,13 @@ enum insn_mmio_type insn_decode_mmio(struct insn *insn, int *bytes)
*bytes = 2;
type = INSN_MMIO_READ_SIGN_EXTEND;
break;
+ case 0xae: /* CLFLUSH */
+ /*
+ * Ignore CLFLUSHes - those go to emulated MMIO anyway and the
+ * hypervisor is responsible for cache management.
+ */
+ type = INSN_MMIO_IGNORE;
+ break;
}
break;
}