Hi David,

On 16/03/12 23:42, David Howells wrote:
How about if I insert the attached patch prior?

Yep, that fixes it. Builds on its own, and with the asm/system.h
disintegration patch applied (and rejects fixed) as well.

Regards
Greg



---
From: David Howells<[email protected]>

m68k: Fix xchg/cmpxchg to fail to link if given an inappropriate pointer

Fix the m68k versions of xchg() and cmpxchg() to fail to link if given an
inappropriately sized pointer rather than BUG()'ing at runtime.

Signed-off-by: David Howells<[email protected]>
---

  arch/m68k/include/asm/system.h |   20 ++++++++++++++++----
  1 files changed, 16 insertions(+), 4 deletions(-)


diff --git a/arch/m68k/include/asm/system.h b/arch/m68k/include/asm/system.h
index 47b01f4..a10c4d1 100644
--- a/arch/m68k/include/asm/system.h
+++ b/arch/m68k/include/asm/system.h
@@ -68,6 +68,8 @@ asmlinkage void resume(void);
  struct __xchg_dummy { unsigned long a[100]; };
  #define __xg(x) ((volatile struct __xchg_dummy *)(x))

+extern unsigned long __invalid_xchg_size(unsigned long, volatile void *, int);
+
  #ifndef CONFIG_RMW_INSNS
  static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int 
size)
  {
@@ -92,7 +94,8 @@ static inline unsigned long __xchg(unsigned long x, volatile 
void * ptr, int siz
                x = tmp;
                break;
        default:
-               BUG();
+               tmp = __invalid_xchg_size(x, ptr, size);
+               break;
        }

        local_irq_restore(flags);
@@ -102,7 +105,7 @@ static inline unsigned long __xchg(unsigned long x, 
volatile void * ptr, int siz
  static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int 
size)
  {
        switch (size) {
-           case 1:
+       case 1:
                __asm__ __volatile__
                        ("moveb %2,%0\n\t"
                         "1:\n\t"
@@ -110,7 +113,7 @@ static inline unsigned long __xchg(unsigned long x, 
volatile void * ptr, int siz
                         "jne 1b"
                         : "=&d" (x) : "d" (x), "m" (*__xg(ptr)) : "memory");
                break;
-           case 2:
+       case 2:
                __asm__ __volatile__
                        ("movew %2,%0\n\t"
                         "1:\n\t"
@@ -118,7 +121,7 @@ static inline unsigned long __xchg(unsigned long x, 
volatile void * ptr, int siz
                         "jne 1b"
                         : "=&d" (x) : "d" (x), "m" (*__xg(ptr)) : "memory");
                break;
-           case 4:
+       case 4:
                __asm__ __volatile__
                        ("movel %2,%0\n\t"
                         "1:\n\t"
@@ -126,6 +129,9 @@ static inline unsigned long __xchg(unsigned long x, 
volatile void * ptr, int siz
                         "jne 1b"
                         : "=&d" (x) : "d" (x), "m" (*__xg(ptr)) : "memory");
                break;
+       default:
+               x = __invalid_xchg_size(x, ptr, size);
+               break;
        }
        return x;
  }
@@ -135,6 +141,9 @@ static inline unsigned long __xchg(unsigned long x, 
volatile void * ptr, int siz

  #define cmpxchg64_local(ptr, o, n) __cmpxchg64_local_generic((ptr), (o), (n))

+extern unsigned long __invalid_cmpxchg_size(volatile void *,
+                                           unsigned long, unsigned long, int);
+
  /*
   * Atomic compare and exchange.  Compare OLD with MEM, if identical,
   * store NEW in MEM.  Return the initial value in MEM.  Success is
@@ -162,6 +171,9 @@ static inline unsigned long __cmpxchg(volatile void *p, 
unsigned long old,
                                      : "=d" (old), "=m" (*(int *)p)
                                      : "d" (new), "0" (old), "m" (*(int *)p));
                break;
+       default:
+               old = __invalid_cmpxchg_size(p, old, new, size);
+               break;
        }
        return old;
  }





--
------------------------------------------------------------------------
Greg Ungerer  --  Principal Engineer        EMAIL:     [email protected]
SnapGear Group, McAfee                      PHONE:       +61 7 3435 2888
8 Gardner Close                             FAX:         +61 7 3217 5323
Milton, QLD, 4064, Australia                WEB: http://www.SnapGear.com
--
To unsubscribe from this list: send the line "unsubscribe linux-m68k" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to