xref: /plan9/sys/src/cmd/ki/symbols.c (revision f19e7b749ec99577072cd8e44030fe810f42c7ad)
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