File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / d / memman / init.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:24:19 2019 UTC (6 years, 11 months ago) by root
Branches: bsd, MAIN
CVS tags: v12b, v121, HEAD
Power 6/32 Unix version 1.2b


/*	init.s								*/


/*	This file is a diagnostic version of locore.s.			*/
/*	It contains the following:					*/
/*	*system data area = scb, dump buffer, interrupt stack,		*/
/*	*system page table,user page tables,pcbs,iomap, & io buffers.	*/
/*									*/
/*	*system code = interrupt vectors, initialization of system data,*/
/*	*memory size calculation,initialization of SPT, zeroing of	*/
/*	*unused memory, & loading of SBR & SLR.				*/
/*	*								*/
/*	*at the end of this code, you are ready to go to virtual mode.	*/
/*	* --- GOOD LUCK!						*/


/*	privileged registers addresses	*/
#include	"prvreg.h"
	
/*	program status long word definition	*/
#include	"psl.h"	

/* 	page table entry definition		*/
#include	"pte.h"
	
/*	process control block offsets	*/
#include	"pcboffset.h"	

/*	fundamental constants for globl use	*/
#include	"const.h"	

/*	system control block offsets*/
#include	"scboffset.h"
/*	SPT offsets				*/
#include	"sptoffset.h"

/*	trap numbers*/
#include	"trap.h"	


#define P0SPACE		1	/* This test run in P0 space */
#define TRUE		1
#define V_TRAP		0
#define V_SYSCALL	4

	.set	HIGH,0x1f	/*mask for disabling all interrupts	*/
	.set	MCKVEC,4	/*scb offset for machinecheck vector	*/
	.set	NISP,2		/*no. of interrupt stack pages		*/
	.set	DONE,255	/*user process done code		*/

	.text

#include "pstorage.s"		/* PROCESSOR STORAGE AREA 		*/

	.globl	_Entry
_Entry:
	jmp	start
	.space	(1024-6)



/*		globl dump buffer to be used for communication		*/
/*		between tests & interrupt handlers, & other misc.	*/
/*		purposes.						*/
				
				/*physical page 3			*/

	.set	NLWU,30		/*no. of longwords already used		*/
				/*this must be changed when you define	*/
				/*additional variables below before	*/
				/*_dbuf					*/
	.globl	_restart
_restart:
	.space	4		/*contains restart address for rastarting*/
				/*after power is restored (loaded by	*/
				/*power fail interrupt handler & used by*/
				/*CPU 2					*/	
	.globl	_maxmem
_maxmem:
	.space	4		/*memory size in no of bytes		*/

	.globl	_maxpages
_maxpages:
	.space	4		/*memory size in no. of physical pages	*/

	.globl	_lastadd
_lastadd:
	.space	4		/*address of the last long word		*/

	.globl	_unused
_unused:
	.space	4		/*first unused page in system space	*/

	.globl	_ctlblk
_ctlblk:
	.long	0		/* pointer to SCB */

	.globl	_savvec0	/*save vectors area			*/
_savvec0:
	.space	4

	.globl	_savvec1	/*save vectors area			*/
_savvec1:
	.space	4

	.globl	_savvec2	/*save vectors area			*/
_savvec2:
	.space	4

	.globl	_savvec3	/*save vectors area			*/
_savvec3:
	.space	4

	.globl	_savvec4	/*save vectors area			*/
_savvec4:
	.space	4

	.globl	_savvec5	/*save vectors area			*/
_savvec5:
	.space	4
	.globl	_savvec6	/*save vectors area			*/
_savvec6:
	.space	4
	.globl	_savvec7	/*save vectors area			*/
_savvec7:
	.space	4
	.globl	_dbuf		/*dump buffer left out of 1K		*/
	.globl	_r_no
_r_no:
	.long	0
	.globl	_pt_base
_pt_base:
	.long	0
	.globl	_saved_psl
_saved_psl:
	.long   0
	.globl	_saved_sp
_saved_sp:
	.long	0
	.globl	_saved_fp
_saved_fp:
	.long	0
	.globl	_p_ptr
_p_ptr:
	.long   0
	.globl	_ret_adr
_ret_adr:
	.long	0
	.globl	_exp_par0
_exp_par0:
	.long	0
	.globl	_exp_par1
_exp_par1:
	.long	0
	.globl	_exp_par2
_exp_par2:
	.long	0
	.globl	_exp_par3
_exp_par3:
	.long	0
	.globl	_act_par0
_act_par0:
	.long	0
	.globl	_act_par1
_act_par1:
	.long	0
	.globl	_act_par2
_act_par2:
	.long	0
	.globl	_act_par3
_act_par3:
	.long	0
	.globl	_test_no
