Skip to content

Commit

Permalink
Blackfin: simplify SYSCFG code a bit and ignore attempts to change it
Browse files Browse the repository at this point in the history
We don't want to let user space modify the SYSCFG register arbitrarily as
the settings are system wide (SNEN/CNEN) and can cause misbehavior.  The
only other bit here (SSSTEP) has proper controls via PTRACE_SINGLESTEP.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
  • Loading branch information
Mike Frysinger committed Mar 9, 2010
1 parent f5b9962 commit 5f09c77
Showing 1 changed file with 6 additions and 18 deletions.
24 changes: 6 additions & 18 deletions arch/blackfin/kernel/ptrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,6 @@
* in exit.c or in signal.c.
*/

/* determines which bits in the SYSCFG reg the user has access to. */
/* 1 = access 0 = no access */
#define SYSCFG_MASK 0x0007 /* SYSCFG reg */
/* sets the trace bits. */
#define TRACE_BITS 0x0001

/* Find the stack offset for a register, relative to thread.esp0. */
#define PT_REG(reg) ((long)&((struct pt_regs *)0)->reg)

Expand Down Expand Up @@ -162,9 +156,8 @@ static inline int is_user_addr_valid(struct task_struct *child,

void ptrace_enable(struct task_struct *child)
{
unsigned long tmp;
tmp = get_reg(child, PT_SYSCFG) | (TRACE_BITS);
put_reg(child, PT_SYSCFG, tmp);
struct pt_regs *regs = task_pt_regs(child);
regs->syscfg |= SYSCFG_SSSTEP;
}

/*
Expand All @@ -174,10 +167,8 @@ void ptrace_enable(struct task_struct *child)
*/
void ptrace_disable(struct task_struct *child)
{
unsigned long tmp;
/* make sure the single step bit is not set. */
tmp = get_reg(child, PT_SYSCFG) & ~TRACE_BITS;
put_reg(child, PT_SYSCFG, tmp);
struct pt_regs *regs = task_pt_regs(child);
regs->syscfg &= ~SYSCFG_SSSTEP;
}

long arch_ptrace(struct task_struct *child, long request, long addr, long data)
Expand Down Expand Up @@ -343,14 +334,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
break;
}

if (addr >= (sizeof(struct pt_regs))) {
/* Ignore writes to SYSCFG and other pseudo regs */
if (addr >= PT_SYSCFG) {
ret = 0;
break;
}
if (addr == PT_SYSCFG) {
data &= SYSCFG_MASK;
data |= get_reg(child, PT_SYSCFG);
}
ret = put_reg(child, addr, data);
break;

Expand Down

0 comments on commit 5f09c77

Please sign in to comment.