a problem in cpucheck.c on x86

From: ttlxzz ccc
Date: Thu Dec 15 2011 - 02:51:57 EST


Hi,all:

In arch/x86/boot/cpucheck.c
static int has_eflag(u32 mask)
{
u32 f0, f1;

asm("pushfl ; "
"pushfl ; "
"popl %0 ; "
"movl %0,%1 ; "
"xorl %2,%1 ; "
"pushl %1 ; "
"popfl ; "
"pushfl ; "
"popl %1 ; "
"popfl"
: "=&r" (f0), "=&r" (f1)
: "ri" (mask));

return !!((f0^f1) & mask);
}

"pushl %1 ; "
"popfl ; "
"pushfl ; "
"popl %1 ; "
I don't know what does above 4 instructions do, and I rewirte it like this:

static int has_eflag(u32 mask)
{
u32 f0;

asm("pushfl ; "
"pushfl ; "
"popl %0 ; "
"popfl"
: "=&r" (f0));

return ~f0 & mask;

}
It works well, and I just want to know is there some special meanings
of the 4 instructions?
"pushl %1 ; "
"popfl ; "
"pushfl ; "
"popl %1 ; "
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/