[PATCH kvm-unit-tests] x86: add and use *_BIT constants for CR0, CR4, EFLAGS

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

 



The "BIT" macro cannot be used in top-level assembly statements
(it can be used in functions through the "i" constraint).  To
avoid having to hard-code EFLAGS.AC being bit 18, define the
constants for CR0, CR4 and EFLAGS bits in terms of new macros
for just the bit number.

Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
---
 lib/x86/processor.h | 164 +++++++++++++++++++++++++++++---------------
 x86/smap.c          |   2 +-
 2 files changed, 109 insertions(+), 57 deletions(-)

diff --git a/lib/x86/processor.h b/lib/x86/processor.h
index fb87198..0324220 100644
--- a/lib/x86/processor.h
+++ b/lib/x86/processor.h
@@ -31,67 +31,119 @@
 #define AC_VECTOR 17
 #define CP_VECTOR 21
 
-#define X86_CR0_PE	BIT(0)
-#define X86_CR0_MP	BIT(1)
-#define X86_CR0_EM	BIT(2)
-#define X86_CR0_TS	BIT(3)
-#define X86_CR0_ET	BIT(4)
-#define X86_CR0_NE	BIT(5)
-#define X86_CR0_WP	BIT(16)
-#define X86_CR0_AM	BIT(18)
-#define X86_CR0_NW	BIT(29)
-#define X86_CR0_CD	BIT(30)
-#define X86_CR0_PG	BIT(31)
+#define X86_CR0_PE_BIT		(0)
+#define X86_CR0_PE		BIT(X86_CR0_PE_BIT)
+#define X86_CR0_MP_BIT		(1)
+#define X86_CR0_MP		BIT(X86_CR0_MP_BIT)
+#define X86_CR0_EM_BIT		(2)
+#define X86_CR0_EM		BIT(X86_CR0_EM_BIT)
+#define X86_CR0_TS_BIT		(3)
+#define X86_CR0_TS		BIT(X86_CR0_TS_BIT)
+#define X86_CR0_ET_BIT		(4)
+#define X86_CR0_ET		BIT(X86_CR0_ET_BIT)
+#define X86_CR0_NE_BIT		(5)
+#define X86_CR0_NE		BIT(X86_CR0_NE_BIT)
+#define X86_CR0_WP_BIT		(16)
+#define X86_CR0_WP		BIT(X86_CR0_WP_BIT)
+#define X86_CR0_AM_BIT		(18)
+#define X86_CR0_AM		BIT(X86_CR0_AM_BIT)
+#define X86_CR0_NW_BIT		(29)
+#define X86_CR0_NW		BIT(X86_CR0_NW_BIT)
+#define X86_CR0_CD_BIT		(30)
+#define X86_CR0_CD		BIT(X86_CR0_CD_BIT)
+#define X86_CR0_PG_BIT		(31)
+#define X86_CR0_PG		BIT(X86_CR0_PG_BIT)
 
 #define X86_CR3_PCID_MASK	GENMASK(11, 0)
 