_test_no:
	.long	0
_dbuf:
	.space	NBPG - (NLWU *4)
edbuf:


	.globl	_intstack	/* Interrupt stack			*/
_intstack:			/* Physical pages 4 & 5			*/
	.space	NISP*NBPG
eintstack:


	.set	SYSPTSIZE,512	/* No. of entries in SPT		*/
 
/*
	System Page Table -- physical page 6 & 7
*/ 
	.align	2
	.globl	_Sysmap
_Sysmap:
	.space	SYSPTSIZE*4 	/* 512 max pages allowed for system	*/
eSysmap:
	.globl	_Syssize
	.set	_Syssize,(eSysmap-_Sysmap)/4	/* should be SYSPTSIZE	*/
	
	.globl	_iomap		/* Physical page 8	*/
_iomap:	.space	1024		/* IOMAP - unused 	*/
	.globl	_eiomap
_eiomap:

	.globl	_pcb0		/* Physical page 9	*/
_pcb0:	.space	128		/*process control block 0		*/
	.globl	_pcb1
_pcb1:	.space 128		/*process control block 1		*/
	.globl	_pcb2
_pcb2:	.space 128		/*process control block 2		*/
	.globl	_pcb3
_pcb3:	.space 128		/*process control block 3		*/
	.globl	_pcb4
_pcb4:	.space 128		/*process control block 4		*/
	.globl	_pcb5
_pcb5:	.space 128		/*process control block 5		*/
	.globl	_pcb6
_pcb6:	.space 128		/*process control block 6		*/
	.globl	_pcb7
_pcb7:	.space 128		/*process control block 7		*/

/*
	*user #0 page tables -- P0PT, P1PT, P2PT			
	*physical memory     --  page10, 11, & 12  respectively
*/
	.align	2
	.globl	_u0p0pt
_u0p0pt:
	.space	1024		/*255 max pages for user #0 text	*/
	.globl	_u0p1pt
_u0p1pt:	
	.space	1024		/*255 max pages for user #0 data	*/
	.globl	_u0p2pt
_u0p2pt:	
	.space	1020		/*255 max pages for user #0 stack	*/
eu0p2pt:
	.space	4

/*
	*user #1 page tables -- P0PT, P1PT, P2PT			
	*physical memory     --  page13 ,14, & 15  respectively
*/
	.align	2
	.globl	_u1p0pt
_u1p0pt:
	.space	1024		/*255 max pages for user #1 text	*/
	.globl	_u1p1pt
_u1p1pt:	
	.space	1024		/*255 max pages for user #1 data	*/
	.globl	_u1p2pt
_u1p2pt:	
	.space	1020		/*255 max pages for user #1 stack	*/
eu1p2pt:
	.space	4


/*
	*user #2 page tables -- P0PT, P1PT, P2PT			
	*physical memory     --  page 16, 17 , & 18  respectively
*/
	.align	2
	.globl	_u2p0pt
_u2p0pt:
	.space	1024		/*255 max pages for user #2 text	*/
	.globl	_u2p1pt
_u2p1pt:	
	.space	1024		/*255 max pages for user #2 data	*/
	.globl	_u2p2pt
_u2p2pt:	
	.space	1020		/*255 max pages for user #2 stack	*/
eu2p2pt:
	.space	4


/*
	*user #3 page tables -- P0PT, P1PT, P2PT			
	*physical memory     --  page 19, 20 , & 21  respectively
*/
	.align	2
	.globl	_u3p0pt
_u3p0pt:
	.space	1024		/*255 max pages for user #3 text	*/
	.globl	_u3p1pt
_u3p1pt:	
	.space	1024		/*255 max pages for user #3 data	*/
	.globl	_u3p2pt
_u3p2pt:	
	.space	1020		/*255 max pages for user #3 stack	*/
eu3p2pt:
	.space	4

/*
	*user #4 thru 6 page tables
	*physical memory -- pages 22 thru 30
*/
	.globl	_u4p0pt
_u4p0pt:
	.space	(9*NBPG) - 4
eu6p2pt:
	.space	4

/*
	*user #7 page tables -- P0PT, P1PT, P2PT			
	*physical memory     --  page 31, 32 , & 33  respectively
*/
	.align	2
	.globl	_u7p0pt
_u7p0pt:
	.space	1024		/*255 max pages for user #7 text	*/
	.globl	_u7p1pt
_u7p1pt:	
	.space	1024		/*255 max pages for user #7 data	*/
	.globl	_u7p2pt
_u7p2pt:	
	.space	1020		/*255 max pages for user #7 stack	*/
eu7p2pt:
	.space	4

	.globl	_iob0		/*io buffer 0 */
_iob0:	.space	1024
	.globl	_iob1		/*io buffer 1 */
_iob1:	.space	1024
	.globl	_iob2		/*io buffer 2 */
_iob2:	.space	1024
	.globl	_iob3		/*io buffer 3 */
_iob3:	.space	1024
	.globl	_iob4		/*io buffer 4 */
_iob4:	.space	1024
	.globl	_iob5		/*io buffer 5 */
_iob5:	.space	1024
	.globl	_iob6		/*io buffer 6 */
_iob6:	.space	1024
esysdata:

#include "scblock.s"		/* SYSTEM CONTROL BLOCK 		*/







#include	"evthandlers.s"	/*event handlers			*/

#define	ACBL(_n1,_n2,_n3,_n4) \
addl2	_n2,_n3;\
cmpl	_n3,_n1;\
bleq	_n4;



/*
	*INITIALIZATION CODE
	*
	* MME off; mode = k; IPL = 31; IS = 1
	*
*/

	.globl	start
start:
	mtpr	$0,$MME			/* Disable MME */
	movl	r0,_tno		/* R0 : Test no to run; 0 run all tests */
	movl	r1,_option
	movl	r2,_Cycle	/* R2 : Cycle count */

	clrl	_cycle
	andl3	_option,$0x8,_ss1	/* Heading message sense switch */
	andl3	_option,$0x4,_Emsg	/* Error message sense switch */
	clrl	_lptest

	tstl	_tno		/* Set lptest if tno == XX and loop forever */
	beql	mmtest
	cmpl	$-1,_Cycle
	bneq	mmtest
	incl	_lptest
mmtest:
	movab	_scb,r0
	mtpr	r0,$SCBB		/* Set SCBB  */
	mtpr	$0x1f,$IPL

	movpsl	r1
	andl2	$0xffffff00,r1		/* Mask out flags		*/
	cmpl	r1,$0x041f0000		/*IS on,modes =k & IPL = 31?	*/
	beql	1f
2:	movl	$1,r0
	movl	$0x041f0000,r2
	halt			/* PSL not initialized as expected	*/
1:
	mtpr	$_intstack+NISP*NBPG,$ISP	/* init. ISP		*/
	movl	$_intstack+NISP*NBPG,sp	/* in case we get exception	*/
	movab	(sp),fp			/* Initialize FP	  	*/

/*
 	Clear system data area all the way upto system code
 	this includes dump buffer,interrupt stack,spt,iomap,pcbs,user 
 	page tables, & io buffer area.
*/
3:	
	movab	esysdata,r7
	movab	_restart,r6
1:	clrl	(r6)
	ACBL(r7,$4,r6,1b)
/*
 	Initialize System Page Table
*/
5:
	clrl	r2
	movab	esysdata,r1	/* R1 = Last address in system data area */
	andl2	$0x3fffffff,r1	/* Mask out bit 30,31	*/
	shar	$PGSHIFT,r1,r1	/* Get page no. of last system data addr  */
				/* Map systm data area 1 to 1,kernel writable */
1:
	movl	r2,r11		
	orl3	$PG_V|PG_KW,r11,_Sysmap[r2]
	aoblss	r1,r2,1b
/*
  	Map system text area 1 to 1, Kernel read/write.
	For this to work, the label _etext must exist at the end 
	of system code; Add in 4 more pages for data area used in C
*/
	movab	_edata + 4*(NBPG-1),r1	/* Map text+data 1 to 1; Kernel R/W */
/*	movab	_etext + 4*(NBPG-1), r1		*/
	andl2	$0x3fffffff,r1
	shar	$PGSHIFT,r1,r1
1:
	movl	r2,r11
	orl3	$PG_V|PG_KW,r11,_Sysmap[r2]	/* Kernel Read/Write */
	aoblss	r1,r2,1b
/*
 	Map from here (1st unused page) to page 512 :
 	   * invalid,no access, & virtual = physical
*/
	movl	r2,_unused	/* Save first unused physical page no	*/
	movl	$LSP+1,r1
1:	movl	r2,_Sysmap[r2]
	aoblss	r1,r2,1b

/*
 	Initialize SBR, SLR
 *Following are some useful addresses for user 0 (in case you want
 *to start user 0:
 *
 *	p0br = $_u0p0pt (limit = 256 max)
 *	p1br = $_u0p1pt ( same limit)
 *	p2br = $0xbfc02c00 (funny)
 *	p2lr = $0x000ffff0 (funny)
 *
 *for other users, add NBPG*3 to above except for p2 area
 *
 *	u0_user_sp = 0xbffffbfc
 *	u0_k_sp    = 0xbfffe3fc
 *	u0_s_sp    = 0xbfffcbfc
 *	u0_e_sp    = 0xbfffcbfc
 *
*/

