|
|
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 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,34 /*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 restarting*/ /*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 _savvec8 /*save vectors area */ _savvec8: .space 4 .globl badrtn badrtn: .long tfail testno: .long 0 .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 .globl _clk_cnt _clk_cnt: .long 0 /* Clock int. count */ _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 */ andl3 $0x3ffffc00,$_scb,r0 mtpr r0,$SCBB /* Set SCBB */ mtpr $0x1f,$IPL /* Set IPL to HIGH */ 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 */ /* # Mask out bit 30,31 of SCB vectors # Will turm them back on when ready to go virtual in # system space */ 1: clrl _clk_cnt clrl _bell movl $7,r0 /* R0 : Vector no. of clock int. */ movab _Hardclk,_scb[r0] /* New vector for clock */ movl $NBPG/4,r1 /* One page for SCB */ movab _scb,r0 andl2 $0x3ffffc00,r0 1: andl2 $0x3fffffff,(r0) addl2 $4,r0 decl r1 /* Last one yet ? */ bneq 1b movl $_intstack+NISP*NBPG,r0 andl2 $0x3fffffff,r0 /* Mask out bit 30,31 */ mtpr r0,$ISP /* init. ISP */ movl r0,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 /* Donot want to use orl3 */ orl2 $PG_V|PG_KW,r11 orl2 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; */ movab _end,r1 /* Map text+data 1 to 1; Kernel R/W */ addl2 $66*(NBPG),r1 /* Some memory for power fail test */ andl2 $0x3fffffff,r1 shar $PGSHIFT,r1,r1 1: movl r2,r11 orl2 $PG_V|PG_KW,r11 /* Kernel Read/Write */ orl2 r11,_Sysmap[r2] 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: mtpr $_Sysmap,$SBR /* Set SYSTEM BASE REG */ mtpr $_Syssize,$SLR .globl _ready _ready: mtpr $64,$DCR /* Enable fault */ /* GO TO VIRTUAL MODE Double map the kernel into user addresses : This will enable system to go to virtual mode the 1st time !! */ mtpr $_Sysmap,$SBR /* Set SYSTEM BASE REG */ mtpr $_Syssize,$SLR mtpr $_Sysmap,$P0BR mtpr $_Syssize,$P0LR mtpr $1,$TBIA mtpr $1,$PADC mtpr $1,$MME jmp *$vmode vmode: movl $_intstack+NISP*NBPG,r0 mtpr r0,$ISP /* init. ISP,sp to virtual address */ movl r0,sp andl3 $_pcb0,$0x3fffffff,r0 mtpr r0,$0xe /* Set PCBB */ # # Set up vectors for power fail/restart # movl $PFVEC,r0 /* R0 : Vector no. of p_fail int. */ movab _Pwfail,_scb[r0] movl $PRVEC,r0 /* R0 : Vector no. of p_restart int. */ movab _Pwrest,_scb[r0] pushl $cmsg0 callf $8,_writes /* Print test heading */ # # Set up before power fails # movl $0xcafebabe,_memflg /* Set memory flag */ clrl _pfint /* Clear power fail interrupt flag */ mfpr $SBR,_sbr mfpr $SLR,_slr mfpr $P0BR,_p0br mfpr $P0LR,_p0lr mtpr $TP1BR,$P1BR mfpr $P1BR,_p1br mtpr $TP2LR,$P2LR mfpr $P2LR,_p2lr mfpr $IPL,_ipl mfpr $MME,_mme mfpr $0xe,_Pcbb mfpr $ISP,_Isp mtpr $7,$0x10 /* Request soft int. 7 */ mfpr $SISR,_Sisr mfpr $SCBB,_scbb mtpr $TKSP,$KSP mfpr $KSP,_ksp # # write pattern to memory # To be checked when power restored # movab _end,r0 addl2 $NBPG,r0 /* 1 page beyond end of program */ andl2 $0xfffffc00,r0 /* Begin address of this page */ movl r0,_baddr /* save this address */ pushl r0 callf $8,_pfsetup # # Write message to turn off power # pushl $cmsg1 callf $8,_writes mtpr $10,$IPL /* allow clock interrupt */ 1: jmp 2f /* Waiting for power to go down */ 2: jmp 1b .globl passed passed: halt tfail: /* enter here when test fail */ movl $0xffffffff,r13 halt # # ***************** # Powerfail handler # ***************** # .align 2 .globl _Pwfail _Pwfail: incl _pfint svpctx 1: incl _pfcnt /* See how long TAHOE can count before stop */ jmp 1b halt # # ********************* # Power restart handler # ********************* # .align 2 .globl _Pwrest _Pwrest: pushl _baddr callf $8,_prest halt # # ***************** # Hardclock handler # ***************** # .align 2 .globl _Hardclk _Hardclk: incl _clk_cnt incl _bell cmpl _bell,$0x50 /* Ring bell every 10 sec. */ jneq 1f pushl $0x7 callf $8,_writec /* Ring bell */ clrl _bell 1: rei # # Message area # .data 1 cmsg0: .ascii "\n\tThis is the Power fail/restart interrupt test.\12\0" cmsg1: .ascii "** Unplug power !!!!\12\0" cmsg2: .ascii "\n** Power restarted...\12\0" .align 2 _bell: .long 0 # # # .globl _memflg _memflg: .long 0 .globl _pfint _pfint: .long 0 .globl _pfcnt _pfcnt: .long 0 .globl _baddr _baddr: .long 0 # # Area to save the privilege registers # .globl _sbr _sbr: .long 0 .globl _slr _slr: .long 0 .set TP0BR,0x100 .set TP0LR,0x200 .set TP1BR,0x300 .set TP1LR,0x400 .set TP2BR,0x500 .set TP2LR,0x600 .set TKSP,0x700 .globl _p0br _p0br: .long 0 .globl _p0lr _p0lr: .long 0 .globl _p1br _p1br: .long 0 .globl _p1lr _p1lr: .long 0 .globl _p2br _p2br: .long 0 .globl _p2lr _p2lr: .long 0 .globl _ipl _ipl: .long 0 .globl _mme _mme: .long 0xf .globl _Pcbb _Pcbb: .long 0 .globl _Isp _Isp: .long 0 .globl _Sisr _Sisr: .long 0 .globl _scbb _scbb: .long 0 .globl _ksp _ksp: .long 0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.