* [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).