[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-4.0-testing] tools/libxc: Fix x86_32 build breakage in previous changeset.
# HG changeset patch # User Keir Fraser <keir@xxxxxxx> # Date 1323168882 0 # Node ID beabf510c4a1cec1c91049284b2fc1b879fec456 # Parent c16b0a997a05e32b38fb33a70d59523375186f9c tools/libxc: Fix x86_32 build breakage in previous changeset. Signed-off-by: Keir Fraser <keir@xxxxxxx> xen-unstable changeset: 24345:491c3ebf1d37 xen-unstable date: Fri Dec 02 08:40:02 2011 -0800 tools/x86_64: Fix cpuid() inline asm to not clobber stack's red zone Pushing stuff onto the stack on x86-64 when we do not specify -mno-red-zone is unsafe. Since the complicated asm is due to register pressure on i386, we simply implement an all-new simpler alternative for x86-64. Signed-off-by: Keir Fraser <keir@xxxxxxx> Acked-by: Jan Beulich <jbeulich@xxxxxxxxxx> xen-unstable changeset: 24344:72f4e4cb7440 xen-unstable date: Fri Dec 02 06:31:14 2011 -0800 --- diff -r c16b0a997a05 -r beabf510c4a1 tools/libxc/xc_cpuid_x86.c --- a/tools/libxc/xc_cpuid_x86.c Wed Nov 16 16:40:05 2011 +0000 +++ b/tools/libxc/xc_cpuid_x86.c Tue Dec 06 10:54:42 2011 +0000 @@ -41,23 +41,23 @@ static void cpuid(const unsigned int *input, unsigned int *regs) { unsigned int count = (input[1] == XEN_CPUID_INPUT_UNUSED) ? 0 : input[1]; +#ifdef __i386__ + /* Use the stack to avoid reg constraint failures with some gcc flags */ asm ( -#ifdef __i386__ "push %%ebx; push %%edx\n\t" -#else - "push %%rbx; push %%rdx\n\t" -#endif "cpuid\n\t" "mov %%ebx,4(%4)\n\t" "mov %%edx,12(%4)\n\t" -#ifdef __i386__ "pop %%edx; pop %%ebx\n\t" -#else - "pop %%rdx; pop %%rbx\n\t" -#endif : "=a" (regs[0]), "=c" (regs[2]) : "0" (input[0]), "1" (count), "S" (regs) : "memory" ); +#else + asm ( + "cpuid" + : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3]) + : "0" (input[0]), "2" (count) ); +#endif } /* Get the manufacturer brand name of the host processor. */ diff -r c16b0a997a05 -r beabf510c4a1 tools/misc/xen-detect.c --- a/tools/misc/xen-detect.c Wed Nov 16 16:40:05 2011 +0000 +++ b/tools/misc/xen-detect.c Tue Dec 06 10:54:42 2011 +0000 @@ -35,18 +35,21 @@ static void cpuid(uint32_t idx, uint32_t *regs, int pv_context) { +#ifdef __i386__ + /* Use the stack to avoid reg constraint failures with some gcc flags */ asm volatile ( -#ifdef __i386__ -#define R(x) "%%e"#x"x" -#else -#define R(x) "%%r"#x"x" -#endif - "push "R(a)"; push "R(b)"; push "R(c)"; push "R(d)"\n\t" + "push %%eax; push %%ebx; push %%ecx; push %%edx\n\t" "test %1,%1 ; jz 1f ; ud2a ; .ascii \"xen\" ; 1: cpuid\n\t" "mov %%eax,(%2); mov %%ebx,4(%2)\n\t" "mov %%ecx,8(%2); mov %%edx,12(%2)\n\t" - "pop "R(d)"; pop "R(c)"; pop "R(b)"; pop "R(a)"\n\t" + "pop %%edx; pop %%ecx; pop %%ebx; pop %%eax\n\t" : : "a" (idx), "c" (pv_context), "S" (regs) : "memory" ); +#else + asm volatile ( + "test %5,%5 ; jz 1f ; ud2a ; .ascii \"xen\" ; 1: cpuid\n\t" + : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3]) + : "0" (idx), "1" (pv_context), "2" (0) ); +#endif } static int check_for_xen(int pv_context) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |