sorry about the first patch; didn't realize until just now that it was issued from the wrong directory. come to terms with RARG register != function return register, so profiling for amd64 will work. (the thread library notwithstanding.) Reference: /n/patches.lsub.org/patch/profrarg Date: Wed Sep 19 17:42:43 CES 2012 Signed-off-by: quanstro@quanstro.net --- /sys/src/libc/port/profile.c Thu Apr 12 12:26:18 2012 +++ /sys/src/libc/port/profile.c Tue Sep 18 20:15:19 2012 @@ -2,8 +2,10 @@ #include #include -extern long _callpc(void**); -extern long _savearg(void); +extern uintptr _callpc(void**); +extern uintptr _savearg(void); +extern uintptr _saveret(void); +extern uintptr _restorearg(uintptr); static ulong khz; static ulong perr; @@ -15,28 +17,27 @@ Plink *old; Plink *down; Plink *link; - long pc; + uintptr pc; long count; vlong time; }; #pragma profile off -ulong +uintptr _profin(void) { void *dummy; - long pc; + uintptr pc; Plink *pp, *p; - ulong arg; + uintptr arg; vlong t; arg = _savearg(); pc = _callpc(&dummy); pp = _tos->prof.pp; if(pp == 0 || (_tos->prof.pid && _tos->pid != _tos->prof.pid)) - return arg; - + return _restorearg(arg); for(p=pp->down; p; p=p->link) if(p->pc == pc) goto out; @@ -44,7 +45,7 @@ if(p >= _tos->prof.last) { _tos->prof.pp = 0; perr++; - return arg; + return _restorearg(arg); } _tos->prof.next = p; p->link = pp->down; @@ -75,17 +76,17 @@ p->time = p->time - _tos->clock; break; } - return arg; /* disgusting linkage */ + return _restorearg(arg); } -ulong +uintptr _profout(void) { Plink *p; - ulong arg; + uintptr arg; vlong t; - arg = _savearg(); + arg = _saveret(); p = _tos->prof.pp; if (p == nil || (_tos->prof.pid != 0 && _tos->pid != _tos->prof.pid)) return arg; /* Not our process */ @@ -131,7 +132,7 @@ snprint(filename, sizeof filename - 1, "prof.out"); f = create(filename, 1, 0666); if(f < 0) { - perror("create prof.out"); + fprint(2, "create prof.out: %r"); return; } _tos->prof.pid = ~0; /* make sure data gets dumped once */ @@ -232,7 +233,7 @@ char ename[50]; int n, f; - n = 2000; + n = 10000; if (_tos->cyclefreq != 0LL){ khz = _tos->cyclefreq / 1000; /* Report times in milliseconds */ havecycles = 1; @@ -240,9 +241,9 @@ f = open("/env/profsize", OREAD); if(f >= 0) { memset(ename, 0, sizeof(ename)); - read(f, ename, sizeof(ename)-1); + if(read(f, ename, sizeof(ename)-1) > 0) + n = atol(ename); close(f); - n = atol(ename); } _tos->prof.what = Profuser; f = open("/env/proftype", OREAD); --- /sys/src/libc/386/main9p.s Thu Apr 12 12:26:14 2012 +++ /sys/src/libc/386/main9p.s Wed Sep 19 04:35:24 2012 @@ -29,6 +29,12 @@ TEXT _savearg(SB), 1, $0 RET +TEXT _saveret(SB), 1, $0 + RET + +TEXT _restorearg(SB), 1, $0 + RET + TEXT _callpc(SB), 1, $0 MOVL argp+0(FP), AX MOVL 4(AX), AX --- /sys/src/libc/68000/main9p.s Thu Apr 12 12:26:15 2012 +++ /sys/src/libc/68000/main9p.s Wed Sep 19 05:04:06 2012 @@ -22,6 +22,12 @@ TEXT _savearg(SB), 1, $0 RTS +TEXT _saveret(SB), 1, $0 + RTS + +TEXT _restorearg(SB), 1, $0 + RTS + TEXT _callpc(SB), 1, $0 MOVL argp+0(FP), A0 MOVL 4(A0), R0 --- /sys/src/libc/68020/main9p.s Thu Apr 12 12:26:15 2012 +++ /sys/src/libc/68020/main9p.s Wed Sep 19 05:04:08 2012 @@ -23,6 +23,12 @@ TEXT _savearg(SB), 1, $0 RTS +TEXT _saveret(SB), 1, $0 + RTS + +TEXT _restorearg(SB), 1, $0 + RTS + TEXT _callpc(SB), 1, $0 MOVL argp+0(FP), A0 MOVL 4(A0), R0 --- /sys/src/libc/alpha/main9p.s Thu Apr 12 12:26:16 2012 +++ /sys/src/libc/alpha/main9p.s Wed Sep 19 05:04:09 2012 @@ -29,6 +29,12 @@ TEXT _savearg(SB), 1, $0 RET +TEXT _saveret(SB), 1, $0 + RET + +TEXT _restorearg(SB), 1, $0 + RET + TEXT _callpc(SB), 1, $0 MOVL argp-8(FP), R0 RET --- /sys/src/libc/amd64/main9p.s Thu Apr 12 12:26:16 2012 +++ /sys/src/libc/amd64/main9p.s Tue Sep 18 21:54:30 2012 @@ -27,8 +27,14 @@ MOVQ RARG, AX RET +TEXT _saveret(SB), 1, $0 + RET + +TEXT _restorearg(SB), 1, $0 + RET /* we want RARG in RARG */ + TEXT _callpc(SB), 1, $0 - MOVQ 4(RARG), AX + MOVQ 8(RARG), AX RET DATA _exits<>+0(SB)/4, $"main" --- /sys/src/libc/arm/main9p.s Thu Apr 12 12:26:17 2012 +++ /sys/src/libc/arm/main9p.s Wed Sep 19 05:04:11 2012 @@ -34,6 +34,12 @@ TEXT _savearg(SB), 1, $0 RET +TEXT _saveret(SB), 1, $0 + RET + +TEXT _restorearg(SB), 1, $0 + RET + TEXT _callpc(SB), 1, $-4 MOVW 0(R13), R(arg) RET --- /sys/src/libc/mips/main9p.s Thu Apr 12 12:26:17 2012 +++ /sys/src/libc/mips/main9p.s Wed Sep 19 05:04:10 2012 @@ -28,6 +28,12 @@ TEXT _savearg(SB), 1, $0 RET +TEXT _saveret(SB), 1, $0 + RET + +TEXT _restorearg(SB), 1, $0 + RET + TEXT _callpc(SB), 1, $0 MOVW argp-4(FP), R1 RET --- /sys/src/libc/power/main9p.s Thu Apr 12 12:26:19 2012 +++ /sys/src/libc/power/main9p.s Wed Sep 19 05:04:12 2012 @@ -29,6 +29,12 @@ TEXT _savearg(SB), 1, $0 RETURN +TEXT _saveret(SB), 1, $0 + RETURN + +TEXT _restorearg(SB), 1, $0 + RETURN + TEXT _callpc(SB), 1, $0 MOVW argp-4(FP), R3 RETURN --- /sys/src/libc/power64/main9p.s Thu Jan 1 00:00:00 1970 +++ /sys/src/libc/power64/main9p.s Wed Sep 19 05:04:13 2012 @@ -0,0 +1,41 @@ +#define NPRIVATES 16 + +TEXT _mainp(SB), 1, $(2*8 + NPRIVATES*8) + + MOVD $setSB(SB), R2 + MOVD R3, _tos(SB) + + MOVD $p-64(SP), R4 + MOVD R4, _privates+0(SB) + MOVW $16, R4 + MOVW R4, _nprivates+0(SB) + + BL _profmain(SB) + MOVD _tos(SB), R3 + MOVD 8(R3), R4 + MOVD R4, 0(R3) + MOVW inargc-4(FP), R3 + MOVD $inargv+0(FP), R4 + MOVD R4, 16(R1) + BL main(SB) +loop: + MOVD $exits<>(SB), R3 + BL exits(SB) + MOVD $_profin(SB), R3 /* force loading of profile */ + BR loop + +TEXT _savearg(SB), 1, $0 + RETURN + +TEXT _saveret(SB), 1, $0 + RETURN + +TEXT _restorearg(SB), 1, $0 + RETURN + +TEXT _callpc(SB), 1, $0 + MOVD argp-8(FP), R3 + RETURN + +DATA exits<>+0(SB)/4, $"main" +GLOBL exits<>+0(SB), $5 --- /sys/src/libc/sparc/main9p.s Thu Apr 12 12:26:19 2012 +++ /sys/src/libc/sparc/main9p.s Wed Sep 19 05:04:14 2012 @@ -36,6 +36,12 @@ TEXT _savearg(SB), 1, $0 RETURN +TEXT _saveret(SB), 1, $0 + RETURN + +TEXT _restorearg(SB), 1, $0 + RETURN + TEXT _callpc(SB), 1, $0 MOVW argp-4(FP), R7 RETURN