9front - general discussion about 9front
 help / color / mirror / Atom feed
* [9front] [PATCH] libc: add _callmain to share more initialization code
@ 2023-12-29  7:05 Jacob Moody
  2023-12-31  0:22 ` Jacob Moody
  0 siblings, 1 reply; 2+ messages in thread
From: Jacob Moody @ 2023-12-29  7:05 UTC (permalink / raw)
  To: 9front

Before each arch had to implement the _privates array
themselves in assembly, which meant it was quite easy
for them to get out of sync. This cleans this up to be
a single enum and shares this initialization code.

This code also reduces a lot of redundant copying,
by just perserving the stack as is, pushing our main function
and then JMP'ing.

Tested with amd64 hardware, 386 qemu, arm64 qemu, 5e, ki, vi, and ki
The only thing I was unable to test in some capacity was the 68k stuff,
perhaps a resident 68k fan can help review. Would also appreciate some
testing with arm32, mips and spim hardware.

Assembly is not something I am super comfortable with, this has already
done a lot of lookover by cinap but I could have easily missed more issues.
---
diff caec06be08d80ed5c6d99367604dbba006d6013f 46acc8fa0520cd8586253a972b55a5f26faa6a47
--- a/sys/src/libc/386/argv0.s
+++ b/sys/src/libc/386/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/386/main9.s
+++ b/sys/src/libc/386/main9.s
@@ -1,21 +1,7 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(8+NPRIVATES*4)
+TEXT	_main(SB), 1, $0
 	MOVL	AX, _tos(SB)
-	LEAL	8(SP), AX
-	MOVL	AX, _privates(SB)
-	MOVL	$NPRIVATES, _nprivates(SB)
-	MOVL	inargc-4(FP), AX
-	MOVL	AX, 0(SP)
-	LEAL	inargv+0(FP), AX
-	MOVL	AX, 4(SP)
-	CALL	main(SB)
-
-loop:
-	MOVL	$_exits<>(SB), AX
-	MOVL	AX, 0(SP)
-	CALL	exits(SB)
-	JMP	loop
-
-DATA	_exits<>+0(SB)/4, $"main"
-GLOBL	_exits<>+0(SB), $5
+	MOVL	$main(SB), AX
+	PUSHL	AX
+	PUSHL	$0
+	MOVL	$_callmain(SB), AX
+	JMP*	AX
--- a/sys/src/libc/386/main9p.s
+++ b/sys/src/libc/386/main9p.s
@@ -1,30 +1,11 @@
-#define NPRIVATES	16
-
-TEXT	_mainp(SB), 1, $(8+NPRIVATES*4)
-	/* _tos = arg */
+TEXT	_mainp(SB), 1, $0
 	MOVL	AX, _tos(SB)
-	LEAL	8(SP), AX
-	MOVL	AX, _privates(SB)
-	MOVL	$NPRIVATES, _nprivates(SB)
-	/* _profmain(); */
-	CALL	_profmain(SB)
-	/* _tos->prof.pp = _tos->prof.next; */
-	MOVL	_tos+0(SB),DX
-	MOVL	4(DX),CX
-	MOVL	CX,(DX)
-	/* main(argc, argv); */
-	MOVL	inargc-4(FP), AX
-	MOVL	AX, 0(SP)
-	LEAL	inargv+0(FP), AX
-	MOVL	AX, 4(SP)
-	CALL	main(SB)
-
-loop:
-	MOVL	$_exits<>(SB), AX
-	MOVL	AX, 0(SP)
-	CALL	exits(SB)
+	MOVL	$_profmain(SB), AX
+	PUSHL	AX
+	PUSHL	$0
+	MOVL	$_callmain(SB), AX
+	JMP*	AX
 	MOVL	$_profin(SB), AX	/* force loading of profile */
-	JMP	loop

 TEXT	_saveret(SB), 1, $0
 TEXT	_savearg(SB), 1, $0
--- a/sys/src/libc/68000/argv0.s
+++ b/sys/src/libc/68000/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/68000/main9.s
+++ b/sys/src/libc/68000/main9.s
@@ -1,18 +1,13 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(16 + NPRIVATES*4)
+TEXT	_main(SB), 1, $0
 	MOVL	$a6base(SB), A6
 	MOVL	R0, _tos(SB)
-	LEA	p-64(SP),A0
-	MOVL	A0,_privates+0(SB)
-	MOVL	$16,R0
-	MOVL	R0,_nprivates+0(SB)
-	PEA	inargv+0(FP)
-	MOVL	inargc-4(FP), TOS
-	BSR	main(SB)
+	PEA	main(SB)
+	BSR	_callmain(SB)
+
+loop:
 	PEA	_exits<>+0(SB)
 	BSR	exits(SB)
-	RTS
+	BRA	loop

 DATA	_exits<>+0(SB)/4, $"main"
 GLOBL	_exits<>+0(SB), $5
--- a/sys/src/libc/68000/main9p.s
+++ b/sys/src/libc/68000/main9p.s
@@ -1,17 +1,8 @@
-#define NPRIVATES	16
-
-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
+TEXT	_mainp(SB), 1, $0
 	MOVL	$a6base(SB), A6
-	MOVL	R0, _tos(SB)		/* return value of sys exec!! */
-	LEA	p-64(SP),A0
-	MOVL	A0,_privates+0(SB)
-	MOVL	$16,R0
-	MOVL	R0,_nprivates+0(SB)
-	BSR	_profmain(SB)
-	MOVL	__prof+4(SB), __prof+0(SB)
-	PEA	inargv+0(FP)
-	MOVL	inargc-4(FP), TOS
-	BSR	main(SB)
+	MOVL	R0, _tos(SB)
+	PEA	_profmain(SB)
+	BSR	_callmain(SB)

 loop:
 	PEA	_exits<>+0(SB)
--- a/sys/src/libc/68020/argv0.s
+++ b/sys/src/libc/68020/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/68020/main9.s
+++ b/sys/src/libc/68020/main9.s
@@ -1,19 +1,13 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(16 + NPRIVATES*4)
+TEXT	_main(SB), 1, $0
 	MOVL	$a6base(SB), A6
 	MOVL	R0, _tos(SB)
-	LEA	p-64(SP),A0
-	MOVL	A0,_privates+0(SB)
-	MOVL	$16,R0
-	MOVL	R0,_nprivates+0(SB)
-	PEA	inargv+0(FP)
-	MOVL	inargc-4(FP), TOS
-	BSR	main(SB)
-	MOVL	$_exits<>+0(SB), R0
-	MOVL	R0,TOS
+	PEA	main(SB)
+	BSR	_callmain(SB)
+
+loop:
+	PEA	_exits<>+0(SB)
 	BSR	exits(SB)
-	RTS
+	BRA	loop

 DATA	_exits<>+0(SB)/4, $"main"
 GLOBL	_exits<>+0(SB), $5
--- a/sys/src/libc/68020/main9p.s
+++ b/sys/src/libc/68020/main9p.s
@@ -1,21 +1,11 @@
-#define NPRIVATES	16
-
-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
+TEXT	_mainp(SB), 1, $0
 	MOVL	$a6base(SB), A6
-	MOVL	R0, _tos(SB)		/* return value of sys exec!! */
-	LEA	p-64(SP),A0
-	MOVL	A0,_privates+0(SB)
-	MOVL	$16,R0
-	MOVL	R0,_nprivates+0(SB)
-	BSR	_profmain(SB)
-	MOVL	__prof+4(SB), __prof+0(SB)
-	PEA	inargv+0(FP)
-	MOVL	inargc-4(FP), TOS
-	BSR	main(SB)
+	MOVL	R0, _tos(SB)
+	PEA	_profmain(SB)
+	BSR	_callmain(SB)

 loop:
-	MOVL	$_exits<>+0(SB), R0
-	MOVL	R0,TOS
+	PEA	_exits<>+0(SB)
 	BSR	exits(SB)
 	LEA	_profin(SB), A0		/* force loading of profile */
 	BRA	loop
--- /dev/null
+++ b/sys/src/libc/9sys/callmain.c
@@ -1,0 +1,24 @@
+#include <u.h>
+#include <libc.h>
+
+void **_privates;
+int _nprivates;
+
+enum{
+	NPRIVATES=16,
+};
+
+#pragma profile off
+
+void
+_callmain(void (*main)(int, char**), int argc, char *arg0)
+{
+	void *privates[NPRIVATES];
+
+	_privates = privates;
+	_nprivates = NPRIVATES;
+	main(argc, &arg0);
+	exits("main");
+}
+
+#pragma profile on
--- a/sys/src/libc/9sys/mkfile
+++ b/sys/src/libc/9sys/mkfile
@@ -5,6 +5,7 @@
 	abort.$O\
 	access.$O\
 	announce.$O\
+	callmain.$O\
 	convD2M.$O\
 	convM2D.$O\
 	convM2S.$O\
--- a/sys/src/libc/amd64/argv0.s
+++ b/sys/src/libc/amd64/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $8
 GLOBL	_tos(SB), $8
-GLOBL	_privates(SB), $8
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/amd64/main9.s
+++ b/sys/src/libc/amd64/main9.s
@@ -1,19 +1,7 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(2*8+NPRIVATES*8)
+TEXT	_main(SB), 1, $0
 	MOVQ	AX, _tos(SB)
-	LEAQ	16(SP), AX
-	MOVQ	AX, _privates(SB)
-	MOVL	$NPRIVATES, _nprivates(SB)
-	MOVL	inargc-8(FP), RARG
-	LEAQ	inargv+0(FP), AX
-	MOVQ	AX, 8(SP)
-	CALL	main(SB)
-
-loop:
-	MOVQ	$_exits<>(SB), RARG
-	CALL	exits(SB)
-	JMP	loop
-
-DATA	_exits<>+0(SB)/4, $"main"
-GLOBL	_exits<>+0(SB), $5
+	MOVQ	$main(SB), RARG
+	PUSHQ	RARG
+	PUSHQ	$0
+	MOVQ	$_callmain(SB), AX
+	JMP*	AX
--- a/sys/src/libc/amd64/main9p.s
+++ b/sys/src/libc/amd64/main9p.s
@@ -1,27 +1,12 @@
-#define NPRIVATES	16
+TEXT	_mainp(SB), 1, $0
+	MOVQ	AX, _tos(SB)
+	MOVQ	$_profmain(SB), RARG
+	PUSHQ	RARG
+	PUSHQ	$0
+	MOVQ	$_callmain(SB), AX
+	JMP*	AX

-TEXT _mainp(SB), 1, $(2*8+NPRIVATES*8)
-	MOVQ	AX, _tos(SB)		/* _tos = arg */
-	LEAQ	16(SP), AX
-	MOVQ	AX, _privates(SB)
-	MOVL	$NPRIVATES, _nprivates(SB)
-
-	CALL	_profmain(SB)		/* _profmain(); */
-
-	MOVQ	_tos+0(SB), DX		/* _tos->prof.pp = _tos->prof.next; */
-	MOVQ	8(DX), CX
-	MOVQ	CX, (DX)
-
-	MOVL	inargc-8(FP), RARG	/* main(argc, argv); */
-	LEAQ	inargv+0(FP), AX
-	MOVQ	AX, 8(SP)
-	CALL	main(SB)
-
-loop:
-	MOVQ	$_exits<>(SB), RARG
-	CALL	exits(SB)
 	MOVQ	$_profin(SB), AX	/* force loading of profile */
-	JMP	loop

 TEXT	_savearg(SB), 1, $0
 	MOVQ	RARG, AX
@@ -33,6 +18,3 @@
 TEXT	_callpc(SB), 1, $0
 	MOVQ	8(RARG), AX
 	RET
-
-DATA	_exits<>+0(SB)/4, $"main"
-GLOBL	_exits<>+0(SB), $5
--- a/sys/src/libc/arm/argv0.s
+++ b/sys/src/libc/arm/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/arm/main9.s
+++ b/sys/src/libc/arm/main9.s
@@ -1,29 +1,14 @@
-#define NPRIVATES	16
-
 arg=0
 sp=13
 sb=12
+lr=14

-TEXT	_main(SB), 1, $(16 + NPRIVATES*4)
+TEXT	_main(SB), 1, $4
 	MOVW	$setR12(SB), R(sb)
 	MOVW	R(arg), _tos(SB)

-	MOVW	$p-64(SP), R1
-	MOVW	R1, _privates(SB)
-	MOVW	$NPRIVATES, R1
-	MOVW	R1, _nprivates(SB)
+	MOVW	$main(SB), R(arg)
+	MOVW	$0, R(lr)
+	B	_callmain(SB)

-	MOVW	$inargv+0(FP), R(arg)
-	MOVW	R(arg), 8(R(sp))
-	MOVW	inargc-4(FP), R(arg)
-	MOVW	R(arg), 4(R(sp))
-	BL	main(SB)
-loop:
-	MOVW	$_exitstr<>(SB), R(arg)
-	MOVW	R(arg), 4(R(sp))
-	BL	exits(SB)
-	BL	_div(SB)
-	B	loop
-
-DATA	_exitstr<>+0(SB)/4, $"main"
-GLOBL	_exitstr<>+0(SB), $5
+	BL	_div(SB)	/* force loading of div */
--- a/sys/src/libc/arm/main9p.s
+++ b/sys/src/libc/arm/main9p.s
@@ -1,35 +1,18 @@
-#define NPRIVATES	16
-
 arg=0
 sp=13
 sb=12
+lr=14

-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
+TEXT	_mainp(SB), 1, $4
 	MOVW	$setR12(SB), R(sb)
 	MOVW	R(arg), _tos(SB)

-	MOVW	$p-64(SP), R1
-	MOVW	R1, _privates(SB)
-	MOVW	$NPRIVATES, R1
-	MOVW	R1, _nprivates(SB)
+	MOVW	$_profmain(SB), R(arg)
+	MOVW	$0, R(lr)
+	B	_callmain(SB)

-	BL	_profmain(SB)
-	MOVW	_tos(SB), R1
-	MOVW	4(R1), R0
-	MOVW	R0, 0(R1)
-
-	MOVW	$inargv+0(FP), R(arg)
-	MOVW	R(arg), 8(R(sp))
-	MOVW	inargc-4(FP), R(arg)
-	MOVW	R(arg), 4(R(sp))
-	BL	main(SB)
-loop:
-	MOVW	$_exitstr<>(SB), R(arg)
-	MOVW	R(arg), 4(R(sp))
-	BL	exits(SB)
 	MOVW	$_div(SB), R(arg)	/* force loading of div */
 	MOVW	$_profin(SB), R(arg)	/* force loading of profile */
-	B	loop

 TEXT	_saveret(SB), 1, $0
 TEXT	_savearg(SB), 1, $0
@@ -38,6 +21,3 @@
 TEXT	_callpc(SB), 1, $-4
 	MOVW	0(R13), R(arg)
 	RET
-
-DATA	_exitstr<>+0(SB)/4, $"main"
-GLOBL	_exitstr<>+0(SB), $5
--- a/sys/src/libc/arm64/argv0.s
+++ b/sys/src/libc/arm64/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $8
 GLOBL	_tos(SB), $8
-GLOBL	_privates(SB), $8
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/arm64/main9.s
+++ b/sys/src/libc/arm64/main9.s
@@ -1,25 +1,8 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(16 + NPRIVATES*8)
+TEXT	_main(SB), 1, $8
 	MOV	$setSB(SB), R28
 	MOV	R0, _tos(SB)

-	ADD	$32, RSP, R1
-	MOV	R1, _privates(SB)
-	MOVW	$NPRIVATES, R2
-	MOVW	R2, _nprivates(SB)
+	MOV	$main(SB), R0

-	MOV	$inargv+0(FP), R1
-	MOV	R1, 16(RSP)
-
-	MOVW	inargc-8(FP), R0
-	MOV	R0, 8(RSP)
-
-	BL	main(SB)
-loop:
-	MOV	$_exitstr<>(SB), R0
-	BL	exits(SB)
-	B	loop
-
-DATA	_exitstr<>+0(SB)/4, $"main"
-GLOBL	_exitstr<>+0(SB), $5
+	MOV	$0, R30
+	B	_callmain(SB)
--- a/sys/src/libc/arm64/main9p.s
+++ b/sys/src/libc/arm64/main9p.s
@@ -1,32 +1,13 @@
-#define NPRIVATES	16
-
-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*8)
+TEXT	_mainp(SB), 1, $8
 	MOV	$setSB(SB), R28
 	MOV	R0, _tos(SB)

-	ADD	$32, RSP, R1
-	MOV	R1, _privates(SB)
-	MOVW	$NPRIVATES, R2
-	MOVW	R2, _nprivates(SB)
+	MOV	$_profmain(SB), R0

-	BL	_profmain(SB)
+	MOV	$0, R30
+	B	_callmain(SB)

-	MOV	_tos(SB), R0	/* _tos->prof.pp = _tos->prof.next; */
-	MOV	8(R0), R1
-	MOV	R1, 0(R0)
-
-	MOV	$inargv+0(FP), R1
-	MOV	R1, 16(RSP)
-
-	MOVW	inargc-8(FP), R0
-	MOV	R0, 8(RSP)
-
-	BL	main(SB)
-loop:
-	MOV	$_exitstr<>(SB), R0
-	BL	exits(SB)
 	MOV	$_profin(SB), R0
-	B	loop

 TEXT	_callpc(SB), 1, $-4
 	MOV	0(SP), R0
--- a/sys/src/libc/mips/argv0.s
+++ b/sys/src/libc/mips/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/mips/main9.s
+++ b/sys/src/libc/mips/main9.s
@@ -1,25 +1,8 @@
-#define NPRIVATES	16
+TEXT	_main(SB), 1, $4

-TEXT	_main(SB), 1, $(16 + NPRIVATES*4)
-
 	MOVW	$setR30(SB), R30
 	MOVW	R1, _tos(SB)

-	MOVW	$p-64(SP), R1
-	MOVW	R1, _privates(SB)
-	MOVW	$NPRIVATES, R1
-	MOVW	R1, _nprivates(SB)
-
-	MOVW	inargc-4(FP), R1
-	MOVW	$inargv+0(FP), R2
-	MOVW	R1, 4(R29)
-	MOVW	R2, 8(R29)
-	JAL	main(SB)
-loop:
-	MOVW	$_exitstr<>(SB), R1
-	MOVW	R1, 4(R29)
-	JAL	exits(SB)
-	JMP	loop
-
-DATA	_exitstr<>+0(SB)/4, $"main"
-GLOBL	_exitstr<>+0(SB), $5
+	MOVW	$main(SB), R1
+	MOVW	$0, R31
+	JMP	_callmain(SB)
--- a/sys/src/libc/mips/main9p.s
+++ b/sys/src/libc/mips/main9p.s
@@ -1,29 +1,12 @@
-#define NPRIVATES	16
+TEXT	_mainp(SB), 1, $4

-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
-
 	MOVW	$setR30(SB), R30
 	MOVW	R1, _tos(SB)

-	MOVW	$p-64(SP), R1
-	MOVW	R1, _privates(SB)
-	MOVW	$NPRIVATES, R1
-	MOVW	R1, _nprivates(SB)
-
-	JAL	_profmain(SB)
-	MOVW	__prof+4(SB), R1
-	MOVW	R1, __prof+0(SB)
-	MOVW	inargc-4(FP), R1
-	MOVW	$inargv+0(FP), R2
-	MOVW	R1, 4(R29)
-	MOVW	R2, 8(R29)
-	JAL	main(SB)
-loop:
-	MOVW	$exits<>(SB), R1
-	MOVW	R1, 4(R29)
-	JAL	exits(SB)
+	MOVW	$_profmain(SB), R1
+	MOVW	$0, R31
+	JMP	_callmain(SB)
 	MOVW	$_profin(SB), R0	/* force loading of profile */
-	JMP	loop

 TEXT	_saveret(SB), 1, $0
 TEXT	_savearg(SB), 1, $0
--- a/sys/src/libc/port/profile.c
+++ b/sys/src/libc/port/profile.c
@@ -235,7 +235,7 @@
 }

 void
-_profmain(void)
+_profmain(int argc, char **argv)
 {
 	char ename[50];
 	int n, f;
@@ -274,6 +274,9 @@
 	_tos->prof.pid = _tos->pid;
 	atexit(_profdump);
 	_tos->clock = 1;
+	_tos->prof.pp = _tos->prof.next;
+	extern void main(int, char**);
+	main(argc, argv);
 }

 void prof(void (*fn)(void*), void *arg, int entries, int what)
--- a/sys/src/libc/power/argv0.s
+++ b/sys/src/libc/power/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/power/main9.s
+++ b/sys/src/libc/power/main9.s
@@ -1,23 +1,12 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(16 + NPRIVATES*4)
-
+TEXT	_main(SB), 1, $0
 	MOVW	$setSB(SB), R2
 	MOVW	R3, _tos(SB)

-	MOVW	$p-64(SP), R4
-	MOVW	R4, _privates+0(SB)
-	MOVW	$16, R4
-	MOVW	R4, _nprivates+0(SB)
-
-	MOVW	inargc-4(FP), R3
-	MOVW	$inargv+0(FP), R4
+	MOVW	$main(SB), R3
 	MOVW	R3, 4(R1)
-	MOVW	R4, 8(R1)
-	BL	main(SB)
+	BL	_callmain(SB)
 loop:
 	MOVW	$_exitstr<>(SB), R3
-	MOVW	R3, 4(R1)
 	BL	exits(SB)
 	BR	loop

--- a/sys/src/libc/power/main9p.s
+++ b/sys/src/libc/power/main9p.s
@@ -1,27 +1,12 @@
-#define NPRIVATES	16
-
-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
-
+TEXT	_mainp(SB), 1, $0
 	MOVW	$setSB(SB), R2
 	MOVW	R3, _tos(SB)

-	MOVW	$p-64(SP), R4
-	MOVW	R4, _privates+0(SB)
-	MOVW	$16, R4
-	MOVW	R4, _nprivates+0(SB)
-
-	BL	_profmain(SB)
-	MOVW	_tos(SB), R3
-	MOVW	4(R3), R4
-	MOVW	R4, 0(R3)
-	MOVW	inargc-4(FP), R3
-	MOVW	$inargv+0(FP), R4
+	MOVW	$_profmain(SB), R3
 	MOVW	R3, 4(R1)
-	MOVW	R4, 8(R1)
-	BL		main(SB)
+	BL	_callmain(SB)
 loop:
 	MOVW	$exits<>(SB), R3
-	MOVW	R3, 4(R1)
 	BL	exits(SB)
 	MOVW	$_profin(SB), R3	/* force loading of profile */
 	BR	loop
--- a/sys/src/libc/sparc/argv0.s
+++ b/sys/src/libc/sparc/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/sparc/main9.s
+++ b/sys/src/libc/sparc/main9.s
@@ -1,14 +1,8 @@
-#define NPRIVATES	16
+TEXT	_main(SB), 1, $0

-TEXT	_main(SB), 1, $(16 + NPRIVATES*4)
-
 	MOVW	$setSB(SB), R2
 	MOVW	R7, _tos(SB)

-	MOVW	$p-64(SP),R7
-	MOVW	R7,_privates+0(SB)
-	MOVW	$16,R7
-	MOVW	R7,_nprivates+0(SB)
 /*
 	MOVW	_fpsr+0(SB), FSR
 	FMOVD	$0.5, F26
@@ -16,10 +10,8 @@
 	FADDD	F26, F26, F28
 	FADDD	F28, F28, F30
 */
-	MOVW	inargc-4(FP), R7
-	MOVW	$inargv+0(FP), R8
-	MOVW	R8, 8(R1)
-	JMPL	main(SB)
+	MOVW	$main(SB), R7
+	JMPL	_callmain(SB)

 loop:
 	MOVW	$_exits<>(SB), R7
--- a/sys/src/libc/sparc/main9p.s
+++ b/sys/src/libc/sparc/main9p.s
@@ -1,14 +1,8 @@
-#define NPRIVATES	16
+TEXT	_mainp(SB), 1, $0

-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
-
 	MOVW	$setSB(SB), R2
 	MOVW	R7, _tos(SB)

-	MOVW	$p-64(SP),R7
-	MOVW	R7,_privates+0(SB)
-	MOVW	$16,R7
-	MOVW	R7,_nprivates+0(SB)
 /*
 	MOVW	_fpsr+0(SB), FSR
 	FMOVD	$0.5, F26
@@ -16,16 +10,8 @@
 	FADDD	F26, F26, F28
 	FADDD	F28, F28, F30
 */
-
-	JMPL	_profmain(SB)
-	MOVW	__prof+4(SB), R7
-	MOVW	R7, __prof+0(SB)
-
-	MOVW	inargc-4(FP), R7
-	MOVW	$inargv+0(FP), R8
-	MOVW	R8, 8(R1)
-	JMPL	main(SB)
-
+	MOVW	$_profmain(SB), R7
+	JMPL	_callmain(SB)
 loop:
 	MOVW	$_exits<>(SB), R7
 	JMPL	exits(SB)

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [9front] [PATCH] libc: add _callmain to share more initialization code
  2023-12-29  7:05 [9front] [PATCH] libc: add _callmain to share more initialization code Jacob Moody
@ 2023-12-31  0:22 ` Jacob Moody
  0 siblings, 0 replies; 2+ messages in thread
From: Jacob Moody @ 2023-12-31  0:22 UTC (permalink / raw)
  To: 9front

Another revision on this, again tested on all I could
get. After hacking on this for a bit I think this is
the best its going to get, pending some modifications
to 6? and 8? to make use of another opcode for directly
JMP'ing.
---
diff 069fd98950440119fef047c09e8816e1e1601319 63a34c9fec1f180211246f36226506589d2bb956
--- a/sys/src/libc/386/argv0.s
+++ b/sys/src/libc/386/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/386/main9.s
+++ b/sys/src/libc/386/main9.s
@@ -1,21 +1,7 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(8+NPRIVATES*4)
+TEXT	_main(SB), 1, $0
 	MOVL	AX, _tos(SB)
-	LEAL	8(SP), AX
-	MOVL	AX, _privates(SB)
-	MOVL	$NPRIVATES, _nprivates(SB)
-	MOVL	inargc-4(FP), AX
-	MOVL	AX, 0(SP)
-	LEAL	inargv+0(FP), AX
-	MOVL	AX, 4(SP)
-	CALL	main(SB)
-
-loop:
-	MOVL	$_exits<>(SB), AX
-	MOVL	AX, 0(SP)
-	CALL	exits(SB)
-	JMP	loop
-
-DATA	_exits<>+0(SB)/4, $"main"
-GLOBL	_exits<>+0(SB), $5
+	MOVL	$main(SB), AX
+	PUSHL	AX
+	PUSHL	$0
+	MOVL	$_callmain(SB), AX
+	JMP*	AX
--- a/sys/src/libc/386/main9p.s
+++ b/sys/src/libc/386/main9p.s
@@ -1,30 +1,11 @@
-#define NPRIVATES	16
-
-TEXT	_mainp(SB), 1, $(8+NPRIVATES*4)
-	/* _tos = arg */
+TEXT	_mainp(SB), 1, $0
 	MOVL	AX, _tos(SB)
-	LEAL	8(SP), AX
-	MOVL	AX, _privates(SB)
-	MOVL	$NPRIVATES, _nprivates(SB)
-	/* _profmain(); */
-	CALL	_profmain(SB)
-	/* _tos->prof.pp = _tos->prof.next; */
-	MOVL	_tos+0(SB),DX
-	MOVL	4(DX),CX
-	MOVL	CX,(DX)
-	/* main(argc, argv); */
-	MOVL	inargc-4(FP), AX
-	MOVL	AX, 0(SP)
-	LEAL	inargv+0(FP), AX
-	MOVL	AX, 4(SP)
-	CALL	main(SB)
-
-loop:
-	MOVL	$_exits<>(SB), AX
-	MOVL	AX, 0(SP)
-	CALL	exits(SB)
+	MOVL	$_profmain(SB), AX
+	PUSHL	AX
+	PUSHL	$0
+	MOVL	$_callmain(SB), AX
+	JMP*	AX
 	MOVL	$_profin(SB), AX	/* force loading of profile */
-	JMP	loop

 TEXT	_saveret(SB), 1, $0
 TEXT	_savearg(SB), 1, $0
@@ -34,6 +15,3 @@
 	MOVL	argp+0(FP), AX
 	MOVL	4(AX), AX
 	RET
-
-DATA	_exits<>+0(SB)/4, $"main"
-GLOBL	_exits<>+0(SB), $5
--- a/sys/src/libc/68000/argv0.s
+++ b/sys/src/libc/68000/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/68000/main9.s
+++ b/sys/src/libc/68000/main9.s
@@ -1,18 +1,6 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(16 + NPRIVATES*4)
+TEXT	_main(SB), 1, $0
 	MOVL	$a6base(SB), A6
 	MOVL	R0, _tos(SB)
-	LEA	p-64(SP),A0
-	MOVL	A0,_privates+0(SB)
-	MOVL	$16,R0
-	MOVL	R0,_nprivates+0(SB)
-	PEA	inargv+0(FP)
-	MOVL	inargc-4(FP), TOS
-	BSR	main(SB)
-	PEA	_exits<>+0(SB)
-	BSR	exits(SB)
-	RTS
-
-DATA	_exits<>+0(SB)/4, $"main"
-GLOBL	_exits<>+0(SB), $5
+	PEA	main(SB)
+	MOVL	$0, TOS
+	JMP	_callmain(SB)
--- a/sys/src/libc/68000/main9p.s
+++ b/sys/src/libc/68000/main9p.s
@@ -1,23 +1,10 @@
-#define NPRIVATES	16
-
-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
+TEXT	_mainp(SB), 1, $0
 	MOVL	$a6base(SB), A6
