亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ptrace.c

?? 該文件是rt_linux
?? C
字號(hào):
/* $Id: ptrace.c,v 1.13 2001/10/01 02:21:50 gniibe Exp $ * * linux/arch/sh/kernel/ptrace.c * * Original x86 implementation: *	By Ross Biro 1/23/92 *	edited by Linus Torvalds * * SuperH version:   Copyright (C) 1999, 2000  Kaz Kojima & Niibe Yutaka * */#include <linux/config.h>#include <linux/kernel.h>#include <linux/sched.h>#include <linux/mm.h>#include <linux/smp.h>#include <linux/smp_lock.h>#include <linux/errno.h>#include <linux/ptrace.h>#include <linux/user.h>#include <asm/io.h>#include <asm/uaccess.h>#include <asm/pgtable.h>#include <asm/system.h>#include <asm/processor.h>#include <asm/mmu_context.h>/* * does not yet catch signals sent when the child dies. * in exit.c or in signal.c. *//* * This routine will get a word off of the process kernel stack. */static inline int get_stack_long(struct task_struct *task, int offset){	unsigned char *stack;	stack = (unsigned char *)task + THREAD_SIZE - sizeof(struct pt_regs);	stack += offset;	return (*((int *)stack));}/* * This routine will put a word on the process kernel stack. */static inline int put_stack_long(struct task_struct *task, int offset,				 unsigned long data){	unsigned char *stack;	stack = (unsigned char *)task + THREAD_SIZE - sizeof(struct pt_regs);	stack += offset;	*(unsigned long *) stack = data;	return 0;}static voidcompute_next_pc(struct pt_regs *regs, unsigned short inst,		unsigned long *pc1, unsigned long *pc2){	int nib[4]		= { (inst >> 12) & 0xf,		    (inst >> 8) & 0xf,		    (inst >> 4) & 0xf,		    inst & 0xf};	/* bra & bsr */	if (nib[0] == 0xa || nib[0] == 0xb) {		*pc1 = regs->pc + 4 + ((short) ((inst & 0xfff) << 4) >> 3);		*pc2 = (unsigned long) -1;		return;	}	/* bt & bf */	if (nib[0] == 0x8 && (nib[1] == 0x9 || nib[1] == 0xb)) {		*pc1 = regs->pc + 4 + ((char) (inst & 0xff) << 1);		*pc2 = regs->pc + 2;		return;	}	/* bt/s & bf/s */	if (nib[0] == 0x8 && (nib[1] == 0xd || nib[1] == 0xf)) {		*pc1 = regs->pc + 4 + ((char) (inst & 0xff) << 1);		*pc2 = regs->pc + 4;		return;	}	/* jmp & jsr */	if (nib[0] == 0x4 && nib[3] == 0xb	    && (nib[2] == 0x0 || nib[2] == 0x2)) {		*pc1 = regs->regs[nib[1]];		*pc2 = (unsigned long) -1;		return;	}	/* braf & bsrf */	if (nib[0] == 0x0 && nib[3] == 0x3	    && (nib[2] == 0x0 || nib[2] == 0x2)) {		*pc1 = regs->pc + 4 + regs->regs[nib[1]];		*pc2 = (unsigned long) -1;		return;	}	if (inst == 0x000b) {		*pc1 = regs->pr;		*pc2 = (unsigned long) -1;		return;	}	*pc1 = regs->pc + 2;	*pc2 = (unsigned long) -1;	return;}/* Tracing by user break controller.  */static voidubc_set_tracing(int asid, unsigned long nextpc1, unsigned nextpc2){	ctrl_outl(nextpc1, UBC_BARA);	ctrl_outb(asid, UBC_BASRA);	if(UBC_TYPE_SH7729){		ctrl_outl(0x0fff, UBC_BAMRA);		ctrl_outw(BBR_INST | BBR_READ | BBR_CPU, UBC_BBRA);	}else{		ctrl_outb(BAMR_12, UBC_BAMRA);		ctrl_outw(BBR_INST | BBR_READ, UBC_BBRA);	}	if (nextpc2 != (unsigned long) -1) {		ctrl_outl(nextpc2, UBC_BARB);		ctrl_outb(asid, UBC_BASRB);		if(UBC_TYPE_SH7729){			ctrl_outl(0x0fff, UBC_BAMRB);			ctrl_outw(BBR_INST | BBR_READ | BBR_CPU, UBC_BBRB);		}else{			ctrl_outb(BAMR_12, UBC_BAMRB);			ctrl_outw(BBR_INST | BBR_READ, UBC_BBRB);		}	}	if(UBC_TYPE_SH7729)		ctrl_outl(BRCR_PCBA | BRCR_PCBB | BRCR_PCTE, UBC_BRCR);	else		ctrl_outw(BRCR_PCBA | BRCR_PCBB, UBC_BRCR);}/* * Called by kernel/ptrace.c when detaching.. * * Make sure single step bits etc are not set. */void ptrace_disable(struct task_struct *child){	/* nothing to do.. */}asmlinkage int sys_ptrace(long request, long pid, long addr, long data){	struct task_struct *child, *tsk = current;	struct user * dummy = NULL;	int ret;	lock_kernel();	ret = -EPERM;	if (request == PTRACE_TRACEME) {		/* are we already being traced? */		if (current->ptrace & PT_PTRACED)			goto out;		/* set the ptrace bit in the process flags. */		current->ptrace |= PT_PTRACED;		ret = 0;		goto out;	}	ret = -ESRCH;	read_lock(&tasklist_lock);	child = find_task_by_pid(pid);	if (child)		get_task_struct(child);	read_unlock(&tasklist_lock);	if (!child)		goto out;	ret = -EPERM;	if (pid == 1)		/* you may not mess with init */		goto out_tsk;	if (request == PTRACE_ATTACH) {		ret = ptrace_attach(child);		goto out_tsk;	}	ret = -ESRCH;	if (!(child->ptrace & PT_PTRACED))		goto out_tsk;	if (child->state != TASK_STOPPED) {		if (request != PTRACE_KILL)			goto out_tsk;	}	if (child->p_pptr != tsk)		goto out_tsk;	switch (request) {	/* when I and D space are separate, these will need to be fixed. */	case PTRACE_PEEKTEXT: /* read word at location addr. */ 	case PTRACE_PEEKDATA: {		unsigned long tmp;		int copied;		copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0);		ret = -EIO;		if (copied != sizeof(tmp))			break;		ret = put_user(tmp,(unsigned long *) data);		break;	}	/* read the word at location addr in the USER area. */	case PTRACE_PEEKUSR: {		unsigned long tmp;		ret = -EIO;		if ((addr & 3) || addr < 0 || 		    addr > sizeof(struct user) - 3)			break;		if (addr < sizeof(struct pt_regs))			tmp = get_stack_long(child, addr);		else if (addr >= (long) &dummy->fpu &&			 addr < (long) &dummy->u_fpvalid) {			if (!child->used_math) {				if (addr == (long)&dummy->fpu.fpscr)					tmp = FPSCR_INIT;				else					tmp = 0;			} else				tmp = ((long *)&child->thread.fpu)					[(addr - (long)&dummy->fpu) >> 2];		} else if (addr == (long) &dummy->u_fpvalid)			tmp = child->used_math;		else			tmp = 0;		ret = put_user(tmp, (unsigned long *)data);		break;	}	/* when I and D space are separate, this will have to be fixed. */	case PTRACE_POKETEXT: /* write the word at location addr. */	case PTRACE_POKEDATA:		ret = 0;		if (access_process_vm(child, addr, &data, sizeof(data), 1) == sizeof(data))			break;		ret = -EIO;		break;	case PTRACE_POKEUSR: /* write the word at location addr in the USER area */		ret = -EIO;		if ((addr & 3) || addr < 0 || 		    addr > sizeof(struct user) - 3)			break;		if (addr < sizeof(struct pt_regs))			ret = put_stack_long(child, addr, data);		else if (addr >= (long) &dummy->fpu &&			 addr < (long) &dummy->u_fpvalid) {			child->used_math = 1;			((long *)&child->thread.fpu)				[(addr - (long)&dummy->fpu) >> 2] = data;			ret = 0;		} else if (addr == (long) &dummy->u_fpvalid) {			child->used_math = data?1:0;			ret = 0;		}		break;	case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */	case PTRACE_CONT: { /* restart after signal. */		ret = -EIO;		if ((unsigned long) data > _NSIG)			break;		if (request == PTRACE_SYSCALL)			child->ptrace |= PT_TRACESYS;		else			child->ptrace &= ~PT_TRACESYS;		child->exit_code = data;		wake_up_process(child);		ret = 0;		break;	}/* * make the child exit.  Best I can do is send it a sigkill.  * perhaps it should be put in the status that it wants to  * exit. */	case PTRACE_KILL: {		ret = 0;		if (child->state == TASK_ZOMBIE)	/* already dead */			break;		child->exit_code = SIGKILL;		wake_up_process(child);		break;	}	case PTRACE_SINGLESTEP: {  /* set the trap flag. */		long tmp, pc;		struct pt_regs *dummy = NULL;		struct pt_regs *regs;		unsigned long nextpc1, nextpc2;		unsigned short insn;		ret = -EIO;		if ((unsigned long) data > _NSIG)			break;		child->ptrace &= ~PT_TRACESYS;		if ((child->ptrace & PT_DTRACE) == 0) {			/* Spurious delayed TF traps may occur */			child->ptrace |= PT_DTRACE;		}		/* Compute next pc.  */		pc = get_stack_long(child, (long)&dummy->pc);		regs = (struct pt_regs *)((unsigned long)child + THREAD_SIZE - sizeof(struct pt_regs));		if (access_process_vm(child, pc&~3, &tmp, sizeof(tmp), 0) != sizeof(tmp))			break; #ifdef  __LITTLE_ENDIAN__		if (pc & 3)			insn = tmp >> 16;		else			insn = tmp & 0xffff;#else		if (pc & 3)			insn = tmp & 0xffff;		else			insn = tmp >> 16;#endif		compute_next_pc (regs, insn, &nextpc1, &nextpc2);		if (nextpc1 & 0x80000000)			break;		if (nextpc2 != (unsigned long) -1 && (nextpc2 & 0x80000000))			break;		ubc_set_tracing(child->mm->context & MMU_CONTEXT_ASID_MASK,				nextpc1, nextpc2);		child->exit_code = data;		/* give it a chance to run. */		wake_up_process(child);		ret = 0;		break;	}	case PTRACE_DETACH: /* detach a process that was attached. */		ret = ptrace_detach(child, data);		break;	case PTRACE_SETOPTIONS: {		if (data & PTRACE_O_TRACESYSGOOD)			child->ptrace |= PT_TRACESYSGOOD;		else			child->ptrace &= ~PT_TRACESYSGOOD;		ret = 0;		break;	}	default:		ret = -EIO;		break;	}out_tsk:	free_task_struct(child);out:	unlock_kernel();	return ret;}asmlinkage void syscall_trace(void){	struct task_struct *tsk = current;	if ((tsk->ptrace & (PT_PTRACED|PT_TRACESYS))	    != (PT_PTRACED|PT_TRACESYS))		return;	/* the 0x80 provides a way for the tracing parent to distinguish	   between a syscall stop and SIGTRAP delivery */	tsk->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)				    ? 0x80 : 0);	tsk->state = TASK_STOPPED;	notify_parent(tsk, SIGCHLD);	schedule();	/*	 * this isn't the same as continuing with a signal, but it will do	 * for normal use.  strace only continues with a signal if the	 * stopping signal is not SIGTRAP.  -brl	 */	if (tsk->exit_code) {		send_sig(tsk->exit_code, tsk, 1);		tsk->exit_code = 0;	}}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
2021久久国产精品不只是精品| 国产精品久久久久精k8| 成人性视频网站| 亚洲一级不卡视频| 久久久久久久免费视频了| 欧美三级三级三级爽爽爽| www.av亚洲| 国产在线观看一区二区| 日韩精品午夜视频| 一区二区欧美视频| 国产欧美综合在线观看第十页| 欧美一区二区三区日韩| 在线观看视频欧美| 国产98色在线|日韩| 蜜桃视频一区二区三区| 亚洲国产一区在线观看| 中文字幕在线视频一区| 亚洲精品在线免费播放| 欧美一区二区三区视频在线| 欧美在线一区二区三区| 国产成人av一区二区| 青娱乐精品视频在线| 亚洲成人av资源| 一片黄亚洲嫩模| 亚洲欧美一区二区三区孕妇| 久久这里只有精品视频网| 欧美日韩国产高清一区二区三区| 色综合色狠狠综合色| 99久久精品免费看| 国产成人精品一区二区三区网站观看| 日韩中文字幕麻豆| 亚洲主播在线播放| 一区二区三区在线观看欧美| 国产精品久久久久久久久果冻传媒 | 在线成人av影院| 欧美综合色免费| 色综合天天综合| 成人做爰69片免费看网站| 国产美女视频一区| 国产精品77777| 久久成人免费日本黄色| 日本成人在线电影网| 免费高清在线一区| 人人精品人人爱| 极品少妇一区二区三区精品视频| 免费在线观看一区| 久久精品国产秦先生| 韩国午夜理伦三级不卡影院| 久久99精品国产.久久久久久| 免费成人在线影院| 久久国内精品自在自线400部| 美国一区二区三区在线播放| 久久精品久久久精品美女| 另类人妖一区二区av| 男女男精品视频| 日韩国产一区二| 狠狠色狠狠色合久久伊人| 国产成人欧美日韩在线电影| av成人动漫在线观看| 91国偷自产一区二区开放时间| 欧美最新大片在线看| 91精品在线麻豆| 精品国产乱码久久久久久免费| 久久久91精品国产一区二区三区| 国产精品成人免费精品自在线观看| 亚洲免费观看高清完整版在线观看熊 | 国产伦精品一区二区三区免费迷| 国产乱码精品一区二区三区忘忧草 | 日本女优在线视频一区二区| 久久精品99国产精品日本| 国产成人av电影在线观看| 97久久久精品综合88久久| 9191成人精品久久| xf在线a精品一区二区视频网站| 中文字幕不卡在线播放| 亚洲国产成人精品视频| 久久99精品国产麻豆婷婷| 国产a精品视频| 欧美三级日韩三级国产三级| 日韩你懂的在线播放| 综合电影一区二区三区 | 久久综合国产精品| 亚洲精品美国一| 九九国产精品视频| 91最新地址在线播放| 欧美日韩成人在线| 欧美高清在线视频| 石原莉奈在线亚洲二区| 99久久伊人久久99| 91精品国产一区二区| 自拍偷拍国产精品| 国内精品嫩模私拍在线| 欧美视频你懂的| 国产目拍亚洲精品99久久精品| 亚洲成a人v欧美综合天堂| 国产乱码精品一品二品| 欧美精品一卡两卡| 亚洲三级久久久| 国产成人福利片| 日韩欧美中文字幕一区| 一区二区三区精品| 成人精品gif动图一区| 欧美videos中文字幕| 亚洲综合清纯丝袜自拍| 成人免费毛片aaaaa**| 精品国产一区二区三区久久久蜜月 | 国产a级毛片一区| 日韩精品专区在线影院重磅| 亚洲精品日日夜夜| 不卡一区二区三区四区| 久久久久久久久久久久久女国产乱 | 精品少妇一区二区三区| 一区二区三区国产精华| 91在线视频免费91| 国产精品久久久久久一区二区三区 | 91成人网在线| 亚洲视频综合在线| 成人午夜视频在线| 久久精品人人做| 国内精品伊人久久久久av一坑| 日韩一级免费观看| 婷婷成人综合网| 777久久久精品| 天天爽夜夜爽夜夜爽精品视频| 欧美综合天天夜夜久久| 一区二区三区免费网站| 日本高清无吗v一区| 一区二区视频在线看| 色综合中文字幕国产 | 日本成人在线网站| 91精品国产综合久久久久久漫画 | 婷婷成人激情在线网| 欧美日韩在线观看一区二区| 伊人性伊人情综合网| 91久久香蕉国产日韩欧美9色| 国产精品传媒在线| 97精品久久久久中文字幕| 亚洲视频在线观看一区| 色综合久久综合中文综合网| 亚洲女同女同女同女同女同69| 色婷婷久久久亚洲一区二区三区| √…a在线天堂一区| 91官网在线观看| 亚洲va欧美va人人爽午夜| 欧美一级久久久久久久大片| 久久国内精品自在自线400部| 精品国产污污免费网站入口 | 337p粉嫩大胆噜噜噜噜噜91av | 国产一区二区电影| 中文字幕欧美国产| 97久久超碰精品国产| 亚洲h精品动漫在线观看| 欧美精品日韩精品| 国产在线精品免费| 国产精品日日摸夜夜摸av| 91精品1区2区| 奇米四色…亚洲| 国产欧美日韩麻豆91| 色狠狠色狠狠综合| 久久精品99国产国产精| 国产精品美女久久久久久久久 | 91麻豆国产精品久久| 亚洲国产一区二区在线播放| 日韩免费高清av| 成人在线一区二区三区| 亚洲精品免费视频| 日韩欧美色电影| 岛国一区二区三区| 亚洲成人综合在线| 国产日韩精品久久久| 91国产视频在线观看| 精品影视av免费| 中文字幕一区二区三区蜜月| 欧美日韩午夜在线| 国产福利一区在线| 亚洲妇熟xx妇色黄| 国产亚洲短视频| 欧美高清www午色夜在线视频| 狠狠色狠狠色合久久伊人| 亚洲猫色日本管| 精品欧美一区二区在线观看| 色94色欧美sute亚洲13| 久久99精品一区二区三区三区| 亚洲视频 欧洲视频| 日韩你懂的电影在线观看| 波多野结衣91| 秋霞电影网一区二区| 亚洲欧美成人一区二区三区| 精品国产精品一区二区夜夜嗨| 色综合久久综合| 国产真实乱对白精彩久久| 亚洲国产精品久久艾草纯爱| 国产精品网曝门| 日韩西西人体444www| 91国内精品野花午夜精品| 国产成人免费视频| 裸体歌舞表演一区二区| 亚洲一区免费观看| 欧美国产成人精品| 欧美成人精品1314www|