[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [RFC v1 5/7] x86/hvm: Move INSTR_* constants to hvm.h


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Ross Lagerwall <ross.lagerwall@xxxxxxxxxx>
  • Date: Thu, 21 May 2026 11:12:03 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Iyo8tMZPDiMI4BhMgaPK7WwQBjL+2b/LtntTFfBi/kg=; b=TM5CAF9Y85c6LrXsWkWIDVDsHIg8UMayv7rH5l5CUCOLJaxaVogRoGxrUIOBrL+hD79ZRzhzcjNvCINZbShNIyMWAOYAnY/1/RdSbLQCoRQyBwnQJyFAFvw1IgzPrQkIR3dpE0Wio9336pDDAs3QV2L8mYkZlrZnGy8GheOj5QHJ62+ofPqIN1zmThWrUVMbYT0//QriIBW8U1YST3LR8i2G9i2GY3tnjbrGyGXfJC9zI1NniMYeayITx7q8Tpq7r2K1iPCR4xonjeItL7DnwRDVuJQXDxVsKwMnaiBz9lkhliG1Zqbd9aK5KSy+TrxJeUiuHFLZU+AX8axIP4WWiA==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=MKTRDEIRK6Cekh7RMhU6hB0FRePzyCV36FwlNMyWy1gZBJOo6MLdRf+SFrnMMt3fQ4VXYsmpD40IDiXQSMmLULE5LWV0c963m6Dh4dDBxvVsf4LVMxucpBoyKzT2xQVhldEqptqHTqGTyWxLASlTsoa1f70QZjEEL2iJzOr0ovKkVRlbDBBzTVg1YZRTaZWW75wp2xrTqFbQMzsfWICYGp/ewVanVo6xc1KRPUQLTgjEUYlyYbTw+udKp9CeilONxFHJjpI3gMGHUDk6EgHJzbJi04yGpPOMFBpEk86D2Gq18n0rAjryleIPBmoSH7xDs/8xc+xb1atkMXfPNamqmw==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Roger Pau Monné <roger.pau@xxxxxxxxxx>, Jason Andryuk <jason.andryuk@xxxxxxx>, Teddy Astie <teddy.astie@xxxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx
  • Delivery-date: Thu, 21 May 2026 10:12:19 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 5/19/26 10:49 AM, Jan Beulich wrote:
On 18.05.2026 15:14, Ross Lagerwall wrote:
These aren't specific to SVM and will be used for emulator fast path so
move them to hvm.h.

Some are SVM-specific, e.g. ...

--- a/xen/arch/x86/hvm/svm/svm.h
+++ b/xen/arch/x86/hvm/svm/svm.h
@@ -36,35 +36,6 @@ static inline void svm_invlpga(unsigned long linear, 
uint32_t asid)
      asm volatile ( "invlpga" :: "a" (linear), "c" (asid) );
  }
-/*
- * Encoding for svm_get_insn_len().  We take X86EMUL_OPC() for the main
- * opcode, shifted left to make room for the ModRM byte.
- *
- * The Grp7 instructions have their ModRM byte expressed in octal for easier
- * cross referencing with the opcode extension table.
- */
-#define INSTR_ENC(opc, modrm) (((opc) << 8) | (modrm))
-
-#define INSTR_PAUSE      INSTR_ENC(X86EMUL_OPC_F3(0, 0x90), 0)
-#define INSTR_INT3       INSTR_ENC(X86EMUL_OPC(   0, 0xcc), 0)
-#define INSTR_ICEBP      INSTR_ENC(X86EMUL_OPC(   0, 0xf1), 0)
-#define INSTR_HLT        INSTR_ENC(X86EMUL_OPC(   0, 0xf4), 0)
-#define INSTR_XSETBV     INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0321) /* octal-ok 
*/
-#define INSTR_VMRUN      INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0330) /* octal-ok 
*/
-#define INSTR_VMCALL     INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0331) /* octal-ok 
*/
-#define INSTR_VMLOAD     INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0332) /* octal-ok 
*/
-#define INSTR_VMSAVE     INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0333) /* octal-ok 
*/
-#define INSTR_STGI       INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0334) /* octal-ok 
*/
-#define INSTR_CLGI       INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0335) /* octal-ok 
*/
-#define INSTR_INVLPGA    INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0337) /* octal-ok 
*/

... the 7 ones above.

--- a/xen/arch/x86/include/asm/hvm/hvm.h
+++ b/xen/arch/x86/include/asm/hvm/hvm.h
@@ -851,6 +851,35 @@ static inline void hvm_sync_pir_to_irr(struct vcpu *v)
          alternative_vcall(hvm_funcs.sync_pir_to_irr, v);
  }
+/*
+ * Encoding for svm_get_insn_len().  We take X86EMUL_OPC() for the main
+ * opcode, shifted left to make room for the ModRM byte.

With all of this moved, the comment wants adjusting, at the very least by
putting "e.g." in front of the function name.

+ * The Grp7 instructions have their ModRM byte expressed in octal for easier
+ * cross referencing with the opcode extension table.
+ */
+#define INSTR_ENC(opc, modrm) (((opc) << 8) | (modrm))
+
+#define INSTR_PAUSE      INSTR_ENC(X86EMUL_OPC_F3(0, 0x90), 0)
+#define INSTR_INT3       INSTR_ENC(X86EMUL_OPC(   0, 0xcc), 0)
+#define INSTR_ICEBP      INSTR_ENC(X86EMUL_OPC(   0, 0xf1), 0)
+#define INSTR_HLT        INSTR_ENC(X86EMUL_OPC(   0, 0xf4), 0)
+#define INSTR_XSETBV     INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0321) /* octal-ok 
*/
+#define INSTR_VMRUN      INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0330) /* octal-ok 
*/
+#define INSTR_VMCALL     INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0331) /* octal-ok 
*/
+#define INSTR_VMLOAD     INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0332) /* octal-ok 
*/
+#define INSTR_VMSAVE     INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0333) /* octal-ok 
*/
+#define INSTR_STGI       INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0334) /* octal-ok 
*/
+#define INSTR_CLGI       INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0335) /* octal-ok 
*/
+#define INSTR_INVLPGA    INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0337) /* octal-ok 
*/
+#define INSTR_RDTSCP     INSTR_ENC(X86EMUL_OPC(0x0f, 0x01), 0371) /* octal-ok 
*/
+#define INSTR_INVD       INSTR_ENC(X86EMUL_OPC(0x0f, 0x08), 0)
+#define INSTR_WBINVD     INSTR_ENC(X86EMUL_OPC(0x0f, 0x09), 0)
+#define INSTR_WRMSR      INSTR_ENC(X86EMUL_OPC(0x0f, 0x30), 0)
+#define INSTR_RDTSC      INSTR_ENC(X86EMUL_OPC(0x0f, 0x31), 0)
+#define INSTR_RDMSR      INSTR_ENC(X86EMUL_OPC(0x0f, 0x32), 0)
+#define INSTR_CPUID      INSTR_ENC(X86EMUL_OPC(0x0f, 0xa2), 0)
+
  #else  /* CONFIG_HVM */

I further wonder whether putting this in hvm.h is a good idea. Is there
anything wrong with using a brand new header, e.g. instr-enc.h?

No objection to that. I do wonder though if using the instruction encoding like
this is the best way of passing through the instruction to the fast path in
hvm_emulate_one_ctxt() since I think in some cases the instruction encoding
may not match the actual instruction that triggered the VMEXIT.

Ross



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.