| From 7d17e2763129ea307702fcdc91f6e9d114b65c2d Mon Sep 17 00:00:00 2001 |
| From: Helge Deller <deller@gmx.de> |
| Date: Thu, 30 Apr 2009 21:39:45 +0000 |
| Subject: parisc: fix ldcw inline assembler |
| |
| From: Helge Deller <deller@gmx.de> |
| |
| commit 7d17e2763129ea307702fcdc91f6e9d114b65c2d upstream. |
| |
| There are two reasons to expose the memory *a in the asm: |
| |
| 1) To prevent the compiler from discarding a preceeding write to *a, and |
| 2) to prevent it from caching *a in a register over the asm. |
| |
| The change has had a few days testing with a SMP build of 2.6.22.19 |
| running on a rp3440. |
| |
| This patch is about the correctness of the __ldcw() macro itself. |
| The use of the macro should be confined to small inline functions |
| to try to limit the effect of clobbering memory on GCC's optimization |
| of loads and stores. |
| |
| Signed-off-by: Dave Anglin <dave.anglin@nrc-cnrc.gc.ca> |
| Signed-off-by: Helge Deller <deller@gmx.de> |
| Signed-off-by: Kyle McMartin <kyle@mcmartin.ca> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/parisc/include/asm/system.h | 4 ++-- |
| 1 file changed, 2 insertions(+), 2 deletions(-) |
| |
| --- a/arch/parisc/include/asm/system.h |
| +++ b/arch/parisc/include/asm/system.h |
| @@ -168,8 +168,8 @@ static inline void set_eiem(unsigned lon |
| /* LDCW, the only atomic read-write operation PA-RISC has. *sigh*. */ |
| #define __ldcw(a) ({ \ |
| unsigned __ret; \ |
| - __asm__ __volatile__(__LDCW " 0(%1),%0" \ |
| - : "=r" (__ret) : "r" (a)); \ |
| + __asm__ __volatile__(__LDCW " 0(%2),%0" \ |
| + : "=r" (__ret), "+m" (*(a)) : "r" (a)); \ |
| __ret; \ |
| }) |
| |