Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=6041b57c6c99dcb59524f1bb0db0628c2689a464
Commit:     6041b57c6c99dcb59524f1bb0db0628c2689a464
Parent:     129a84de2347002f09721cda3155ccfd19fade40
Author:     Joerg Roedel <[EMAIL PROTECTED]>
AuthorDate: Thu May 10 22:22:14 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Fri May 11 08:29:32 2007 -0700

    i386: work around miscompilation of alternatives code
    
    A recent change makes my Dell 1501 hang on boot.  It's an AMD MK-36.  I use
    an x86_64 kernel.  It is 100% reproducible.
    
    I debugged this problem a bit and my compiler[1]interprets the =A constraint
    as %rax instead of %edx:%eax on x86_64 which causes the problem.  The 
appended
    patch provides a workaround for this and fixed the hang on my machine.
    
    [1] gcc version 4.1.3 20070429 (prerelease) (Debian 4.1.2-5)
    
    Signed-off-by: Joerg Roedel <[EMAIL PROTECTED]>
    Cc: Andi Kleen <[EMAIL PROTECTED]>
    Cc: Benny Halevy <[EMAIL PROTECTED]>
    Cc: Pete Zaitcev <[EMAIL PROTECTED]>
    Cc: "Joerg Roedel" <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 include/asm-i386/alternative.h   |    6 ++++++
 include/asm-i386/tsc.h           |    6 ++++--
 include/asm-x86_64/alternative.h |    6 ++++++
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/include/asm-i386/alternative.h b/include/asm-i386/alternative.h
index 0f70b37..eb7da54 100644
--- a/include/asm-i386/alternative.h
+++ b/include/asm-i386/alternative.h
@@ -98,6 +98,12 @@ static inline void alternatives_smp_switch(int smp) {}
                      ".previous" : output : [feat] "i" (feature), ##input)
 
 /*
+ * use this macro(s) if you need more than one output parameter
+ * in alternative_io
+ */
+#define ASM_OUTPUT2(a, b) a, b
+
+/*
  * Alternative inline assembly for SMP.
  *
  * The LOCK_PREFIX macro defined here replaces the LOCK and
diff --git a/include/asm-i386/tsc.h b/include/asm-i386/tsc.h
index 3f3c1fa..62c091f 100644
--- a/include/asm-i386/tsc.h
+++ b/include/asm-i386/tsc.h
@@ -35,14 +35,16 @@ static inline cycles_t get_cycles(void)
 static __always_inline cycles_t get_cycles_sync(void)
 {
        unsigned long long ret;
-       unsigned eax;
+       unsigned eax, edx;
 
        /*
         * Use RDTSCP if possible; it is guaranteed to be synchronous
         * and doesn't cause a VMEXIT on Hypervisors
         */
        alternative_io(ASM_NOP3, ".byte 0x0f,0x01,0xf9", X86_FEATURE_RDTSCP,
-                                "=A" (ret), "0" (0ULL) : "ecx", "memory");
+                      ASM_OUTPUT2("=a" (eax), "=d" (edx)),
+                      "a" (0U), "d" (0U) : "ecx", "memory");
+       ret = (((unsigned long long)edx) << 32) | ((unsigned long long)eax);
        if (ret)
                return ret;
 
diff --git a/include/asm-x86_64/alternative.h b/include/asm-x86_64/alternative.h
index a09fe85..a094276 100644
--- a/include/asm-x86_64/alternative.h
+++ b/include/asm-x86_64/alternative.h
@@ -103,6 +103,12 @@ static inline void alternatives_smp_switch(int smp) {}
                      ".previous" : output : [feat] "i" (feature), ##input)
 
 /*
+ * use this macro(s) if you need more than one output parameter
+ * in alternative_io
+ */
+#define ASM_OUTPUT2(a, b) a, b
+
+/*
  * Alternative inline assembly for SMP.
  *
  * The LOCK_PREFIX macro defined here replaces the LOCK and
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to