sysrdy:
	cmpl	$TRUE,$P0SPACE
	bneq	0f
	mtpr	$_Sysmap,$SBR			/*  Physical mode */
	brb	1f
0:	mtpr	$(_Sysmap-0xc0000000),$SBR      /* Virtual mode version */
1:	mtpr	$_Syssize,$SLR

/* 
	Double map the kernel into user addresses : 
	This will enable system to go to virtual mode the 1st time !!
*/
	.globl	_ready
	mtpr	$_Sysmap,$P0BR
	mtpr	$_Syssize,$P0LR
_ready:				
	cmpl	$P0SPACE,$TRUE		/* Run physical ? */
	beql	pmode
	
/*	GO TO VIRTUAL MODE	*/
	mtpr	$1,$DCK			/* Set data cache key */
	mtpr	$1,$DCR			/* Enable data cache */
	mtpr	$1,$PADC		/* Purge all data cache	*/
	mtpr	$1,$TBIA		/* Purge all translation buffer */
	mtpr	$1,$MME			/* Turn on MME */
	jmp	*$pmode			/* Go .... */
pmode:
	mtpr	$0,$P0LR		/* Invalidate user map */
	mtpr	$_pcb0,$PCBB		/* Initialize PCBB */

	tstl	_ss1
	jeql	1f
	pushl	$M0
	callf	$4+4,_writes
1:
	mtpr	$2,$DCR			/* Disable data cache */
	cmpl	$0,_tno
	beql	t0
	cmpl	$1,_tno
	bneq	nxt1
t0:
	calls	$4,_vtest 	/* and fetching virtual in P0 */
	tstl	_lptest
	bneq	t0
nxt1:
	mtpr	$1,$DCR			/* Enable data cache */
	mtpr	$2,$DCK			/* Set data cache key */
	mtpr	$1,$PADC		/* Purge all data cache	*/

	cmpl	$0,_tno
	beql	t1
	cmpl	$2,_tno
	bneq	nxt2
t1:
	calls   $4,_protect	/* Test1 : access protection of PTE's */
	tstl	_lptest
	bneq	t1
nxt2:
	cmpl	$0,_tno
	beql	t2
	cmpl	$3,_tno
	bneq	nxt3
t2:
	calls   $4,_vl_test 	/* Test2 :  valid bit and length check */
	tstl	_lptest
	bneq	t2
nxt3:
	cmpl	$0,_tno
	beql	t3
	cmpl	$4,_tno
	bneq	nxt4
t3:
	calls   $4,_mu_test	/* Test3 : the M bit of PTE */
	tstl	_lptest
	bneq	t3

nxt4:
	cmpl	$0,_tno
	beql	t4
	cmpl	$5,_tno
	bneq	nxt5
t4:	                	/* Test4 : if protection fault detected */
	calls   $4,_pv_test	/* prior to translation fault */
	tstl	_lptest
	bneq	t4

nxt5:
	cmpl	$0,_tno
	beql	t5
	cmpl	$6,_tno
	bneq	last
t5:
	calls   $4,_ucbit_chk	/* Test5 : Check the Noncachable bit */
	tstl	_lptest
	bneq	t5
last:
	cmpl	$-1,_Cycle	/* If Cycle == -1 then loop forever */
	jeql	mmtest

	incl	_cycle
	cmpl	_cycle,_Cycle
	jlss	mmtest

	.globl	passed
passed:
	tstl	_ss1
	jeql	1f
	pushl	$M2		/* Cycle count */
	callf	$4+4,_writes
	pushl	_Cycle
	callf	$4+4,_writeh
	pushl	$M1
	callf	$4+4,_writes
1:
	movl	$0xcafebabe,r0
	halt				/* Good halt :   R0 == CAFE BABE */
	.space	40			/* Reserved some space */


	.align	2
	.globl	_ss1
_ss1:	.long	0	/* Heading sense switch : 1 then donot print */
	.globl	_tno
_tno:	.long	0	/* If -1 run ALL tests, else run test "tno" */
	.globl	_Cycle
_Cycle:	.long	0	/* Cycle count */
	.globl	_cycle
_cycle:	.long	0	/* Cycle count */
	.globl	_option
_option:
	.long	0
	.globl	_lptest
_lptest:
	.long	0	/* Loop on test specified by tno */
	.globl	_Emsg
_Emsg:
	.long	0

	.data   1		/* MESSAGE AREA */
M0:	.ascii	"\n** Memory Management Test **\n\0"
M1:	.ascii	"\n** Passed ... \n\0"
M2:	.ascii	"\n** Cycle count : \0"


unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.