patch-2.4.7 linux/arch/ppc/kernel/ptrace.c
Next file: linux/arch/s390/kernel/entry.S
Previous file: linux/arch/ppc/kernel/prom.c
Back to the patch index
Back to the overall index
- Lines: 102
- Date:
Fri Jul 20 12:39:55 2001
- Orig file:
v2.4.6/linux/arch/ppc/kernel/ptrace.c
- Orig date:
Mon May 21 17:04:47 2001
diff -u --recursive --new-file v2.4.6/linux/arch/ppc/kernel/ptrace.c linux/arch/ppc/kernel/ptrace.c
@@ -1,5 +1,5 @@
/*
- * BK Id: SCCS/s.ptrace.c 1.5 05/17/01 18:14:22 cort
+ * BK Id: SCCS/s.ptrace.c 1.8 07/07/01 17:00:08 paulus
*/
/*
* linux/arch/ppc/kernel/ptrace.c
@@ -49,7 +49,8 @@
*/
static inline unsigned long get_reg(struct task_struct *task, int regno)
{
- if (regno < sizeof(struct pt_regs) / sizeof(unsigned long))
+ if (regno < sizeof(struct pt_regs) / sizeof(unsigned long)
+ && task->thread.regs != NULL)
return ((unsigned long *)task->thread.regs)[regno];
return (0);
}
@@ -60,7 +61,7 @@
static inline int put_reg(struct task_struct *task, int regno,
unsigned long data)
{
- if (regno <= PT_MQ) {
+ if (regno <= PT_MQ && task->thread.regs != NULL) {
if (regno == PT_MSR)
data = (data & MSR_DEBUGCHANGE)
| (task->thread.regs->msr & ~MSR_DEBUGCHANGE);
@@ -74,14 +75,18 @@
set_single_step(struct task_struct *task)
{
struct pt_regs *regs = task->thread.regs;
- regs->msr |= MSR_SE;
+
+ if (regs != NULL)
+ regs->msr |= MSR_SE;
}
static inline void
clear_single_step(struct task_struct *task)
{
struct pt_regs *regs = task->thread.regs;
- regs->msr &= ~MSR_SE;
+
+ if (regs != NULL)
+ regs->msr &= ~MSR_SE;
}
int sys_ptrace(long request, long pid, long addr, long data)
@@ -113,33 +118,7 @@
goto out_tsk;
if (request == PTRACE_ATTACH) {
- if (child == current)
- goto out_tsk;
- if ((!child->dumpable ||
- (current->uid != child->euid) ||
- (current->uid != child->suid) ||
- (current->uid != child->uid) ||
- (current->gid != child->egid) ||
- (current->gid != child->sgid) ||
- (!cap_issubset(child->cap_permitted, current->cap_permitted)) ||
- (current->gid != child->gid))
- && !capable(CAP_SYS_PTRACE))
- goto out_tsk;
- /* the same process cannot be attached many times */
- if (child->ptrace & PT_PTRACED)
- goto out_tsk;
- child->ptrace |= PT_PTRACED;
-
- write_lock_irq(&tasklist_lock);
- if (child->p_pptr != current) {
- REMOVE_LINKS(child);
- child->p_pptr = current;
- SET_LINKS(child);
- }
- write_unlock_irq(&tasklist_lock);
-
- send_sig(SIGSTOP, child, 1);
- ret = 0;
+ ret = ptrace_attach(child);
goto out_tsk;
}
ret = -ESRCH;
@@ -181,7 +160,8 @@
if (index < PT_FPR0) {
tmp = get_reg(child, (int) index);
} else {
- if (child->thread.regs->msr & MSR_FP)
+ if (child->thread.regs != NULL
+ && child->thread.regs->msr & MSR_FP)
giveup_fpu(child);
tmp = ((unsigned long *)child->thread.fpr)[index - PT_FPR0];
}
@@ -214,7 +194,8 @@
if (index < PT_FPR0) {
ret = put_reg(child, index, data);
} else {
- if (child->thread.regs->msr & MSR_FP)
+ if (child->thread.regs != NULL
+ && child->thread.regs->msr & MSR_FP)
giveup_fpu(child);
((unsigned long *)child->thread.fpr)[index - PT_FPR0] = data;
ret = 0;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)