* [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).