예제 #1
0
파일: ptrace.c 프로젝트: ysei/linux-2.6.x
/*
 * Get all user integer registers.
 */
static inline int ptrace_getregs(struct task_struct *tsk, void __user *uregs)
{
	struct pt_regs regs;
	memcpy(&regs, get_user_regs(tsk), sizeof(regs));
	regs.usp = tsk->thread.usp;
	return copy_to_user(uregs, &regs, sizeof(struct pt_regs)) ? -EFAULT : 0;
}
예제 #2
0
static int ptrace_setregs(struct task_struct *tsk, const void __user *uregs)
{
    struct pt_regs newregs;
    int ret;

    ret = -EFAULT;
    if (copy_from_user(&newregs, uregs, sizeof(newregs)) == 0) {
        struct pt_regs *regs = get_user_regs(tsk);

        ret = -EINVAL;
        if (valid_user_regs(&newregs)) {
            *regs = newregs;
            ret = 0;
        }
    }

    return ret;
}
예제 #3
0
/*
 * Write the word "value" to offset "offset" into the task's "struct
 * user". We actually access the pt_regs struct stored on the kernel
 * stack.
 */
static int ptrace_write_user(struct task_struct *tsk, unsigned long offset,
			     unsigned long value)
{
	unsigned long *regs;

	if (offset & 3 || offset >= sizeof(struct user)) {
		printk("ptrace_write_user: invalid offset 0x%08lx\n", offset);
		return -EIO;
	}

	if (offset >= sizeof(struct pt_regs))
		return 0;

	regs = (unsigned long *)get_user_regs(tsk);
	regs[offset / sizeof(regs[0])] = value;

	return 0;
}
예제 #4
0
/*
 * Write the word "value" to offset "offset" into the task's "struct
 * user". We actually access the pt_regs struct stored on the kernel
 * stack.
 */
static int ptrace_write_user(struct task_struct *tsk, unsigned long offset,
                             unsigned long value)
{
    unsigned long *regs;

    pr_debug("ptrace_write_user(%s[%u], %#lx, %#lx)\n",
             tsk->comm, tsk->pid, offset, value);

    if (offset & 3 || offset >= sizeof(struct user)) {
        pr_debug("  invalid offset 0x%08lx\n", offset);
        return -EIO;
    }

    if (offset >= sizeof(struct pt_regs))
        return 0;

    regs = (unsigned long *)get_user_regs(tsk);
    regs[offset / sizeof(regs[0])] = value;

    return 0;
}
예제 #5
0
/*
 * Read the word at offset "offset" into the task's "struct user". We
 * actually access the pt_regs struct stored on the kernel stack.
 */
static int ptrace_read_user(struct task_struct *tsk, unsigned long offset,
                            unsigned long __user *data)
{
    unsigned long *regs;
    unsigned long value;

    if (offset & 3 || offset >= sizeof(struct user)) {
        printk("ptrace_read_user: invalid offset 0x%08lx\n", offset);
        return -EIO;
    }

    regs = (unsigned long *)get_user_regs(tsk);

    value = 0;
    if (offset < sizeof(struct pt_regs))
        value = regs[offset / sizeof(regs[0])];

    pr_debug("ptrace_read_user(%s[%u], %#lx, %p) -> %#lx\n",
             tsk->comm, tsk->pid, offset, data, value);

    return put_user(value, data);
}
예제 #6
0
static int ptrace_getregs(struct task_struct *tsk, void __user *uregs)
{
    struct pt_regs *regs = get_user_regs(tsk);

    return copy_to_user(uregs, regs, sizeof(*regs)) ? -EFAULT : 0;
}