]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - arch/powerpc/kernel/process.c
Merge tag 'powerpc-4.17-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
[linux.git] / arch / powerpc / kernel / process.c
index 1738c4127b3207506e434dea167f755eea66ff7f..1237f13fed51862cbb5d7d2117c686cc06b2852b 100644 (file)
@@ -173,7 +173,7 @@ void __msr_check_and_clear(unsigned long bits)
 EXPORT_SYMBOL(__msr_check_and_clear);
 
 #ifdef CONFIG_PPC_FPU
-void __giveup_fpu(struct task_struct *tsk)
+static void __giveup_fpu(struct task_struct *tsk)
 {
        unsigned long msr;
 
@@ -556,7 +556,7 @@ void restore_math(struct pt_regs *regs)
        regs->msr = msr;
 }
 
-void save_all(struct task_struct *tsk)
+static void save_all(struct task_struct *tsk)
 {
        unsigned long usermsr;
 
@@ -718,7 +718,8 @@ static void set_debug_reg_defaults(struct thread_struct *thread)
 {
        thread->hw_brk.address = 0;
        thread->hw_brk.type = 0;
-       set_breakpoint(&thread->hw_brk);
+       if (ppc_breakpoint_available())
+               set_breakpoint(&thread->hw_brk);
 }
 #endif /* !CONFIG_HAVE_HW_BREAKPOINT */
 #endif /* CONFIG_PPC_ADV_DEBUG_REGS */
@@ -815,9 +816,14 @@ void __set_breakpoint(struct arch_hw_breakpoint *brk)
        memcpy(this_cpu_ptr(&current_brk), brk, sizeof(*brk));
 
        if (cpu_has_feature(CPU_FTR_DAWR))
+               // Power8 or later
                set_dawr(brk);
-       else
+       else if (!cpu_has_feature(CPU_FTR_ARCH_207S))
+               // Power7 or earlier
                set_dabr(brk);
+       else
+               // Shouldn't happen due to higher level checks
+               WARN_ON_ONCE(1);
 }
 
 void set_breakpoint(struct arch_hw_breakpoint *brk)
@@ -827,6 +833,18 @@ void set_breakpoint(struct arch_hw_breakpoint *brk)
        preempt_enable();
 }
 
+/* Check if we have DAWR or DABR hardware */
+bool ppc_breakpoint_available(void)
+{
+       if (cpu_has_feature(CPU_FTR_DAWR))
+               return true; /* POWER8 DAWR */
+       if (cpu_has_feature(CPU_FTR_ARCH_207S))
+               return false; /* POWER9 with DAWR disabled */
+       /* DABR: Everything but POWER8 and POWER9 */
+       return true;
+}
+EXPORT_SYMBOL_GPL(ppc_breakpoint_available);
+
 #ifdef CONFIG_PPC64
 DEFINE_PER_CPU(struct cpu_usage, cpu_usage_array);
 #endif