|
|
1.1 root 1: /* Tahoe version 3/28/84 (unused yet) */
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 r12; /* dummy */
41: register int r11; /* needed for init */
42: register struct kframe *kfp; /* r10 */
43: register char **targv;
44: register char **argv;
45:
46: #ifdef lint
47: kfp = 0;
48: initcode = initcode = 0;
49: #else not lint
50: asm(" movl sp,r10"); /* catch it quick */
51: #endif not lint
52: for (argv = targv = &kfp->kargv[0]; *targv++; /* void */)
53: /* void */ ;
54: if (targv >= (char **)(*argv))
55: --targv;
56: environ = targv;
57: asm("eprol:");
58: #ifdef MCRT0
59: monstartup(&eprol, &etext);
60: #endif MCRT0
61: exit(main(kfp->kargc, argv, environ));
62: }
63: asm("#undef _start");
64: asm("#undef _eprol");
65:
66: #ifdef MCRT0
67: /*ARGSUSED*/
68: exit(code)
69: int code; /* 4(fp) */
70: {
71: monitor(0);
72: _cleanup();
73: asm(" movl 4(fp),r0");
74: asm(" chmk $1");
75: }
76: #endif MCRT0
77:
78: #ifdef CRT0
79: /*
80: * null mcount and moncontrol,
81: * just in case some routine is compiled for profiling
82: */
83: moncontrol(val)
84: int val;
85: {
86:
87: }
88: asm(" .globl mcount");
89: asm("mcount: ret");
90: #endif CRT0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.