linux-serial.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@suse.de>
To: linux-serial@vger.kernel.org
Cc: Stephen Boyd <sboyd@codeaurora.org>,
	Arnd Bergmann <arnd@arndb.de>,
	Daniel Walker <dwalker@codeaurora.org>,
	Greg Kroah-Hartman <gregkh@suse.de>
Subject: [PATCH 12/76] hvc_dcc: Fix bad code generation by marking assembly volatile
Date: Wed, 16 Mar 2011 14:11:42 -0700	[thread overview]
Message-ID: <1300309966-5745-12-git-send-email-gregkh@suse.de> (raw)
In-Reply-To: <1300309966-5745-1-git-send-email-gregkh@suse.de>

From: Stephen Boyd <sboyd@codeaurora.org>

Without marking the asm __dcc_getstatus() volatile my compiler
decides it can cache the value of __ret in a register and then
check the value of it continually in hvc_dcc_put_chars() (I had
to replace get_wait/put_wait with 1 and fixup the branch
otherwise my disassembler barfed on __dcc_(get|put)char).

00000000 <hvc_dcc_put_chars>:
   0:   ee103e11        mrc     14, 0, r3, cr0, cr1, {0}
   4:   e3a0c000        mov     ip, #0  ; 0x0
   8:   e2033202        and     r3, r3, #536870912      ; 0x20000000
   c:   ea000006        b       2c <hvc_dcc_put_chars+0x2c>
  10:   e3530000        cmp     r3, #0  ; 0x0
  14:   1afffffd        bne     10 <hvc_dcc_put_chars+0x10>
  18:   e7d1000c        ldrb    r0, [r1, ip]
  1c:   ee10fe11        mrc     14, 0, pc, cr0, cr1, {0}
  20:   2afffffd        bcs     1c <hvc_dcc_put_chars+0x1c>
  24:   ee000e15        mcr     14, 0, r0, cr0, cr5, {0}
  28:   e28cc001        add     ip, ip, #1      ; 0x1
  2c:   e15c0002        cmp     ip, r2
  30:   bafffff6        blt     10 <hvc_dcc_put_chars+0x10>
  34:   e1a00002        mov     r0, r2
  38:   e12fff1e        bx      lr

As you can see, the value of the mrc is checked against
DCC_STATUS_TX (bit 29) and then stored in r3 for later use.
Marking the asm volatile produces the following:

00000000 <hvc_dcc_put_chars>:
   0:   e3a03000        mov     r3, #0  ; 0x0
   4:   ea000007        b       28 <hvc_dcc_put_chars+0x28>
   8:   ee100e11        mrc     14, 0, r0, cr0, cr1, {0}
   c:   e3100202        tst     r0, #536870912  ; 0x20000000
  10:   1afffffc        bne     8 <hvc_dcc_put_chars+0x8>
  14:   e7d10003        ldrb    r0, [r1, r3]
  18:   ee10fe11        mrc     14, 0, pc, cr0, cr1, {0}
  1c:   2afffffd        bcs     18 <hvc_dcc_put_chars+0x18>
  20:   ee000e15        mcr     14, 0, r0, cr0, cr5, {0}
  24:   e2833001        add     r3, r3, #1      ; 0x1
  28:   e1530002        cmp     r3, r2
  2c:   bafffff5        blt     8 <hvc_dcc_put_chars+0x8>
  30:   e1a00002        mov     r0, r2
  34:   e12fff1e        bx      lr

which looks better and actually works. Mark all the inline
assembly in this file as volatile since we don't want the
compiler to optimize away these statements or move them around
in any way.

Acked-by: Tony Lindgren <tony@atomide.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Acked-by: Nicolas Pitre <nicolas.pitre@linaro.org>
Cc: Daniel Walker <dwalker@codeaurora.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
 drivers/tty/hvc/hvc_dcc.c |   11 +++++------
 1 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/drivers/tty/hvc/hvc_dcc.c b/drivers/tty/hvc/hvc_dcc.c
