arch/sparc/kernel/ptrace_32.c

Source file repositories/reference/linux-study-clean/arch/sparc/kernel/ptrace_32.c

File Facts

System
Linux kernel
Corpus path
arch/sparc/kernel/ptrace_32.c
Extension
.c
Size
10491 bytes
Lines
449
Domain
Architecture Layer
Bucket
arch/sparc
Inferred role
Architecture Layer: implementation source
Status
source implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

struct fps {
	unsigned long regs[32];
	unsigned long fsr;
	unsigned long flags;
	unsigned long extra;
	unsigned long fpqd;
	struct fq {
		unsigned long *insnaddr;
		unsigned long insn;
	} fpq[16];
};

long arch_ptrace(struct task_struct *child, long request,
		 unsigned long addr, unsigned long data)
{
	unsigned long addr2 = current->thread.kregs->u_regs[UREG_I4];
	void __user *addr2p;
	struct pt_regs __user *pregs;
	struct fps __user *fps;
	int ret;

	addr2p = (void __user *) addr2;
	pregs = (struct pt_regs __user *) addr;
	fps = (struct fps __user *) addr;

	switch(request) {
	case PTRACE_GETREGS: {
		ret = copy_regset_to_user(child, &ptrace32_view,
					  REGSET_GENERAL, 0,
					  19 * sizeof(u32),
					  pregs);
		break;
	}

	case PTRACE_SETREGS: {
		ret = copy_regset_from_user(child, &ptrace32_view,
					    REGSET_GENERAL, 0,
					    19 * sizeof(u32),
					    pregs);
		break;
	}

	case PTRACE_GETFPREGS: {
		ret = copy_regset_to_user(child, &ptrace32_view,
					  REGSET_FP, 0,
					  68 * sizeof(u32),
					  fps);
		break;
	}

	case PTRACE_SETFPREGS: {
		ret = copy_regset_from_user(child, &ptrace32_view,
					  REGSET_FP, 0,
					  33 * sizeof(u32),
					  fps);
		break;
	}

	case PTRACE_READTEXT:
	case PTRACE_READDATA:
		ret = ptrace_readdata(child, addr, addr2p, data);

		if (ret == data)
			ret = 0;
		else if (ret >= 0)
			ret = -EIO;
		break;

	case PTRACE_WRITETEXT:
	case PTRACE_WRITEDATA:
		ret = ptrace_writedata(child, addr2p, addr, data);

		if (ret == data)
			ret = 0;
		else if (ret >= 0)
			ret = -EIO;
		break;

	default:
		if (request == PTRACE_SPARC_DETACH)
			request = PTRACE_DETACH;
		ret = ptrace_request(child, request, addr, data);
		break;
	}

	return ret;
}

asmlinkage int syscall_trace(struct pt_regs *regs, int syscall_exit_p)
{

Annotation

Implementation Notes