From 8ddb7dccb207eb36041ef59e3fbad790a912110a Mon Sep 17 00:00:00 2001 From: Alexey Kardashevskiy Date: Thu, 10 Jan 2013 20:29:09 +0000 Subject: [PATCH] --- yaml --- r: 356390 b: refs/heads/master c: 1715a826a5b72d4fb882504d0babcea9aec8a0db h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/arch/powerpc/include/uapi/asm/ptrace.h | 1 + trunk/arch/powerpc/kernel/ptrace.c | 29 ++++++++++++++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index b9bf1a86ac4b..32b4f430b9f0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 61383407677aef05928541a00678591abea2d84c +refs/heads/master: 1715a826a5b72d4fb882504d0babcea9aec8a0db diff --git a/trunk/arch/powerpc/include/uapi/asm/ptrace.h b/trunk/arch/powerpc/include/uapi/asm/ptrace.h index ee67a2bc91bb..5a4863c76b5f 100644 --- a/trunk/arch/powerpc/include/uapi/asm/ptrace.h +++ b/trunk/arch/powerpc/include/uapi/asm/ptrace.h @@ -108,6 +108,7 @@ struct pt_regs { #define PT_DAR 41 #define PT_DSISR 42 #define PT_RESULT 43 +#define PT_DSCR 44 #define PT_REGS_COUNT 44 #define PT_FPR0 48 /* each FP reg occupies 2 slots in this space */ diff --git a/trunk/arch/powerpc/kernel/ptrace.c b/trunk/arch/powerpc/kernel/ptrace.c index d4afcccf1238..245c1b6a0858 100644 --- a/trunk/arch/powerpc/kernel/ptrace.c +++ b/trunk/arch/powerpc/kernel/ptrace.c @@ -179,6 +179,30 @@ static int set_user_msr(struct task_struct *task, unsigned long msr) return 0; } +#ifdef CONFIG_PPC64 +static unsigned long get_user_dscr(struct task_struct *task) +{ + return task->thread.dscr; +} + +static int set_user_dscr(struct task_struct *task, unsigned long dscr) +{ + task->thread.dscr = dscr; + task->thread.dscr_inherit = 1; + return 0; +} +#else +static unsigned long get_user_dscr(struct task_struct *task) +{ + return -EIO; +} + +static int set_user_dscr(struct task_struct *task, unsigned long dscr) +{ + return -EIO; +} +#endif + /* * We prevent mucking around with the reserved area of trap * which are used internally by the kernel. @@ -200,6 +224,9 @@ unsigned long ptrace_get_reg(struct task_struct *task, int regno) if (regno == PT_MSR) return get_user_msr(task); + if (regno == PT_DSCR) + return get_user_dscr(task); + if (regno < (sizeof(struct pt_regs) / sizeof(unsigned long))) return ((unsigned long *)task->thread.regs)[regno]; @@ -218,6 +245,8 @@ int ptrace_put_reg(struct task_struct *task, int regno, unsigned long data) return set_user_msr(task, data); if (regno == PT_TRAP) return set_user_trap(task, data); + if (regno == PT_DSCR) + return set_user_dscr(task, data); if (regno <= PT_MAX_PUT_REG) { ((unsigned long *)task->thread.regs)[regno] = data;