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

📄 xmon.c

📁 microwindows移植到S3C44B0的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
			printf("Couldn't insert breakpoint at %x, disabling\n",			       bp->address);			bp->enabled = 0;		} else {			store_inst((void *)bp->address);		}	}	if (!__is_processor(PV_POWER4)) {		if (dabr.enabled)			set_dabr(dabr.address);		if (iabr.enabled)			set_iabr(iabr.address);	}}static voidremove_bpts(){	int i;	struct bpt *bp;	unsigned instr;	if (naca->platform != PLATFORM_PSERIES)		return;	if (!__is_processor(PV_POWER4)) {		set_dabr(0);		set_iabr(0);	}	bp = bpts;	for (i = 0; i < NBPTS; ++i, ++bp) {		if (!bp->enabled)			continue;		if (mread(bp->address, &instr, 4) == 4		    && instr == bpinstr		    && mwrite(bp->address, &bp->instr, 4) != 4)			printf("Couldn't remove breakpoint at %x\n",			       bp->address);		else			store_inst((void *)bp->address);	}}static char *last_cmd;/* Command interpreting routine */static intcmds(struct pt_regs *excp){	int cmd;	last_cmd = NULL;	for(;;) {#ifdef CONFIG_SMP		printf("%d:", smp_processor_id());#endif /* CONFIG_SMP */		printf("mon> ");		fflush(stdout);		flush_input();		termch = 0;		cmd = skipbl();		if( cmd == '\n' ) {			if (last_cmd == NULL)				continue;			take_input(last_cmd);			last_cmd = NULL;			cmd = inchar();		}		switch (cmd) {		case 'z':			printf("Rebooting machine now...");			machine_restart(NULL);			break;		case 'Z':			printf("Halting machine now...");			machine_halt();			break;		case 'm':			cmd = inchar();			switch (cmd) {			case 'm':			case 's':			case 'd':				memops(cmd);				break;			case 'l':				memlocate();				break;			case 'z':				memzcan();				break;			case 'x':				mem_translate();				break;			case 'c':				mem_check();				break;			case 'g':				mem_check_full_group();				break;			case 'j':				mem_map_check_slab();				break;			case 'h':				mem_map_check_hash();				break;			case 'f':				mem_find_real();				break;			case 'e':				mem_find_vsid();				break;			case 'r':				mem_check_dup_rpn();				break;           			case 'i':				show_mem();				break;			case 'o':				mem_check_pagetable_vsids ();				break;			case 'q':				mem_map_lock_pages() ;				break;			default:				termch = cmd;				memex();			}			break;		case 'd':			dump();			break;		case 'r':			if (excp != NULL)				prregs(excp);	/* print regs */			break;		case 'e':			if (excp == NULL)				printf("No exception information\n");			else				excprint(excp);			break;		case 'M':			print_sysmap();			break;		case 'S':			super_regs();			break;		case 't':			backtrace(excp);			break;		case 'f':			cacheflush();			break;		case 'h':			dump_hash_table();			break;		case 's':		case 'x':		case EOF:			return cmd;		case '?':			printf(help_string);			break;		case 'p':			show_state();			break;		case 'b':			bpt_cmds();			break;		case 'C':			csum();			break;#ifdef CONFIG_SMP		case 'c':			cpu_cmd();			break;#endif /* CONFIG_SMP */		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;		}	}}#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(" %d", 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 (__is_processor(PV_POWER4)) {			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 (__is_processor(PV_POWER4)) {			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 0x400:	ret = "(Instruction 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)) {

⌨️ 快捷键说明

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