aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm
diff options
context:
space:
mode:
authorWill Deacon <will.deacon@arm.com>2011-02-11 09:55:12 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2011-02-11 17:54:47 -0500
commited19b739c5c76ad241d30f6c6a5ee96fb284f4cf (patch)
tree5e36a488dbf997875b732faff8fabfdbe1fac070 /arch/arm
parent34cd2d38db423a991a36d14e9f79e98993addd07 (diff)
ARM: 6656/1: hw_breakpoint: avoid UNPREDICTABLE behaviour when reading DBGDSCR
Reading baseline CP14 registers, other than DBGDIDR, when the OS Lock is set leads to UNPREDICTABLE behaviour. This patch ensures that we clear the OS lock before accessing anything other than the DBGDIDR, thereby avoiding this behaviour. Signed-off-by: Will Deacon <will.deacon@arm.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/kernel/hw_breakpoint.c26
1 files changed, 13 insertions, 13 deletions
diff --git a/arch/arm/kernel/hw_breakpoint.c b/arch/arm/kernel/hw_breakpoint.c
index c9f3f0467570..ab02d8aadb77 100644
--- a/arch/arm/kernel/hw_breakpoint.c
+++ b/arch/arm/kernel/hw_breakpoint.c
@@ -834,11 +834,11 @@ static void reset_ctrl_regs(void *unused)
834 834
835 /* 835 /*
836 * v7 debug contains save and restore registers so that debug state 836 * v7 debug contains save and restore registers so that debug state
837 * can be maintained across low-power modes without leaving 837 * can be maintained across low-power modes without leaving the debug
838 * the debug logic powered up. It is IMPLEMENTATION DEFINED whether 838 * logic powered up. It is IMPLEMENTATION DEFINED whether we can access
839 * we can write to the debug registers out of reset, so we must 839 * the debug registers out of reset, so we must unlock the OS Lock
840 * unlock the OS Lock Access Register to avoid taking undefined 840 * Access Register to avoid taking undefined instruction exceptions
841 * instruction exceptions later on. 841 * later on.
842 */ 842 */
843 if (debug_arch >= ARM_DEBUG_ARCH_V7_ECP14) { 843 if (debug_arch >= ARM_DEBUG_ARCH_V7_ECP14) {
844 /* 844 /*
@@ -899,18 +899,18 @@ static int __init arch_hw_breakpoint_init(void)
899 pr_info("%d breakpoint(s) reserved for watchpoint " 899 pr_info("%d breakpoint(s) reserved for watchpoint "
900 "single-step.\n", core_num_reserved_brps); 900 "single-step.\n", core_num_reserved_brps);
901 901
902 /*
903 * Reset the breakpoint resources. We assume that a halting
904 * debugger will leave the world in a nice state for us.
905 */
906 on_each_cpu(reset_ctrl_regs, NULL, 1);
907
902 ARM_DBG_READ(c1, 0, dscr); 908 ARM_DBG_READ(c1, 0, dscr);
903 if (dscr & ARM_DSCR_HDBGEN) { 909 if (dscr & ARM_DSCR_HDBGEN) {
910 max_watchpoint_len = 4;
904 pr_warning("halting debug mode enabled. Assuming maximum " 911 pr_warning("halting debug mode enabled. Assuming maximum "
905 "watchpoint size of 4 bytes."); 912 "watchpoint size of %u bytes.", max_watchpoint_len);
906 } else { 913 } else {
907 /*
908 * Reset the breakpoint resources. We assume that a halting
909 * debugger will leave the world in a nice state for us.
910 */
911 smp_call_function(reset_ctrl_regs, NULL, 1);
912 reset_ctrl_regs(NULL);
913
914 /* Work out the maximum supported watchpoint length. */ 914 /* Work out the maximum supported watchpoint length. */
915 max_watchpoint_len = get_max_wp_len(); 915 max_watchpoint_len = get_max_wp_len();
916 pr_info("maximum watchpoint size is %u bytes.\n", 916 pr_info("maximum watchpoint size is %u bytes.\n",