index 6470f63..155ec10 100644
--- a/drivers/tty/hvc/hvc_dcc.c
+++ b/drivers/tty/hvc/hvc_dcc.c
@@ -33,8 +33,7 @@
 static inline u32 __dcc_getstatus(void)
 {
 	u32 __ret;
-
-	asm("mrc p14, 0, %0, c0, c1, 0	@ read comms ctrl reg"
+	asm volatile("mrc p14, 0, %0, c0, c1, 0	@ read comms ctrl reg"
 		: "=r" (__ret) : : "cc");
 
 	return __ret;
@@ -46,7 +45,7 @@ static inline char __dcc_getchar(void)
 {
 	char __c;
 
-	asm("get_wait:	mrc p14, 0, pc, c0, c1, 0                          \n\
+	asm volatile("get_wait:	mrc p14, 0, pc, c0, c1, 0                  \n\
 			bne get_wait                                       \n\
 			mrc p14, 0, %0, c0, c5, 0	@ read comms data reg"
 		: "=r" (__c) : : "cc");
@@ -58,7 +57,7 @@ static inline char __dcc_getchar(void)
 {
 	char __c;
 
-	asm("mrc p14, 0, %0, c0, c5, 0	@ read comms data reg"
+	asm volatile("mrc p14, 0, %0, c0, c5, 0	@ read comms data reg"
 		: "=r" (__c));
 
 	return __c;
@@ -68,7 +67,7 @@ static inline char __dcc_getchar(void)
 #if defined(CONFIG_CPU_V7)
 static inline void __dcc_putchar(char c)
 {
-	asm("put_wait:	mrc p14, 0, pc, c0, c1, 0                 \n\
+	asm volatile("put_wait:	mrc p14, 0, pc, c0, c1, 0         \n\
 			bcs put_wait                              \n\
 			mcr p14, 0, %0, c0, c5, 0                   "
 	: : "r" (c) : "cc");
@@ -76,7 +75,7 @@ static inline void __dcc_putchar(char c)
 #else
 static inline void __dcc_putchar(char c)
 {
-	asm("mcr p14, 0, %0, c0, c5, 0	@ write a char"
+	asm volatile("mcr p14, 0, %0, c0, c5, 0	@ write a char"
 		: /* no output register */
 		: "r" (c));
 }
-- 
1.7.4.1


  parent reply	other threads:[~2011-03-16 21:13 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-16 20:57 [GIT PATCH] TTY/serial driver patches for .39 Greg KH
2011-03-16 21:11 ` [PATCH 01/76] tty: serial: bfin_sport_uart: fix signedness error Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 02/76] serial: mfd: remove the timeout workaround for A0 Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 03/76] serial: ifx6x60: expanded info available from platform data Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 04/76] OMAP: Enable Magic SysRq on serial console ttyOx Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 05/76] serial: omap-serial: Enable the UART wake-up bits always Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 06/76] tty_ldisc: don't use flush_scheduled_work() Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 07/76] serial: mrst_max3110: make buffer larger Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 08/76] serial-core: reset the console speed on resume Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 09/76] 68328serial: remove unsed m68k_serial->tqueue_hangup Greg Kroah-Hartman
2011-03-16 22:41     ` Greg Ungerer
2011-03-16 21:11   ` [PATCH 10/76] serial: pch_uart: support new device ML7213 Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 11/76] serial: pch_uart: revert Kconfig for non-DMA mode Greg Kroah-Hartman
2011-03-16 21:11   ` Greg Kroah-Hartman [this message]
2011-03-16 21:11   ` [PATCH 13/76] hvc_dcc: Simplify put_chars()/get_chars() loops Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 14/76] hvc_dcc: Simplify assembly for v6 and v7 ARM Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 15/76] vt: Add virtual console keyboard mode OFF Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 16/76] hvc: add Blackfin JTAG console support Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 17/76] TTY: use appropriate printk priority level Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 18/76] tty,vcs: lseek/VC-release race fix Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 19/76] tty,vcs removing con_buf/conf_buf_mtx Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 20/76] serial: ifx6x60: fixed call to tty_port_init Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 21/76] serial: ifx6x60: dma_alloc_coherent must use parent dev Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 22/76] serial: ifx6x60: changed internal bpw from boolean to int Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 23/76] serial: ifx6x60: set SPI max_speed_hz based on platform type Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 24/76] serial: ifx6x60: probe routine needs to call spi_setup Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 25/76] serial: ifx6x60: minor cleanup Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 26/76] serial: also set the uartclk value in resume after goes to highspeed Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 27/76] serial: change the divisor latch only when prescalar actually changed Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 28/76] tty: Add msm_smd_tty driver Greg Kroah-Hartman
2011-03-16 21:11   ` [PATCH 29/76] atmel_serial: enable PPS support Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 30/76] tty,vt: fix VT_SETACTIVATE console switch Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 31/76] tty: serial: altera_uart: Handle pdev->id == -1 in altera_uart_remove Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 32/76] tty: serial: altera_uart: Use port->regshift to store bus shift Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 33/76] MAINTAINERS: Add myself as a maintainer for altera_uart/altera_jtaguart Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 34/76] tiocmget: kill off the passing of the struct file Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 35/76] tiocmset: kill the file pointer argument Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 36/76] tty: remove filp from the USB tty ioctls Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 37/76] tty: now phase out the ioctl file pointer for good Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 38/76] tty: fix build error in vt_ioctl.c if CONFIG_COMPAT is enabled Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 39/76] tty: add a helper for setting termios data from kernel side Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 40/76] hci_ath: Fix the mess in this driver Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 41/76] tty: add TIOCVHANGUP to allow clean tty shutdown of all ttys Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 42/76] tty: move Kconfig entries into drivers/tty from drivers/char Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 43/76] tty: simserial: now phase out the ioctl file pointer for good Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 44/76] serial: mfd: remove the TX full-empty interrupts workaround Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 45/76] serial: mfd: add a module parameter for setting each port's working mode Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 46/76] tty: serial: altera_jtaguart: Don't use plain integer as NULL pointer Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 47/76] tty: serial: altera_jtaguart: Remove unused function early_altera_jtaguart_setup Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 48/76] tty: serial: altera_jtaguart: Support getting mapbase and IRQ from resources Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 49/76] tty: serial: altera_jtaguart: Fixup type usage of port flags Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 50/76] tty: move a number of tty drivers from drivers/char/ to drivers/tty/ Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 51/76] tty: move ipwireless driver from drivers/char/pcmcia/ " Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 52/76] tty: move obsolete and broken tty drivers to drivers/staging/tty/ Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 53/76] tty: move obsolete and broken generic_serial drivers to drivers/staging/generic_serial/ Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 54/76] pch_uart: add multi-scatter processing Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 55/76] pch_uart: add spin_lock_init Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 56/76] pch_uart : Reduce memcpy Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 57/76] pch_uart : Use dev_xxx not pr_xxx Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 58/76] pch_uart: fix uart clock setting issue Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 59/76] pch_uart: fix auto flow control miss-setting issue Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 60/76] pch_uart: fix exclusive access issue Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 61/76] pch_uart: Fix DMA channel miss-setting issue Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 62/76] tty: forgot to remove ipwireless from drivers/char/pcmcia/Makefile Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 63/76] tty: phase out of ioctl file pointer for tty3270 as well Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 64/76] MAINTAINERS: Update HVC file patterns Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 65/76] tty/serial: Relax the device_type restriction from of_serial Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 66/76] nozomi: don't use flush_scheduled_work() Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 67/76] Staging: generic_serial: fix double locking bug Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 68/76] pcmcia: synclink_cs: fix prototype for mgslpc_ioctl() Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 69/76] Staging: tty: fix build with epca.c driver Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 70/76] tty: move cd1865.h to drivers/staging/tty/ Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 71/76] tty_audit: fix tty_audit_add_data live lock on audit disabled Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 72/76] serial: msm_serial_hs: Add MSM high speed UART driver Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 73/76] n_gsm: add a documentation Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 74/76] n_gsm: fix UIH control byte : P bit should be 0 Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 75/76] pch_phub: add new device ML7213 Greg Kroah-Hartman
2011-03-16 21:12   ` [PATCH 76/76] pch_uart: reference clock on CM-iTC Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1300309966-5745-12-git-send-email-gregkh@suse.de \
    --to=gregkh@suse.de \
    --cc=arnd@arndb.de \
    --cc=dwalker@codeaurora.org \
    --cc=linux-serial@vger.kernel.org \
    --cc=sboyd@codeaurora.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).