kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH kvm-unit-tests] x86: add and use *_BIT constants for CR0, CR4, EFLAGS
@ 2022-07-26 15:12 Paolo Bonzini
  2022-07-26 17:32 ` Sean Christopherson
  0 siblings, 1 reply; 6+ messages in thread
From: Paolo Bonzini @ 2022-07-26 15:12 UTC (permalink / raw)
  To: kvm

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@redhat.com>
---
 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


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH kvm-unit-tests] x86: add and use *_BIT constants for CR0, CR4, EFLAGS
  2022-07-26 15:12 [PATCH kvm-unit-tests] x86: add and use *_BIT constants for CR0, CR4, EFLAGS Paolo Bonzini
@ 2022-07-26 17:32 ` Sean Christopherson
  2022-07-27  6:04   ` Paolo Bonzini
  0 siblings, 1 reply; 6+ messages in thread
From: Sean Christopherson @ 2022-07-26 17:32 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: kvm

On Tue, Jul 26, 2022, Paolo Bonzini wrote:
> 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@redhat.com>
> ---

...

> 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

I don't understand, this compiles cleanly on both gcc and clang, and generates the
correct code.  What am I missing?

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

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH kvm-unit-tests] x86: add and use *_BIT constants for CR0, CR4, EFLAGS
@ 2022-07-26 17:35 Paolo Bonzini
  0 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2022-07-26 17:35 UTC (permalink / raw)
  To: kvm; +Cc: seanjc

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@redhat.com>
---
 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


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH kvm-unit-tests] x86: add and use *_BIT constants for CR0, CR4, EFLAGS
  2022-07-26 17:32 ` Sean Christopherson
@ 2022-07-27  6:04   ` Paolo Bonzini
  2022-07-27 18:00     ` Sean Christopherson
  0 siblings, 1 reply; 6+ messages in thread
From: Paolo Bonzini @ 2022-07-27  6:04 UTC (permalink / raw)
  To: Sean Christopherson; +Cc: kvm

On 7/26/22 19:32, Sean Christopherson wrote:
> On Tue, Jul 26, 2022, Paolo Bonzini wrote:
>> 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@redhat.com>
>> ---
> 
> ...
> 
>> 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
> 
> I don't understand, this compiles cleanly on both gcc and clang, and generates the
> correct code.  What am I missing?

I saw a failure on older binutils where 1UL is not accepted by the 
assembler.

An alternative is to have some kind of __ASSEMBLY__ symbol as in Linux.

Paolo


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH kvm-unit-tests] x86: add and use *_BIT constants for CR0, CR4, EFLAGS
  2022-07-27  6:04   ` Paolo Bonzini
@ 2022-07-27 18:00     ` Sean Christopherson
  2022-07-28 15:13       ` Paolo Bonzini
  0 siblings, 1 reply; 6+ messages in thread
From: Sean Christopherson @ 2022-07-27 18:00 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: kvm

On Wed, Jul 27, 2022, Paolo Bonzini wrote:
> On 7/26/22 19:32, Sean Christopherson wrote:
> > On Tue, Jul 26, 2022, Paolo Bonzini wrote:
> > > 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@redhat.com>
> > > ---
> > 
> > ...
> > 
> > > 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
> > 
> > I don't understand, this compiles cleanly on both gcc and clang, and generates the
> > correct code.  What am I missing?
> 
> I saw a failure on older binutils where 1UL is not accepted by the
> assembler.

Mostly out of curiosity, how old?  I thought I was running some ancient crud in some
of my VMs, but even they play nice with this.

> An alternative is to have some kind of __ASSEMBLY__ symbol as in Linux.

I've no objection to this approach, but can you reword the changelog to call out
that it's only older binutils that's problematic?  I was truly confused by the
"cannot be used" blurb.

And a nit, add spaces around the shift (largely because they're needed around the
string), e.g.

  "orl $(1 << " xstr(X86_EFLAGS_AC_BIT) "), 2*"S"(%"R "sp)\n"  // set EFLAGS.AC and retry

I'm indifferent about the lack of spaces for the existing multiplication, I just
found the shift a little hard to read.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH kvm-unit-tests] x86: add and use *_BIT constants for CR0, CR4, EFLAGS
  2022-07-27 18:00     ` Sean Christopherson
@ 2022-07-28 15:13       ` Paolo Bonzini
  0 siblings, 0 replies; 6+ messages in thread
From: Paolo Bonzini @ 2022-07-28 15:13 UTC (permalink / raw)
  To: Sean Christopherson; +Cc: kvm

On 7/27/22 20:00, Sean Christopherson wrote:
>> I saw a failure on older binutils where 1UL is not accepted by the
>> assembler.
> 
> Mostly out of curiosity, how old?  I thought I was running some ancient crud in some
> of my VMs, but even they play nice with this.

CentOS 7, so 2014-vintage.

>> An alternative is to have some kind of __ASSEMBLY__ symbol as in Linux.
> 
> I've no objection to this approach, but can you reword the changelog to call out
> that it's only older binutils that's problematic?  I was truly confused by the
> "cannot be used" blurb.
> 
> And a nit, add spaces around the shift (largely because they're needed around the
> string), e.g.
> 
>    "orl $(1 << " xstr(X86_EFLAGS_AC_BIT) "), 2*"S"(%"R "sp)\n"  // set EFLAGS.AC and retry
> 
> I'm indifferent about the lack of spaces for the existing multiplication, I just
> found the shift a little hard to read.

Ok, will do.

Paolo

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-07-28 15:14 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-07-26 15:12 [PATCH kvm-unit-tests] x86: add and use *_BIT constants for CR0, CR4, EFLAGS Paolo Bonzini
2022-07-26 17:32 ` Sean Christopherson
2022-07-27  6:04   ` Paolo Bonzini
2022-07-27 18:00     ` Sean Christopherson
2022-07-28 15:13       ` Paolo Bonzini
  -- strict thread matches above, loose matches on Subject: below --
2022-07-26 17:35 Paolo Bonzini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).