-	MOVL	R0, _tos(SB)		/* return value of sys exec!! */
-	LEA	p-64(SP),A0
-	MOVL	A0,_privates+0(SB)
-	MOVL	$16,R0
-	MOVL	R0,_nprivates+0(SB)
-	BSR	_profmain(SB)
-	MOVL	__prof+4(SB), __prof+0(SB)
-	PEA	inargv+0(FP)
-	MOVL	inargc-4(FP), TOS
-	BSR	main(SB)
-
-loop:
-	PEA	_exits<>+0(SB)
-	BSR	exits(SB)
+	MOVL	R0, _tos(SB)
+	PEA	_profmain(SB)
+	MOVL	$0, TOS
+	JMP	_callmain(SB)
 	LEA	_profin(SB), A0		/* force loading of profile */
-	BRA	loop

 TEXT	_saveret(SB), 1, $0
 TEXT	_savearg(SB), 1, $0
@@ -27,6 +14,3 @@
 	MOVL	argp+0(FP), A0
 	MOVL	4(A0), R0
 	RTS
-
-DATA	_exits<>+0(SB)/4, $"main"
-GLOBL	_exits<>+0(SB), $5
--- a/sys/src/libc/68020/argv0.s
+++ b/sys/src/libc/68020/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/68020/main9.s
+++ b/sys/src/libc/68020/main9.s
@@ -1,19 +1,6 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(16 + NPRIVATES*4)
+TEXT	_main(SB), 1, $0
 	MOVL	$a6base(SB), A6
 	MOVL	R0, _tos(SB)
-	LEA	p-64(SP),A0
-	MOVL	A0,_privates+0(SB)
-	MOVL	$16,R0
-	MOVL	R0,_nprivates+0(SB)
-	PEA	inargv+0(FP)
-	MOVL	inargc-4(FP), TOS
-	BSR	main(SB)
-	MOVL	$_exits<>+0(SB), R0
-	MOVL	R0,TOS
-	BSR	exits(SB)
-	RTS
-
-DATA	_exits<>+0(SB)/4, $"main"
-GLOBL	_exits<>+0(SB), $5
+	PEA	main(SB)
+	MOVL	$0, TOS
+	JMP	_callmain(SB)
--- a/sys/src/libc/68020/main9p.s
+++ b/sys/src/libc/68020/main9p.s
@@ -1,24 +1,10 @@
-#define NPRIVATES	16
-
-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
+TEXT	_mainp(SB), 1, $0
 	MOVL	$a6base(SB), A6
-	MOVL	R0, _tos(SB)		/* return value of sys exec!! */
-	LEA	p-64(SP),A0
-	MOVL	A0,_privates+0(SB)
-	MOVL	$16,R0
-	MOVL	R0,_nprivates+0(SB)
-	BSR	_profmain(SB)
-	MOVL	__prof+4(SB), __prof+0(SB)
-	PEA	inargv+0(FP)
-	MOVL	inargc-4(FP), TOS
-	BSR	main(SB)
-
-loop:
-	MOVL	$_exits<>+0(SB), R0
-	MOVL	R0,TOS
-	BSR	exits(SB)
+	MOVL	R0, _tos(SB)
+	PEA	_profmain(SB)
+	MOVL	$0, TOS
+	JMP	_callmain(SB)
 	LEA	_profin(SB), A0		/* force loading of profile */
-	BRA	loop

 TEXT	_saveret(SB), 1, $0
 TEXT	_savearg(SB), 1, $0
@@ -28,6 +14,3 @@
 	MOVL	argp+0(FP), A0
 	MOVL	4(A0), R0
 	RTS
