summaryrefslogtreecommitdiff
path: root/kernels/xen/24345.patch
diff options
context:
space:
mode:
authorAndré Fabian Silva Delgado <andre@pc-01.localdomain>2012-02-21 11:39:38 -0200
committerAndré Fabian Silva Delgado <andre@pc-01.localdomain>2012-02-21 11:39:38 -0200
commit415e6b0a686989d0000a82ba8404d4ab9cd1e6b7 (patch)
tree4c78f30103549386aa7f645c7f2623c181ce0572 /kernels/xen/24345.patch
parent8446919c3950deb73699302e1c33cdc05b7d4add (diff)
kernels/xe-guest-utilities
Diffstat (limited to 'kernels/xen/24345.patch')
-rw-r--r--kernels/xen/24345.patch31
1 files changed, 31 insertions, 0 deletions
diff --git a/kernels/xen/24345.patch b/kernels/xen/24345.patch
new file mode 100644
index 000000000..e75a1b38c
--- /dev/null
+++ b/kernels/xen/24345.patch
@@ -0,0 +1,31 @@
+--- a/tools/misc/xen-detect.c 2011-10-20 15:05:43.000000000 -0200
++++ b/tools/misc/xen-detect.c 2012-02-15 00:05:55.524455578 -0200
+@@ -35,18 +35,21 @@
+
+ static void cpuid(uint32_t idx, uint32_t *regs, int pv_context)
+ {
+- 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"
++/* Use the stack to avoid reg constraint failures with some gcc flags */
++ asm volatile (
++ "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)