13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
4bd389b36SDavid du Colombier #include <mach.h>
53e12c5d1SDavid du Colombier #define Extern extern
63e12c5d1SDavid du Colombier #include "sparc.h"
73e12c5d1SDavid du Colombier
83e12c5d1SDavid du Colombier #define STRINGSZ 128
93e12c5d1SDavid du Colombier
103e12c5d1SDavid du Colombier /*
113e12c5d1SDavid du Colombier * print the value of dot as file:line
123e12c5d1SDavid du Colombier */
133e12c5d1SDavid du Colombier void
printsource(long dot)143e12c5d1SDavid du Colombier printsource(long dot)
153e12c5d1SDavid du Colombier {
163e12c5d1SDavid du Colombier char str[STRINGSZ];
173e12c5d1SDavid du Colombier
183e12c5d1SDavid du Colombier if (fileline(str, STRINGSZ, dot))
193e12c5d1SDavid du Colombier Bprint(bioout, "%s", str);
203e12c5d1SDavid du Colombier }
213e12c5d1SDavid du Colombier
223e12c5d1SDavid du Colombier void
printlocals(Symbol * fn,ulong fp)233e12c5d1SDavid du Colombier printlocals(Symbol *fn, ulong fp)
243e12c5d1SDavid du Colombier {
253e12c5d1SDavid du Colombier int i;
263e12c5d1SDavid du Colombier Symbol s;
273e12c5d1SDavid du Colombier
283e12c5d1SDavid du Colombier s = *fn;
293e12c5d1SDavid du Colombier for (i = 0; localsym(&s, i); i++) {
303e12c5d1SDavid du Colombier if (s.class != CAUTO)
313e12c5d1SDavid du Colombier continue;
323e12c5d1SDavid du Colombier Bprint(bioout, "\t%s=#%lux\n", s.name, getmem_4(fp-s.value));
333e12c5d1SDavid du Colombier }
343e12c5d1SDavid du Colombier }
353e12c5d1SDavid du Colombier
363e12c5d1SDavid du Colombier void
printparams(Symbol * fn,ulong fp)373e12c5d1SDavid du Colombier printparams(Symbol *fn, ulong fp)
383e12c5d1SDavid du Colombier {
393e12c5d1SDavid du Colombier int i;
403e12c5d1SDavid du Colombier Symbol s;
413e12c5d1SDavid du Colombier int first;
423e12c5d1SDavid du Colombier
433e12c5d1SDavid du Colombier fp += mach->szreg; /* skip saved pc */
443e12c5d1SDavid du Colombier s = *fn;
453e12c5d1SDavid du Colombier for (first = i = 0; localsym(&s, i); i++) {
463e12c5d1SDavid du Colombier if (s.class != CPARAM)
473e12c5d1SDavid du Colombier continue;
483e12c5d1SDavid du Colombier if (first++)
493e12c5d1SDavid du Colombier Bprint(bioout, ", ");
503e12c5d1SDavid du Colombier Bprint(bioout, "%s=#%lux", s.name, getmem_4(fp+s.value));
513e12c5d1SDavid du Colombier }
523e12c5d1SDavid du Colombier Bprint(bioout, ") ");
533e12c5d1SDavid du Colombier }
543e12c5d1SDavid du Colombier
553e12c5d1SDavid du Colombier #define STARTSYM "_main"
563e12c5d1SDavid du Colombier #define FRAMENAME ".frame"
573e12c5d1SDavid du Colombier
583e12c5d1SDavid du Colombier void
stktrace(int modif)593e12c5d1SDavid du Colombier stktrace(int modif)
603e12c5d1SDavid du Colombier {
613e12c5d1SDavid du Colombier ulong pc, sp;
623e12c5d1SDavid du Colombier Symbol s, f;
633e12c5d1SDavid du Colombier int i;
64219b2ee8SDavid du Colombier char buf[512];
653e12c5d1SDavid du Colombier
663e12c5d1SDavid du Colombier pc = reg.pc;
673e12c5d1SDavid du Colombier sp = reg.r[1];
683e12c5d1SDavid du Colombier i = 0;
693e12c5d1SDavid du Colombier while (findsym(pc, CTEXT, &s)) {
703e12c5d1SDavid du Colombier if(strcmp(STARTSYM, s.name) == 0) {
71*f19e7b74SDavid du Colombier Bprint(bioout, "%s() at #%llux\n", s.name, s.value);
723e12c5d1SDavid du Colombier break;
733e12c5d1SDavid du Colombier }
743e12c5d1SDavid du Colombier if (pc == s.value) /* at first instruction */
753e12c5d1SDavid du Colombier f.value = 0;
763e12c5d1SDavid du Colombier else if (findlocal(&s, FRAMENAME, &f) == 0)
773e12c5d1SDavid du Colombier break;
783e12c5d1SDavid du Colombier if (s.type == 'L' || s.type == 'l' || pc <= s.value+4)
79219b2ee8SDavid du Colombier pc = reg.r[15];
803e12c5d1SDavid du Colombier else pc = getmem_4(sp);
813e12c5d1SDavid du Colombier sp += f.value;
823e12c5d1SDavid du Colombier Bprint(bioout, "%s(", s.name);
833e12c5d1SDavid du Colombier printparams(&s, sp);
843e12c5d1SDavid du Colombier printsource(s.value);
853e12c5d1SDavid du Colombier Bprint(bioout, " called from ");
86219b2ee8SDavid du Colombier symoff(buf, sizeof(buf), pc-8, CTEXT);
87219b2ee8SDavid du Colombier Bprint(bioout, buf);
883e12c5d1SDavid du Colombier printsource(pc-8);
893e12c5d1SDavid du Colombier Bprint(bioout, "\n");
903e12c5d1SDavid du Colombier if(modif == 'C')
913e12c5d1SDavid du Colombier printlocals(&s, sp);
923e12c5d1SDavid du Colombier if(++i > 40){
933e12c5d1SDavid du Colombier Bprint(bioout, "(trace truncated)\n");
943e12c5d1SDavid du Colombier break;
953e12c5d1SDavid du Colombier }
963e12c5d1SDavid du Colombier }
973e12c5d1SDavid du Colombier }
98