17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier #include <mach.h>
57dd7cddfSDavid du Colombier #include "arm.h"
67dd7cddfSDavid du Colombier
77dd7cddfSDavid du Colombier #define STRINGSZ 128
87dd7cddfSDavid du Colombier
97dd7cddfSDavid du Colombier /*
107dd7cddfSDavid du Colombier * print the value of dot as file:line
117dd7cddfSDavid du Colombier */
127dd7cddfSDavid du Colombier void
printsource(long dot)137dd7cddfSDavid du Colombier printsource(long dot)
147dd7cddfSDavid du Colombier {
157dd7cddfSDavid du Colombier char str[STRINGSZ];
167dd7cddfSDavid du Colombier
177dd7cddfSDavid du Colombier if (fileline(str, STRINGSZ, dot))
187dd7cddfSDavid du Colombier Bprint(bioout, "%s", str);
197dd7cddfSDavid du Colombier }
207dd7cddfSDavid du Colombier
217dd7cddfSDavid du Colombier void
printlocals(Symbol * fn,ulong fp)227dd7cddfSDavid du Colombier printlocals(Symbol *fn, ulong fp)
237dd7cddfSDavid du Colombier {
247dd7cddfSDavid du Colombier int i;
257dd7cddfSDavid du Colombier Symbol s;
267dd7cddfSDavid du Colombier
277dd7cddfSDavid du Colombier s = *fn;
287dd7cddfSDavid du Colombier for (i = 0; localsym(&s, i); i++) {
297dd7cddfSDavid du Colombier if (s.class != CAUTO)
307dd7cddfSDavid du Colombier continue;
317dd7cddfSDavid du Colombier Bprint(bioout, "\t%s=#%lux\n", s.name, getmem_4(fp-s.value));
327dd7cddfSDavid du Colombier }
337dd7cddfSDavid du Colombier }
347dd7cddfSDavid du Colombier
357dd7cddfSDavid du Colombier void
printparams(Symbol * fn,ulong fp)367dd7cddfSDavid du Colombier printparams(Symbol *fn, ulong fp)
377dd7cddfSDavid du Colombier {
387dd7cddfSDavid du Colombier int i;
397dd7cddfSDavid du Colombier Symbol s;
407dd7cddfSDavid du Colombier int first;
417dd7cddfSDavid du Colombier
427dd7cddfSDavid du Colombier fp += mach->szreg; /* skip saved pc */
437dd7cddfSDavid du Colombier s = *fn;
447dd7cddfSDavid du Colombier for (first = i = 0; localsym(&s, i); i++) {
457dd7cddfSDavid du Colombier if (s.class != CPARAM)
467dd7cddfSDavid du Colombier continue;
477dd7cddfSDavid du Colombier if (first++)
487dd7cddfSDavid du Colombier Bprint(bioout, ", ");
497dd7cddfSDavid du Colombier Bprint(bioout, "%s=#%lux", s.name, getmem_4(fp+s.value));
507dd7cddfSDavid du Colombier }
517dd7cddfSDavid du Colombier Bprint(bioout, ") ");
527dd7cddfSDavid du Colombier }
537dd7cddfSDavid du Colombier #define STARTSYM "_main"
547dd7cddfSDavid du Colombier #define FRAMENAME ".frame"
557dd7cddfSDavid du Colombier
567dd7cddfSDavid du Colombier void
stktrace(int modif)577dd7cddfSDavid du Colombier stktrace(int modif)
587dd7cddfSDavid du Colombier {
597dd7cddfSDavid du Colombier ulong pc, sp;
607dd7cddfSDavid du Colombier Symbol s, f;
617dd7cddfSDavid du Colombier int i;
627dd7cddfSDavid du Colombier char buf[512];
637dd7cddfSDavid du Colombier
647dd7cddfSDavid du Colombier pc = reg.r[15];
657dd7cddfSDavid du Colombier sp = reg.r[13];
667dd7cddfSDavid du Colombier i = 0;
677dd7cddfSDavid du Colombier while (findsym(pc, CTEXT, &s)) {
687dd7cddfSDavid du Colombier if(strcmp(STARTSYM, s.name) == 0) {
69*f19e7b74SDavid du Colombier Bprint(bioout, "%s() at #%llux\n", s.name, s.value);
707dd7cddfSDavid du Colombier break;
717dd7cddfSDavid du Colombier }
727dd7cddfSDavid du Colombier if (pc == s.value) /* at first instruction */
737dd7cddfSDavid du Colombier f.value = 0;
747dd7cddfSDavid du Colombier else if (findlocal(&s, FRAMENAME, &f) == 0)
757dd7cddfSDavid du Colombier break;
767dd7cddfSDavid du Colombier if (s.type == 'L' || s.type == 'l' || pc <= s.value+4)
777dd7cddfSDavid du Colombier pc = reg.r[14];
787dd7cddfSDavid du Colombier else pc = getmem_4(sp);
797dd7cddfSDavid du Colombier sp += f.value;
807dd7cddfSDavid du Colombier Bprint(bioout, "%s(", s.name);
817dd7cddfSDavid du Colombier printparams(&s, sp);
827dd7cddfSDavid du Colombier printsource(s.value);
837dd7cddfSDavid du Colombier Bprint(bioout, " called from ");
847dd7cddfSDavid du Colombier symoff(buf, sizeof(buf), pc-8, CTEXT);
857dd7cddfSDavid du Colombier Bprint(bioout, buf);
867dd7cddfSDavid du Colombier printsource(pc-8);
877dd7cddfSDavid du Colombier Bprint(bioout, "\n");
887dd7cddfSDavid du Colombier if(modif == 'C')
897dd7cddfSDavid du Colombier printlocals(&s, sp);
907dd7cddfSDavid du Colombier if(++i > 40){
917dd7cddfSDavid du Colombier Bprint(bioout, "(trace truncated)\n");
927dd7cddfSDavid du Colombier break;
937dd7cddfSDavid du Colombier }
947dd7cddfSDavid du Colombier }
957dd7cddfSDavid du Colombier }
96