/* assume vlong alignment of SP */
#define NPRIVATES 16
#define FCSR 3
GLOBL _tos(SB), $XLEN
GLOBL _privates(SB), $XLEN
GLOBL _nprivates(SB), $4
TEXT _main(SB), 1, $(4*XLEN + NPRIVATES*XLEN)
MOV $setSB(SB), R3
MOV R0, CSR(FCSR)
/* _tos = arg */
MOV R8, _tos(SB)
MOV $NPRIVATES, R9
MOVW R9, _nprivates(SB)
MOV $p-(NPRIVATES*XLEN)(SP), R9
MOV R9, _privates(SB)
/* save inargc & inargv before _envsetup */
MOVW inargc-XLEN(FP), R8 /* argc */
MOV R8, (R9) /* private storage on stack */
MOV $inargv+0(FP), R8
MOV R8, XLEN(R9) /* private storage on stack */
JAL R1, _envsetup(SB) /* may trash any register above R7 */
/* exit(main(argc, argv, environ)); */
MOV _privates(SB), R9
MOVW (R9), R8 /* argc */
MOVW R8, XLEN(SP)
MOV XLEN(R9), R10
MOV R10, (2*XLEN)(SP) /* argv */
MOV environ(SB), R10
MOV R10, (3*XLEN)(SP) /* environ */
JAL R1, main(SB)
JAL R1, exit(SB)
RET
|