All new accounts created on Gitlab now require administrator approval. If you invite any collaborators, please let Flux staff know so they can approve the accounts.

Commit 0479abab authored by Wei Gang's avatar Wei Gang

x86: add volatile prefix for cpuid asm clauses

cpuid results are possible to be changed now. For example, changing
CR4.OSXSAVE bit or setting MSR XCR_XFEATURE_ENABLED_MASK may change
XSAVE related cpuid leave return values.

The volatile prefix is required to avoid the second cpuid calls
following some possible changing operations being optimized in
incorrect way by compiler.

The sample bug is in xsave_init while debug=3Dn. The second call to
cpuid_count() may be optimized and lead to a BUG_ON case while compare
xsave_cntxt_size with ebx.
Signed-off-by: default avatarWei Gang <gang.wei@intel.com>
parent 34f1ee9b
......@@ -223,7 +223,7 @@ static always_inline void detect_ht(struct cpuinfo_x86 *c) {}
* resulting in stale register contents being returned.
*/
#define cpuid(_op,_eax,_ebx,_ecx,_edx) \
asm ( "cpuid" \
asm volatile ( "cpuid" \
: "=a" (*(int *)(_eax)), \
"=b" (*(int *)(_ebx)), \
"=c" (*(int *)(_ecx)), \
......@@ -239,7 +239,7 @@ static inline void cpuid_count(
unsigned int *ecx,
unsigned int *edx)
{
asm ( "cpuid"
asm volatile ( "cpuid"
: "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx)
: "0" (op), "c" (count) );
}
......@@ -251,7 +251,7 @@ static always_inline unsigned int cpuid_eax(unsigned int op)
{
unsigned int eax;
asm ( "cpuid"
asm volatile ( "cpuid"
: "=a" (eax)
: "0" (op)
: "bx", "cx", "dx" );
......@@ -262,7 +262,7 @@ static always_inline unsigned int cpuid_ebx(unsigned int op)
{
unsigned int eax, ebx;
asm ( "cpuid"
asm volatile ( "cpuid"
: "=a" (eax), "=b" (ebx)
: "0" (op)
: "cx", "dx" );
......@@ -273,7 +273,7 @@ static always_inline unsigned int cpuid_ecx(unsigned int op)
{
unsigned int eax, ecx;
asm ( "cpuid"
asm volatile ( "cpuid"
: "=a" (eax), "=c" (ecx)
: "0" (op)
: "bx", "dx" );
......@@ -284,7 +284,7 @@ static always_inline unsigned int cpuid_edx(unsigned int op)
{
unsigned int eax, edx;
asm ( "cpuid"
asm volatile ( "cpuid"
: "=a" (eax), "=d" (edx)
: "0" (op)
: "bx", "cx" );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment