shithub: patch

Download patch

ref: b998b1b45649a1ce604ce7460f9378efc74a6110
parent: d81d83a3a040ff1ee7ff6d54c4980714cb1ac04b
author: qwx <qwx@sciops.net>
date: Mon Nov 3 04:11:40 EST 2025

add ape-prof: update ape prof code (pending)

_IO_cleanup doesn't need to be in this.

--- /dev/null
+++ b/ape-prof
@@ -1,0 +1,160 @@
+diff 14d4c7d7ba8b347739e7b1fbf2eb4b5eeec85762 uncommitted
+--- a/sys/src/ape/lib/ap/plan9/_envsetup.c
++++ b/sys/src/ape/lib/ap/plan9/_envsetup.c
+@@ -27,6 +27,8 @@
+ 	Envhunk=7000,
+ };
+ 
++#pragma profile off
++
+ void
+ _envsetup(void)
+ {
+@@ -134,3 +136,5 @@
+ 			_sighdlr[sig] = SIG_IGN;
+ 	}
+ }
++
++#pragma profile on
+--- a/sys/src/ape/lib/ap/plan9/profile.c
++++ b/sys/src/ape/lib/ap/plan9/profile.c
+@@ -18,6 +18,7 @@
+ typedef long long vlong;
+ typedef unsigned long ulong;
+ typedef unsigned long long uvlong;
++typedef unsigned char uchar;
+ 
+ #include	"/sys/include/tos.h"
+ 
+@@ -26,7 +27,10 @@
+ extern	void*	_saveret(void);
+ extern	void*	_savearg(void);
+ extern	void	_cycles(uvlong*);	/* 64-bit value of the cycle counter if there is one, 0 if there isn't */
++extern	void	_envsetup(void);
+ 
++extern	char	**environ;
++
+ static ulong	khz;
+ static ulong	perr;
+ static int	havecycles;
+@@ -164,10 +168,11 @@
+ _profdump(void)
+ {
+ 	int f;
+-	long n;
++	vlong n;
+ 	Plink *p;
+ 	char *vp;
+ 	char filename[64];
++	uchar hdr[3+1+8] = {'p', 'r', 0x0f, 0x2};
+ 
+ 	if (_tos->prof.what == 0)
+ 		return;	/* No profiling */
+@@ -202,8 +207,17 @@
+ 		_tos->prof.first->time = _tos->clock;
+ 		break;
+ 	}
++	hdr[4+0] = _tos->cyclefreq>>56;
++	hdr[4+1] = _tos->cyclefreq>>48;
++	hdr[4+2] = _tos->cyclefreq>>40;
++	hdr[4+3] = _tos->cyclefreq>>32;
++	hdr[4+4] = _tos->cyclefreq>>24;
++	hdr[4+5] = _tos->cyclefreq>>16;
++	hdr[4+6] = _tos->cyclefreq>>8;
++	hdr[4+7] = _tos->cyclefreq;
++	write(f, hdr, sizeof hdr);
++ 
+ 	vp = (char*)_tos->prof.first;
+-
+ 	for(p = _tos->prof.first; p <= _tos->prof.next; p++) {
+ 
+ 		/*
+@@ -248,16 +262,16 @@
+ 		/*
+ 		 * vlong time
+ 		 */
+-		if (havecycles){
+-			n = (vlong)(p->time / (vlong)khz);
+-		}else
+-			n = p->time;
+-
+-		vp[0] = n>>24;
+-		vp[1] = n>>16;
+-		vp[2] = n>>8;
+-		vp[3] = n;
+-		vp += 4;
++		n = p->time;
++		vp[0] = n>>56;
++		vp[1] = n>>48;
++		vp[2] = n>>40;
++		vp[3] = n>>32;
++		vp[4] = n>>24;
++		vp[5] = n>>16;
++		vp[6] = n>>8;
++		vp[7] = n;
++		vp += 8;
+ 	}
+ 	write(f, (char*)_tos->prof.first, vp - (char*)_tos->prof.first);
+ 	close(f);
+@@ -283,11 +297,7 @@
+ 	char ename[50];
+ 	int n, f;
+ 
+-	n = 2000;
+-	if (_tos->cyclefreq != 0LL){
+-		khz = _tos->cyclefreq / 1000;	/* Report times in milliseconds */
+-		havecycles = 1;
+-	}
++	n = 256*1024;
+ 	f = open("/env/profsize", OREAD|OCEXEC);
+ 	if(f >= 0) {
+ 		memset(ename, 0, sizeof(ename));
+@@ -310,6 +320,7 @@
+ 		else if (strcmp(ename, "sample") == 0)
+ 			_tos->prof.what = Profsample;
+ 	}
++	_envsetup();
+ 	_tos->prof.first = sbrk(n*sizeof(Plink));
+ 	_tos->prof.last = sbrk(0);
+ 	_tos->prof.next = _tos->prof.first;
+@@ -318,8 +329,8 @@
+ 	atexit(_profdump);
+ 	_tos->clock = 1;
+ 	_tos->prof.pp = _tos->prof.next;
+-	extern int _apemain(int, char**);
+-	return _apemain(argc, argv);
++	extern int main(int, char**, char**);
++	return main(argc, argv, environ);
+ }
+ 
+ void prof(void (*fn)(void*), void *arg, int entries, int what)
+--- a/sys/src/ape/lib/ap/stdio/_IO_putc.c
++++ b/sys/src/ape/lib/ap/stdio/_IO_putc.c
+@@ -3,9 +3,11 @@
+  */
+ #include "iolib.h"
+ 
++#pragma profile off
+ void _IO_cleanup(void){
+ 	fflush(NULL);
+ }
++#pragma profile on
+ /*
+  * Look this over for simplification
+  */
+--- a/sys/src/ape/lib/ap/stdio/exit.c
++++ b/sys/src/ape/lib/ap/stdio/exit.c
+@@ -1,4 +1,7 @@
+ #include <unistd.h>
++
++#pragma profile off
++
+ #define	NONEXIT	34
+ int (*_atexitfns[NONEXIT])(void);
+ void _doatexits(void){
+@@ -15,3 +18,5 @@
+ 	_doatexits();
+ 	_exit(status);
+ }
++
++#pragma profile on
--