15f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/*
25f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Copyright (C) 2004-2006 Atmel Corporation
35f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen *
45f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * This program is free software; you can redistribute it and/or modify
55f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * it under the terms of the GNU General Public License version 2 as
65f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * published by the Free Software Foundation.
75f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */
85f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#undef DEBUG
95f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <linux/kernel.h>
105f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <linux/sched.h>
115f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <linux/mm.h>
125f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <linux/ptrace.h>
135f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <linux/errno.h>
145f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <linux/user.h>
155f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <linux/security.h>
165f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <linux/unistd.h>
175f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <linux/notifier.h>
185f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
195f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <asm/traps.h>
205f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <asm/uaccess.h>
215f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <asm/ocd.h>
225f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <asm/mmu_context.h>
231eeb66a1bb973534dc3d064920a5ca683823372eChristoph Hellwig#include <linux/kdebug.h>
245f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
255f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic struct pt_regs *get_user_regs(struct task_struct *tsk)
265f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
27c9f4f06d3191bd91c1a081b54a6c8e913e7b8a83Roman Zippel	return (struct pt_regs *)((unsigned long)task_stack_page(tsk) +
285f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen				  THREAD_SIZE - sizeof(struct pt_regs));
295f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
305f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
319e584fbbd9fd4f0f10b8aafc9982df8d0b553e35Peter Huewevoid user_enable_single_step(struct task_struct *tsk)
325f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
331d8393171b1f6c30a889fd7cb16fc193f689923cChristoph Hellwig	pr_debug("user_enable_single_step: pid=%u, PC=0x%08lx, SR=0x%08lx\n",
342507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		 tsk->pid, task_pt_regs(tsk)->pc, task_pt_regs(tsk)->sr);
355f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
362507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	/*
372507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	 * We can't schedule in Debug mode, so when TIF_BREAKPOINT is
382507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	 * set, the system call or exception handler will do a
392507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	 * breakpoint to enter monitor mode before returning to
402507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	 * userspace.
412507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	 *
422507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	 * The monitor code will then notice that TIF_SINGLE_STEP is
432507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	 * set and return to userspace with single stepping enabled.
442507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	 * The CPU will then enter monitor mode again after exactly
452507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	 * one instruction has been executed, and the monitor code
462507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	 * will then send a SIGTRAP to the process.
472507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	 */
482507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	set_tsk_thread_flag(tsk, TIF_BREAKPOINT);
495f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	set_tsk_thread_flag(tsk, TIF_SINGLE_STEP);
505f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
515f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
521d8393171b1f6c30a889fd7cb16fc193f689923cChristoph Hellwigvoid user_disable_single_step(struct task_struct *child)
531d8393171b1f6c30a889fd7cb16fc193f689923cChristoph Hellwig{
541d8393171b1f6c30a889fd7cb16fc193f689923cChristoph Hellwig	/* XXX(hch): a no-op here seems wrong.. */
551d8393171b1f6c30a889fd7cb16fc193f689923cChristoph Hellwig}
561d8393171b1f6c30a889fd7cb16fc193f689923cChristoph Hellwig
575f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/*
585f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Called by kernel/ptrace.c when detaching
595f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen *
605f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Make sure any single step bits, etc. are not set
615f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */
625f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenvoid ptrace_disable(struct task_struct *child)
635f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
645f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	clear_tsk_thread_flag(child, TIF_SINGLE_STEP);
652507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	clear_tsk_thread_flag(child, TIF_BREAKPOINT);
6613b54a50525a9685065684e1e11258d27dd27bdfHaavard Skinnemoen	ocd_disable(child);
675f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
685f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
695f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/*
705f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Read the word at offset "offset" into the task's "struct user". We
715f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * actually access the pt_regs struct stored on the kernel stack.
725f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */
735f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic int ptrace_read_user(struct task_struct *tsk, unsigned long offset,
745f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen			    unsigned long __user *data)
755f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
765f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	unsigned long *regs;
775f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	unsigned long value;
785f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
795f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	if (offset & 3 || offset >= sizeof(struct user)) {
805f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		printk("ptrace_read_user: invalid offset 0x%08lx\n", offset);
815f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		return -EIO;
825f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	}
835f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
845f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	regs = (unsigned long *)get_user_regs(tsk);
855f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
865f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	value = 0;
875f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	if (offset < sizeof(struct pt_regs))
885f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		value = regs[offset / sizeof(regs[0])];
895f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
902507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	pr_debug("ptrace_read_user(%s[%u], %#lx, %p) -> %#lx\n",
912507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		 tsk->comm, tsk->pid, offset, data, value);
922507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
935f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	return put_user(value, data);
945f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
955f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
965f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/*
975f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Write the word "value" to offset "offset" into the task's "struct
985f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * user". We actually access the pt_regs struct stored on the kernel
995f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * stack.
1005f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */
1015f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic int ptrace_write_user(struct task_struct *tsk, unsigned long offset,
1025f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen			     unsigned long value)
1035f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
1045f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	unsigned long *regs;
1055f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1062507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	pr_debug("ptrace_write_user(%s[%u], %#lx, %#lx)\n",
1072507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			tsk->comm, tsk->pid, offset, value);
1082507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
1095f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	if (offset & 3 || offset >= sizeof(struct user)) {
1102507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		pr_debug("  invalid offset 0x%08lx\n", offset);
1115f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		return -EIO;
1125f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	}
1135f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1145f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	if (offset >= sizeof(struct pt_regs))
1155f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		return 0;
1165f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1175f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	regs = (unsigned long *)get_user_regs(tsk);
1185f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	regs[offset / sizeof(regs[0])] = value;
1195f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1205f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	return 0;
1215f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
1225f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1235f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic int ptrace_getregs(struct task_struct *tsk, void __user *uregs)
1245f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
1255f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	struct pt_regs *regs = get_user_regs(tsk);
1265f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1275f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	return copy_to_user(uregs, regs, sizeof(*regs)) ? -EFAULT : 0;
1285f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
1295f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1305f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenstatic int ptrace_setregs(struct task_struct *tsk, const void __user *uregs)
1315f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
1325f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	struct pt_regs newregs;
1335f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	int ret;
1345f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1355f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	ret = -EFAULT;
1365f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	if (copy_from_user(&newregs, uregs, sizeof(newregs)) == 0) {
1375f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		struct pt_regs *regs = get_user_regs(tsk);
1385f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1395f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		ret = -EINVAL;
1405f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		if (valid_user_regs(&newregs)) {
1415f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen			*regs = newregs;
1425f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen			ret = 0;
1435f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		}
1445f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	}
1455f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1465f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	return ret;
1475f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
1485f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1499b05a69e0534ec70bc94921936ffa05b330507cbNamhyung Kimlong arch_ptrace(struct task_struct *child, long request,
1509b05a69e0534ec70bc94921936ffa05b330507cbNamhyung Kim		 unsigned long addr, unsigned long data)
1515f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
1525f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	int ret;
1539f29b8fb416a0ad49d5077ab10ed780efdfcb126Namhyung Kim	void __user *datap = (void __user *) data;
1545f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1555f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	switch (request) {
1565f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	/* Read the word at location addr in the child process */
1575f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	case PTRACE_PEEKTEXT:
1585f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	case PTRACE_PEEKDATA:
1597664732315c97f48dba9d1e7339ad16fc5a320acAlexey Dobriyan		ret = generic_ptrace_peekdata(child, addr, data);
1605f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		break;
1615f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1625f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	case PTRACE_PEEKUSR:
1639f29b8fb416a0ad49d5077ab10ed780efdfcb126Namhyung Kim		ret = ptrace_read_user(child, addr, datap);
1645f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		break;
1655f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1665f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	/* Write the word in data at location addr */
1675f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	case PTRACE_POKETEXT:
1685f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	case PTRACE_POKEDATA:
169f284ce7269031947326bac6bb19a977705276222Alexey Dobriyan		ret = generic_ptrace_pokedata(child, addr, data);
1705f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		break;
1715f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1725f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	case PTRACE_POKEUSR:
1735f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		ret = ptrace_write_user(child, addr, data);
1745f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		break;
1755f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1765f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	case PTRACE_GETREGS:
1779f29b8fb416a0ad49d5077ab10ed780efdfcb126Namhyung Kim		ret = ptrace_getregs(child, datap);
1785f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		break;
1795f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1805f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	case PTRACE_SETREGS:
1819f29b8fb416a0ad49d5077ab10ed780efdfcb126Namhyung Kim		ret = ptrace_setregs(child, datap);
1825f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		break;
1835f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1845f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	default:
1855f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		ret = ptrace_request(child, request, addr, data);
1865f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		break;
1875f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	}
1885f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1895f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	return ret;
1905f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
1915f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1925f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenasmlinkage void syscall_trace(void)
1935f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen{
1945f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	if (!test_thread_flag(TIF_SYSCALL_TRACE))
1955f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		return;
1965f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	if (!(current->ptrace & PT_PTRACED))
1975f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		return;
1985f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
1995f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	/* The 0x80 provides a way for the tracing parent to
2005f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 * distinguish between a syscall stop and SIGTRAP delivery */
2015f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
2025f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen				 ? 0x80 : 0));
2035f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
2045f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	/*
2055f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 * this isn't the same as continuing with a signal, but it
2065f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 * will do for normal use.  strace only continues with a
2075f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 * signal if the stopping signal is not SIGTRAP.  -brl
2085f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 */
2095f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	if (current->exit_code) {
2105f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		pr_debug("syscall_trace: sending signal %d to PID %u\n",
2115f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen			 current->exit_code, current->pid);
2125f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		send_sig(current->exit_code, current, 1);
2135f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen		current->exit_code = 0;
2145f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	}
2155f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
2165f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
2175f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/*
2182507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen * debug_trampoline() is an assembly stub which will store all user
2192507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen * registers on the stack and execute a breakpoint instruction.
2202507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen *
2212507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen * If we single-step into an exception handler which runs with
2222507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen * interrupts disabled the whole time so it doesn't have to check for
2232507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen * pending work, its return address will be modified so that it ends
2242507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen * up returning to debug_trampoline.
2252507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen *
2262507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen * If the exception handler decides to store the user context and
2272507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen * enable interrupts after all, it will restore the original return
2282507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen * address and status register value. Before it returns, it will
2292507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen * notice that TIF_BREAKPOINT is set and execute a breakpoint
2302507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen * instruction.
2315f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */
2322507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoenextern void debug_trampoline(void);
2335f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
2342507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoenasmlinkage struct pt_regs *do_debug(struct pt_regs *regs)
2352507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen{
2362507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	struct thread_info	*ti;
2372507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	unsigned long		trampoline_addr;
2382507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	u32			status;
2392507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	u32			ctrl;
2402507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	int			code;
2412507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
2422507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	status = ocd_read(DS);
2432507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	ti = current_thread_info();
2442507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	code = TRAP_BRKPT;
2452507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
2462507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	pr_debug("do_debug: status=0x%08x PC=0x%08lx SR=0x%08lx tif=0x%08lx\n",
2472507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			status, regs->pc, regs->sr, ti->flags);
2482507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
2492507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	if (!user_mode(regs)) {
2502507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		unsigned long	die_val = DIE_BREAKPOINT;
2512507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
2522507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		if (status & (1 << OCD_DS_SSS_BIT))
2532507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			die_val = DIE_SSTEP;
2542507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
2552507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		if (notify_die(die_val, "ptrace", regs, 0, 0, SIGTRAP)
2562507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				== NOTIFY_STOP)
2572507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			return regs;
2582507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
2592507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		if ((status & (1 << OCD_DS_SWB_BIT))
2602507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				&& test_and_clear_ti_thread_flag(
2612507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen					ti, TIF_BREAKPOINT)) {
2622507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			/*
2632507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * Explicit breakpoint from trampoline or
2642507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * exception/syscall/interrupt handler.
2652507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 *
2662507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * The real saved regs are on the stack right
2672507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * after the ones we saved on entry.
2682507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 */
2692507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			regs++;
2702507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			pr_debug("  -> TIF_BREAKPOINT done, adjusted regs:"
2712507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen					"PC=0x%08lx SR=0x%08lx\n",
2722507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen					regs->pc, regs->sr);
2732507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			BUG_ON(!user_mode(regs));
2742507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
2752507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			if (test_thread_flag(TIF_SINGLE_STEP)) {
2762507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				pr_debug("Going to do single step...\n");
2772507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				return regs;
2782507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			}
2792507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
2802507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			/*
2812507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * No TIF_SINGLE_STEP means we're done
2822507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * stepping over a syscall. Do the trap now.
2832507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 */
2842507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			code = TRAP_TRACE;
2852507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		} else if ((status & (1 << OCD_DS_SSS_BIT))
2862507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				&& test_ti_thread_flag(ti, TIF_SINGLE_STEP)) {
2872507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
2882507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			pr_debug("Stepped into something, "
2892507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen					"setting TIF_BREAKPOINT...\n");
2902507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			set_ti_thread_flag(ti, TIF_BREAKPOINT);
2912507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
2922507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			/*
2932507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * We stepped into an exception, interrupt or
2942507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * syscall handler. Some exception handlers
2952507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * don't check for pending work, so we need to
2962507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * set up a trampoline just in case.
2972507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 *
2982507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * The exception entry code will undo the
2992507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * trampoline stuff if it does a full context
3002507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * save (which also means that it'll check for
3012507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * pending work later.)
3022507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 */
3032507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			if ((regs->sr & MODE_MASK) == MODE_EXCEPTION) {
3042507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				trampoline_addr
3052507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen					= (unsigned long)&debug_trampoline;
3062507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
3072507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				pr_debug("Setting up trampoline...\n");
3082507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				ti->rar_saved = sysreg_read(RAR_EX);
3092507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				ti->rsr_saved = sysreg_read(RSR_EX);
3102507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				sysreg_write(RAR_EX, trampoline_addr);
3112507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				sysreg_write(RSR_EX, (MODE_EXCEPTION
3122507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen							| SR_EM | SR_GM));
3132507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				BUG_ON(ti->rsr_saved & MODE_MASK);
3142507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			}
3152507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
3162507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			/*
3172507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * If we stepped into a system call, we
3182507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * shouldn't do a single step after we return
3192507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * since the return address is right after the
3202507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * "scall" instruction we were told to step
3212507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 * over.
3222507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			 */
3232507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			if ((regs->sr & MODE_MASK) == MODE_SUPERVISOR) {
3242507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				pr_debug("Supervisor; no single step\n");
3252507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen				clear_ti_thread_flag(ti, TIF_SINGLE_STEP);
3262507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			}
3272507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
3282507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			ctrl = ocd_read(DC);
3292507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			ctrl &= ~(1 << OCD_DC_SS_BIT);
3302507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			ocd_write(DC, ctrl);
3312507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
3322507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			return regs;
3332507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		} else {
3342507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			printk(KERN_ERR "Unexpected OCD_DS value: 0x%08x\n",
3352507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen					status);
3362507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			printk(KERN_ERR "Thread flags: 0x%08lx\n", ti->flags);
3372507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			die("Unhandled debug trap in kernel mode",
3382507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen					regs, SIGTRAP);
3392507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		}
3402507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	} else if (status & (1 << OCD_DS_SSS_BIT)) {
3412507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		/* Single step in user mode */
3422507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		code = TRAP_TRACE;
3435f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
3442507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		ctrl = ocd_read(DC);
3452507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		ctrl &= ~(1 << OCD_DC_SS_BIT);
3462507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen		ocd_write(DC, ctrl);
3475f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	}
3485f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
3492507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	pr_debug("Sending SIGTRAP: code=%d PC=0x%08lx SR=0x%08lx\n",
3502507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen			code, regs->pc, regs->sr);
3515f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
3522507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	clear_thread_flag(TIF_SINGLE_STEP);
3532507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	_exception(SIGTRAP, regs, code, instruction_pointer(regs));
3542507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen
3552507bc1338e43eadfef5b604d2c47e4f8180718fHaavard Skinnemoen	return regs;
3565f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen}
357