[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAOvLkw08BQjexftPZbKCL83uuSaAS7Cn2q2rAamewDDbVtPcxw@mail.gmail.com>
Date: Thu, 15 Dec 2011 15:51:44 +0800
From: ttlxzz ccc <boyzccc@...il.com>
To: linux-kernel@...r.kernel.org
Subject: a problem in cpucheck.c on x86
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@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists