tags 652146 patch thanks Michael Prokop wrote...
> Problem doesn't seem to be present on 32bit systems,
> but on amd64 it's definitely reproducable.
The most likely culprit is
"push %%rbx\n\t"
in src/hd/hd.c:hd_is_xen, in combination with the compiler and perhaps
libc.
As the compiler makes the strcmp call inline, hd_is_xen becomes a leaf
function. Hence the compiler optimizes the frame pointer handling,
therefore %rsp is not decremented and may not be used for push/pop
operations - at least not without tampering data, probably somewhere
in the caller's domain.
Suggested solution:
Instead of pushing, save %rbp in another register and mark that one
clobbered:
--- src/hd/hd.c.orig 2009-05-12 17:49:52.000000000 +0200
+++ src/hd/hd.c 2012-01-16 00:57:35.600532496 +0100
@@ -3245,16 +3257,16 @@
"mov %%edx,8(%%esi)\n\t"
"pop %%ebx"
#else
- "push %%rbx\n\t"
+ "mov %%ebx,%%edi\n\t"
"cpuid\n\t"
"mov %%ebx,(%%rsi)\n\t"
"mov %%ecx,4(%%rsi)\n\t"
"mov %%edx,8(%%rsi)\n\t"
- "pop %%rbx"
+ "mov %%edi,%%ebx\n\t"
#endif
: "=a" (u), "=c" (foo)
: "a" (0x40000000), "c" (0), "S" (signature)
- : "%edx"
+ : "%edx", "%edi"
);
signature[12] = 0;
Other solutions:
* Mark %ebx clobbered. This appears to create the regular frameing but
I wouldn't rely on that.
* Use some kind of pragma that disables frame optimization. Ditto.
Still unexplained: Why does this not happen on i386? Avoiding push/pop
there too would at least do not harm.
Christoph
signature.asc
Description: Digital signature

