| From f976decfb4eafe4a1d011a14739eee4b069e317c Mon Sep 17 00:00:00 2001 |
| From: Will Deacon <will.deacon@arm.com> |
| Date: Fri, 19 Nov 2010 13:18:31 +0100 |
| Subject: [PATCH] ARM: 6489/1: thumb2: fix incorrect optimisation in usracc |
| |
| commit 1142b71d85894dcff1466dd6c871ea3c89e0352c upstream. |
| |
| Commit 8b592783 added a Thumb-2 variant of usracc which, when it is |
| called with \rept=2, calls usraccoff once with an offset of 0 and |
| secondly with a hard-coded offset of 4 in order to avoid incrementing |
| the pointer again. If \inc != 4 then we will store the data to the wrong |
| offset from \ptr. Luckily, the only caller that passes \rept=2 to this |
| function is __clear_user so we haven't been actively corrupting user data. |
| |
| This patch fixes usracc to pass \inc instead of #4 to usraccoff |
| when it is called a second time. |
| |
| Reported-by: Tony Thompson <tony.thompson@arm.com> |
| Acked-by: Catalin Marinas <catalin.marinas@arm.com> |
| Signed-off-by: Will Deacon <will.deacon@arm.com> |
| Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h |
| index 6e8f05c..d757555 100644 |
| --- a/arch/arm/include/asm/assembler.h |
| +++ b/arch/arm/include/asm/assembler.h |
| @@ -215,7 +215,7 @@ |
| @ Slightly optimised to avoid incrementing the pointer twice |
| usraccoff \instr, \reg, \ptr, \inc, 0, \cond, \abort |
| .if \rept == 2 |
| - usraccoff \instr, \reg, \ptr, \inc, 4, \cond, \abort |
| + usraccoff \instr, \reg, \ptr, \inc, \inc, \cond, \abort |
| .endif |
| |
| add\cond \ptr, #\rept * \inc |
| -- |
| 1.7.4.4 |
| |