34#if !defined(lint) && defined(LIBC_SCCS)
35static char sccsid[] =
"@(#)gmon.c 8.1 (Berkeley) 6/4/93";
57#define SCALE_1_TO_1 0x10000L
59#define ERR(s) write(2, s, sizeof(s))
67static int cputime_bias = 0;
68static u_long prev_count= 0;
83 delta = (int)(count - prev_count);
119 if (cp == (
char *)-1) {
120 ERR(
"monstartup: out of memory\n");
128 p->
kcount = (u_short *)cp;
130 p->
froms = (u_short *)cp;
144 else if (quot >= 0x100)
145 s_scale = 0x10000 / quot;
146 else if (o >= 0x800000)
147 s_scale = 0x1000000 / (o / (p->
kcountsize >> 8));
149 s_scale = 0x1000000 / ((o << 8) / p->
kcountsize);
175 ERR(
"_mcleanup: tos overflow\n");
181 mib[1] = KERN_CLOCKRATE;
200 fd =
open(
"uda:/gmon.out", O_CREAT|O_TRUNC|O_WRONLY, 0666);
202 perror(
"mcount: uda:/gmon.out");
206 log =
open(
"uda:/gmon.log", O_CREAT|O_TRUNC|O_WRONLY, 0664);
208 perror(
"mcount: uda:/gmon.log");
211 len = sprintf(buf,
"[mcleanup1] kcount 0x%x ssiz %d\n",
213 write(log, buf, len);
221 write(fd, (
char *)hdr,
sizeof *hdr);
224 for (fromindex = 0; fromindex < endfrom; fromindex++) {
225 if (p->
froms[fromindex] == 0)
230 for (toindex = p->
froms[fromindex]; toindex != 0;
231 toindex = p->
tos[toindex].
link) {
234 "[mcleanup2] frompc 0x%x selfpc 0x%x count %d\n" ,
237 write(log, buf, len);
276 "stwu %sp, -0x70(%sp) \n"
278 "stw %r0, 0x60(%sp) \n"
279 "std %r3, 0x10(%sp) \n"
280 "std %r4, 0x18(%sp) \n"
281 "std %r5, 0x20(%sp) \n"
282 "std %r6, 0x28(%sp) \n"
283 "std %r7, 0x30(%sp) \n"
284 "std %r8, 0x38(%sp) \n"
285 "std %r9, 0x40(%sp) \n"
286 "std %r10, 0x48(%sp) \n"
288 "lwz %r4,0x74(%sp) \n"
289 "bl internal_mcount \n"
290 "ld %r3, 0x10(%sp) \n"
291 "ld %r4, 0x18(%sp) \n"
292 "ld %r5, 0x20(%sp) \n"
293 "ld %r6, 0x28(%sp) \n"
294 "ld %r7, 0x30(%sp) \n"
295 "ld %r8, 0x38(%sp) \n"
296 "ld %r9, 0x40(%sp) \n"
297 "ld %r10, 0x48(%sp) \n"
298 "lwz %r11, 0x60(%sp) \n"
299 "addi %sp, %sp, 0x70 \n"
323_MCOUNT_DECL(frompc, selfpc)
334 register u_short *frompcindex;
335 register struct tostruct *top, *prevtop;
337 register long toindex;
346 static char already_setup;
348 extern char bss_start[];
372 frompci = frompc - p->
lowpc;
381 if (frompci + p->
lowpc
382 >= (
fptrint_t)(VM_MAXUSER_ADDRESS + UPAGES * PAGE_SIZE))
419 KCOUNT(p, frompci) += delta;
462 toindex = *frompcindex;
476 *frompcindex = toindex;
477 top = &p->
tos[toindex];
483 top = &p->
tos[toindex];
484 if (top->
selfpc == selfpc) {
498 if (top->
link == 0) {
510 top = &p->
tos[toindex];
513 top->
link = *frompcindex;
514 *frompcindex = toindex;
522 if (top->
selfpc == selfpc) {
531 toindex = prevtop->
link;
533 top->
link = *frompcindex;
534 *frompcindex = toindex;
void monstartup(u_long lowpc, u_long highpc)
struct gmonparam _gmonparam
__asm__(".global _mcount \n" "_mcount: \n" "stwu %sp, -0x70(%sp) \n" "mflr %r0 \n" "stw %r0, 0x60(%sp) \n" "std %r3, 0x10(%sp) \n" "std %r4, 0x18(%sp) \n" "std %r5, 0x20(%sp) \n" "std %r6, 0x28(%sp) \n" "std %r7, 0x30(%sp) \n" "std %r8, 0x38(%sp) \n" "std %r9, 0x40(%sp) \n" "std %r10, 0x48(%sp) \n" "mflr %r3 \n" "lwz %r4,0x74(%sp) \n" "bl internal_mcount \n" "ld %r3, 0x10(%sp) \n" "ld %r4, 0x18(%sp) \n" "ld %r5, 0x20(%sp) \n" "ld %r6, 0x28(%sp) \n" "ld %r7, 0x30(%sp) \n" "ld %r8, 0x38(%sp) \n" "ld %r9, 0x40(%sp) \n" "ld %r10, 0x48(%sp) \n" "lwz %r11, 0x60(%sp) \n" "addi %sp, %sp, 0x70 \n" "mtlr %r0 \n" "lwz %r0,4(%sp) \n" "mtctr %r11 \n" "mtlr %r0 \n" "bctr \n")
void internal_mcount(fptrint_t selfpc, fptrint_t frompc)
int write(int fileDesc, const void *ptr, size_t len)
int open(const char *file, int flags, int mode)
void * sbrk(ptrdiff_t incr)