Merge branch 'topic/ppc-kvm' into next
Merge the DAWR series, which touches arch code and KVM code and may need to be merged into the kvm-ppc tree.
This commit is contained in:
@@ -713,6 +713,9 @@ static __init void cpufeatures_cpu_quirks(void)
|
||||
else if ((version & 0xffffefff) == 0x004e0202)
|
||||
cur_cpu_spec->cpu_features |= CPU_FTR_P9_TM_HV_ASSIST |
|
||||
CPU_FTR_P9_TM_XER_SO_BUG;
|
||||
|
||||
if ((version & 0xffff0000) == 0x004e0000)
|
||||
cur_cpu_spec->cpu_features &= ~(CPU_FTR_DAWR);
|
||||
}
|
||||
|
||||
static void __init cpufeatures_setup_finished(void)
|
||||
|
@@ -33,6 +33,7 @@
|
||||
#include <asm/hw_breakpoint.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/sstep.h>
|
||||
#include <asm/debug.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
/*
|
||||
@@ -171,6 +172,8 @@ int arch_validate_hwbkpt_settings(struct perf_event *bp)
|
||||
* HW_BREAKPOINT_ALIGN by rounding off to the lower address, the
|
||||
* 'symbolsize' should satisfy the check below.
|
||||
*/
|
||||
if (!ppc_breakpoint_available())
|
||||
return -ENODEV;
|
||||
length_max = 8; /* DABR */
|
||||
if (cpu_has_feature(CPU_FTR_DAWR)) {
|
||||
length_max = 512 ; /* 64 doublewords */
|
||||
|
@@ -827,6 +827,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
|
||||
|
@@ -41,6 +41,7 @@
|
||||
#include <asm/switch_to.h>
|
||||
#include <asm/tm.h>
|
||||
#include <asm/asm-prototypes.h>
|
||||
#include <asm/debug.h>
|
||||
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/syscalls.h>
|
||||
@@ -2378,6 +2379,7 @@ static int ptrace_set_debugreg(struct task_struct *task, unsigned long addr,
|
||||
struct perf_event_attr attr;
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
#ifndef CONFIG_PPC_ADV_DEBUG_REGS
|
||||
bool set_bp = true;
|
||||
struct arch_hw_breakpoint hw_brk;
|
||||
#endif
|
||||
|
||||
@@ -2411,9 +2413,10 @@ static int ptrace_set_debugreg(struct task_struct *task, unsigned long addr,
|
||||
hw_brk.address = data & (~HW_BRK_TYPE_DABR);
|
||||
hw_brk.type = (data & HW_BRK_TYPE_DABR) | HW_BRK_TYPE_PRIV_ALL;
|
||||
hw_brk.len = 8;
|
||||
set_bp = (data) && (hw_brk.type & HW_BRK_TYPE_RDWR);
|
||||
#ifdef CONFIG_HAVE_HW_BREAKPOINT
|
||||
bp = thread->ptrace_bps[0];
|
||||
if ((!data) || !(hw_brk.type & HW_BRK_TYPE_RDWR)) {
|
||||
if (!set_bp) {
|
||||
if (bp) {
|
||||
unregister_hw_breakpoint(bp);
|
||||
thread->ptrace_bps[0] = NULL;
|
||||
@@ -2450,6 +2453,9 @@ static int ptrace_set_debugreg(struct task_struct *task, unsigned long addr,
|
||||
return PTR_ERR(bp);
|
||||
}
|
||||
|
||||
#else /* !CONFIG_HAVE_HW_BREAKPOINT */
|
||||
if (set_bp && (!ppc_breakpoint_available()))
|
||||
return -ENODEV;
|
||||
#endif /* CONFIG_HAVE_HW_BREAKPOINT */
|
||||
task->thread.hw_brk = hw_brk;
|
||||
#else /* CONFIG_PPC_ADV_DEBUG_REGS */
|
||||
@@ -2904,6 +2910,9 @@ static long ppc_set_hwdebug(struct task_struct *child,
|
||||
if (child->thread.hw_brk.address)
|
||||
return -ENOSPC;
|
||||
|
||||
if (!ppc_breakpoint_available())
|
||||
return -ENODEV;
|
||||
|
||||
child->thread.hw_brk = brk;
|
||||
|
||||
return 1;
|
||||
@@ -3052,7 +3061,10 @@ long arch_ptrace(struct task_struct *child, long request,
|
||||
#endif
|
||||
#else /* !CONFIG_PPC_ADV_DEBUG_REGS */
|
||||
dbginfo.num_instruction_bps = 0;
|
||||
dbginfo.num_data_bps = 1;
|
||||
if (ppc_breakpoint_available())
|
||||
dbginfo.num_data_bps = 1;
|
||||
else
|
||||
dbginfo.num_data_bps = 0;
|
||||
dbginfo.num_condition_regs = 0;
|
||||
#ifdef CONFIG_PPC64
|
||||
dbginfo.data_bp_alignment = 8;
|
||||
|
Reference in New Issue
Block a user