linux/arch/arm
Will Deacon 398aa66827 ARM: 6212/1: atomic ops: add memory constraints to inline asm
Currently, the 32-bit and 64-bit atomic operations on ARM do not
include memory constraints in the inline assembly blocks. In the
case of barrier-less operations [for example, atomic_add], this
means that the compiler may constant fold values which have actually
been modified by a call to an atomic operation.

This issue can be observed in the atomic64_test routine in
<kernel root>/lib/atomic64_test.c:

00000000 <test_atomic64>:
   0:	e1a0c00d 	mov	ip, sp
   4:	e92dd830 	push	{r4, r5, fp, ip, lr, pc}
   8:	e24cb004 	sub	fp, ip, #4
   c:	e24dd008 	sub	sp, sp, #8
  10:	e24b3014 	sub	r3, fp, #20
  14:	e30d000d 	movw	r0, #53261	; 0xd00d
  18:	e3011337 	movw	r1, #4919	; 0x1337
  1c:	e34c0001 	movt	r0, #49153	; 0xc001
  20:	e34a1aa3 	movt	r1, #43683	; 0xaaa3
  24:	e16300f8 	strd	r0, [r3, #-8]!
  28:	e30c0afe 	movw	r0, #51966	; 0xcafe
  2c:	e30b1eef 	movw	r1, #48879	; 0xbeef
  30:	e34d0eaf 	movt	r0, #57007	; 0xdeaf
  34:	e34d1ead 	movt	r1, #57005	; 0xdead
  38:	e1b34f9f 	ldrexd	r4, [r3]
  3c:	e1a34f90 	strexd	r4, r0, [r3]
  40:	e3340000 	teq	r4, #0
  44:	1afffffb 	bne	38 <test_atomic64+0x38>
  48:	e59f0004 	ldr	r0, [pc, #4]	; 54 <test_atomic64+0x54>
  4c:	e3a0101e 	mov	r1, #30
  50:	ebfffffe 	bl	0 <__bug>
  54:	00000000 	.word	0x00000000

The atomic64_set (0x38-0x44) writes to the atomic64_t, but the
compiler doesn't see this, assumes the test condition is always
false and generates an unconditional branch to __bug. The rest of the
test is optimised away.

This patch adds suitable memory constraints to the atomic operations on ARM
to ensure that the compiler is informed of the correct data hazards. We have
to use the "Qo" constraints to avoid hitting the GCC anomaly described at
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44492 , where the compiler
makes assumptions about the writeback in the addressing mode used by the
inline assembly. These constraints forbid the use of auto{inc,dec} addressing
modes, so it doesn't matter if we don't use the operand exactly once.

Cc: stable@kernel.org
Reviewed-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2010-07-09 11:29:35 +01:00
..
boot ARM: arch/arm/boot/bootp/bootp.lds: Checkpatch cleanup 2010-05-24 20:40:09 +01:00
common ARM: 6146/1: sa1111: Prevent deadlock in resume path 2010-05-27 10:36:08 +01:00
configs ARM: s3c2410_defconfig: Add new machines 2010-05-28 19:33:05 +09:00
include/asm ARM: 6212/1: atomic ops: add memory constraints to inline asm 2010-07-09 11:29:35 +01:00
kernel ARM: 6205/1: perf: ensure counter delta is treated as unsigned 2010-07-04 23:11:37 +01:00
lib ARM: 6110/1: Fix Thumb-2 kernel builds when UACCESS_WITH_MEMCPY is enabled 2010-05-08 10:45:26 +01:00
mach-aaec2000 include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
mach-at91 ARM: mach-at91: duplicated include 2010-05-24 20:40:13 +01:00
mach-bcmring Merge branch 'devel-stable' into devel 2010-05-17 17:24:04 +01:00
mach-clps711x ARM: arch/arm/mach-clps711x/Makefile.boot: Checkpatch cleanup 2010-05-24 20:40:09 +01:00
mach-cns3xxx ARM: cns3xxx: Add CNS3420 Validation Board support 2010-05-02 21:55:49 +04:00
mach-davinci davinci: da850 TPS6507x touch screen driver board data 2010-05-28 01:37:39 +02:00
mach-dove Merge branch 'origin' into devel-stable 2010-03-08 20:21:04 +00:00
mach-ebsa110 ARM: 5910/1: ARM: Add tmp register for addruart and loadsp 2010-02-12 17:27:52 +00:00
mach-ep93xx Merge remote branch 'origin' into secretlab/next-spi 2010-05-25 00:38:26 -06:00
mach-footbridge ARM: arch/arm/mach-footbridge/ebsa285-pci.c: Checkpatch cleanup 2010-05-24 20:40:10 +01:00
mach-gemini Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm 2010-03-01 09:15:15 -08:00
mach-h720x ARM: arch/arm/mach-h720x/common.h: Checkpatch cleanup 2010-05-24 20:40:10 +01:00
mach-integrator Merge branch 'devel-stable' into devel 2010-05-17 17:24:04 +01:00
mach-iop13xx include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
mach-iop32x Merge branch 'devel-stable' into devel 2010-05-17 17:24:04 +01:00
mach-iop33x include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
mach-ixp4xx Merge branch 'devel-stable' into devel 2010-05-17 17:24:04 +01:00
mach-ixp23xx include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
mach-ixp2000 include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
mach-kirkwood Merge git://git.infradead.org/mtd-2.6 2010-05-21 07:25:43 -07:00
mach-ks8695 ARM: 5910/1: ARM: Add tmp register for addruart and loadsp 2010-02-12 17:27:52 +00:00
mach-l7200 ARM: 5910/1: ARM: Add tmp register for addruart and loadsp 2010-02-12 17:27:52 +00:00
mach-lh7a40x include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
mach-loki Merge branch 'misc2' into devel 2010-02-25 22:09:41 +00:00
mach-mmp [ARM] mmp: append device support in jasper 2010-05-11 17:25:06 +02:00
mach-msm msm: dma: add completion.h header 2010-06-07 16:16:33 -07:00
mach-mv78xx0 Merge branch 'origin' into devel-stable 2010-03-08 20:21:04 +00:00
mach-mx1 Merge branch 'origin' into devel-stable 2010-03-08 20:21:04 +00:00
mach-mx2 Merge branch 'devel' of master.kernel.org:/home/rmk/linux-2.6-arm 2010-05-25 12:06:33 -07:00
mach-mx3 ARM: mx3: mx31lilly: fix build error for !CONFIG_USB_ULPI 2010-07-01 09:52:39 +02:00
mach-mx5 Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 into devel-stable 2010-05-20 23:43:18 +01:00
mach-mx25 arm/mx25: add watchdog device 2010-05-18 08:32:33 +02:00
mach-mxc91231 Merge branch 'origin' into devel-stable 2010-03-08 20:21:04 +00:00
mach-netx include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
mach-nomadik ARM: 6145/1: ux500 MTU clockrate correction 2010-05-27 10:36:08 +01:00
mach-ns9xxx include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
mach-nuc93x
mach-omap1 Merge branch 'omap4-i2c-init' into omap-for-linus 2010-05-20 11:37:23 -07:00
mach-omap2 Merge branch 'for_2.6.35rc' of git://git.pwsan.com/linux-2.6 into omap-fixes-for-linus 2010-06-28 15:47:04 +03:00
mach-orion5x leds: leds-gpio: Change blink_set callback to be able to turn off blinking 2010-05-26 13:07:55 +01:00
mach-pnx4008 include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
mach-pxa [ARM] pxa/mioa701: fix camera regression 2010-06-13 23:55:15 +08:00
mach-realview ARM: 6201/1: RealView: Do not use outer_sync() on ARM11MPCore boards with L220 2010-07-02 10:10:09 +01:00
mach-rpc include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
mach-s3c24a0/include/mach Merge branch 'origin' into devel-stable 2010-03-08 20:21:04 +00:00
mach-s3c64xx ARM: S3C64XX: Add USB OTG HCLK to the list of clocks 2010-05-28 19:31:34 +09:00
mach-s3c2400
mach-s3c2410 ARM: SAMSUNG: Move WDT device definitions in plat-samsung 2010-05-20 19:44:18 +09:00
mach-s3c2412 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6 2010-05-20 09:41:44 -07:00
mach-s3c2416 ARM: SMDK2416: Add support for framebuffer device and ensure correct setup 2010-05-18 18:46:30 +09:00
mach-s3c2440 gta02: Use pcf50633 backlight driver instead of platform backlight driver. 2010-05-26 17:34:40 +01:00
mach-s3c2443 Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2010-05-20 09:20:59 -07:00
mach-s5p6440 ARM: S5P: Fix the platform external interrupt issues. 2010-05-26 19:09:50 +09:00
mach-s5p6442 ARM: S5P6442: Fix PLL setting announce message. 2010-07-05 16:01:04 +09:00
mach-s5pc100 ARM: S5PC100: Fixup cross tree merge problems 2010-05-26 19:09:50 +09:00
mach-s5pv210 ARM: S5PV210: Correct clock register properties 2010-07-05 16:01:04 +09:00
mach-sa1100 ARM: arch/arm/mach-sa1100/leds.c: Checkpatch cleanup 2010-05-24 20:40:11 +01:00
mach-shark ARM: arch/arm/mach-shark/pci.c: Checkpatch cleanup 2010-05-24 20:40:11 +01:00
mach-shmobile ARM: remove 'select GENERIC_TIME' 2010-05-18 08:17:56 +01:00
mach-spear3xx ARM: 6091/1: ST SPEAr: Adding support for shared irq layer 2010-05-04 16:54:54 +01:00
mach-spear6xx ARM: SPEAR6xx: remove duplicated #include 2010-05-24 20:39:52 +01:00
mach-stmp37xx
mach-stmp378x
mach-u300 ARM: AB3550 board configuration and irq for U300 2010-05-28 01:37:47 +02:00
mach-ux500 Merge branch 'fix' of git://git.kernel.org/pub/scm/linux/kernel/git/ycmiao/pxa-linux-2.6 2010-06-08 19:40:08 +01:00
mach-versatile Merge branch 'devel-stable' into devel 2010-05-17 17:24:04 +01:00
mach-vexpress ARM: 6192/1: VExpress: Align the machine_desc.phys_io to 1MB section 2010-07-01 10:13:41 +01:00
mach-w90x900 ARM: 6141/1: Add audio support part in arch/arm/mach-w90x900 2010-05-24 22:25:34 +01:00
mm ARM: 6210/1: Do not rely on reset defaults of L2X0_AUX_CTRL 2010-07-09 11:28:53 +01:00
nwfpe ARM: arch/arm/nwfpe/fpsr.h: Checkpatch cleanup 2010-05-24 20:40:12 +01:00
oprofile ARM: 6074/1: oprofile: convert from sysdev to platform device 2010-05-17 11:53:59 +01:00
plat-iop ARM: 6048/1: ARM: iop3xx: register PMU IRQs during board initialisation 2010-04-29 18:03:49 +01:00
plat-mxc Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 into devel-stable 2010-05-20 23:43:18 +01:00
plat-nomadik ARM: 6145/1: ux500 MTU clockrate correction 2010-05-27 10:36:08 +01:00
plat-omap omap: GPIO: fix auto-disable of debounce clock 2010-06-10 15:37:41 +03:00
plat-orion mtd: orion/kirkwood: add RnB line support to orion mtd driver 2010-05-14 01:04:19 +01:00
plat-pxa [ARM] mmp: fix build failure due to IRQ_PMU depends on ARCH_PXA 2010-06-14 00:45:26 +08:00
plat-s3c24xx ARM: SAMSUNG: Move WDT device definitions in plat-samsung 2010-05-20 19:44:18 +09:00
plat-s5p ARM: S5P: Bug fix on external interrupt for S5P SoCs 2010-07-05 16:01:04 +09:00
plat-samsung ARM: SAMSUNG: Fix on wrong function name for S5PV210 sdhci0 2010-07-05 16:01:04 +09:00
plat-spear ARM: 6091/1: ST SPEAr: Adding support for shared irq layer 2010-05-04 16:54:54 +01:00
plat-stmp3xxx include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
plat-versatile ARM: Indirect round/set_rate operations through clk structure 2010-05-02 09:35:38 +01:00
tools ARM: Update mach-types 2010-05-01 11:32:58 +01:00
vfp ARM: VFP: Fix vfp_put_double() for d16-d31 2010-05-27 10:32:06 +01:00
Kconfig ARM: 6195/1: OMAP3: pmu: make CPU_HAS_PMU dependent on OMAP3_EMU 2010-07-01 10:13:58 +01:00
Kconfig-nommu
Kconfig.debug ARM: SAMSUNG: Move plat-s3c Kconfig entries to plat-samsung and plat-s3c24xx 2010-02-24 01:52:06 +00:00
Makefile Merge branch 'for-rmk/samsung3' of git://git.fluff.org/bjdooks/linux into devel-stable 2010-05-24 23:08:36 +01:00