static char *sccsid
= "@(#)crt0.c 4.6 (Berkeley) 3/30/83";
* Robert Henry, UCB, 20 Oct 81
* We make the following (true) assumptions:
* 1) when the kernel calls start, it does a jump to location 2,
* and thus avoids the register save mask. We are NOT called
* with a calls! see sys1.c:setregs().
* 2) The only register variable that we can trust is sp,
* which points to the base of the kernel calling frame.
* Do NOT believe the documentation in exec(2) regarding the
* 3) We can allocate as many register variables as we want,
* and don't have to save them for anybody.
* 4) Because of the ways that asm's work, we can't have
* any automatic variables allocated on the stack, because
* we must catch the value of sp before any automatics are
char **environ
= (char **)0;
asm("#define _start start");
asm("#define _eprol eprol");
extern unsigned char etext
;
extern unsigned char eprol
;
char *kargv
[1]; /* size depends on kargc */
char kargstr
[1]; /* size varies */
char kenvstr
[1]; /* size varies */
* ALL REGISTER VARIABLES!!!
register int r11
; /* needed for init */
register struct kframe
*kfp
; /* r10 */
asm(" movl sp,r10"); /* catch it quick */
for (argv
= targv
= &kfp
->kargv
[0]; *targv
++; /* void */)
if (targv
>= (char **)(*argv
))
monstartup(&eprol
, &etext
);
exit(main(kfp
->kargc
, argv
, environ
));
register int code
; /* r11 */
* null mcount and moncontrol,
* just in case some routine is compiled for profiling