Ausam/sys/ken/once.c

Find at most related files.
including files from this version of Unix.

#
#include "../defines.h"
#include "../param.h"
#include "../file.h"
#ifdef	ONCE
#include "../conf.h"
#include "../filsys.h"
#include "../tty.h"
#include "../buf.h"
#endif
#include "../user.h"
#ifdef	AUSAML
#include	"../lnode.h"
#endif	AUSAML
#include "../systm.h"
#include "../proc.h"
#include "../text.h"
#include "../inode.h"
#include "../seg.h"

#define	CLOCK1	0177546
#define	CLOCK2	0172540
/*
 * Icode is the octal bootstrap
 * program executed in user mode
 * to bring up the system.
 */
int	icode[]
{
	0104413,	/* sys exec; init; initp */
	0000014,
	0000010,
	0000777,	/* br . */
	0000021,	/* initp: init+5; 0 
			   use init as name -> looks nicer on ps */
	0000000,
	0062457,	/* init: </etc/init\0> */
	0061564,
	0064457,
	0064556,
	0000164,
};

#ifdef	BIG_UNIX
extern	char	eto[], eu[];
#endif

#ifdef PROFILE
extern char	pshift[],pmask[],etext[];
int	profstart;
int	pnbytes;
long	pusertix;
#endif PROFILE

/*
 * Initialization code.
 * Called from m40.s or m45.s as
 * soon as a stack and segmentation
 * have been established.
 * Functions:
 *	clear and free user core
 *	find which clock is configured
 *	hand craft 0th process
 *	call all initialization routines
 *	fork - process 0 to schedule
 *	     - process 1 execute bootstrap
 *
 * panic: no clock -- neither clock responds
 * loop at loc 6 in user mode -- /etc/init
 *	cannot be executed.
 */
main()
{
	extern schar;
	register i, *p;

	/*
	 * zero and free all of core
	 */

#ifndef	BIG_UNIX
	i = *ka6 + USIZE;
#else	BIG_UNIX
	i = eu + USIZE;
#endif	BIG_UNIX
#ifdef	_1170
	p = MEMCNTRL->integ;
	MEMCNTRL->integ =| 3;		/* parity traps here can be ugly */
#endif	_1170
	UISD->r[0] = 077406;
	for(;;) {
		UISA->r[0] = i;
#ifndef	BIG_UNIX
		if(suiword(0,0) < 0)	/* fix027 */
			break;
		clearseg(i);
#else	BIG_UNIX
		if ( fuibyte(0) < 0 )
			break;
#endif	BIG_UNIX
		maxmem++;
	/*	mfree(coremap, 1, i);	fix027 */
		i++;
	}
	u.u_error = 0;		/* fix037 */
#ifdef	_1170
	MEMCNTRL->integ = p;
#endif	_1170
#ifndef	BIG_UNIX
	mfree( coremap , maxmem , *ka6 + USIZE );	/* fix027 */
#else	BIG_UNIX
	mfree( coremap , maxmem , eu + USIZE );
#endif	BIG_UNIX
#ifdef	UNIBUS_MAP & ! MAPPED_BUFFERS
/*	if(cputype == 70)	*/
	for(i=0; i<62; i=+2) {
		UBMAP->r[i] = i<<12;
		UBMAP->r[i+1] = 0;
	}
#ifdef	MALLOC_UMAP
	/* unibus-map 1->8 (really 0->7) point at kernal buffer pool etc */
	mfree( umap , 23 , 9 ); /* free unibus-map 9->32 */
#endif	MALLOC_UMAP
#endif	UNIBUS_MAP & ! MAPPED_BUFFERS
#ifdef	MAPPED_BUFFERS
	maxmem =- NBUF*8;	/* this space is grabbed for buffer pool */
#endif	MAPPED_BUFFERS
	printf("       mem = %lKb\n\n", maxmem/16);				/* fix011 */
/*	printf("RESTRICTED RIGHTS\n\n");				fix012 */
/*	printf("Use, duplication or disclosure is subject to\n");	fix012 */
/*	printf("restrictions stated in Contract with Western\n");	fix012 */
/*	printf("Electric Company, Inc.\n");				fix012 */

	maxmem = min(maxmem, MAXMEM);
	mfree(swapmap, nswap, swplo);

	/*
	 * determine clock
	 */

#ifndef	PROG_CLOCK
	lks = CLOCK1;
	if(!fkword(lks)) {	/* fix036 */
#endif
		lks = CLOCK2;
		if(!fkword(lks))	/* fix036 */
			panic("no clock");
#ifndef	PROG_CLOCK
	}
#endif

#ifdef	STACK_LIMIT
	/*
	 *	if stack-limit register exists
	 *	use it !!
	 */

	if(fkword(SLR))	/* fix036 */
	{
		i = &u ;
		SLR->integ = i + sizeof u;
	}

#endif

#ifdef	MEM_PAR_INTR & _1140
	/*
	 *	if memory-parity interrupts exist - use them.
	 */
	p = PARMEMCSR;
	while(fkword(p))		/* fix036 */
		*p++ = 1;	/* enable interrupts */
#endif	MEM_PAR_INTR & _1140

	/*
	 * set up system process
	 */

	proc[0].p_addr = *ka6;
	proc[0].p_size = USIZE;
	proc[0].p_stat = SRUN;
	proc[0].p_flag =| SLOAD|SSYS;
	u.u_procp = &proc[0];

	/*
	 * set up 'known' i-nodes
	 */

	*lks = 0115;
	cinit();
	binit();
	iinit();
	rootdir = iget(rootdev, ROOTINO);
	rootdir->i_flag =& ~ILOCK;
	u.u_cdir = iget(rootdev, ROOTINO);
	u.u_cdir->i_flag =& ~ILOCK;

#ifdef PROFILE
	{
		int	j;	int	*p2;
		struct {
			int	drmcsr,drmcount;
		};
#define SDSA0 0772260
#define SDSD0 0772220
		pnbytes = ((etext >> pshift) + 3) & ~pmask;
		pusertix = 0;	/* redundant really */
		j = ((pnbytes + 63) >> 6 ) & 01777;	/* max poss is full addr space */
		if((i = malloc(coremap,j)) == NULL)
			panic("no core for profile\n");
		profstart = i;
		p = SDSA0;
		p2 = SDSD0;
		do {
			*p++ = i;
			*p2++ = 077406;
			i =+ 0200;
			j =- 0200;
		} while(j > 0);
		*--p2 = ((j + 0177) << 8) | 06;	/* appropriate size, R/W */
		printf("profiling in system, enable clock interrupts to ...\n");
	}
#endif PROFILE
	/*
	 * make init process
	 * enter scheduling loop
	 * with system process
	 */

	if(newproc()) {
		expand(USIZE+1);
		estabur(0, 1, 0, 0);
#ifndef	_1170 | _1145
		copyout(icode, 0, sizeof icode);
#endif
#ifdef	_1170 | _1145
		copyout(icode, 0, sizeof icode, SEG_USD);
#endif
		/*
		 * Return goes to loc. 0 of user init
		 * code just copied out.
		 */
		return;
	}
	sched();
}

#ifndef	ONCE
#include "../estabur.h"
#endif

#ifdef	ONCE
#include "../iinit.h"

#include "../binit.h"

#include "../cinit.h"

#endif