-#define X86_CR4_VME		BIT(0)
-#define X86_CR4_PVI		BIT(1)
-#define X86_CR4_TSD		BIT(2)
-#define X86_CR4_DE		BIT(3)
-#define X86_CR4_PSE		BIT(4)
-#define X86_CR4_PAE		BIT(5)
-#define X86_CR4_MCE		BIT(6)
-#define X86_CR4_PGE		BIT(7)
-#define X86_CR4_PCE		BIT(8)
-#define X86_CR4_OSFXSR		BIT(9)
-#define X86_CR4_OSXMMEXCPT	BIT(10)
-#define X86_CR4_UMIP		BIT(11)
-#define X86_CR4_LA57		BIT(12)
-#define X86_CR4_VMXE		BIT(13)
-#define X86_CR4_SMXE		BIT(14)
-/* UNUSED			BIT(15) */
-#define X86_CR4_FSGSBASE	BIT(16)
-#define X86_CR4_PCIDE		BIT(17)
-#define X86_CR4_OSXSAVE		BIT(18)
-#define X86_CR4_KL		BIT(19)
-#define X86_CR4_SMEP		BIT(20)
-#define X86_CR4_SMAP		BIT(21)
-#define X86_CR4_PKE		BIT(22)
-#define X86_CR4_CET		BIT(23)
-#define X86_CR4_PKS		BIT(24)
+#define X86_CR4_VME_BIT		(0)
+#define X86_CR4_VME		BIT(X86_CR4_VME_BIT)
+#define X86_CR4_PVI_BIT		(1)
+#define X86_CR4_PVI		BIT(X86_CR4_PVI_BIT)
+#define X86_CR4_TSD_BIT		(2)
+#define X86_CR4_TSD		BIT(X86_CR4_TSD_BIT)
+#define X86_CR4_DE_BIT		(3)
+#define X86_CR4_DE		BIT(X86_CR4_DE_BIT)
+#define X86_CR4_PSE_BIT		(4)
+#define X86_CR4_PSE		BIT(X86_CR4_PSE_BIT)
+#define X86_CR4_PAE_BIT		(5)
+#define X86_CR4_PAE		BIT(X86_CR4_PAE_BIT)
+#define X86_CR4_MCE_BIT		(6)
+#define X86_CR4_MCE		BIT(X86_CR4_MCE_BIT)
+#define X86_CR4_PGE_BIT		(7)
+#define X86_CR4_PGE		BIT(X86_CR4_PGE_BIT)
+#define X86_CR4_PCE_BIT		(8)
+#define X86_CR4_PCE		BIT(X86_CR4_PCE_BIT)
+#define X86_CR4_OSFXSR_BIT	(9)
+#define X86_CR4_OSFXSR		BIT(X86_CR4_OSFXSR_BIT)
+#define X86_CR4_OSXMMEXCPT_BIT	(10)
+#define X86_CR4_OSXMMEXCPT	BIT(X86_CR4_OSXMMEXCPT_BIT)
+#define X86_CR4_UMIP_BIT	(11)
+#define X86_CR4_UMIP		BIT(X86_CR4_UMIP_BIT)
+#define X86_CR4_LA57_BIT	(12)
+#define X86_CR4_LA57		BIT(X86_CR4_LA57_BIT)
+#define X86_CR4_VMXE_BIT	(13)
+#define X86_CR4_VMXE		BIT(X86_CR4_VMXE_BIT)
+#define X86_CR4_SMXE_BIT	(14)
+#define X86_CR4_SMXE		BIT(X86_CR4_SMXE_BIT)
+/* UNUSED			(15) */
+#define X86_CR4_FSGSBASE_BIT	(16)
+#define X86_CR4_FSGSBASE	BIT(X86_CR4_FSGSBASE_BIT)
+#define X86_CR4_PCIDE_BIT	(17)
+#define X86_CR4_PCIDE		BIT(X86_CR4_PCIDE_BIT)
+#define X86_CR4_OSXSAVE_BIT	(18)
+#define X86_CR4_OSXSAVE		BIT(X86_CR4_OSXSAVE_BIT)
+#define X86_CR4_KL_BIT		(19)
+#define X86_CR4_KL		BIT(X86_CR4_KL_BIT)
+#define X86_CR4_SMEP_BIT	(20)
+#define X86_CR4_SMEP		BIT(X86_CR4_SMEP_BIT)
+#define X86_CR4_SMAP_BIT	(21)
+#define X86_CR4_SMAP		BIT(X86_CR4_SMAP_BIT)
+#define X86_CR4_PKE_BIT		(22)
+#define X86_CR4_PKE		BIT(X86_CR4_PKE_BIT)
+#define X86_CR4_CET_BIT		(23)
+#define X86_CR4_CET		BIT(X86_CR4_CET_BIT)
+#define X86_CR4_PKS_BIT		(24)
+#define X86_CR4_PKS		BIT(X86_CR4_PKS_BIT)
 
