relevant cache maintenance functions and sets a specific bit
          in the diagnostic control register of the SCU.
 
+config ARM_ERRATA_764319
+       bool "ARM errata: Read to DBGPRSR and DBGOSLSR may generate Undefined instruction"
+       depends on CPU_V7
+       help
+         This option enables the workaround for the 764319 Cortex A-9 erratum.
+         CP14 read accesses to the DBGPRSR and DBGOSLSR registers generate an
+         unexpected Undefined Instruction exception when the DBGSWENABLE
+         external pin is set to 0, even when the CP14 accesses are performed
+         from a privileged mode. This work around catches the exception in a
+         way the kernel does not stop execution.
+
 config ARM_ERRATA_775420
        bool "ARM errata: A data cache maintenance operation which aborts, might lead to deadlock"
        depends on CPU_V7
 
        return ret;
 }
 
+#ifdef CONFIG_ARM_ERRATA_764319
+static int oslsr_fault;
+
+static int debug_oslsr_trap(struct pt_regs *regs, unsigned int instr)
+{
+       oslsr_fault = 1;
+       instruction_pointer(regs) += 4;
+       return 0;
+}
+
+static struct undef_hook debug_oslsr_hook = {
+       .instr_mask  = 0xffffffff,
+       .instr_val = 0xee115e91,
+       .fn = debug_oslsr_trap,
+};
+#endif
+
 /*
  * One-time initialisation.
  */
        case ARM_DEBUG_ARCH_V7_1:
                return true;
        case ARM_DEBUG_ARCH_V7_ECP14:
+#ifdef CONFIG_ARM_ERRATA_764319
+               oslsr_fault = 0;
+               register_undef_hook(&debug_oslsr_hook);
                ARM_DBG_READ(c1, c1, 4, oslsr);
+               unregister_undef_hook(&debug_oslsr_hook);
+               if (oslsr_fault)
+                       return false;
+#else
+               ARM_DBG_READ(c1, c1, 4, oslsr);
+#endif
                if (oslsr & ARM_OSLSR_OSLM0)
                        return true;
                fallthrough;