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

📄 dump.c

📁 mips架构的bootloader,99左右的版本 但源代码现在没人更新了
💻 C
字号:
/************************************************************* * File: mon/dump.c * Purpose: Part of core Monitor * Author: Phil Bunce (pjb@carmel.com) * Revision History: *	970304	Start of revision history *	970901	Added special meaning for "d -R addr", dump host mem *	980917	Added help for -S. *	980917	Fixed -s option. Needed read_target not *adr. */#include <mon.h>Optdesc d_opts[] = {	{"[-bhwsS] adr [cnt]","display memory"},	{"-b","display as bytes"},	{"-h","display as half-words"},	{"-w","display as words"},        {"-fR","display as fp values (reversed word order)"},	{"-s","display a null terminated string"},	{"-S","cnt is count of words, bytes, or halfwords"},	{"-r<reg>","display as register"},	{0}};#define D_RFLAG         0x0001/**************************************************************  dump(ac,av)*	the 'd' command */dump(ac,av)int ac;char *av[];{Ulong adr, siz, l,v;char *reg;int i,j,datasz,n,bysize,flags;if (!regChain) {	printf("Target Description Driver not loaded\n");	return(1);	}if (!atob(&siz,getMonEnv("moresz"),10)) {	printf("%s: bad moresz value\n",getMonEnv("moresz"));	return(1);	}bysize = 0;i = matchenv("datasz");switch (i) {	case 0 : datasz = 1; break;	case 1 : datasz = 2; break;	case 2 : datasz = 4; break;	default :		printf("%s: bad datasz value\n",getMonEnv("datasz"));		return(1);	}flags = 0;n = 0;for (i=1;i<ac;i++) {	if (av[i][0] == '-') {		for (j=1;av[i][j] != 0;j++) {			switch (av[i][j]) {                                case 'R' : flags |= D_RFLAG; break;                                case 'f' : datasz=8; break;				case 'S' : bysize=1; break;				case 'w' : datasz=4; break;				case 'b' : datasz=1; break;				case 'h' : datasz=2; break;				case 's' : datasz=0; break;				case 'r' : 					reg = &av[i][j+1];					datasz = -1; 					break;				default :					printf("%c: unknown option\n",av[i][j]);					return(1);				}			if (datasz == -1) break;			}		}	else {		switch (n) {			case 0 :				if(!get_rsa(&adr,av[i])) return(1);				break;			case 1 :				if(!get_rsa(&siz,av[i])) return(1);				break;			default :				printf("%s: unknown argument\n",av[i]);				return(1);			}		n++;		}	}if (n == 0) {	printf("address not specified\n");	return(1);	}if (adr&1) datasz = 1;else if (adr&2) datasz = 2;if (bysize) {	switch (datasz) {		case 1 : siz = (siz+15)/16; break;		case 2 : siz = (siz+7)/8 ; break;		case 4 : siz = (siz+3)/4 ; break;		}	}if (datasz == 0) { /* -s, print string */	for (i=0;i<70;i++) { /* 980917 */		v = read_target8(adr++);		prnbuf[i] = v;		if (v == 0) break;		if (!isprint(v)) prnbuf[i] = '.';		}	printf("%s\n",prnbuf);	return(0);	}if (datasz == -1) { /* -r<reg> print as register */	if (!disp_as_reg(read_target(XT_MEM,adr,4),reg)) 		printf("%s: bad register name\n",reg);	return(0);	}ioctl_cbreak(0L);l = siz;while(1) {	adr = dispmem(prnbuf,adr,datasz,flags);	if (more(prnbuf,&l,(n > 1)?0:siz)) break;	}}/**************************************************************  static Ulong read_host_mem(adr,sz)*	Added to support the special "d -R" command.*/static Ulong read_host_mem(adr,sz)Ulong adr;int sz;{switch (sz) {	case 1 : return (*(Uchar *)(adr));	case 2 : return (*(Ushort *)(adr));	case 4 : return (*(Ulong *)(adr));	}}/**************************************************************  Ulong dispmem(p,adr,siz,flags)*	writes one line of output to p.*/Ulong dispmem(p,adr,siz,flags)char *p;Ulong adr;int siz,flags;{int i;char tmp[10],*q;char buf[16];unsigned short *ph;Ulong *pw,v,a;if (!regChain) {	printf("Target Description Driver not loaded\n");	return(1);	}#ifdef FLOATINGPTif (siz == 8) return dispfp(p,adr,flags);#endifadr &= ~(siz-1); /* align */a = adr;q = buf;for (i=0;i<(16/siz);i++) {	if (flags&D_RFLAG) v = read_host_mem(a,siz); /* 970901 */	else v = read_target(XT_MEM,a,siz);	switch (siz) {		case 1 : *q++ = v; break;		case 2 : *((unsigned short *)q) = v; q+=2; break;		case 4 : *((Ulong *)q) = v; q+=4; break;		}	a += siz;	}sprintf(p,"%08x  ",adr);for(i = 0; i < 16 ; i += siz){	if(i == 8) strccat(p,' ');	switch (siz) {		case 1 :			sprintf(tmp,"%02x ",buf[i]&0xff);			break;		case 2 :			ph = (unsigned short *)&buf[i];			sprintf(tmp,"%04x ",(*ph)&0xffff);			break;		case 4 :			pw = (unsigned long *)&buf[i];			sprintf(tmp,"%08x ",*pw);			break;		}	strcat(p,tmp);	}strcat(p,"  ");for(i = 0; i < 16 ; i++){	v = buf[i];	if (isprint(v)) strccat(p,(Uchar)v);	else strccat(p,'.');	}return(adr+16);}#ifdef FLOATINGPT/**************************************************************  Ulong dispfp(p,adr,flags)*/Ulong dispfp(p,adr,flags)char *p;Ulong adr;int flags;{int v0,v1,temp[2];double *dp;float *sp0,*sp1; sp0 = (float *)&v0;sp1 = (float *)&v1;dp = (double *)temp;v0 = read_target(XT_MEM,adr,4);v1 = read_target(XT_MEM,adr+4,4);if (flags&D_RFLAG) {        temp[0] = read_target(XT_MEM,adr+4,4);        temp[1] = read_target(XT_MEM,adr,4);        }else {        temp[0] = read_target(XT_MEM,adr,4);        temp[1] = read_target(XT_MEM,adr+4,4);        }#undef sprintfsprintf(p,"%08x = %08x %13e %08x %13e dp=%e",adr,read_target(XT_MEM,adr,4),*sp0,                                read_target(XT_MEM,adr+4,4),*sp1,*dp);#define sprintf xsprintfreturn(adr+8);}#endif

⌨️ 快捷键说明

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