summaryrefslogtreecommitdiff
path: root/utils/libmach/machdata.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/libmach/machdata.c')
-rw-r--r--utils/libmach/machdata.c68
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;