⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmon.c

📁 linux-2.4.29操作系统的源码
💻 C
📖 第 1 页 / 共 4 页
字号:
		case 'b':			bpt_cmds();			break;		case 'C':			csum();			break;#ifdef CONFIG_SMP		case 'c':			cpu_cmd();			break;#endif /* CONFIG_SMP */		case 'z':			bootcmds();		case 'T':			debug_trace();			break;		default:			printf("Unrecognized command: ");		        do {				if( ' ' < cmd && cmd <= '~' )					putchar(cmd);				else					printf("\\x%x", cmd);				cmd = inchar();		        } while (cmd != '\n'); 			printf(" (type ? for help)\n");			break;		}	}}static void bootcmds(void){	int cmd;	cmd = inchar();	if (cmd == 'r')		ppc_md.restart(NULL);	else if (cmd == 'h')		ppc_md.halt();	else if (cmd == 'p')		ppc_md.power_off();}#ifdef CONFIG_SMPstatic void cpu_cmd(void){	unsigned long cpu;	int timeout;	int cmd;	cmd = inchar();	if (cmd == 'i') {		printf("stopping all cpus\n");		/* interrupt other cpu(s) */		cpu = MSG_ALL_BUT_SELF;		smp_send_xmon_break(cpu);		return;	}	termch = cmd;	if (!scanhex(&cpu)) {		/* print cpus waiting or in xmon */		printf("cpus stopped:");		for (cpu = 0; cpu < NR_CPUS; ++cpu) {			if (test_bit(cpu, &cpus_in_xmon)) {				printf(" %x", cpu);				if (cpu == smp_processor_id())					printf("*", cpu);			}		}		printf("\n");		return;	}	/* try to switch to cpu specified */	take_xmon = cpu;	timeout = 10000000;	while (take_xmon >= 0) {		if (--timeout == 0) {			/* yes there's a race here */			take_xmon = -1;			printf("cpu %u didn't take control\n", cpu);			return;		}	}	/* now have to wait to be given control back */	while (test_and_set_bit(0, &got_xmon)) {		if (take_xmon == smp_processor_id()) {			take_xmon = -1;			break;		}	}}#endif /* CONFIG_SMP */static unsigned short fcstab[256] = {	0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,	0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,	0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,	0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,	0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,	0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,	0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,	0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,	0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,	0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,	0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,	0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,	0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,	0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,	0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,	0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,	0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,	0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,	0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,	0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,	0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,	0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,	0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,	0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,	0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,	0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,	0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,	0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,	0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,	0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,	0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,	0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78};#define FCS(fcs, c)	(((fcs) >> 8) ^ fcstab[((fcs) ^ (c)) & 0xff])static voidcsum(void){	unsigned int i;	unsigned short fcs;	unsigned char v;	if (!scanhex(&adrs))		return;	if (!scanhex(&ncsum))		return;	fcs = 0xffff;	for (i = 0; i < ncsum; ++i) {		if (mread(adrs+i, &v, 1) == 0) {			printf("csum stopped at %x\n", adrs+i);			break;		}		fcs = FCS(fcs, v);	}	printf("%x\n", fcs);}static char *breakpoint_help_string =     "Breakpoint command usage:\n"    "b                show breakpoints\n"    "b <addr> [cnt]   set breakpoint at given instr addr\n"    "bc               clear all breakpoints\n"    "bc <n/addr>      clear breakpoint number n or at addr\n"    "bi <addr> [cnt]  set hardware instr breakpoint (broken?)\n"    "bd <addr> [cnt]  set hardware data breakpoint (broken?)\n"    "";static voidbpt_cmds(void){	int cmd;	unsigned long a;	int mode, i;	struct bpt *bp;	struct tbtable tab;	cmd = inchar();	switch (cmd) {	case 'd':	/* bd - hardware data breakpoint */		if (cur_cpu_spec->cpu_features & CPU_FTR_SLB) {			printf("Not implemented on POWER4\n");			break;		}					mode = 7;		cmd = inchar();		if (cmd == 'r')			mode = 5;		else if (cmd == 'w')			mode = 6;		else			termch = cmd;		dabr.address = 0;		dabr.count = 0;		dabr.enabled = scanhex(&dabr.address);		scanhex(&dabr.count);		if (dabr.enabled)			dabr.address = (dabr.address & ~7) | mode;		break;	case 'i':	/* bi - hardware instr breakpoint */		if (cur_cpu_spec->cpu_features & CPU_FTR_SLB) {			printf("Not implemented on POWER4\n");			break;		}		iabr.address = 0;		iabr.count = 0;		iabr.enabled = scanhex(&iabr.address);		if (iabr.enabled)			iabr.address |= 3;		scanhex(&iabr.count);		break;	case 'c':		if (!scanhex(&a)) {			/* clear all breakpoints */			for (i = 0; i < NBPTS; ++i)				bpts[i].enabled = 0;			iabr.enabled = 0;			dabr.enabled = 0;			printf("All breakpoints cleared\n");		} else {			if (a <= NBPTS && a >= 1) {				/* assume a breakpoint number */				--a;	/* bp nums are 1 based */				bp = &bpts[a];			} else {				/* assume a breakpoint address */				bp = at_breakpoint(a);			}			if (bp == 0) {				printf("No breakpoint at %x\n", a);			} else {				printf("Cleared breakpoint %x (%lx %s)\n", (bp - bpts)+1, bp->address, bp->funcname);				bp->enabled = 0;			}		}		break;	case '?':	        printf(breakpoint_help_string);	        break;	default:		termch = cmd;	        cmd = skipbl();		if (cmd == '?') {			printf(breakpoint_help_string);			break;		}		termch = cmd;		if (!scanhex(&a)) {			/* print all breakpoints */			int bpnum;			printf("   type            address    count\n");			if (dabr.enabled) {				printf("   data   %.16lx %8x [", dabr.address & ~7,				       dabr.count);				if (dabr.address & 1)					printf("r");				if (dabr.address & 2)					printf("w");				printf("]\n");			}			if (iabr.enabled)				printf("   inst   %.16lx %8x\n", iabr.address & ~3,				       iabr.count);			for (bp = bpts, bpnum = 1; bp < &bpts[NBPTS]; ++bp, ++bpnum)				if (bp->enabled)					printf("%2x trap   %.16lx %8x  %s\n", bpnum, bp->address, bp->count, bp->funcname);			break;		}		bp = at_breakpoint(a);		if (bp == 0) {			for (bp = bpts; bp < &bpts[NBPTS]; ++bp)				if (!bp->enabled)					break;			if (bp >= &bpts[NBPTS]) {				printf("Sorry, no free breakpoints.  Please clear one first.\n");				break;			}		}		bp->enabled = 1;		bp->address = a;		bp->count = 0;		scanhex(&bp->count);		/* Find the function name just once. */		bp->funcname[0] = '\0';		if (find_tb_table(bp->address, &tab) && tab.name[0]) {			/* Got a nice name for it. */			int delta = bp->address - tab.funcstart;			sprintf(bp->funcname, "%s+0x%x", tab.name, delta);		}		printf("Set breakpoint %2x trap   %.16lx %8x  %s\n", (bp-bpts)+1, bp->address, bp->count, bp->funcname);		break;	}}/* Very cheap human name for vector lookup. */staticconst char *getvecname(unsigned long vec){	char *ret;	switch (vec) {	case 0x100:	ret = "(System Reset)"; break; 	case 0x200:	ret = "(Machine Check)"; break; 	case 0x300:	ret = "(Data Access)"; break; 	case 0x380:	ret = "(Data SLB Access)"; break;	case 0x400:	ret = "(Instruction Access)"; break; 	case 0x480:	ret = "(Instruction SLB Access)"; break;	case 0x500:	ret = "(Hardware Interrupt)"; break; 	case 0x600:	ret = "(Alignment)"; break; 	case 0x700:	ret = "(Program Check)"; break; 	case 0x800:	ret = "(FPU Unavailable)"; break; 	case 0x900:	ret = "(Decrementer)"; break; 	case 0xc00:	ret = "(System Call)"; break; 	case 0xd00:	ret = "(Single Step)"; break; 	case 0xf00:	ret = "(Performance Monitor)"; break; 	default: ret = "";	}	return ret;}static voidbacktrace(struct pt_regs *excp){	unsigned long sp;	unsigned long lr;	unsigned long stack[3];	struct pt_regs regs;	struct tbtable tab;	int framecount;	char *funcname;	/* declare these as raw ptrs so we don't get func descriptors */	extern void *ret_from_except, *ret_from_syscall_1;	if (excp != NULL) {	        lr = excp->link;		sp = excp->gpr[1];	} else {	        /* Use care not to call any function before this point		 so the saved lr has a chance of being good. */	        asm volatile ("mflr %0" : "=r" (lr) :);		sp = getsp();	}	scanhex(&sp);	scannl();	for (framecount = 0;	     sp != 0 && framecount < MAXFRAMECOUNT;	     sp = stack[0], framecount++) {		if (mread(sp, stack, sizeof(stack)) != sizeof(stack))			break;#if 0		if (lr != 0) {		    stack[2] = lr;	/* fake out the first saved lr.  It may not be saved yet. */		    lr = 0;		}#endif		printf("%.16lx  %.16lx", sp, stack[2]);		/* TAI -- for now only the ones cast to unsigned long will match.		 * Need to test the rest...		 */		if ((stack[2] == (unsigned long)ret_from_except &&		            (funcname = "ret_from_except"))		    || (stack[2] == (unsigned long)ret_from_syscall_1 &&		            (funcname = "ret_from_syscall_1"))#if 0		    || stack[2] == (unsigned) &ret_from_syscall_2		    || stack[2] == (unsigned) &do_signal_ret#endif		    ) {			printf("  %s\n", funcname);			if (mread(sp+112, &regs, sizeof(regs)) != sizeof(regs))				break;			printf("exception: %lx %s regs %lx\n", regs.trap, getvecname(regs.trap), sp+112);			printf("                  %.16lx", regs.nip);			if ((regs.nip & 0xffffffff00000000UL) &&			    find_tb_table(regs.nip, &tab)) {				int delta = regs.nip-tab.funcstart;				if (delta < 0)					printf("  <unknown code>");				else					printf("  %s+0x%x", tab.name, delta);			}			printf("\n");                        if (regs.gpr[1] < sp) {                            printf("<Stack drops into 32-bit userspace %.16lx>\n", regs.gpr[1]);                            break;			}			sp = regs.gpr[1];			if (mread(sp, stack, sizeof(stack)) != sizeof(stack))				break;		} else {			if (stack[2] && find_tb_table(stack[2], &tab)) {				int delta = stack[2]-tab.funcstart;				if (delta < 0)					printf("  <unknown code>");				else					printf("  %s+0x%x", tab.name, delta);			}			printf("\n");		}		if (stack[0] && stack[0] <= sp) {			if ((stack[0] & 0xffffffff00000000UL) == 0)				printf("<Stack drops into 32-bit userspace %.16lx>\n", stack[0]);			else				printf("<Corrupt stack.  Next backchain is %.16lx>\n", stack[0]);			break;		}	}	if (framecount >= MAXFRAMECOUNT)		printf("<Punt. Too many stack frames>\n");}intgetsp(){	int x;	asm("mr %0,1" : "=r" (x) :);	return x;}spinlock_t exception_print_lock = SPIN_LOCK_UNLOCKED;voidexcprint(struct pt_regs *fp){	struct task_struct *c;	struct tbtable tab;	unsigned long flags;	spin_lock_irqsave(&exception_print_lock, flags);#ifdef CONFIG_SMP	printf("cpu %d: ", smp_processor_id());#endif /* CONFIG_SMP */	printf("Vector: %lx %s at  [%lx]\n", fp->trap, getvecname(fp->trap), fp);	printf("    pc: %lx", fp->nip);	if (find_tb_table(fp->nip, &tab) && tab.name[0]) {		/* Got a nice name for it */		int delta = fp->nip - tab.funcstart;		printf(" (%s+0x%x)", tab.name, delta);	}	printf("\n");	printf("    lr: %lx", fp->link);	if (find_tb_table(fp->link, &tab) && tab.name[0]) {		/* Got a nice name for it */		int delta = fp->link - tab.funcstart;		printf(" (%s+0x%x)", tab.name, delta);	}	printf("\n");	printf("    sp: %lx\n", fp->gpr[1]);	printf("   msr: %lx\n", fp->msr);	if (fp->trap == 0x300 || fp->trap == 0x380 || fp->trap == 0x600) {		printf("   dar: %lx\n", fp->dar);		printf(" dsisr: %lx\n", fp->dsisr);	}	/* XXX: need to copy current or we die.  Why? */	c = current;	printf("  current = 0x%lx\n", c);	printf("  paca    = 0x%lx\n", get_paca());	if (c) {		printf("  current = %lx, pid = %ld, comm = %s\n",		       c, c->pid, c->comm);	}	spin_unlock_irqrestore(&exception_print_lock, flags);}voidprregs(struct pt_regs *fp){	int n;	unsigned long base;	if (scanhex((void *)&base))		fp = (struct pt_regs *) base;	for (n = 0; n < 16; ++n)		printf("R%.2ld = %.16lx   R%.2ld = %.16lx\n", n, fp->gpr[n],		       n+16, fp->gpr[n+16]);	printf("pc  = %.16lx   msr = %.16lx\nlr  = %.16lx   cr  = %.16lx\n",	       fp->nip, fp->msr, fp->link, fp->ccr);	printf("ctr = %.16lx   xer = %.16lx   trap = %8lx\n",	       fp->ctr, fp->xer, fp->trap);}voidcacheflush(void){	int cmd;	unsigned long nflush;	cmd = inchar();	if (cmd != 'i')		termch = cmd;	scanhex((void *)&adrs);	if (termch != '\n')		termch = 0;	nflush = 1;	scanhex(&nflush);	nflush = (nflush + 31) / 32;	if (cmd != 'i') {		for (; nflush > 0; --nflush, adrs += 0x20)			cflush((void *) adrs);	} else {		for (; nflush > 0; --nflush, adrs += 0x20)			cinval((void *) adrs);	}}unsigned longread_spr(int n){	unsigned int instrs[2];	unsigned long (*code)(void);	unsigned long opd[3];	instrs[0] = 0x7c6002a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);	instrs[1] = 0x4e800020;	opd[0] = (unsigned long)instrs;	opd[1] = 0;	opd[2] = 0;	store_inst(instrs);	store_inst(instrs+1);	code = (unsigned long (*)(void)) opd;	return code();}voidwrite_spr(int n, unsigned long val){	unsigned int instrs[2];	unsigned long (*code)(unsigned long);	unsigned long opd[3];	instrs[0] = 0x7c6003a6 + ((n & 0x1F) << 16) + ((n & 0x3e0) << 6);	instrs[1] = 0x4e800020;	opd[0] = (unsigned long)instrs;	opd[1] = 0;	opd[2] = 0;	store_inst(instrs);	store_inst(instrs+1);	code = (unsigned long (*)(unsigned long)) opd;	code(val);}static unsigned long regno;extern char exc_prolog;extern char dec_exc;voidprint_sysmap(void){	extern char *sysmap;	if ( sysmap )		printf("System.map: \n%s", sysmap);}voidsuper_regs(){	int i, cmd;	unsigned long val;	struct paca_struct*  ptrPaca = NULL;	struct ItLpPaca*  ptrLpPaca = NULL;	struct ItLpRegSave*  ptrLpRegSave = NULL;	cmd = skipbl();	if (cmd == '\n') {	        unsigned long sp, toc;		asm("mr %0,1" : "=r" (sp) :);		asm("mr %0,2" : "=r" (toc) :);		printf("msr  = %.16lx  sprg0= %.16lx\n", get_msr(), get_sprg0());		printf("pvr  = %.16lx  sprg1= %.16lx\n", get_pvr(), get_sprg1()); 		printf("dec  = %.16lx  sprg2= %.16lx\n", get_dec(), get_sprg2());		printf("sp   = %.16lx  sprg3= %.16lx\n", sp, get_sprg3());		printf("toc  = %.16lx  dar  = %.16lx\n", toc, get_dar());		printf("srr0 = %.16lx  srr1 = %.16lx\n", get_srr0(), get_srr1());		printf("asr  = %.16lx\n", mfasr());		for (i = 0; i < 8; ++i)			printf("sr%.2ld = %.16lx  sr%.2ld = %.16lx\n", i, get_sr(i), i+8, get_sr(i+8));		// Dump out relevant Paca data areas.		printf("Paca: \n");		ptrPaca = get_paca();    		printf("  Local Processor Control Area (LpPaca): \n");		ptrLpPaca = ptrPaca->xLpPacaPtr;		printf("    Saved Srr0=%.16lx  Saved Srr1=%.16lx \n", ptrLpPaca->xSavedSrr0, ptrLpPaca->xSavedSrr1);		printf("    Saved Gpr3=%.16lx  Saved Gpr4=%.16lx \n", ptrLpPaca->xSavedGpr3, ptrLpPaca->xSavedGpr4);		printf("    Saved Gpr5=%.16lx \n", ptrLpPaca->xSavedGpr5);    		printf("  Local Processor Register Save Area (LpRegSave): \n");		ptrLpRegSave = ptrPaca->xLpRegSavePtr;		printf("    Saved Sprg0=%.16lx  Saved Sprg1=%.16lx \n", ptrLpRegSave->xSPRG0, ptrLpRegSave->xSPRG0);		printf("    Saved Sprg2=%.16lx  Saved Sprg3=%.16lx \n", ptrLpRegSave->xSPRG2, ptrLpRegSave->xSPRG3);		printf("    Saved Msr  =%.16lx  Saved Nia  =%.16lx \n", ptrLpRegSave->xMSR, ptrLpRegSave->xNIA);    		return;	}	scanhex(&regno);	switch (cmd) {	case 'w':		val = read_spr(regno);		scanhex(&val);		write_spr(regno, val);		/* fall through */	case 'r':		printf("spr %lx = %lx\n", regno, read_spr(regno));		break;	case 's':		val = get_sr(regno);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -