| From c2a3e84f950e7ddba1f3914b005861d46ae60359 Mon Sep 17 00:00:00 2001 |
| From: Stephen Boyd <sboyd@codeaurora.org> |
| Date: Tue, 25 Oct 2011 19:19:43 -0700 |
| Subject: tty: hvc_dcc: Fix duplicate character inputs |
| |
| From: Stephen Boyd <sboyd@codeaurora.org> |
| |
| commit c2a3e84f950e7ddba1f3914b005861d46ae60359 upstream. |
| |
| Reading from the DCC grabs a character from the buffer and |
| clears the status bit. Since this is a context-changing |
| operation, instructions following the character read that rely on |
| the status bit being accurate need to be synchronized with an |
| ISB. |
| |
| In this case, the status bit check needs to execute after the |
| character read otherwise we run the risk of reading the character |
| and checking the status bit before the read can clear the status |
| bit in the first place. When this happens, the user will see the |
| same character they typed twice, instead of once. |
| |
| Add an ISB after the read and the write, so that the status check |
| is synchronized with the read/write operations. |
| |
| Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/tty/hvc/hvc_dcc.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/drivers/tty/hvc/hvc_dcc.c |
| +++ b/drivers/tty/hvc/hvc_dcc.c |
| @@ -46,6 +46,7 @@ static inline char __dcc_getchar(void) |
| |
| asm volatile("mrc p14, 0, %0, c0, c5, 0 @ read comms data reg" |
| : "=r" (__c)); |
| + isb(); |
| |
| return __c; |
| } |
| @@ -55,6 +56,7 @@ static inline void __dcc_putchar(char c) |
| asm volatile("mcr p14, 0, %0, c0, c5, 0 @ write a char" |
| : /* no output register */ |
| : "r" (c)); |
| + isb(); |
| } |
| |
| static int hvc_dcc_put_chars(uint32_t vt, const char *buf, int count) |