Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include <u.h>
2
#include <libc.h>
3
#include <bio.h>
4
#include <mach.h>
5
#include "arm.h"
6
 
7
#define Percent(num, max)	((max)?((num)*100)/(max):0)
8
#define prof prof5i
9
 
10
extern	Inst	itab[];
11
Inst *tables[] = { itab, 0 };
12
 
13
void
14
isum(void)
15
{
16
	Inst *i;
17
	int total, mems, arith, branch;
18
	int useddelay, taken, syscall;
19
	int pct, j;
20
 
21
	total = 0;
22
	mems = 0;
23
	arith = 0;
24
	branch = 0;
25
	useddelay = 0;
26
	taken = 0;
27
	syscall = 0;
28
 
29
	/* Compute the total so we can have percentages */
30
	for(i = itab; i->func; i++)
31
		if(i->name && i->count)
32
			total += i->count;
33
 
34
	Bprint(bioout, "\nInstruction summary.\n\n");
35
 
36
	for(j = 0; tables[j]; j++) {
37
		for(i = tables[j]; i->func; i++) {
38
			if(i->name) {
39
				/* This is gross */
40
				if(i->count == 0)
41
					continue;
42
				pct = Percent(i->count, total);
43
				if(pct != 0)
44
					Bprint(bioout, "%-8ud %3d%% %s\n",
45
						i->count, Percent(i->count,
46
						total), i->name);
47
				else
48
					Bprint(bioout, "%-8ud      %s\n",
49
						i->count, i->name);
50
 
51
 
52
				switch(i->type) {
53
				default:
54
					fatal(0, "isum bad stype %d\n", i->type);
55
				case Imem:
56
					mems += i->count;
57
					break;
58
				case Iarith:
59
					arith += i->count;
60
					break;
61
				case Ibranch:
62
					branch += i->count;
63
					taken += i->taken;
64
					useddelay += i->useddelay;
65
					break;
66
				case Isyscall:
67
					syscall += i->count;
68
					break;
69
				}
70
 
71
			}
72
		}
73
	}
74
 
75
	Bprint(bioout, "\n%-8ud      Memory cycles\n", mems+total);	
76
	Bprint(bioout, "%-8ud %3d%% Instruction cycles\n",
77
			total, Percent(total, mems+total));
78
	Bprint(bioout, "%-8ud %3d%% Data cycles\n\n",
79
			mems, Percent(mems, mems+total));	
80
 
81
	Bprint(bioout, "%-8ud %3d%% Arithmetic\n",
82
			arith, Percent(arith, total));
83
 
84
	Bprint(bioout, "%-8ud %3d%% System calls\n",
85
			syscall, Percent(syscall, total));
86
 
87
	Bprint(bioout, "%-8ud %3d%% Branches\n",
88
			branch, Percent(branch, total));
89
 
90
	Bprint(bioout, "   %-8ud %3d%% Branches taken\n",
91
			taken, Percent(taken, branch));
92
 
93
	Bprint(bioout, "   %-8ud %3d%% Delay slots\n",
94
			useddelay, Percent(useddelay, branch));
95
 
96
	Bprint(bioout, "   %-8ud %3d%% Unused delay slots\n", 
97
			branch-useddelay, Percent(branch-useddelay, branch));
98
 
99
	Bprint(bioout, "%-8ud %3d%% Program total delay slots\n",
100
			nopcount, Percent(nopcount, total));
101
}
102
 
103
void
104
tlbsum(void)
105
{
106
	if(tlb.on == 0)
107
		return;
108
 
109
	Bprint(bioout, "\n\nTlb summary\n");
110
 
111
	Bprint(bioout, "\n%-8d User entries\n", tlb.tlbsize);
112
	Bprint(bioout, "%-8d Accesses\n", tlb.hit+tlb.miss);
113
	Bprint(bioout, "%-8d Tlb hits\n", tlb.hit);
114
	Bprint(bioout, "%-8d Tlb misses\n", tlb.miss);
115
	Bprint(bioout, "%7d%% Hit rate\n", Percent(tlb.hit, tlb.hit+tlb.miss));
116
}
117
 
118
char *stype[] = { "Stack", "Text", "Data", "Bss" };
119
 
120
void
121
segsum(void)
122
{
123
	Segment *s;
124
	int i;
125
 
126
	Bprint(bioout, "\n\nMemory Summary\n\n");
127
	Bprint(bioout, "      Base     End      Resident References\n");
128
	for(i = 0; i < Nseg; i++) {
129
		s = &memory.seg[i];
130
		Bprint(bioout, "%-5s %.8lux %.8lux %-8d %-8d\n",
131
				stype[i], s->base, s->end, s->rss*BY2PG, s->refs);
132
	}
133
}
134
 
135
typedef struct Prof Prof;
136
struct Prof
137
{
138
	Symbol	s;
139
	long	count;
140
};
141
Prof	prof[5000];
142
 
143
int
144
profcmp(void *va, void *vb)
145
{
146
	Prof *a, *b;
147
 
148
	a = va;
149
	b = vb;
150
	return b->count - a->count;
151
}
152
 
153
void
154
iprofile(void)
155
{
156
	Prof *p, *n;
157
	int i, b, e;
158
	ulong total;
159
	extern ulong textbase;
160
 
161
	i = 0;
162
	p = prof;
163
	if(textsym(&p->s, i) == 0)
164
		return;
165
	i++;
166
	for(;;) {
167
		n = p+1;
168
		if(textsym(&n->s, i) == 0)
169
			break;
170
		b = (p->s.value-textbase)/PROFGRAN;
171
		e = (n->s.value-textbase)/PROFGRAN;
172
		while(b < e)
173
			p->count += iprof[b++];
174
		i++;
175
		p = n;
176
	}
177
 
178
	qsort(prof, i, sizeof(Prof), profcmp);
179
 
180
	total = 0;
181
	for(b = 0; b < i; b++)
182
		total += prof[b].count;
183
 
184
	Bprint(bioout, "  cycles     %% symbol          file\n");
185
	for(b = 0; b < i; b++) {
186
		if(prof[b].count == 0)
187
			continue;
188
 
189
		Bprint(bioout, "%8ld %3ld.%ld %-15s ",
190
			prof[b].count,
191
			100*prof[b].count/total,
192
			(1000*prof[b].count/total)%10,
193
			prof[b].s.name);
194
 
195
		printsource(prof[b].s.value);
196
		Bputc(bioout, '\n');
197
	}
198
	memset(prof, 0, sizeof(Prof)*i);
199
}