- lea _edata-SYSTEM,r6
- lea _end-SYSTEM,r5
- bisl3 $SYSTEM,r5,r9 # convert to virtual address
- addl2 $NBPG-1,r9 # roundup to next page
- addl2 $(UPAGES*NBPG)+NBPG+NBPG,r5
-1: clrq (r6); acbl r5,$8,r6,1b
-/* initialize system page table: uba vectors and int stack writeable */
- clrl r2
- movab eintstack,r1; bbcc $31,r1,1f;
-1: bisl3 $PG_V|PG_KW,r2,_Sysmap[r2]; aoblss r1,r2,1b
-/* make kernel text space read-only */
- movab _etext+NBPG-1,r1; bbcc $31,r1,1f;
-1: bisl3 $PG_V|PG_URKR,r2,_Sysmap[r2]; aoblss r1,r2,1b
-/* make kernel data, bss, read-write */
- bicl3 $SYSTEM,r9,r1; ashl $-PGSHIFT,r1,r1
-1: bisl3 $PG_V|PG_KW,r2,_Sysmap[r2]; aoblss r1,r2,1b
-/* now go to mapped mode */
- mtpr $0,$TBIA; mtpr $1,$MAPEN; jmp *$0f; 0:
-/* init mem sizes */
- ashl $-PGSHIFT,r7,_maxmem
- movl _maxmem,_physmem
- movl _maxmem,_freemem
-/* setup context for proc[0] == Scheduler */
- bicl3 $SYSTEM|(NBPG-1),r9,r6 # make phys, page boundary
-/* setup page table for proc[0] */
- ashl $-PGSHIFT,r6,r3 # r3 = btoc(r6)
- bisl3 $PG_V|PG_KW,r3,_Usrptmap # init first upt entry
- incl r3
- movab _usrpt,r0
- mtpr r0,$TBIS
-/* init p0br, p0lr */
- mtpr r0,$P0BR
- mtpr $0,$P0LR
-/* double map the kernel into the virtual user addresses of phys mem */
- mtpr $_Sysmap,$P0BR
- mtpr $_Syssize,$P0LR
-/* init p1br, p1lr */
- movab NBPG(r0),r0
- movl $0x200000-UPAGES,r1
- mtpr r1,$P1LR
- mnegl r1,r1
- moval -4*UPAGES(r0)[r1],r2
- mtpr r2,$P1BR
-/* setup mapping for UPAGES of _u */
- movl $UPAGES,r2; movab _u+NBPG*UPAGES,r1; addl2 $UPAGES,r3; jbr 2f
-1: decl r3
- moval -NBPG(r1),r1;
- bisl3 $PG_V|PG_URKW,r3,-(r0)
- mtpr r1,$TBIS
-2: sobgeq r2,1b
-/* initialize (slightly) the pcb */
- movab UPAGES*NBPG(r1),PCB_KSP(r1)
- mnegl $1,PCB_ESP(r1)
- mnegl $1,PCB_SSP(r1)
- movl r1,PCB_USP(r1)
- mfpr $P0BR,PCB_P0BR(r1)
- mfpr $P0LR,PCB_P0LR(r1)
- movb $4,PCB_P0LR+3(r1) # disable ast
- mfpr $P1BR,PCB_P1BR(r1)
- mfpr $P1LR,PCB_P1LR(r1)
- movl $CLSIZE,PCB_SZPT(r1) # init u.u_pcb.pcb_szpt
- movl r9,PCB_R9(r1)
- movl r10,PCB_R10(r1)
- movl r11,PCB_R11(r1)
- movab 1f,PCB_PC(r1) # initial pc
- clrl PCB_PSL(r1) # mode(k,k), ipl=0
- ashl $PGSHIFT,r3,r3
- mtpr r3,$PCBB # first pcbb
-/* set regs, p0br, p0lr, p1br, p1lr, astlvl, ksp and change to kernel mode */
- ldpctx
- rei
-/* put signal trampoline code in u. area */
-1: movab _u,r0
- movc3 $19,sigcode,PCB_SIGC(r0)
-/* save boot device in global _bootdev */
- movl r10,_bootdev
-/* save reboot flags in global _boothowto */
- movl r11,_boothowto
-#ifdef KADB
-/* save end of symbol & string table in global _bootesym */
- subl3 $NBPG-1,r9,_bootesym
-#endif
-/* calculate firstaddr, and call main() */
- bicl3 $SYSTEM,r9,r0; ashl $-PGSHIFT,r0,-(sp)
- addl2 $UPAGES+1,(sp); calls $1,_main
-/* proc[1] == /etc/init now running here; run icode */
- pushl $PSL_CURMOD|PSL_PRVMOD; pushl $0; rei
-
-/* signal trampoline code: it is known that this code takes exactly 19 bytes */
-/* in ../vax/pcb.h and in the movc3 above */
-sigcode:
- calls $4,8(pc) # params pushed by sendsig
- movl sp,ap # calls frame built by sendsig
- chmk $103 # cleanup mask and onsigstack
- halt # sigreturn() does not return!
- .word 0x3f # registers 0-5
- callg (ap),*16(ap) # call the signal handler
- ret # return to code above