-
-DATA	_exits<>+0(SB)/4, $"main"
-GLOBL	_exits<>+0(SB), $5
--- /dev/null
+++ b/sys/src/libc/9sys/callmain.c
@@ -1,0 +1,24 @@
+#include <u.h>
+#include <libc.h>
+
+void **_privates;
+int _nprivates;
+
+enum{
+	NPRIVATES=16,
+};
+
+#pragma profile off
+
+void
+_callmain(void (*main)(int, char**), int argc, char *arg0)
+{
+	void *privates[NPRIVATES];
+
+	_privates = privates;
+	_nprivates = NPRIVATES;
+	main(argc, &arg0);
+	exits("main");
+}
+
+#pragma profile on
--- a/sys/src/libc/9sys/mkfile
+++ b/sys/src/libc/9sys/mkfile
@@ -5,6 +5,7 @@
 	abort.$O\
 	access.$O\
 	announce.$O\
+	callmain.$O\
 	convD2M.$O\
 	convM2D.$O\
 	convM2S.$O\
--- a/sys/src/libc/amd64/argv0.s
+++ b/sys/src/libc/amd64/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $8
 GLOBL	_tos(SB), $8
-GLOBL	_privates(SB), $8
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/amd64/main9.s
+++ b/sys/src/libc/amd64/main9.s
@@ -1,19 +1,7 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(2*8+NPRIVATES*8)
+TEXT	_main(SB), 1, $0
 	MOVQ	AX, _tos(SB)
-	LEAQ	16(SP), AX
-	MOVQ	AX, _privates(SB)
-	MOVL	$NPRIVATES, _nprivates(SB)
-	MOVL	inargc-8(FP), RARG
-	LEAQ	inargv+0(FP), AX
-	MOVQ	AX, 8(SP)
-	CALL	main(SB)
-
-loop:
-	MOVQ	$_exits<>(SB), RARG
-	CALL	exits(SB)
-	JMP	loop
-
-DATA	_exits<>+0(SB)/4, $"main"
-GLOBL	_exits<>+0(SB), $5
+	MOVQ	$main(SB), RARG
+	PUSHQ	RARG
+	PUSHQ	$0
+	MOVQ	$_callmain(SB), AX
+	JMP*	AX
--- a/sys/src/libc/amd64/main9p.s
+++ b/sys/src/libc/amd64/main9p.s
@@ -1,27 +1,12 @@
-#define NPRIVATES	16
+TEXT	_mainp(SB), 1, $0
+	MOVQ	AX, _tos(SB)
+	MOVQ	$_profmain(SB), RARG
+	PUSHQ	RARG
+	PUSHQ	$0
+	MOVQ	$_callmain(SB), AX
+	JMP*	AX

-TEXT _mainp(SB), 1, $(2*8+NPRIVATES*8)
-	MOVQ	AX, _tos(SB)		/* _tos = arg */
-	LEAQ	16(SP), AX
-	MOVQ	AX, _privates(SB)
-	MOVL	$NPRIVATES, _nprivates(SB)
-
-	CALL	_profmain(SB)		/* _profmain(); */
-
-	MOVQ	_tos+0(SB), DX		/* _tos->prof.pp = _tos->prof.next; */
-	MOVQ	8(DX), CX
-	MOVQ	CX, (DX)
-
-	MOVL	inargc-8(FP), RARG	/* main(argc, argv); */
-	LEAQ	inargv+0(FP), AX
-	MOVQ	AX, 8(SP)
-	CALL	main(SB)
-
-loop:
-	MOVQ	$_exits<>(SB), RARG
-	CALL	exits(SB)
 	MOVQ	$_profin(SB), AX	/* force loading of profile */
-	JMP	loop

 TEXT	_savearg(SB), 1, $0
 	MOVQ	RARG, AX
@@ -33,6 +18,3 @@
 TEXT	_callpc(SB), 1, $0
 	MOVQ	8(RARG), AX
 	RET
-
-DATA	_exits<>+0(SB)/4, $"main"
-GLOBL	_exits<>+0(SB), $5
--- a/sys/src/libc/arm/argv0.s
+++ b/sys/src/libc/arm/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/arm/main9.s
+++ b/sys/src/libc/arm/main9.s
@@ -1,29 +1,15 @@
-#define NPRIVATES	16
-
 arg=0
 sp=13
 sb=12
+lr=14

-TEXT	_main(SB), 1, $(16 + NPRIVATES*4)
+TEXT	_main(SB), 1, $0
+	SUB	$8, R(sp)
 	MOVW	$setR12(SB), R(sb)
 	MOVW	R(arg), _tos(SB)

-	MOVW	$p-64(SP), R1
-	MOVW	R1, _privates(SB)
-	MOVW	$NPRIVATES, R1
-	MOVW	R1, _nprivates(SB)
+	MOVW	$main(SB), R(arg)
+	MOVW	$0, R(lr)
+	B	_callmain(SB)

-	MOVW	$inargv+0(FP), R(arg)
-	MOVW	R(arg), 8(R(sp))
-	MOVW	inargc-4(FP), R(arg)
-	MOVW	R(arg), 4(R(sp))
-	BL	main(SB)
-loop:
-	MOVW	$_exitstr<>(SB), R(arg)
-	MOVW	R(arg), 4(R(sp))
-	BL	exits(SB)
-	BL	_div(SB)
-	B	loop
-
-DATA	_exitstr<>+0(SB)/4, $"main"
-GLOBL	_exitstr<>+0(SB), $5
+	BL	_div(SB)	/* force loading of div */
--- a/sys/src/libc/arm/main9p.s
+++ b/sys/src/libc/arm/main9p.s
@@ -1,35 +1,19 @@
-#define NPRIVATES	16
-
 arg=0
 sp=13
 sb=12
+lr=14

-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
+TEXT	_mainp(SB), 1, $0
+	SUB	$8, R(sp)
 	MOVW	$setR12(SB), R(sb)
 	MOVW	R(arg), _tos(SB)

-	MOVW	$p-64(SP), R1
-	MOVW	R1, _privates(SB)
-	MOVW	$NPRIVATES, R1
-	MOVW	R1, _nprivates(SB)
+	MOVW	$_profmain(SB), R(arg)
+	MOVW	$0, R(lr)
+	B	_callmain(SB)

-	BL	_profmain(SB)
-	MOVW	_tos(SB), R1
-	MOVW	4(R1), R0
-	MOVW	R0, 0(R1)
-
-	MOVW	$inargv+0(FP), R(arg)
-	MOVW	R(arg), 8(R(sp))
-	MOVW	inargc-4(FP), R(arg)
-	MOVW	R(arg), 4(R(sp))
-	BL	main(SB)
-loop:
-	MOVW	$_exitstr<>(SB), R(arg)
-	MOVW	R(arg), 4(R(sp))
-	BL	exits(SB)
 	MOVW	$_div(SB), R(arg)	/* force loading of div */
 	MOVW	$_profin(SB), R(arg)	/* force loading of profile */
