diff options
| author | forsyth <forsyth@vitanuova.com> | 2010-04-27 12:51:13 +0100 |
|---|---|---|
| committer | forsyth <forsyth@vitanuova.com> | 2010-04-27 12:51:13 +0100 |
| commit | d67b7dad77bb8aa973dad1f7c3ab0c309b114278 (patch) | |
| tree | 6794120fb327d6de19cf05eed53f80d877781a3e /utils/libmach/machdata.c | |
| parent | 09da2e137d5eb0c940df35d989e4c31ec0654fc4 (diff) | |
20100427-1251
Diffstat (limited to 'utils/libmach/machdata.c')
| -rw-r--r-- | utils/libmach/machdata.c | 68 |
1 files changed, 34 insertions, 34 deletions
diff --git a/utils/libmach/machdata.c b/utils/libmach/machdata.c index a82e14e8..425173e6 100644 --- a/utils/libmach/machdata.c +++ b/utils/libmach/machdata.c @@ -16,11 +16,10 @@ int asstype = AMIPS; /* disassembler type */ Machdata *machdata; /* machine-dependent functions */ int -localaddr(Map *map, char *fn, char *var, long *r, Rgetter rget) +localaddr(Map *map, char *fn, char *var, uvlong *r, Rgetter rget) { Symbol s; - ulong fp; - ulong pc, sp, link; + uvlong fp, pc, sp, link; if (!lookup(fn, 0, &s)) { werrstr("function not found"); @@ -63,10 +62,10 @@ localaddr(Map *map, char *fn, char *var, long *r, Rgetter rget) } /* - * Print value v as name[+offset] and then the string s. + * Print value v as s.name[+offset] if possible, or just v. */ int -symoff(char *buf, int n, long v, int space) +symoff(char *buf, int n, uvlong v, int space) { Symbol s; int r; @@ -81,16 +80,17 @@ symoff(char *buf, int n, long v, int space) delta = -delta; } if (v == 0 || r == 0) - return snprint(buf, n, "%lux", v); + return snprint(buf, n, "%llux", v); if (s.type != 't' && s.type != 'T' && delta >= 4096) - return snprint(buf, n, "%lux", v); - if (strcmp(s.name, ".string") == 0) - return snprint(buf, n, "%lux", v); - if (delta) - return snprint(buf, n, "%s+%lux", s.name, v-s.value); + return snprint(buf, n, "%llux", v); + else if (strcmp(s.name, ".string") == 0) + return snprint(buf, n, "%llux", v); + else if (delta) + return snprint(buf, n, "%s+%lux", s.name, delta); else return snprint(buf, n, "%s", s.name); } + /* * Format floating point registers * @@ -105,7 +105,7 @@ int fpformat(Map *map, Reglist *rp, char *buf, int n, int modif) { char reg[12]; - long r; + ulong r; switch(rp->rformat) { @@ -116,10 +116,12 @@ fpformat(Map *map, Reglist *rp, char *buf, int n, int modif) break; case 'F': /* first reg of double reg pair */ if (modif == 'F') - if (((rp+1)->rflags&RFLT) && (rp+1)->rformat == 'f') { + if ((rp->rformat=='F') || (((rp+1)->rflags&RFLT) && (rp+1)->rformat == 'f')) { if (get1(map, rp->roffs, (uchar *)reg, 8) < 0) return -1; machdata->dftos(buf, n, reg); + if (rp->rformat == 'F') + return 1; return 2; } /* treat it like 'f' */ @@ -316,7 +318,6 @@ beieee80ftos(char *buf, int n, void *s) return beieeedftos(buf, n, (void*)ieee); } - int leieee80ftos(char *buf, int n, void *s) { @@ -331,19 +332,18 @@ leieee80ftos(char *buf, int n, void *s) } int -cisctrace(Map *map, ulong pc, ulong sp, ulong link, Tracer trace) +cisctrace(Map *map, uvlong pc, uvlong sp, uvlong link, Tracer trace) { Symbol s; - int found; - ulong opc; - long moved, j; + int found, i; + uvlong opc, moved; USED(link); - j = 0; + i = 0; opc = 0; while(pc && opc != pc) { moved = pc2sp(pc); - if (moved == -1) + if (moved == ~0) break; found = findsym(pc, CTEXT, &s); if (!found) @@ -353,22 +353,22 @@ cisctrace(Map *map, ulong pc, ulong sp, ulong link, Tracer trace) sp += moved; opc = pc; - if (get4(map, sp, (long *)&pc) < 0) + if (geta(map, sp, &pc) < 0) break; (*trace)(map, pc, sp, &s); sp += mach->szaddr; /*assumes address size = stack width*/ - if(++j > 40) + if(++i > 40) break; } - return j; + return i; } int -risctrace(Map *map, ulong pc, ulong sp, ulong link, Tracer trace) +risctrace(Map *map, uvlong pc, uvlong sp, uvlong link, Tracer trace) { int i; Symbol s, f; - ulong oldpc; + uvlong oldpc; i = 0; while(findsym(pc, CTEXT, &s)) { @@ -384,7 +384,7 @@ risctrace(Map *map, ulong pc, ulong sp, ulong link, Tracer trace) if(s.type == 'L' || s.type == 'l' || pc <= s.value+mach->pcquant) pc = link; else - if (get4(map, sp, (long *) &pc) < 0) + if (geta(map, sp, &pc) < 0) break; if(pc == 0 || (pc == oldpc && f.value == 0)) @@ -399,30 +399,30 @@ risctrace(Map *map, ulong pc, ulong sp, ulong link, Tracer trace) return i; } -ulong -ciscframe(Map *map, ulong addr, ulong pc, ulong sp, ulong link) +uvlong +ciscframe(Map *map, uvlong addr, uvlong pc, uvlong sp, uvlong link) { Symbol s; - int moved; + uvlong moved; USED(link); for(;;) { moved = pc2sp(pc); - if (moved == -1) + if (moved == ~0) break; sp += moved; findsym(pc, CTEXT, &s); if (addr == s.value) return sp; - if (get4(map, sp, (long *) &pc) < 0) + if (geta(map, sp, &pc) < 0) break; sp += mach->szaddr; /*assumes sizeof(addr) = stack width*/ } return 0; } -ulong -riscframe(Map *map, ulong addr, ulong pc, ulong sp, ulong link) +uvlong +riscframe(Map *map, uvlong addr, uvlong pc, uvlong sp, uvlong link) { Symbol s, f; @@ -443,7 +443,7 @@ riscframe(Map *map, ulong addr, ulong pc, ulong sp, ulong link) if (s.type == 'L' || s.type == 'l' || pc-s.value <= mach->szaddr*2) pc = link; else - if (get4(map, sp-f.value, (long *)&pc) < 0) + if (geta(map, sp-f.value, &pc) < 0) break; } return 0; |