-#define X86_EFLAGS_CF		BIT(0)
-#define X86_EFLAGS_FIXED	BIT(1)
-#define X86_EFLAGS_PF		BIT(2)
-/* RESERVED 0			BIT(3) */
-#define X86_EFLAGS_AF		BIT(4)
-/* RESERVED 0			BIT(5) */
-#define X86_EFLAGS_ZF		BIT(6)
-#define X86_EFLAGS_SF		BIT(7)
-#define X86_EFLAGS_TF		BIT(8)
-#define X86_EFLAGS_IF		BIT(9)
-#define X86_EFLAGS_DF		BIT(10)
-#define X86_EFLAGS_OF		BIT(11)
+#define X86_EFLAGS_CF_BIT	(0)
+#define X86_EFLAGS_CF		BIT(X86_EFLAGS_CF_BIT)
+#define X86_EFLAGS_FIXED_BIT	(1)
+#define X86_EFLAGS_FIXED	BIT(X86_EFLAGS_FIXED_BIT)
+#define X86_EFLAGS_PF_BIT	(2)
+#define X86_EFLAGS_PF		BIT(X86_EFLAGS_PF_BIT)
+/* RESERVED 0			(3) */
+#define X86_EFLAGS_AF_BIT	(4)
+#define X86_EFLAGS_AF		BIT(X86_EFLAGS_AF_BIT)
+/* RESERVED 0			(5) */
+#define X86_EFLAGS_ZF_BIT	(6)
+#define X86_EFLAGS_ZF		BIT(X86_EFLAGS_ZF_BIT)
+#define X86_EFLAGS_SF_BIT	(7)
+#define X86_EFLAGS_SF		BIT(X86_EFLAGS_SF_BIT)
+#define X86_EFLAGS_TF_BIT	(8)
+#define X86_EFLAGS_TF		BIT(X86_EFLAGS_TF_BIT)
+#define X86_EFLAGS_IF_BIT	(9)
+#define X86_EFLAGS_IF		BIT(X86_EFLAGS_IF_BIT)
+#define X86_EFLAGS_DF_BIT	(10)
+#define X86_EFLAGS_DF		BIT(X86_EFLAGS_DF_BIT)
+#define X86_EFLAGS_OF_BIT	(11)
+#define X86_EFLAGS_OF		BIT(X86_EFLAGS_OF_BIT)
 #define X86_EFLAGS_IOPL		GENMASK(13, 12)
-#define X86_EFLAGS_NT		BIT(14)
-/* RESERVED 0			BIT(15) */
-#define X86_EFLAGS_RF		BIT(16)
-#define X86_EFLAGS_VM		BIT(17)
-#define X86_EFLAGS_AC		BIT(18)
-#define X86_EFLAGS_VIF		BIT(19)
-#define X86_EFLAGS_VIP		BIT(20)
-#define X86_EFLAGS_ID		BIT(21)
+#define X86_EFLAGS_NT_BIT	(14)
+#define X86_EFLAGS_NT		BIT(X86_EFLAGS_NT_BIT)
+/* RESERVED 0			(15) */
+#define X86_EFLAGS_RF_BIT	(16)
+#define X86_EFLAGS_RF		BIT(X86_EFLAGS_RF_BIT)
+#define X86_EFLAGS_VM_BIT	(17)
+#define X86_EFLAGS_VM		BIT(X86_EFLAGS_VM_BIT)
+#define X86_EFLAGS_AC_BIT	(18)
+#define X86_EFLAGS_AC		BIT(X86_EFLAGS_AC_BIT)
+#define X86_EFLAGS_VIF_BIT	(19)
+#define X86_EFLAGS_VIF		BIT(X86_EFLAGS_VIF_BIT)
+#define X86_EFLAGS_VIP_BIT	(20)
+#define X86_EFLAGS_VIP		BIT(X86_EFLAGS_VIP_BIT)
+#define X86_EFLAGS_ID_BIT	(21)
+#define X86_EFLAGS_ID		BIT(X86_EFLAGS_ID_BIT)
 
 #define X86_EFLAGS_ALU (X86_EFLAGS_CF | X86_EFLAGS_PF | X86_EFLAGS_AF | \
 			X86_EFLAGS_ZF | X86_EFLAGS_SF | X86_EFLAGS_OF)
diff --git a/x86/smap.c b/x86/smap.c
index 0994c29..3f63ee1 100644
--- a/x86/smap.c
+++ b/x86/smap.c
@@ -39,7 +39,7 @@ asm ("pf_tss:\n"
 #endif
 	"add $"S", %"R "sp\n"
 #ifdef __x86_64__
-	"orl $" xstr(X86_EFLAGS_AC) ", 2*"S"(%"R "sp)\n"  // set EFLAGS.AC and retry
+	"orl $(1<<" xstr(X86_EFLAGS_AC_BIT) "), 2*"S"(%"R "sp)\n"  // set EFLAGS.AC and retry
 #endif
         "iret"W" \n\t"
         "jmp pf_tss\n\t");
-- 
2.36.1




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux