#define ARM_DSCR_HDBGEN                (1 << 14)
 #define ARM_DSCR_MDBGEN                (1 << 15)
 
+/* OSLSR os lock model bits */
+#define ARM_OSLSR_OSLM0                (1 << 0)
+
 /* opcode2 numbers for the co-processor instructions. */
 #define ARM_OP2_BVR            4
 #define ARM_OP2_BCR            5
 
 /* Debug architecture version. */
 static u8 debug_arch;
 
+/* Does debug architecture support OS Save and Restore? */
+static bool has_ossr;
+
 /* Maximum supported watchpoint length. */
 static u8 max_watchpoint_len;
 
        .fn             = debug_reg_trap,
 };
 
+/* Does this core support OS Save and Restore? */
+static bool core_has_os_save_restore(void)
+{
+       u32 oslsr;
+
+       switch (get_debug_arch()) {
+       case ARM_DEBUG_ARCH_V7_1:
+               return true;
+       case ARM_DEBUG_ARCH_V7_ECP14:
+               ARM_DBG_READ(c1, c1, 4, oslsr);
+               if (oslsr & ARM_OSLSR_OSLM0)
+                       return true;
+       default:
+               return false;
+       }
+}
+
 static void reset_ctrl_regs(void *unused)
 {
        int i, raw_num_brps, err = 0, cpu = smp_processor_id();
                if ((val & 0x1) == 0)
                        err = -EPERM;
 
-               /*
-                * Check whether we implement OS save and restore.
-                */
-               ARM_DBG_READ(c1, c1, 4, val);
-               if ((val & 0x9) == 0)
+               if (!has_ossr)
                        goto clear_vcr;
                break;
        case ARM_DEBUG_ARCH_V7_1:
                return 0;
        }
 
+       has_ossr = core_has_os_save_restore();
+
        /* Determine how many BRPs/WRPs are available. */
        core_num_brps = get_num_brps();
        core_num_wrps = get_num_wrps();