-	B	loop

 TEXT	_saveret(SB), 1, $0
 TEXT	_savearg(SB), 1, $0
@@ -38,6 +22,3 @@
 TEXT	_callpc(SB), 1, $-4
 	MOVW	0(R13), R(arg)
 	RET
-
-DATA	_exitstr<>+0(SB)/4, $"main"
-GLOBL	_exitstr<>+0(SB), $5
--- a/sys/src/libc/arm64/argv0.s
+++ b/sys/src/libc/arm64/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $8
 GLOBL	_tos(SB), $8
-GLOBL	_privates(SB), $8
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/arm64/main9.s
+++ b/sys/src/libc/arm64/main9.s
@@ -1,25 +1,9 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(16 + NPRIVATES*8)
+TEXT	_main(SB), 1, $0
+	SUB	$16, SP
 	MOV	$setSB(SB), R28
 	MOV	R0, _tos(SB)

-	ADD	$32, RSP, R1
-	MOV	R1, _privates(SB)
-	MOVW	$NPRIVATES, R2
-	MOVW	R2, _nprivates(SB)
+	MOV	$main(SB), R0

-	MOV	$inargv+0(FP), R1
-	MOV	R1, 16(RSP)
-
-	MOVW	inargc-8(FP), R0
-	MOV	R0, 8(RSP)
-
-	BL	main(SB)
-loop:
-	MOV	$_exitstr<>(SB), R0
-	BL	exits(SB)
-	B	loop
-
-DATA	_exitstr<>+0(SB)/4, $"main"
-GLOBL	_exitstr<>+0(SB), $5
+	MOV	$0, R30
+	B	_callmain(SB)
--- a/sys/src/libc/arm64/main9p.s
+++ b/sys/src/libc/arm64/main9p.s
@@ -1,32 +1,14 @@
-#define NPRIVATES	16
-
-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*8)
+TEXT	_mainp(SB), 1, $0
+	SUB	$16, SP
 	MOV	$setSB(SB), R28
 	MOV	R0, _tos(SB)

-	ADD	$32, RSP, R1
-	MOV	R1, _privates(SB)
-	MOVW	$NPRIVATES, R2
-	MOVW	R2, _nprivates(SB)
+	MOV	$_profmain(SB), R0

-	BL	_profmain(SB)
+	MOV	$0, R30
+	B	_callmain(SB)

-	MOV	_tos(SB), R0	/* _tos->prof.pp = _tos->prof.next; */
-	MOV	8(R0), R1
-	MOV	R1, 0(R0)
-
-	MOV	$inargv+0(FP), R1
-	MOV	R1, 16(RSP)
-
-	MOVW	inargc-8(FP), R0
-	MOV	R0, 8(RSP)
-
-	BL	main(SB)
-loop:
-	MOV	$_exitstr<>(SB), R0
-	BL	exits(SB)
 	MOV	$_profin(SB), R0
-	B	loop

 TEXT	_callpc(SB), 1, $-4
 	MOV	0(SP), R0
@@ -33,6 +15,3 @@
 TEXT	_saveret(SB), 1, $-4
 TEXT	_savearg(SB), 1, $-4
 	RETURN
-
-DATA	_exitstr<>+0(SB)/4, $"main"
-GLOBL	_exitstr<>+0(SB), $5
--- a/sys/src/libc/mips/argv0.s
+++ b/sys/src/libc/mips/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/mips/main9.s
+++ b/sys/src/libc/mips/main9.s
@@ -1,25 +1,8 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(16 + NPRIVATES*4)
-
+TEXT	_main(SB), 1, $0
+	ADD	$-8, R29
 	MOVW	$setR30(SB), R30
 	MOVW	R1, _tos(SB)

-	MOVW	$p-64(SP), R1
-	MOVW	R1, _privates(SB)
-	MOVW	$NPRIVATES, R1
-	MOVW	R1, _nprivates(SB)
-
-	MOVW	inargc-4(FP), R1
-	MOVW	$inargv+0(FP), R2
-	MOVW	R1, 4(R29)
-	MOVW	R2, 8(R29)
-	JAL	main(SB)
-loop:
-	MOVW	$_exitstr<>(SB), R1
-	MOVW	R1, 4(R29)
-	JAL	exits(SB)
-	JMP	loop
-
-DATA	_exitstr<>+0(SB)/4, $"main"
-GLOBL	_exitstr<>+0(SB), $5
+	MOVW	$main(SB), R1
+	MOVW	$0, R31
+	JMP	_callmain(SB)
--- a/sys/src/libc/mips/main9p.s
+++ b/sys/src/libc/mips/main9p.s
@@ -1,29 +1,12 @@
-#define NPRIVATES	16
-
-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
-
+TEXT	_mainp(SB), 1, $0
+	ADD	$-8, R29
 	MOVW	$setR30(SB), R30
 	MOVW	R1, _tos(SB)

-	MOVW	$p-64(SP), R1
-	MOVW	R1, _privates(SB)
-	MOVW	$NPRIVATES, R1
-	MOVW	R1, _nprivates(SB)
-
-	JAL	_profmain(SB)
-	MOVW	__prof+4(SB), R1
-	MOVW	R1, __prof+0(SB)
-	MOVW	inargc-4(FP), R1
-	MOVW	$inargv+0(FP), R2
-	MOVW	R1, 4(R29)
-	MOVW	R2, 8(R29)
-	JAL	main(SB)
-loop:
-	MOVW	$exits<>(SB), R1
-	MOVW	R1, 4(R29)
-	JAL	exits(SB)
+	MOVW	$_profmain(SB), R1
+	MOVW	$0, R31
+	JMP	_callmain(SB)
 	MOVW	$_profin(SB), R0	/* force loading of profile */
-	JMP	loop

 TEXT	_saveret(SB), 1, $0
 TEXT	_savearg(SB), 1, $0
@@ -32,6 +15,3 @@
 TEXT	_callpc(SB), 1, $0
 	MOVW	argp-4(FP), R1
 	RET
-
-DATA	exits<>+0(SB)/4, $"main"
-GLOBL	exits<>+0(SB), $5
--- a/sys/src/libc/port/profile.c
+++ b/sys/src/libc/port/profile.c
@@ -235,7 +235,7 @@
 }

 void
-_profmain(void)
+_profmain(int argc, char **argv)
 {
 	char ename[50];
 	int n, f;
@@ -274,6 +274,9 @@
 	_tos->prof.pid = _tos->pid;
 	atexit(_profdump);
 	_tos->clock = 1;
+	_tos->prof.pp = _tos->prof.next;
+	extern void main(int, char**);
+	main(argc, argv);
 }

 void prof(void (*fn)(void*), void *arg, int entries, int what)
--- a/sys/src/libc/power/argv0.s
+++ b/sys/src/libc/power/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/power/main9.s
+++ b/sys/src/libc/power/main9.s
@@ -1,25 +1,10 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(16 + NPRIVATES*4)
-
+TEXT	_main(SB), 1, $0
+	SUB	$8, R1
 	MOVW	$setSB(SB), R2
 	MOVW	R3, _tos(SB)

-	MOVW	$p-64(SP), R4
-	MOVW	R4, _privates+0(SB)
-	MOVW	$16, R4
-	MOVW	R4, _nprivates+0(SB)
-
-	MOVW	inargc-4(FP), R3
-	MOVW	$inargv+0(FP), R4
-	MOVW	R3, 4(R1)
-	MOVW	R4, 8(R1)
-	BL	main(SB)
-loop:
-	MOVW	$_exitstr<>(SB), R3
-	MOVW	R3, 4(R1)
-	BL	exits(SB)
-	BR	loop
-
-DATA	_exitstr<>+0(SB)/4, $"main"
-GLOBL	_exitstr<>+0(SB), $5
+	MOVW	$main(SB), R3
+	MOVW	R0, LR
+	MOVW	$_callmain(SB), R4
+	MOVW	R4, CTR
+	BR	(CTR)
--- a/sys/src/libc/power/main9p.s
+++ b/sys/src/libc/power/main9p.s
@@ -1,31 +1,14 @@
-#define NPRIVATES	16
-
-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
-
+TEXT	_mainp(SB), 1, $0
+	SUB	$8, R1
 	MOVW	$setSB(SB), R2
 	MOVW	R3, _tos(SB)

-	MOVW	$p-64(SP), R4
-	MOVW	R4, _privates+0(SB)
-	MOVW	$16, R4
-	MOVW	R4, _nprivates+0(SB)
+	MOVW	$_profmain(SB), R3
+	MOVW	R0, LR
+	MOVW	$_callmain(SB), R4
+	MOVW	R4, CTR
+	BR	(CTR)

-	BL	_profmain(SB)
-	MOVW	_tos(SB), R3
-	MOVW	4(R3), R4
-	MOVW	R4, 0(R3)
-	MOVW	inargc-4(FP), R3
-	MOVW	$inargv+0(FP), R4
-	MOVW	R3, 4(R1)
-	MOVW	R4, 8(R1)
-	BL		main(SB)
-loop:
-	MOVW	$exits<>(SB), R3
-	MOVW	R3, 4(R1)
-	BL	exits(SB)
-	MOVW	$_profin(SB), R3	/* force loading of profile */
-	BR	loop
-
 TEXT	_saveret(SB), 1, $0
 TEXT	_savearg(SB), 1, $0
 	RETURN
@@ -33,6 +16,3 @@
 TEXT	_callpc(SB), 1, $0
 	MOVW	argp-4(FP), R3
 	RETURN
-
-DATA	exits<>+0(SB)/4, $"main"
-GLOBL	exits<>+0(SB), $5
--- a/sys/src/libc/sparc/argv0.s
+++ b/sys/src/libc/sparc/argv0.s
@@ -1,4 +1,2 @@
 GLOBL	argv0(SB), $4
 GLOBL	_tos(SB), $4
-GLOBL	_privates(SB), $4
-GLOBL	_nprivates(SB), $4
--- a/sys/src/libc/sparc/main9.s
+++ b/sys/src/libc/sparc/main9.s
@@ -1,14 +1,8 @@
-#define NPRIVATES	16
-
-TEXT	_main(SB), 1, $(16 + NPRIVATES*4)
-
+TEXT	_main(SB), 1, $0
+	SUB	$8, R1
 	MOVW	$setSB(SB), R2
 	MOVW	R7, _tos(SB)

-	MOVW	$p-64(SP),R7
-	MOVW	R7,_privates+0(SB)
-	MOVW	$16,R7
-	MOVW	R7,_nprivates+0(SB)
 /*
 	MOVW	_fpsr+0(SB), FSR
 	FMOVD	$0.5, F26
@@ -16,16 +10,8 @@
 	FADDD	F26, F26, F28
 	FADDD	F28, F28, F30
 */
-	MOVW	inargc-4(FP), R7
-	MOVW	$inargv+0(FP), R8
-	MOVW	R8, 8(R1)
-	JMPL	main(SB)

-loop:
-	MOVW	$_exits<>(SB), R7
-	JMPL	exits(SB)
+	MOVW	$main(SB), R7
+	MOVW	$_callmain(SB), R24
+	JMP	(R24)
 	MOVW	$_mul(SB), R8	/* force loading of muldiv */
-	JMP	loop
-
-DATA	_exits<>+0(SB)/5, $"main"
-GLOBL	_exits<>+0(SB), $5
--- a/sys/src/libc/sparc/main9p.s
+++ b/sys/src/libc/sparc/main9p.s
@@ -1,14 +1,8 @@
-#define NPRIVATES	16
-
-TEXT	_mainp(SB), 1, $(16 + NPRIVATES*4)
-
+TEXT	_mainp(SB), 1, $0
+	SUB	$8, R1
 	MOVW	$setSB(SB), R2
 	MOVW	R7, _tos(SB)

-	MOVW	$p-64(SP),R7
-	MOVW	R7,_privates+0(SB)
-	MOVW	$16,R7
-	MOVW	R7,_nprivates+0(SB)
 /*
 	MOVW	_fpsr+0(SB), FSR
 	FMOVD	$0.5, F26
@@ -17,21 +11,11 @@
 	FADDD	F28, F28, F30
 */

-	JMPL	_profmain(SB)
-	MOVW	__prof+4(SB), R7
-	MOVW	R7, __prof+0(SB)
-
-	MOVW	inargc-4(FP), R7
-	MOVW	$inargv+0(FP), R8
-	MOVW	R8, 8(R1)
-	JMPL	main(SB)
-
-loop:
-	MOVW	$_exits<>(SB), R7
-	JMPL	exits(SB)
+	MOVW	$_profmain(SB), R7
+	MOVW	$_callmain(SB), R24
+	JMP	(R24)
 	MOVW	$_mul(SB), R8		/* force loading of muldiv */
 	MOVW	$_profin(SB), R9	/* force loading of profile */
-	JMP	loop

 TEXT	_saveret(SB), 1, $0
 TEXT	_savearg(SB), 1, $0
@@ -40,6 +24,3 @@
 TEXT	_callpc(SB), 1, $0
 	MOVW	argp-4(FP), R7
 	RETURN
-
-DATA	_exits<>+0(SB)/4, $"main"
-GLOBL	_exits<>+0(SB), $5


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2023-12-31  0:24 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-12-29  7:05 [9front] [PATCH] libc: add _callmain to share more initialization code Jacob Moody
2023-12-31  0:22 ` Jacob Moody

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).