Subject: TOY clock support for the 11/93 and 11/94 (#72) Index: sys/ 2.11BSD Description: Time Of Year clock support has come to 2.11BSD at last. In order to add this new feature the cpu type probe code had to be totally rewritten. /boot will now properly announce an 84 as an 84 rather than 44 and the more recent additions to the pdp-11 family will also be correctly announced when as "93boot" and "94boot". The first few diffs add "toy.s" and "toy.o" to the _prototype_ makefiles, you will have to add similar modifications to your locally configured kernel Make.files. It's not hard, just add toy.s in the same place as the diffs do, the toy.o can be put wherever you have about 500 bytes (it was a _lot_ of fun squeezing it down that tight. Whee!) free in an overlay - the code's only called once so placement is definitely non critical. On 11/93 and 11/94 systems (the TOY code checks the cputype and returns an "error" which is ignored if not on a 93 or 94) the TOY clock is read at system startup time just after the root filesystem is mounted, overriding the time read from the superblock. NOTE: The toy clock MUST be set (via the ODT monitor) to run on UCT (otherwise known as GMT). The 'date', usw. commands will provide the necessary timezone and daylight savings time corrections. (can you imagine trying to put the Elz timezone stuff in the _kernel_?) The cpu probe logic was removed from the kernel - there was no sense in replicating the effort which /boot went thru. The cputype is passed thru from /boot and the kernel takes advantage of that fact. ALSO, the 'dump code (hardly _ever_ used any more since autoreboot with crash dump capability was added) in mch_dump.s was streamlined - it pays attention to whether or not a Unibus Map is present, _not_ simply whether the cpu type is 44 or 70. In init_main.c there the "auto attach" call (the loop which previously called _every_ driver's "XXroot" entry point) has changed. This happened quite a while ago (locally) when a second MSCP controller was added and i wanted to boot from it rather than the default/"first" controller. The comments in that diff should make it clear what's going on - but a brief summary here might be a good idea: All drivers work as before, in fact they don't even know the protocol has changed! /boot passes thru both the unit number _and_ CSR of the controller from which the boot block was loaded. The kernel now pays attention to this information, but a way was needed to pass it along to the driver which handles the system disc [N.B. the kernel still only understands booting from unit 0 - but it can be on _any_ controller]. The "auto attach" loop was removed (why attach every possible controller when all that's needed is the drive we booted from - and possibly the swap device?) and in its place two calls to the "root" and "swap" device drivers made. As of now only the MSCP (ra.c) driver has been modified to handle this situation - all other drivers use hardcoded CSR addresses in their XXroot() routine. I have not as yet posted the diffs to the ra.c driver - the changes to init_main.c will not be noticed by older ra.c drivers. The ra.c changes (not yet posted) include a new and (i think) vastly superior partition scheme, it's not a substitute for labels, but it does recognize _all_ MSCP drives! This change was made necessary by the need to get 2.11BSD up on a 93 with RZ23L and RZ24L drives without adding _yet more_ tables to ra.c. Watch for it Real Soon Now on comp.bugs.2bsd The changes have been tested on an 11/44, 11/73, 11/84 and 11/93. Hats off and many many thanks to Terry Kennedy for the 11/93 "donated" (bent or warped? ;-)) to the 2.11BSD effort! The TOY support wouldn't have been possible without his help. Thank you. Repeat-By: Not really applicable, it's all "new" stuff/features. Fix: Assuming you've kept up with the previous fixes posted (available by request, i'm also working up a "master patch set" from the base 2.11BSD kit) these patches should apply with no problems. Apply the patches below and remake the kernel and /boot. If you're really paranoid make sure you have an old boot tape handy. But definitely _do_ try this at home :-) This fix is in two parts (both included). First unshar this file, it will produce two files: /tmp/c and /tmp/toy.s. Move /tmp/toy.s to /sys/pdp/toy.s: mv /tmp/toy.s /sys/pdp/toy.s. Then apply the rest of the patch by: patch -p0 < /tmp/c #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # c # toy.s # This archive created: Sat Aug 29 00:33:00 1992 export PATH; PATH=/bin:/usr/bin:$PATH if test -f 'c' then echo shar: "will not over-write existing file 'c'" else sed 's/^X//' << \SHAR_EOF > 'c' XSubject: TOY clock support for the 11/93 and 11/94 (#72) XIndex: sys/ 2.11BSD X XDescription: X X Time Of Year clock support has come to 2.11BSD at last. In order X to add this new feature the cpu type probe code had to be totally X rewritten. /boot will now properly announce an 84 as an 84 rather X than 44 and the more recent additions to the pdp-11 family will X also be correctly announced when as "93boot" and "94boot". X X The first few diffs add "toy.s" and "toy.o" to the _prototype_ X makefiles, you will have to add similar modifications to your locally X configured kernel Make.files. It's not hard, just add toy.s in X the same place as the diffs do, the toy.o can be put wherever X you have about 500 bytes (it was a _lot_ of fun squeezing it down X that tight. Whee!) free in an overlay - the code's only called X once so placement is definitely non critical. X X On 11/93 and 11/94 systems (the TOY code checks the cputype and X returns an "error" which is ignored if not on a 93 or 94) the TOY X clock is read at system startup time just after the root filesystem X is mounted, overriding the time read from the superblock. X X NOTE: The toy clock MUST be set (via the ODT monitor) to run X on UCT (otherwise known as GMT). The 'date', usw. commands will X provide the necessary timezone and daylight savings time corrections. X (can you imagine trying to put the Elz timezone stuff in the _kernel_?) X X The cpu probe logic was removed from the kernel - there was no X sense in replicating the effort which /boot went thru. The cputype X is passed thru from /boot and the kernel takes advantage of that X fact. ALSO, the 'dump code (hardly _ever_ used any more since X autoreboot with crash dump capability was added) in mch_dump.s X was streamlined - it pays attention to whether or not a Unibus X Map is present, _not_ simply whether the cpu type is 44 or 70. X X In init_main.c there the "auto attach" call (the loop which X previously called _every_ driver's "XXroot" entry point) has X changed. This happened quite a while ago (locally) when a second X MSCP controller was added and i wanted to boot from it rather than X the default/"first" controller. The comments in that diff should X make it clear what's going on - but a brief summary here might be X a good idea: X X All drivers work as before, in fact they don't even know X the protocol has changed! X X /boot passes thru both the unit number _and_ CSR of the X controller from which the boot block was loaded. The X kernel now pays attention to this information, but a way X was needed to pass it along to the driver which handles X the system disc [N.B. the kernel still only understands X booting from unit 0 - but it can be on _any_ controller]. X The "auto attach" loop was removed (why attach every possible X controller when all that's needed is the drive we booted X from - and possibly the swap device?) and in its place X two calls to the "root" and "swap" device drivers made. X X As of now only the MSCP (ra.c) driver has been modified X to handle this situation - all other drivers use hardcoded X CSR addresses in their XXroot() routine. I have not as X yet posted the diffs to the ra.c driver - the changes X to init_main.c will not be noticed by older ra.c drivers. X X The ra.c changes (not yet posted) include a new and (i think) X vastly superior partition scheme, it's not a substitute for X labels, but it does recognize _all_ MSCP drives! This change X was made necessary by the need to get 2.11BSD up on a 93 with X RZ23L and RZ24L drives without adding _yet more_ tables X to ra.c. Watch for it Real Soon Now on comp.bugs.2bsd X X The changes have been tested on an 11/44, 11/73, 11/84 and 11/93. X X Hats off and many many thanks to Terry Kennedy for the 11/93 X "donated" (bent or warped? ;-)) to the 2.11BSD effort! The TOY X support wouldn't have been possible without his help. Thank you. X XRepeat-By: X X Not really applicable, it's all "new" stuff/features. X XFix: X Assuming you've kept up with the previous fixes posted (available X by request, i'm also working up a "master patch set" from the base X 2.11BSD kit) these patches should apply with no problems. Apply X the patches below and remake the kernel and /boot. If you're X really paranoid make sure you have an old boot tape handy. But X definitely _do_ try this at home :-) X X This fix is in two parts (both included). First unshar this X file, it will produce two files: /tmp/c and /tmp/toy.s. Move X /tmp/toy.s to /sys/pdp/toy.s: mv /tmp/toy.s /sys/pdp/toy.s. X X Then apply the rest of the patch by: patch -p0 < /tmp/c X X=================================cut here================================== X*** /usr/src/sys/conf/Make.pdp.old Fri Sep 2 20:20:58 1988 X--- /usr/src/sys/conf/Make.pdp Sat Jul 11 23:07:00 1992 X*************** X*** 32,43 **** X ${M}/mch_click.s ${M}/mch_copy.s ${M}/mch_csv.s ${M}/mch_dump.s \ X ${M}/mch_dzpdma.s ${M}/mch_fpsim.s ${M}/mch_KScall.s \ X ${M}/mch_profile.s ${M}/mch_start.s ${M}/mch_trap.s \ X! ${M}/mch_vars.s ${M}/mch_xxx.s ${M}/scb.s X SOBJS= libc_bcmp.o libc_bcopy.o libc_bzero.o libc_ffs.o libc_insque.o \ X libc_ldiv.o libc_lmul.o libc_lrem.o libc_remque.o libc_strlen.o \ X libc_udiv.o mch_backup.o mch_click.o mch_copy.o mch_csv.o \ X mch_dump.o mch_dzpdma.o mch_fpsim.o mch_KScall.o mch_profile.o \ X! mch_start.o mch_trap.o mch_vars.o mch_xxx.o scb.o X X .c.o: X ${CC} ${CFLAGS} -S $*.c X--- 32,43 ---- X ${M}/mch_click.s ${M}/mch_copy.s ${M}/mch_csv.s ${M}/mch_dump.s \ X ${M}/mch_dzpdma.s ${M}/mch_fpsim.s ${M}/mch_KScall.s \ X ${M}/mch_profile.s ${M}/mch_start.s ${M}/mch_trap.s \ X! ${M}/mch_vars.s ${M}/mch_xxx.s ${M}/scb.s ${M}/toy.s X SOBJS= libc_bcmp.o libc_bcopy.o libc_bzero.o libc_ffs.o libc_insque.o \ X libc_ldiv.o libc_lmul.o libc_lrem.o libc_remque.o libc_strlen.o \ X libc_udiv.o mch_backup.o mch_click.o mch_copy.o mch_csv.o \ X mch_dump.o mch_dzpdma.o mch_fpsim.o mch_KScall.o mch_profile.o \ X! mch_start.o mch_trap.o mch_vars.o mch_xxx.o scb.o toy.o X X .c.o: X ${CC} ${CFLAGS} -S $*.c X*** /usr/src/sys/conf/Make.nsunix.old Sun Dec 22 16:15:43 1991 X--- /usr/src/sys/conf/Make.nsunix Sat Jul 11 23:13:10 1992 X*************** X*** 74,80 **** X sys_pipe.o X # OV6 gets the (hopefully) never used routines X OV6= clock.o dn.o init_main.o kern_pdp.o machdep2.o subr_prf.o syscalls.o \ X! subr_log.o X OV7= tmscp.o X X KERNOBJ=${CONF} ${BASE} ${OV1} ${OV2} ${OV3} ${OV4} ${OV5} \ X--- 74,80 ---- X sys_pipe.o X # OV6 gets the (hopefully) never used routines X OV6= clock.o dn.o init_main.o kern_pdp.o machdep2.o subr_prf.o syscalls.o \ X! subr_log.o toy.o X OV7= tmscp.o X X KERNOBJ=${CONF} ${BASE} ${OV1} ${OV2} ${OV3} ${OV4} ${OV5} \ X*** /usr/src/sys/conf/Make.sunix.old Sun Dec 22 16:16:31 1991 X--- /usr/src/sys/conf/Make.sunix Sat Jul 11 23:13:33 1992 X*************** X*** 58,64 **** X kern_xxx.o machdep2.o quota_sys.o subr_prf.o sys_process.o \ X syscalls.o ufs_mount.o X OV4= hk.o init_main.o kern_prot.o tty_pty.o quota_kern.o quota_subr.o \ X! quota_ufs.o subr_log.o vm_swap.o vm_proc.o X OV5= ht.o tm.o ts.o X OV6= tmscp.o X X--- 58,64 ---- X kern_xxx.o machdep2.o quota_sys.o subr_prf.o sys_process.o \ X syscalls.o ufs_mount.o X OV4= hk.o init_main.o kern_prot.o tty_pty.o quota_kern.o quota_subr.o \ X! quota_ufs.o subr_log.o vm_swap.o vm_proc.o toy.o X OV5= ht.o tm.o ts.o X OV6= tmscp.o X X*** /usr/src/sys/conf/Make.unix.old Thu Feb 20 13:33:30 1992 X--- /usr/src/sys/conf/Make.unix Sat Jul 11 23:14:10 1992 X*************** X*** 55,61 **** X kern_subr.o kern_synch.o kern_time.o kern_xxx.o lp.o machdep.o \ X machdep2.o mem.o quota_kern.o quota_subr.o quota_sys.o \ X quota_ufs.o ra.o ram.o rk.o rl.o rx.o si.o subr_prf.o subr_rmap.o \ X! subr_xxx.o sys_generic.o sys_inode.o sys_kern.o \ X sys_pipe.o sys_process.o syscalls.o tm.o trap.o tmscp.o ts.o tty.o \ X tty_conf.o tty_pty.o tty_subr.o tty_tb.o tty_tty.o ufs_alloc.o \ X ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o \ X--- 55,61 ---- X kern_subr.o kern_synch.o kern_time.o kern_xxx.o lp.o machdep.o \ X machdep2.o mem.o quota_kern.o quota_subr.o quota_sys.o \ X quota_ufs.o ra.o ram.o rk.o rl.o rx.o si.o subr_prf.o subr_rmap.o \ X! subr_xxx.o sys_generic.o sys_inode.o sys_kern.o toy.o \ X sys_pipe.o sys_process.o syscalls.o tm.o trap.o tmscp.o ts.o tty.o \ X tty_conf.o tty_pty.o tty_subr.o tty_tb.o tty_tty.o ufs_alloc.o \ X ufs_bio.o ufs_bmap.o ufs_dsort.o ufs_fio.o ufs_inode.o \ X*** /usr/src/sys/sys/init_main.c.old Sun Sep 22 09:50:36 1991 X--- /usr/src/sys/sys/init_main.c Sun Jul 12 16:27:15 1992 X*************** X*** 46,54 **** X--- 46,57 ---- X */ X main() X { X+ extern dev_t bootdev; X+ extern caddr_t bootcsr; X register struct proc *p; X register int i; X register struct fs *fs; X+ time_t toytime, toyclk(); X X startup(); X X*************** X*** 94,101 **** X nchinit(); X clkstart(); X X! for (i = 0; i < nblkdev; i++) X! (void)(*bdevsw[i].d_root)(); X (*bdevsw[major(swapdev)].d_open)(swapdev, B_READ); X fs = mountfs(rootdev, boothowto & RB_RDONLY, (struct inode *)0); X if (!fs) X--- 97,118 ---- X nchinit(); X clkstart(); X X! /* X! * Need to attach the root device. The CSR is passed thru because this X! * may be a 2nd or 3rd controller rather than the 1st. NOTE: This poses X! * a big problem if 'swapdev' is not on the same controller as 'rootdev' X! * _or_ if 'swapdev' itself is on a 2nd or 3rd controller. Short of moving X! * autconfigure back in to the kernel it is not known what can be done about X! * this. X! * X! * As a "compatibility hack" call swapdev's attach routine with a zero X! * address. The MSCP driver treats the 0 as a signal to perform the X! * old (fixed address) attach. Drivers (all the rest at this point) which X! * do not support alternate controller booting always attach the first X! * (primary) CSR and do not expect an argument to be passed. X! */ X! (void)(*bdevsw[major(bootdev)].d_root)(bootcsr); X! (void)(*bdevsw[major(swapdev)].d_root)((caddr_t) 0); /* XXX */ X (*bdevsw[major(swapdev)].d_open)(swapdev, B_READ); X fs = mountfs(rootdev, boothowto & RB_RDONLY, (struct inode *)0); X if (!fs) X*************** X*** 104,109 **** X--- 121,128 ---- X fs->fs_fsmnt[0] = '/'; X fs->fs_fsmnt[1] = '\0'; X time.tv_sec = fs->fs_time; X+ if (toytime = toyclk()) X+ time.tv_sec = toytime; X boottime = time; X X /* kick off timeout driven events by calling first time */ X*** /usr/src/sys/pdp/mch_start.s.old Sat Apr 20 21:44:52 1991 X--- /usr/src/sys/pdp/mch_start.s Fri Jul 3 23:21:46 1992 X*************** X*** 4,9 **** X--- 4,10 ---- X * specifies the terms and conditions for redistribution. X * X * @(#)mch_start.s 1.1 (2.10BSD Berkeley) 6/11/88 X+ * 1.2 (2.11BSD GTE) 7/03/92 X */ X X #include "DEFS.h" X*************** X*** 15,20 **** X--- 16,22 ---- X bit $1,SSR0 / is memory management enabled? X beq . / better be !!! X X+ mov r0,_cputype / save cpu type passed by boot X /* X * The following two instructions change the contents of the "sys" X * instruction vector (034-037) to read: X*************** X*** 137,142 **** X--- 139,149 ---- X * on any processor but still take advantage of hardware that is present. X * This is also a plus for a site which wants to maintain one kernel for a X * number of different processors. X+ * X+ * Might as well use the cpu type from /boot after all the hoops it jumped X+ * thru to figure it out. No sense in duplicating that code here in the X+ * kernel. /boot also stuffed the right bits into the MSCR register to X+ * disable cache and unibus traps. X */ X hardprobe: X mov $1f,nofault X*************** X*** 147,160 **** X /* X * Test for SSR3 and UNIBUS map capability. If there is no SSR3, the X * first test of SSR3 will trap and we skip past the separate I/D test. X */ X! mov $cputest,nofault X! #ifdef UNIBUS_MAP X bit $40,SSR3 X beq 1f X incb _ubmap X 1: X- #endif X X #ifdef NONSEPARATE X /* X--- 154,166 ---- X /* X * Test for SSR3 and UNIBUS map capability. If there is no SSR3, the X * first test of SSR3 will trap and we skip past the separate I/D test. X+ * 2.11BSD will be _seriously_ upset if I/D is not available! X */ X! mov $2f,nofault X bit $40,SSR3 X beq 1f X incb _ubmap X 1: X X #ifdef NONSEPARATE X /* X*************** X*** 165,217 **** X bic $1,SSR3 X #else X bit $1,SSR3 / Test for separate I/D capability X! beq cputest X incb _sep_id X #endif X! X! /* X! * Try to find out what kind of cpu this is. Defaults are 40 for X! * nonseparate and 45 for separate. Cputype will be one of: 24, X! * 40, 60, 45, 44, 70, 73. X! */ X! cputest: X! #ifndef NONSEPARATE X! tstb _sep_id X! beq nonsepcpu X! X! tstb _ubmap / sep_id: 44, 45, 70, 73 X! bne 1f X! X! mov $cpudone,nofault / sep_id && !ubmap: 45 or 73 X! tst *$PDP1170_MSER / mem sys err reg implies 73 X! mov $73.,_cputype X! bis $CCR_DT,*$PDP1170_CCR / disable cache traps X! br cpudone X! 1: X! mov $1f,nofault / sep_id && ubmap: 44 or 70 X! mfpt / if mfpt instruction exists, this is X! mov $44.,_cputype / a 44 X! bis $CCR_DCPI,*$PDP1144_CCR / Disable cache parity interrupts. X! br cpudone X! 1: X! mov $70.,_cputype X! bis $CCR_DUT|CCR_DT,*$PDP1170_CCR / Disable UNIBUS and nonfatal X! br cpudone / traps. X! X! nonsepcpu: X! #endif !NONSEPARATE X! tstb _ubmap / !sep_id: 24, 40, 60 X! bne 1f X! X! mov $cpudone,nofault / !sep_id && !ubmap: 40, 60 X! tst PDP1160_MSR X! mov $60.,_cputype X! bis $CCR_DT,*$PDP1160_CCR / Disable cache parity error traps. X! br cpudone X! 1: X! mov $24.,_cputype / !sepid && ubmap: 24 X! X! cpudone: X / Test for stack limit register; set it if present. X mov $1f,nofault X mov $intstk-256.,STACKLIM X--- 171,180 ---- X bic $1,SSR3 X #else X bit $1,SSR3 / Test for separate I/D capability X! beq 2f X incb _sep_id X #endif X! 2: X / Test for stack limit register; set it if present. X mov $1f,nofault X mov $intstk-256.,STACKLIM X*** /usr/src/sys/pdp/mch_dump.s.old Fri Aug 4 14:59:46 1989 X--- /usr/src/sys/pdp/mch_dump.s Sat Jul 4 00:22:11 1992 X*************** X*** 4,9 **** X--- 4,10 ---- X * specifies the terms and conditions for redistribution. X * X * @(#)mch_dump.s 1.1 (2.10BSD Berkeley) 2/10/87 X+ * 1.2 (2.11BSD GTE) 7/03/92 X */ X #include "DEFS.h" X #include "../machine/mch_iopage.h" X*************** X*** 153,163 **** X * reg 5 -- is used as an interation counter when mapping is enabled X */ X X! clr r4 / clear UB map used indicator X! cmp _cputype,$44. / is a 44? X! beq 1f / yes, skip next X! cmp _cputype,$70. / is a 70? X! bne 2f / not a 70 either, no UBMAP X 1: X /* X * This section of code initializes the Unibus map registers and X--- 154,161 ---- X * reg 5 -- is used as an interation counter when mapping is enabled X */ X X! movb _ubmap,r4 / UB map used indicator X! beq 2f / no UBMAP - br X 1: X /* X * This section of code initializes the Unibus map registers and X*************** X*** 167,173 **** X * Kernal I space 7 points to the I/O page. X */ X X- inc r4 / indicate that UB mapping is needed X mov $UBMR0,r1 / point to map register 0 X clr r2 / init for low map reg X clr r3 / init for high map reg X--- 165,170 ---- X*************** X*** 241,253 **** X * reg 5 -- is used as an interation counter when mapping is enabled X */ X X! cmp _cputype,$44. / is a 44? X! beq 1f / yes, skip next X! cmp _cputype,$70. / is a 70? X! bne 2f / not a 70 either, no UBMAP X! 1: X! / tst _ubmap / unibus map present? X! / beq 2f / no, skip map init X X /* X * This section of code initializes the Unibus map registers and X--- 238,245 ---- X * reg 5 -- is used as an interation counter when mapping is enabled X */ X X! movb _ubmap,setmap / unibus map present? X! beq 2f / no, skip map init X X /* X * This section of code initializes the Unibus map registers and X*************** X*** 259,265 **** X * Kernal I space 7 points to the I/O page. X */ X X- inc setmap / indicate that UB mapping is needed X mov $UBMR0,r0 / point to map register 0 X clr r2 / init for low map reg X clr r3 / init for high map reg X--- 251,256 ---- X*** /usr/src/sys/pdp/mch_vars.s.old Sat Sep 8 11:02:01 1990 X--- /usr/src/sys/pdp/mch_vars.s Sat Jul 4 00:26:50 1992 X*************** X*** 12,17 **** X--- 12,18 ---- X X INT(GLOBAL, _fpp, 0) / we have a floating point processor X INT(GLOBAL, _ubmap, 0) / we have a unibus map X+ INT(GLOBAL, _cputype, 0) / cpu type X CHAR(GLOBAL, _sep_id, 0) / we have a separate I&D CPU X X #ifdef ENABLE34 X*************** X*** 19,25 **** X #endif X .even X X- X /* X * Define _ka6 and give it a reasonable initial value X */ X--- 20,25 ---- X*************** X*** 29,36 **** X # else X INT(GLOBAL, _ka6, KISA6) X # endif X- X- INT(GLOBAL, _cputype, 40.) X #else X # ifdef ENABLE34 X INT(GLOBAL, _ka6, DEC_KDSA6) X--- 29,34 ---- X*************** X*** 37,46 **** X # else X INT(GLOBAL, _ka6, KDSA6) X # endif X- X- INT(GLOBAL, _cputype, 45.) X #endif X- X X SPACE(GLOBAL, intstk, INTSTK) / temp stack while KDSA6 is unmapped X CONST(GLOBAL, eintstk, intstk+INTSTK) / top of interuupt stack X--- 35,41 ---- X*** /usr/src/sys/pdpstand/M.s.old Tue Apr 23 10:21:47 1991 X--- /usr/src/sys/pdpstand/M.s Sat Jul 4 00:03:21 1992 X*************** X*** 1,12 **** X / X / SCCS id @(#)M.s 1.7 (Berkeley) 7/11/83 X! / @(#)M.s 2.0 (2.11BSD) 4/12/91 (sms@wlv.imsd.contel.com) X / X / Startup code for two-stage bootstrap with support for autoboot. X / Supports 11/45, 11/70, 11/53, 11/73, 11/83, 11/84, 11/93, 11/94 X X- systrap = 104400 / trap 0 X- X / The boot options and device are placed in the last SZFLAGS bytes X / at the end of core by the kernel if this is an autoboot. X / The first-stage boot will leave them in registers for us; X--- 1,10 ---- X / X / SCCS id @(#)M.s 1.7 (Berkeley) 7/11/83 X! / @(#)M.s 3.0 (2.11BSD) 7/03/92 (sms@wlv.iipo.gtegsc.com) X / X / Startup code for two-stage bootstrap with support for autoboot. X / Supports 11/45, 11/70, 11/53, 11/73, 11/83, 11/84, 11/93, 11/94 X X / The boot options and device are placed in the last SZFLAGS bytes X / at the end of core by the kernel if this is an autoboot. X / The first-stage boot will leave them in registers for us; X*************** X*** 60,102 **** X clr ENDCORE-BOOTDEV X clr ENDCORE-CHECKWORD X / X! / determine what kind of cpu we are running on X! / The check for the switch register removed because: 1) the only use X! / of it was in xp.c for the drive type and an alternate method of X! / modifying xptype is provided, 2) the only machine with a front panel X! / which can run the system is the 11/70 and i got tired of having the X! / system think it was on a 11/40 because switches were left up after the X! / boot, 3) the standalone code was becoming large enough that 'restor' X! / was having size problems due to the addition of multi-controller support, X! / 4) the probing proceedure adequately determines the hardware capabilities. X X clrb _sep_id X clrb _ubmap X! mov $40.,r0 / assume 11/40 X! mov $2f,nofault X! mov *$KDSA6,r1 / then we have sep i/d 45, 70, 73 X! incb _sep_id X! mov $45.,r0 X! mov $3f,nofault X! mov *$UBMAP,r1 / then we have a unibus map. 44 or 70 X! incb _ubmap X! mov $70.,r0 X! mov $1f,nofault X! mfpt / if mfpt instruction exists, this is X! mov $44.,r0 / a 44 X! br 1f X! 3: / br here with sep i/d, no ubmap. 45 or 73. X! mov $1f,nofault X! mov *$MSCR,r1 / if no MSCR, 45 ! X! mov $73.,r0 / sep i/d, no ubmap, MSCR. 73! X! br 1f X! 2: / br here if no sep. I/D. 23, 24, 34, 40, 60 X! mov $1f,nofault X! mov *$UBMAP,r1 / then we have a unibus map X! incb _ubmap X! mov $24.,r0 / unibus map, no sep. I/D = 24 X! 1: clr nofault X! mov r0,_cputype X X / X / Set kernel I space registers to physical 0 and I/O page X--- 58,71 ---- X clr ENDCORE-BOOTDEV X clr ENDCORE-CHECKWORD X / X! / determine what kind of cpu we are running on. this was totally rewritten X! / when support for the 93 and 94 was added. X X clrb _sep_id X clrb _ubmap X! jsr pc,cpuprobe / fill in _cputype, _ubmap and _sep_id X! / also sets MSCR bits X! clr nofault X X / X / Set kernel I space registers to physical 0 and I/O page X*************** X*** 138,144 **** X / X / If 11/40 class processor, only need set the I space registers X / X! tstb _sep_id X jeq 1f X X / X--- 107,113 ---- X / X / If 11/40 class processor, only need set the I space registers X / X! movb _sep_id, _ksep X jeq 1f X X / X*************** X*** 161,167 **** X X 1: X / enable map X- clrb _ksep X tstb _ubmap X beq 2f X jsr pc,_ubmapset / 24, 44, 70 -> ubmap X--- 130,135 ---- X*************** X*** 171,195 **** X br 1f X 3: X mov $65,SSR3 / 44, 70 -> ubmap, I/D X- incb _ksep X- mov $3,MSCR / 44, 70: $1: disable cache parity traps X- / 44: $2: ignored X- / 70: $2: disable UNIBUS traps X br 1f X 2: X tstb _sep_id / 23, 34, 40, 45, 60, 73 -> no ubmap X beq 1f X mov $25,SSR3 / 45, 73 -> no ubmap, I/D; maybe 22-bit X- incb _ksep X 1: X mov $30340,PS X! inc SSR0 X X- X / copy program to user I space X mov $_end,r0 X! asr r0 X! bic $100000,r0 X clr r1 X 1: X mov (r1),-(sp) X--- 139,157 ---- X br 1f X 3: X mov $65,SSR3 / 44, 70 -> ubmap, I/D X br 1f X 2: X tstb _sep_id / 23, 34, 40, 45, 60, 73 -> no ubmap X beq 1f X mov $25,SSR3 / 45, 73 -> no ubmap, I/D; maybe 22-bit X 1: X mov $30340,PS X! inc SSR0 / turn on memory management X X / copy program to user I space X mov $_end,r0 X! clc X! ror r0 X clr r1 X 1: X mov (r1),-(sp) X*************** X*** 228,237 **** X com r2 / checkword X mov $160000,-(sp) / set ksp to very top so that the trap X mtpi sp / puts the return address and psw at 157774,6 X! systrap X X br user X X setseg: X mov $8,r0 X 1: X--- 190,255 ---- X com r2 / checkword X mov $160000,-(sp) / set ksp to very top so that the trap X mtpi sp / puts the return address and psw at 157774,6 X! sys 0 / can't use "trap" because that's a label X X br user X X+ cpuprobe: X+ mov $1f,nofault / catch possible trap X+ tst *$UBMAP / look for unibus map X+ incb _ubmap / we've got one, note that and continue on X+ 1: X+ mov $1f,nofault X+ tst *$KDSA6 / look for split I/D X+ incb _sep_id X+ 1: X+ mov $nomfpt,nofault / catch possible fault from instruction X+ mfpt / 23/24, 44, and KDJ-11 have this instruction X+ cmp r0,$1 / 44? X+ bne 1f / no - br X+ mov $1,*$MSCR / disable cache parity traps X+ mov $44.,_cputype X+ rts pc X+ 1: X+ cmp r0,$5 / KDJ-11? X+ bne 2f / no - br X+ mov *$MAINT,r0 / get system maint register X+ ash $-4,r0 / move down and X+ bic $177760,r0 / isolate the module id X+ mov $1,*$MSCR / disable cache parity traps X+ movb j11typ(r0),r0 / lookup cpu type X+ movb _ubmap,r1 / unibus? X+ beq 1f / nope - br X+ bis $2,*$MSCR / disable unibus traps X+ 1: X+ add r1,r0 / bump the cpu type (93 -> 94, 83 ->84) X+ br out X+ 2: X+ cmp r0,$3 / 23 or 24? X+ bne nomfpt / mfpt returned other than 1,3,5 - HELP! X+ mov $23.,r0 / assume 23 X+ movb _ubmap,r1 / add in... X+ add r1,r0 / the unibus flag (23 -> 24) X+ br out X+ nomfpt: X+ tstb _sep_id / split I/D present? X+ beq 2f / no - br X+ mov $45.,r0 / assume 45 X+ tstb _ubmap / is that correct? X+ beq out / yes - br X+ mov $3,*$MSCR / disable unibus and cache traps X+ mov $70.,r0 X+ br out X+ 2: X+ mov $40.,r0 / assume 40 X+ mov $out,nofault X+ tst *$MSCR / 60 has MSCR, 40 doesn't X+ mov $60.,r0 X+ mov $1,*$MSCR X+ out: X+ mov r0,_cputype X+ rts pc X+ X setseg: X mov $8,r0 X 1: X*************** X*** 341,346 **** X--- 359,365 ---- X UDSA0 = 177660 X UDSD0 = 177620 X MSCR = 177746 / 11/44/60/70 memory system cache control register X+ MAINT = 177750 / KDJ-11 system maintenance register X IO = 177600 X UBMAP = 170200 X X*************** X*** 350,356 **** X .globl _bootopts, _bootdev, _checkword, _bootcsr X X nofault: .=.+2 / where to go on predicted trap X! _cputype: .=.+2 / cpu type (currently 40,45 or 70) X _sep_id: .=.+1 / 1 if we have separate I and D X _ksep: .=.+1 / 1 if kernel mode has sep I/D enabled X _ubmap: .=.+2 / 1 if we have a unibus map X--- 369,375 ---- X .globl _bootopts, _bootdev, _checkword, _bootcsr X X nofault: .=.+2 / where to go on predicted trap X! _cputype: .=.+2 / cpu type X _sep_id: .=.+1 / 1 if we have separate I and D X _ksep: .=.+1 / 1 if kernel mode has sep I/D enabled X _ubmap: .=.+2 / 1 if we have a unibus map X*************** X*** 358,360 **** X--- 377,380 ---- X _bootdev: .=.+2 / device booted from X _bootcsr: .=.+2 / csr of device booted from X _checkword: .=.+2 / saved r2, complement of bootopts if an autoboot X+ j11typ: .byte 0, 73., 83., 0, 53., 93. SHAR_EOF fi if test -f 'toy.s' then echo shar: "will not over-write existing file 'toy.s'" else sed 's/^X//' << \SHAR_EOF > 'toy.s' X/ the notes say that the TOY clock uses 24 hour time, but then later on X/ mention flags dealing with AM/PM... So, code is present but disabled X/ to handle 12 hour time. If this code is needed change the 0 below to X/ a 1. X Xtoy24=0 X X/ extraneous flag bit possible in the day field. this "should never X/ happen", but if it does change the 0 to a 1 below. X Xdayflags=0 X X .globl TOYCSR XTOYCSR = 177526 X X .globl _toyclk X .text X_toyclk: X jsr r5,csv / callable from C, save regs X sub $8.,sp / need 8 byte scratch area Xtdata = -20 X cmp _cputype,$93. / are we a 11/93? X beq 1f / yes - br X cmp _cputype,$94. / are we a 11/94? X bne err / no, go return "error" X1: X jsr pc,initoy / initialize the clock for reading X mov r5,(sp) X add $tdata,(sp) / pointer to scratch area X jsr pc,_gettoy / read the toy clock X mov (sp),r2 / pointer to scratch area X mov $8.,r3 / number of bytes of clock data X2: X clr r1 X bisb (r2),r1 / fetch byte of clock data (!sign ext) X.if toy24 X cmp r3,$5 / are we on the hours field? X bne 3f / no - br X bic $240,r1 / clear am/pm flags X3: X.endif X jsr pc,bcd / convert 2 nybbles bcd to binary X.if toy24 X cmp r3,$5 / hours field? X bne 4f / no - skip am/pm stuff X tstb (r2) / $200 = am/pm in use X bpl 4f / not am/pm, skip it X cmp r1,$12. / exactly 12? X bne 5f / no - br X clr r1 / make midnight X5: X bitb $40,(r2) / PM? X beq 4f / no - br X add $12.,r1 / convert to 24 hour time X.endif X4: X movb r1,(r2)+ / store converted/correct binary value X sob r3,2b / continue on for rest of the bytes X sub $7,r2 / back up to seconds field X.if dayflags X bicb $177770,4(r2) / clear possible excess bits in day X.endif X mov $bounds,r3 / do bounds checking now, not 100ths X1: X movb (r2)+,r1 / get byte of clock data X cmpb r1,(r3)+ / below lo bound? X blo err / yes - br X cmpb r1,(r3)+ / above hi bound X bhi err / yes - br X cmp r3,$bounds+14. / at end (7 limits * 2 bytes per = 14)? X blo 1b / no - br X sub $8.,r2 / back to seconds field X movb 7(r2),r0 / fetch the year of century X cmp r0,$90. / are we a "90s" system? X bhis 1f / yep - br X add $100.,r0 / next century for years 00 - 89 X1: X movb r0,7(r2) / store fixed up year X decb 6(r2) / convert 1-12 month to 0-11 X mov r2,(sp) / pointer to the toy clock data X jsr pc,_tm2t / convert to a 32bit # of seconds time X br ret Xerr: X clr r0 / a double precision value X clr r1 / of 0 signals an error Xret: X jmp cret / return X .data Xbounds: X .byte 0,59. / seconds lo,hi X .byte 0,59. / minutes lo,hi X .byte 0,23. / hours lo,hi X .byte 0,7 / day of week lo,hi X .byte 1,31. / day of month lo,hi X .byte 1,12. / month of year lo,hi X .byte 0,99. / year of century lo,hi X .text Xinitoy: X tst *$TOYCSR / strobe the clock register X clr -(sp) / save previous high byte of register X movb *$TOYCSR+1,(sp) / only bit 8 belongs to TOY! X bic $1,(sp) / make sure bit 8 (TOY bit) is clear X mov $2,r2 / number of double words to send clock X1: X mov $35305,r0 / first word of recognition code X jsr pc,toyload / send it to clock X mov $56243,r0 / second word X jsr pc,toyload / send it X sob r2,1b / do the whole thing twice X tst (sp)+ / clean stack X rts pc X X/ send contents of r0 to the TOY. 2(sp) has the old bits 9-15, bit 8 X/ has been cleared. X Xtoyload: X mov $16.,r1 / number of bits to send X1: X mov r0,r3 / scratch copy X bic $177776,r3 / clear all but bit being sent X bis 2(sp),r3 / merge in old_csr_bits X movb r3,*$TOYCSR+1 / send bit to clock X asr r0 / shift pattern down X sob r1,1b / do all 16 bits in the word X rts pc X X .globl _gettoy X_gettoy: / (void)gettoy(&char[8]); X jsr r5,csv / C callable X mov 4(r5),r2 / buffer address X mov $4,r3 / number of words in buffer X1: X mov $16.,r4 / number of bits in word X2: X movb *$TOYCSR+1,r0 / low bit of top byte is a clock bit X asr r0 / put it in carry X ror r1 / ripple in at top end of r1 X sob r4,2b / do all 16 bits X mov r1,(r2)+ / store the word in the buffer X sob r3,1b / do all 4 words X jmp cret / and return X Xbcd: X clr r0 X div $16.,r0 X mov r1,-(sp) X mov r0,r1 X mul $10.,r1 X add (sp)+,r1 X rts pc X X .globl _tm2t X_tm2t: X jsr r5,csv X mov 4(r5),r4 X movb 1(r4),r1 X mov r1,-(sp) X clr -(sp) X movb 2(r4),r0 X mul $74,r0 X mov r1,-(sp) X mov r0,-(sp) X mov $7020,-(sp) X sxt -(sp) X movb 3(r4),r1 X mov r1,-(sp) X clr -(sp) X jsr pc,lmul X add $10,sp X mov r1,-(sp) X mov r0,-(sp) X mov $50600,-(sp) X mov $1,-(sp) X mov r4,-(sp) X jsr pc,_ndays / return value in r1 X tst (sp)+ X dec r1 X mov r1,-(sp) X sxt -(sp) X jsr pc,lmul X add $10,sp X add (sp)+,r0 X add (sp)+,r1 X adc r0 X add (sp)+,r0 X add (sp)+,r1 X adc r0 X add (sp)+,r0 X add (sp)+,r1 X adc r0 X jmp cret X X_leap: / r2 = year number, r1 clobbered X mov r2,r1 X add $3554,r1 X sxt r0 X div $620,r0 X tst r1 X bne 2f X br 3f X1: X clr r0 / return false X br 4f X2: X mov r2,r1 X sxt r0 X div $144,r0 X tst r1 X jeq 1b X bit $3,r2 X jne 1b X3: X mov $1,r0 / return true X4: X rts pc X .data Xmdays: X .byte 37,34,37,36,37,36,37,37,36,37,36,37,0 X .even X .text X_ndays: X jsr r5,csv X mov 4(r5),r0 X movb 5(r0),r4 X mov $106,r2 X jbr 3f X1: X add $555,r4 X jsr pc,*$_leap / r2 has year in it already X add r0,r4 X inc r2 X3: X mov 4(r5),r0 X movb 7(r0),r0 X cmp r2,r0 X jlt 1b X clr r3 X jbr 8f X4: X clr r0 X cmp $1,r3 X jne 5f X jsr pc,*$_leap / r2 has year X5: X movb mdays(r3),r1 X add r1,r0 X add r0,r4 X inc r3 X8: X mov 4(r5),r0 X movb 6(r0),r0 X cmp r3,r0 X jlt 4b X mov r4,r1 / return value in r1 not r0 X jmp cret SHAR_EOF fi exit 0 # End of shell archive