/************************************************************* * 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 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","display as register"}, {0}}; #define D_RFLAG 0x0001 /************************************************************* * int dump(int ac,char *av[]) * the 'd' command */ dump(int ac,char *av[]) { ADDR adr; Ulong v; int siz,l; char *reg; int i,j,datasz,n,bysize,flags; U64 rv; 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 print as register */ if (!disp_as_reg(read_target32(adr),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) */ Ulong dispmem(char *p,ADDR adr,int siz,int flags) { int i; char tmp[10],*q; char buf[16]; unsigned short *ph; Ulong *pw,v; ADDR a; if (!regChain) { printf("Target Description Driver not loaded\n"); return(1); } #ifdef FLOATINGPT if (siz == 8) return dispfp(p,adr,flags); #endif 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).lo; 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) */ ADDR dispfp(char *p,ADDR adr,int flags) { int v0,v1,temp[2]; double *dp; float *sp0,*sp1; sp0 = (float *)&v0; sp1 = (float *)&v1; dp = (double *)temp; v0 = read_target32(adr); v1 = read_target32(adr+4); if (flags&D_RFLAG) { temp[0] = read_target32(adr+4); temp[1] = read_target32(adr); } else { temp[0] = read_target32(adr); temp[1] = read_target32(adr+4); } #undef sprintf sprintf(p,"%08x = %08x %13e %08x %13e dp=%e",adr,read_target32(adr),*sp0, read_target32(adr+4),*sp1,*dp); #define sprintf xsprintf return(adr+8); } #endif