Keir Fraser a écrit :
On 10/7/08 11:54, "Guillaume Rousse" <Guillaume.Rousse@xxxxxxxx> wrote:
I turned it into the current way because I don't need the check in pv
context, but I guess it might be simplified.
Actually then you can take the xc_cpuid_x86 function pretty much unmodified
(of course regs[0-3] become eax-edx, and input[1] is not needed).
The other stuff in the asm code is to ensure that cpuid traps into the
hypervisor when run in a pv guest. If you don't need to run in a pv guest
then you don't need that extra code.
OK, I tried this:
void Xen_cpuid(uint32_t idx, uint32_t *eax, uint32_t *ebx, uint32_t
*ecx, uint32_t *edx)
{
asm (
/* %ebx register need to be saved before usage and restored
thereafter
* for PIC-compliant code on i386 */
#ifdef __i386__
"push %%ebx; cpuid; mov %%ebx,%1; pop %%ebx"
#else
"push %%rbx; cpuid; mov %%ebx,%1; pop %%rbx"
#endif
: "=a" (*eax), "=r" (*ebx), "=c" (*ecx), "=d" (*edx)
: "" (idx), "2" (0) );
But it doesn't build:
misc.c: In function 'Xen_cpuid':
misc.c:1377: warning: asm operand 4 probably doesn't match constraints
misc.c:1377: error: impossible constraint in 'asm'
According to what I understood from GCC-Inline-Assembly-HOWTO, the 4th
operand is probably "=d" (*edx), but I don't see the exact issue.
--
Guillaume Rousse
Moyens Informatiques - INRIA Futurs
Tel: 01 69 35 69 62
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|