|
|
1.1 root 1: static char *sccsid = "@(#)crt0.c 4.6 (Berkeley) 3/30/83";
2:
3: /*
4: * C start up routine.
5: * Robert Henry, UCB, 20 Oct 81
6: *
7: * We make the following (true) assumptions:
8: * 1) when the kernel calls start, it does a jump to location 2,
9: * and thus avoids the register save mask. We are NOT called
10: * with a calls! see sys1.c:setregs().
11: * 2) The only register variable that we can trust is sp,
12: * which points to the base of the kernel calling frame.
13: * Do NOT believe the documentation in exec(2) regarding the
14: * values of fp and ap.
15: * 3) We can allocate as many register variables as we want,
16: * and don't have to save them for anybody.
17: * 4) Because of the ways that asm's work, we can't have
18: * any automatic variables allocated on the stack, because
19: * we must catch the value of sp before any automatics are
20: * allocated.
21: */
22:
23: char **environ = (char **)0;
24:
25: asm("#define _start start");
26: asm("#define _eprol eprol");
27: extern unsigned char etext;
28: extern unsigned char eprol;
29: start()
30: {
31: struct kframe {
32: int kargc;
33: char *kargv[1]; /* size depends on kargc */
34: char kargstr[1]; /* size varies */
35: char kenvstr[1]; /* size varies */
36: };
37: /*
38: * ALL REGISTER VARIABLES!!!
39: */
40: register int r11; /* needed for init */
41: register struct kframe *kfp; /* r10 */
42: register char **targv;
43: register char **argv;
44:
45: #ifdef lint
46: kfp = 0;
47: initcode = initcode = 0;
48: #else not lint
49: asm(" movl sp,r10"); /* catch it quick */
50: #endif not lint
51: for (argv = targv = &kfp->kargv[0]; *targv++; /* void */)
52: /* void */ ;
53: if (targv >= (char **)(*argv))
54: --targv;
55: environ = targv;
56: asm("eprol:");
57: #ifdef MCRT0
58: monstartup(&eprol, &etext);
59: #endif MCRT0
60: exit(main(kfp->kargc, argv, environ));
61: }
62: asm("#undef _start");
63: asm("#undef _eprol");
64:
65: #ifdef MCRT0
66: /*ARGSUSED*/
67: exit(code)
68: register int code; /* r11 */
69: {
70: monitor(0);
71: _cleanup();
72: asm(" movl r11,r0");
73: asm(" chmk $1");
74: }
75: #endif MCRT0
76:
77: #ifdef CRT0
78: /*
79: * null mcount and moncontrol,
80: * just in case some routine is compiled for profiling
81: */
82: moncontrol(val)
83: int val;
84: {
85:
86: }
87: asm(" .globl mcount");
88: asm("mcount: rsb");
89: #endif CRT0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.