lkml.org 
[lkml]   [2012]   [Feb]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[26/89] m68k: Fix assembler constraint to prevent overeager gcc optimisation
    3.2-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Andreas Schwab <schwab@linux-m68k.org>

    commit 2a3535069e33d8b416f406c159ce924427315303 upstream.

    Passing the address of a variable as an operand to an asm statement
    doesn't mark the value of this variable as used, so gcc may optimize its
    initialisation away. Fix this by using the "m" constraint instead.

    Signed-off-by: Andreas Schwab <schwab@linux-m68k.org>
    Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/m68k/atari/config.c | 8 ++++----
    arch/m68k/kernel/process_mm.c | 4 ++--
    arch/m68k/kernel/process_no.c | 4 ++--
    arch/m68k/kernel/traps.c | 36 +++++++++++++++++-------------------
    arch/m68k/mm/cache.c | 6 +++---
    5 files changed, 28 insertions(+), 30 deletions(-)

    --- a/arch/m68k/atari/config.c
    +++ b/arch/m68k/atari/config.c
    @@ -414,9 +414,9 @@ void __init config_atari(void)
    * FDC val = 4 -> Supervisor only */
    asm volatile ("\n"
    " .chip 68030\n"
    - " pmove %0@,%/tt1\n"
    + " pmove %0,%/tt1\n"
    " .chip 68k"
    - : : "a" (&tt1_val));
    + : : "m" (tt1_val));
    } else {
    asm volatile ("\n"
    " .chip 68040\n"
    @@ -569,10 +569,10 @@ static void atari_reset(void)
    : "d0");
    } else
    asm volatile ("\n"
    - " pmove %0@,%%tc\n"
    + " pmove %0,%%tc\n"
    " jmp %1@"
    : /* no outputs */
    - : "a" (&tc_val), "a" (reset_addr));
    + : "m" (tc_val), "a" (reset_addr));
    }


    --- a/arch/m68k/kernel/process_mm.c
    +++ b/arch/m68k/kernel/process_mm.c
    @@ -189,8 +189,8 @@ void flush_thread(void)
    current->thread.fs = __USER_DS;
    if (!FPU_IS_EMU)
    asm volatile (".chip 68k/68881\n\t"
    - "frestore %0@\n\t"
    - ".chip 68k" : : "a" (&zero));
    + "frestore %0\n\t"
    + ".chip 68k" : : "m" (zero));
    }

    /*
    --- a/arch/m68k/kernel/process_no.c
    +++ b/arch/m68k/kernel/process_no.c
    @@ -163,8 +163,8 @@ void flush_thread(void)
    #ifdef CONFIG_FPU
    if (!FPU_IS_EMU)
    asm volatile (".chip 68k/68881\n\t"
    - "frestore %0@\n\t"
    - ".chip 68k" : : "a" (&zero));
    + "frestore %0\n\t"
    + ".chip 68k" : : "m" (zero));
    #endif
    }

    --- a/arch/m68k/kernel/traps.c
    +++ b/arch/m68k/kernel/traps.c
    @@ -552,13 +552,13 @@ static inline void bus_error030 (struct

    #ifdef DEBUG
    asm volatile ("ptestr %3,%2@,#7,%0\n\t"
    - "pmove %%psr,%1@"
    - : "=a&" (desc)
    - : "a" (&temp), "a" (addr), "d" (ssw));
    + "pmove %%psr,%1"
    + : "=a&" (desc), "=m" (temp)
    + : "a" (addr), "d" (ssw));
    #else
    asm volatile ("ptestr %2,%1@,#7\n\t"
    - "pmove %%psr,%0@"
    - : : "a" (&temp), "a" (addr), "d" (ssw));
    + "pmove %%psr,%0"
    + : "=m" (temp) : "a" (addr), "d" (ssw));
    #endif
    mmusr = temp;

    @@ -605,20 +605,18 @@ static inline void bus_error030 (struct
    !(ssw & RW) ? "write" : "read", addr,
    fp->ptregs.pc, ssw);
    asm volatile ("ptestr #1,%1@,#0\n\t"
    - "pmove %%psr,%0@"
    - : /* no outputs */
    - : "a" (&temp), "a" (addr));
    + "pmove %%psr,%0"
    + : "=m" (temp)
    + : "a" (addr));
    mmusr = temp;

    printk ("level 0 mmusr is %#x\n", mmusr);
    #if 0
    - asm volatile ("pmove %%tt0,%0@"
    - : /* no outputs */
    - : "a" (&tlong));
    + asm volatile ("pmove %%tt0,%0"
    + : "=m" (tlong));
    printk("tt0 is %#lx, ", tlong);
    - asm volatile ("pmove %%tt1,%0@"
    - : /* no outputs */
    - : "a" (&tlong));
    + asm volatile ("pmove %%tt1,%0"
    + : "=m" (tlong));
    printk("tt1 is %#lx\n", tlong);
    #endif
    #ifdef DEBUG
    @@ -668,13 +666,13 @@ static inline void bus_error030 (struct

    #ifdef DEBUG
    asm volatile ("ptestr #1,%2@,#7,%0\n\t"
    - "pmove %%psr,%1@"
    - : "=a&" (desc)
    - : "a" (&temp), "a" (addr));
    + "pmove %%psr,%1"
    + : "=a&" (desc), "=m" (temp)
    + : "a" (addr));
    #else
    asm volatile ("ptestr #1,%1@,#7\n\t"
    - "pmove %%psr,%0@"
    - : : "a" (&temp), "a" (addr));
    + "pmove %%psr,%0"
    + : "=m" (temp) : "a" (addr));
    #endif
    mmusr = temp;

    --- a/arch/m68k/mm/cache.c
    +++ b/arch/m68k/mm/cache.c
    @@ -52,9 +52,9 @@ static unsigned long virt_to_phys_slow(u
    unsigned long *descaddr;

    asm volatile ("ptestr %3,%2@,#7,%0\n\t"
    - "pmove %%psr,%1@"
    - : "=a&" (descaddr)
    - : "a" (&mmusr), "a" (vaddr), "d" (get_fs().seg));
    + "pmove %%psr,%1"
    + : "=a&" (descaddr), "=m" (mmusr)
    + : "a" (vaddr), "d" (get_fs().seg));
    if (mmusr & (MMU_I|MMU_B|MMU_L))
    return 0;
    descaddr = phys_to_virt((unsigned long)descaddr);



    \
     
     \ /
      Last update: 2012-02-01 22:41    [W:3.367 / U:0.356 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site