Trailing-Edge
-
PDP-10 Archives
-
tops20_version7_0_monitor_sources_clock
-
monitor-sources/aprsrv.mac
There are 54 other files named aprsrv.mac in the archive. Click here to see a list.
; UPD ID= 8477, RIP:<7.MONITOR>APRSRV.MAC.8, 9-Feb-88 11:48:37 by GSCOTT
;TCO 7.1218 - Update copyright notice.
; UPD ID= 8405, RIP:<7.MONITOR>APRSRV.MAC.7, 4-Feb-88 10:20:51 by GSCOTT
;TCO 7.1210 - Set BUGs to be not normally dumpable.
; UPD ID= 319, RIP:<7.MONITOR>APRSRV.MAC.6, 10-Dec-87 14:40:05 by GSCOTT
;TCO 7.1158 - Insure proper BUGHLT name stored in BUGNAM.
; UPD ID= 202, RIP:<7.MONITOR>APRSRV.MAC.4, 23-Oct-87 15:16:46 by GSCOTT
;TCO 7.1081 - Call DODOB from BUGFIN, check DB%DIP, save BUG name for SETSPD.
; UPD ID= 3, RIP:<7.MONITOR>APRSRV.MAC.3, 28-May-87 16:06:02 by RASPUZZI
;TCO 7.1002 - Implement PMOVE/M instructions.
; *** Edit 7463 to APRSRV.MAC by RASPUZZI on 28-Apr-87, for SPR #20634
; Catch ILLUUOs before they happen on a non-existant RH20 channel. Instead,
; let's crash with a RH2NXC.
; *** Edit 7447 to APRSRV.MAC by RASPUZZI on 14-Apr-87, for SPR #20703
; Make sure that we queue up a SYSERR block when an APR interrupt happens
; during a page fault. All we need to do is switch to the APR stack (MEMPP)
; when the interrupt hits.
; *** Edit 7376 to APRSRV.MAC by RASPUZZI on 6-Oct-86
; Fix silliness in edit 7363. Use a TXNE not a TXNN when checking for PMOV.
; *** Edit 7363 to APRSRV.MAC by RASPUZZI on 12-Sep-86
; If the PMOVE/PMOVEM instructions are available, then use them instead of
; routines MOVRCA and STORCA for more efficiency.
; *** Edit 7357 to APRSRV.MAC by RASPUZZI on 22-Aug-86
; Remove routine GAPRID since the processor serial number is already in APRSER
; and make all CALLs to GAPRID refer to that resident location.
; *** Edit 7240 to APRSRV.MAC by MCCOLLUM on 10-Feb-86
; Change BUGSTO to convert the local job index to a global job number.
; *** Edit 7224 to APRSRV.MAC by MCCOLLUM on 8-Jan-86
; Remove edit 7222. It caused SKDPF1's.
; *** Edit 7222 to APRSRV.MAC by MCCOLLUM on 3-Jan-86
; Use global job number in BUGCHKs and BUGINFs instead of local index
; Edit 7134 to APRSRV.MAC by GRANT on 15-Aug-85 (TCO 6-1-1522)
; Turn off the NI at BUGHLT and PAR>SHUT time
; UPD ID= 2311, SNARK:<6.1.MONITOR>APRSRV.MAC.204, 12-Aug-85 15:23:19 by MOSER
;TCO 6.1.1487 - FIX BUGHLT SAVING OF ACS FROM BUGHLT IN XCDSEC
; UPD ID= 2304, SNARK:<6.1.MONITOR>APRSRV.MAC.203, 19-Jul-85 16:42:00 by MOSER
;TCO 6.1.1492 - MORE JFNS NO SZCOD
; UPD ID= 2206, SNARK:<6.1.MONITOR>APRSRV.MAC.202, 6-Jun-85 21:06:28 by MOSER
;TCO 6.1.1436 - BUGHLT CODE SHOULDN'T PAGE FAULT!!!
; UPD ID= 2047, SNARK:<6.1.MONITOR>APRSRV.MAC.201, 3-Jun-85 14:13:32 by MCCOLLUM
;TCO 6.1.1406 - Update copyright notice.
; UPD ID= 2034, SNARK:<6.1.MONITOR>APRSRV.MAC.200, 30-May-85 13:42:51 by GROSSMAN
;TCO 6.1.1417 - Fix generation of SYSERR blocks for BUGHLTs from XCDSEC.
; UPD ID= 1891, SNARK:<6.1.MONITOR>APRSRV.MAC.199, 4-May-85 15:28:40 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1865, SNARK:<6.1.MONITOR>APRSRV.MAC.198, 4-May-85 10:31:55 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1808, SNARK:<6.1.MONITOR>APRSRV.MAC.197, 24-Apr-85 14:01:47 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1784, SNARK:<6.1.MONITOR>APRSRV.MAC.196, 23-Apr-85 12:40:03 by MCCOLLUM
;TCO 6.1.1238 - Fix more BUG. documentation
; UPD ID= 1721, SNARK:<6.1.MONITOR>APRSRV.MAC.195, 8-Apr-85 10:11:40 by MCCOLLUM
;TCO 6.1.1238 - Fix BUG. documentation
; UPD ID= 1692, SNARK:<6.1.MONITOR>APRSRV.MAC.194, 28-Mar-85 10:46:32 by GROSSMAN
;TCO 6.1.1293 - Save PI state better for BUGHLT's.
; UPD ID= 1658, SNARK:<6.1.MONITOR>APRSRV.MAC.193, 20-Mar-85 14:51:50 by LOMARTIRE
;TCO 6.1.1279 - Rework previous edit
; UPD ID= 1403, SNARK:<6.1.MONITOR>APRSRV.MAC.192, 24-Jan-85 16:45:41 by LOMARTIRE
;TCO 6.1.1127 - Prevent ILLUUO from bad byte pointer to GTJFN
; UPD ID= 1070, SNARK:<6.1.MONITOR>APRSRV.MAC.191, 14-Nov-84 00:13:50 by GROSSMAN
;TCO 6.1.1051 - Redo $EAENT using XJRST.
; UPD ID= 1027, SNARK:<6.1.MONITOR>APRSRV.MAC.190, 12-Nov-84 14:17:09 by GLINDELL
;TCO 6.1.1021 - fix BUGINF to work in section XCDSEC
; UPD ID= 994, SNARK:<6.1.MONITOR>APRSRV.MAC.189, 7-Nov-84 13:46:55 by MOSER
;MORE TCO 6.2262 - FIX KA KLOAT POINT INSTRS NOT TO ILLUUO
; UPD ID= 943, SNARK:<6.1.MONITOR>APRSRV.MAC.188, 4-Nov-84 15:23:01 by GLINDELL
;More TCO 6.1.1021 - make PAGRST do CONI/CONO PAG.
; UPD ID= 5021, SNARK:<6.MONITOR>APRSRV.MAC.187, 26-Oct-84 22:56:19 by MOSER
;TCO 6.2263 - REMOVE KIMXCT MAKE THIS STUFF FINALLY WORK RIGHT
; FIX USER MODE ILLEGAL BYTE POINTERS TO GIVE ILINS1 AGAIN
; UPD ID= 4989, SNARK:<6.MONITOR>APRSRV.MAC.186, 24-Oct-84 16:21:55 by LOMARTIRE
;TCO 6.2252 - Fix power fail and spurious power fail restarting
; UPD ID= 4911, SNARK:<6.MONITOR>APRSRV.MAC.185, 10-Oct-84 16:57:11 by GLINDELL
;TCO 6.1.1021 - 6.1 address space
; 1. BUGHLT does not transfer into section 0 any more
; 2. BUG code will handle 30-bit addresses when referencing bug blocks
; UPD ID= 4674, SNARK:<6.MONITOR>APRSRV.MAC.184, 10-Aug-84 17:16:36 by GROSSMAN
;TCO 6.2169 - Split PIINIT into two parts. One part (PVINIT) just sets up the
;interrupt vectors. The other part (PSINIT) just turns the PI system on.
; UPD ID= 4638, SNARK:<6.MONITOR>APRSRV.MAC.183, 31-Jul-84 14:26:40 by PURRETTA
;Update copyright notice
; UPD ID= 4611, SNARK:<6.MONITOR>APRSRV.MAC.182, 27-Jul-84 14:52:31 by TBOYLE
;New SYSERR - At BUGST0, call ALCSBX, and use EXTEND BLT
; UPD ID= 4583, SNARK:<6.MONITOR>APRSRV.MAC.181, 24-Jul-84 20:33:06 by GRANT
;Stop the CI-20 when we BUGHLT
; UPD ID= 4567, SNARK:<6.MONITOR>APRSRV.MAC.179, 19-Jul-84 10:11:53 by SHTIL
; Remove previous edit because of illegal use of cx
; UPD ID= 4551, SNARK:<6.MONITOR>APRSRV.MAC.178, 18-Jul-84 08:36:29 by SHTIL
;TCO 6.2122 MTIME:store time in smallest units in CX
; UPD ID= 4120, SNARK:<6.MONITOR>APRSRV.MAC.175, 24-Apr-84 18:09:37 by TBOYLE
;More TCO 6.2045 Increment BUGLST if more than BUGMAX in the queue.
; UPD ID= 4076, SNARK:<6.MONITOR>APRSRV.MAC.174, 11-Apr-84 22:19:50 by TBOYLE
;TCO 6.2027 AOS BUGLST down at BUGST0 on fail of ALCSEB.
; UPD ID= 4073, SNARK:<6.MONITOR>APRSRV.MAC.173, 11-Apr-84 19:31:01 by MOSER
;TCO 6.6026 - FIX KIMXCT - FIRST PASS
; UPD ID= 4050, SNARK:<6.MONITOR>APRSRV.MAC.172, 5-Apr-84 08:35:50 by PAETZOLD
;TCO 6.2022 - Remove MSTKOV as we now have global stack pointers.
; UPD ID= 4030, SNARK:<6.MONITOR>APRSRV.MAC.171, 31-Mar-84 20:42:21 by GRANT
;Remove references to FTKLIPA and FTCI
; UPD ID= 3793, SNARK:<6.MONITOR>APRSRV.MAC.170, 29-Feb-84 01:40:36 by TGRADY
; Implement Global Job Numbers
; - In BUGH5, Print Global Job number, not local Job index (JOBNO)
; UPD ID= 3630, SNARK:<6.MONITOR>APRSRV.MAC.169, 1-Feb-84 22:07:11 by MURPHY
;Ever more 6.1525 - Move DDTs and bugstrings to SYMSEC.
; UPD ID= 3589, SNARK:<6.MONITOR>APRSRV.MAC.168, 30-Jan-84 09:19:49 by HAUDEL
;More TCO 6.1798 - Keep me change. Change STKEEP.
; UPD ID= 3509, SNARK:<6.MONITOR>APRSRV.MAC.167, 23-Jan-84 09:38:35 by PRATT
;TCO 6.1924 - WTO routines need the display type value for QUEUE%
; UPD ID= 3487, SNARK:<6.MONITOR>APRSRV.MAC.166, 20-Jan-84 09:08:52 by HAUDEL
;More TCO 6.1798 - Fix AC reference in keep me change.
; UPD ID= 3468, SNARK:<6.MONITOR>APRSRV.MAC.165, 16-Jan-84 14:11:22 by HAUDEL
;More TCO 6.1798 - Keep me change, remove PGCLKP bit from KIPGW0.
; UPD ID= 3448, SNARK:<6.MONITOR>APRSRV.MAC.164, 12-Jan-84 14:22:04 by PAETZOLD
;TCO 6.1929 - Change FKJOBN to FKJBN
; UPD ID= 3316, SNARK:<6.MONITOR>APRSRV.MAC.163, 14-Dec-83 14:35:00 by MURPHY
;TCO 6.1909 - Fix ACSAV and SAVEPQ routines to work with global stack pointer.
; UPD ID= 3285, SNARK:<6.MONITOR>APRSRV.MAC.162, 10-Dec-83 15:53:20 by PAETZOLD
;TCO 6.1900 - Handle PI0 unvectored interrupts.
; UPD ID= 3273, SNARK:<6.MONITOR>APRSRV.MAC.161, 7-Dec-83 11:41:55 by MOSER
;TCO 6.1889 MORE FIXES FOR ARITHMETIC TRAPPING
;TCO 6.1877 FIX ARITHMETIC TRAPPING
; UPD ID= 3269, SNARK:<6.MONITOR>APRSRV.MAC.160, 6-Dec-83 21:21:39 by MCLEAN
;SWITCH AC BLOCKS INSTEAD OF SAVING ACS
; UPD ID= 3261, SNARK:<6.MONITOR>APRSRV.MAC.159, 6-Dec-83 14:30:52 by MCLEAN
;TCO 6.1892 SAVE AND RESTORE AC'S FOR PIAPR INTERRUPTS
; UPD ID= 3162, SNARK:<6.MONITOR>APRSRV.MAC.158, 16-Nov-83 14:15:50 by PAETZOLD
;TCO 6.1867 - Add SAVP1
; UPD ID= 3066, SNARK:<6.MONITOR>APRSRV.MAC.157, 25-Oct-83 08:21:54 by MILLER
;Remove previous edit
; UPD ID= 3064, SNARK:<6.MONITOR>APRSRV.MAC.156, 24-Oct-83 15:42:52 by MILLER
;Try turning off the KLIPA when we BUGHLT
; UPD ID= 3058, SNARK:<6.MONITOR>APRSRV.MAC.155, 22-Oct-83 09:27:11 by MILLER
;TCO 6.1832. Improve CLRALL routine
; UPD ID= 3055, SNARK:<6.MONITOR>APRSRV.MAC.154, 21-Oct-83 19:30:29 by MURPHY
;Get rid of some PUSH's.
; UPD ID= 3038, SNARK:<6.MONITOR>APRSRV.MAC.153, 17-Oct-83 14:16:30 by MILLER
;TCO 6.1832. Retry page table parity errors
; UPD ID= 3034, SNARK:<6.MONITOR>APRSRV.MAC.152, 12-Oct-83 12:11:59 by MCINTEE
;More TCO 6.1764 - Save AC3 in PFSA1 area
; UPD ID= 2903, SNARK:<6.MONITOR>APRSRV.MAC.151, 19-Sep-83 11:25:21 by MURPHY
;Make IORST turn off paging like it says it does.
; UPD ID= 2894, SNARK:<6.MONITOR>APRSRV.MAC.150, 13-Sep-83 13:38:12 by HALL
;Typo in previous edit - lost an angle bracket
; UPD ID= 2892, SNARK:<6.MONITOR>APRSRV.MAC.149, 12-Sep-83 15:47:02 by HALL
;TCO 6.1798 - Provide support (possibly temporary) for "keep me" bit in
; hardware page table
; Change SMAPOK macro to check "hard error" rather than "paged
; reference"
; Add PGCLKP bit to KIPGW0 (clear all entries on first DATAO PAG)
; Move remaining page fail bit definitions to PROLOG
; Add STKEEP and TESTKP routines
; UPD ID= 2858, SNARK:<6.MONITOR>APRSRV.MAC.148, 23-Aug-83 11:28:21 by LOMARTIRE
;TCO 6.1769 - Allow system to continue after a power fail
; UPD ID= 2857, SNARK:<6.MONITOR>APRSRV.MAC.147, 23-Aug-83 11:19:35 by LOMARTIRE
;TCO 6.1768 - Allow system to continue after spurious power fail
; UPD ID= 2845, SNARK:<6.MONITOR>APRSRV.MAC.146, 17-Aug-83 22:23:12 by MURPHY
;More 6.1525 - Map split. Make a few things here stay in section 0.
; UPD ID= 2814, SNARK:<6.MONITOR>APRSRV.MAC.145, 9-Aug-83 11:53:18 by MCINTEE
;TCO 6.1764 - In SKDPF1 bughlt, move data into ACs, and display it.
; UPD ID= 2624, SNARK:<6.MONITOR>APRSRV.MAC.144, 22-Jun-83 11:25:52 by HALL
;TCO 1689 - Move fork tables to extended section
; Reference fork tables via DEFSTR
; UPD ID= 2619, SNARK:<6.MONITOR>APRSRV.MAC.143, 21-Jun-83 15:32:55 by MURPHY
;Move PGRCST to PAGUTL.
; UPD ID= 2490, SNARK:<6.MONITOR>APRSRV.MAC.142, 18-May-83 15:02:08 by MURPHY
;TCO 6.1525 - Add routine MAPIPG, like SETSPG except uses PIPG.
; UPD ID= 2424, SNARK:<6.MONITOR>APRSRV.MAC.141, 5-May-83 17:22:37 by MURPHY
;More of previous - fix difficulties with external/internal refs.
; UPD ID= 2404, SNARK:<6.MONITOR>APRSRV.MAC.140, 3-May-83 15:56:23 by COBB
;TCO 6.1639 - ?s and %s after PRINTX messages
; UPD ID= 2373, SNARK:<6.MONITOR>APRSRV.MAC.139, 29-Apr-83 14:23:26 by MURPHY
;TCO 6.1635 - define MONENV as standard flag word value for monitor context.
; UPD ID= 2144, SNARK:<6.MONITOR>APRSRV.MAC.138, 4-Apr-83 09:54:41 by MILLER
;TCO 6.1588. Add CPPCON for CFSSRV to use.
; UPD ID= 2125, SNARK:<6.MONITOR>APRSRV.MAC.137, 1-Apr-83 11:51:20 by MILLER
;TCO 6.1585. Fix trap handling for user-defined trap block
; UPD ID= 2000, SNARK:<6.MONITOR>APRSRV.MAC.136, 15-Mar-83 19:18:53 by HALL
;TCO 6.1502 - Allow resident free space in extended sections
; Make secondary protocol DTE stuff run in section 1 because it calls
; TTYSRV.
; UPD ID= 1983, SNARK:<6.MONITOR>APRSRV.MAC.135, 12-Mar-83 17:39:22 by MILLER
;More TCO 6.1540
; UPD ID= 1977, SNARK:<6.MONITOR>APRSRV.MAC.134, 11-Mar-83 12:50:04 by MILLER
;TCO 6.1540. Fix BLCAL support routines
; UPD ID= 1930, SNARK:<6.MONITOR>APRSRV.MAC.133, 7-Mar-83 21:06:22 by CDUNN
;Change default to include KLIPA support code
; UPD ID= 1902, SNARK:<6.MONITOR>APRSRV.MAC.131, 1-Mar-83 23:43:20 by MURPHY
;Try again on making KA FPT simulation work after previous edit.
; UPD ID= 1889, SNARK:<6.MONITOR>APRSRV.MAC.130, 1-Mar-83 10:38:18 by HALL
;TCO 6.1502 - Allow free space outside of section 0
; At least temporarily, make all callers request section 0
; UPD ID= 1879, SNARK:<6.MONITOR>APRSRV.MAC.129, 27-Feb-83 22:04:01 by MURPHY
;TCO 6.1525 - Support code for TSTMS0.
;Make KA10 floating point instructions in monitor do ILUUO bughlt.
;Resolve conflicting edit with 6.1527.
; UPD ID= 1876, SNARK:<6.MONITOR>APRSRV.MAC.128, 25-Feb-83 01:15:02 by PAETZOLD
;TCO 6.1527 - Artificially increment and decrement the stack pointer before and
; after calling KIMXCT in the ILLUUO code.
; UPD ID= 1835, SNARK:<6.MONITOR>APRSRV.MAC.127, 20-Feb-83 20:18:35 by MURPHY
;More 6.1470 - Make BUGCHK and BUGINF not clobber CX, no continue handling here.
; UPD ID= 1813, SNARK:<6.MONITOR>APRSRV.MAC.126, 16-Feb-83 14:51:24 by HALL
;Clarify comments on trap-setting routines
; UPD ID= 1679, SNARK:<6.MONITOR>APRSRV.MAC.125, 19-Jan-83 12:53:22 by MCINTEE
;TCO 6.1470 - Fix continuation feature for BUGs
; UPD ID= 1611, SNARK:<6.MONITOR>APRSRV.MAC.124, 3-Jan-83 15:19:43 by MCINTEE
;Add RTN
; UPD ID= 1585, SNARK:<6.MONITOR>APRSRV.MAC.123, 27-Dec-82 20:15:33 by NICHOLS
;Turns out some callers depend on being able to call XBLTA with garbage
;in the left half of the length word! Restore HRRZS T1 to BLT routines.
;Add XBLTAT as an alternate entry for XBLTA which tests LH of T1
; UPD ID= 1582, SNARK:<6.MONITOR>APRSRV.MAC.122, 27-Dec-82 16:45:25 by NICHOLS
;BUGHLT if XBLT. is asked to BLT more than a section.
; UPD ID= 1559, SNARK:<6.MONITOR>APRSRV.MAC.121, 21-Dec-82 15:37:04 by MOSER
;TCO 6.1391 Yet again - Do it better
; UPD ID= 1502, SNARK:<6.MONITOR>APRSRV.MAC.120, 1-Dec-82 14:30:11 by HALL
;TCO 6.1000 - Support the 2080
; Fix BUGSTO to check the correct AC after MAP instruction
; UPD ID= 1480, SNARK:<6.MONITOR>APRSRV.MAC.119, 29-Nov-82 09:30:16 by GRANT
;TCO 6.1010 - Rewrite PGRCST and eliminate PGRCSX, add a few EA.ENTs
; UPD ID= 1476, SNARK:<6.MONITOR>APRSRV.MAC.118, 28-Nov-82 16:36:23 by PAETZOLD
;Delete very old edit history
; UPD ID= 1475, SNARK:<6.MONITOR>APRSRV.MAC.117, 24-Nov-82 11:31:14 by PAETZOLD
;TCO 6.1391 - Go NOSKED in GFLT0 for a little bit
; UPD ID= 1458, SNARK:<6.MONITOR>APRSRV.MAC.116, 18-Nov-82 11:38:27 by PAETZOLD
;TCO 6.1385 - refetch information in GFLT0 after the MCENTR
; UPD ID= 1425, SNARK:<6.MONITOR>APRSRV.MAC.115, 8-Nov-82 10:54:58 by MILLER
;CHKCFS again. Account for bug in MAP instruction
; UPD ID= 1422, SNARK:<6.MONITOR>APRSRV.MAC.114, 7-Nov-82 14:49:22 by MILLER
;TCO 6.1094. Add CHKCFS to check for CFS-required UCODE
; UPD ID= 1387, SNARK:<6.MONITOR>APRSRV.MAC.113, 27-Oct-82 23:27:32 by CDUNN
;More TCO 6.1127 - Make CI emulator clock level code faster
; UPD ID= 1367, SNARK:<6.MONITOR>APRSRV.MAC.112, 22-Oct-82 03:54:35 by CDUNN
;More TCO 6.1127 - Change clock code (under FTCI feature test) to make memory
;lights show total emulated CFS traffic.
; UPD ID= 1358, SNARK:<6.MONITOR>APRSRV.MAC.111, 20-Oct-82 00:59:51 by CDUNN
;More TCO 6.1127 - Make CI emulator keep alive happen at clock level instead
;of sceduler lever (Under FTCI feature test)...
; UPD ID= 1287, SNARK:<6.MONITOR>APRSRV.MAC.110, 6-Oct-82 13:43:42 by MILLER
;Set CSWRB in all instances of "temporary" mapping (TCO 6.1094)
; UPD ID= 1279, SNARK:<6.MONITOR>APRSRV.MAC.109, 4-Oct-82 22:51:51 by LEACHE
;TCO 6.1299 - Change KIMXCT
; UPD ID= 1262, SNARK:<6.MONITOR>APRSRV.MAC.108, 1-Oct-82 08:43:50 by NEUSTAEDTER
;TCO 6.1294 - Add recovery address to BUG.
; UPD ID= 1210, SNARK:<6.MONITOR>APRSRV.MAC.107, 21-Sep-82 17:09:46 by HALL
;TCO 6.1000 - Support the 2080
; Make STEXBK global
;Remove change to SWPZPG (temporarily).
; UPD ID= 1188, SNARK:<6.MONITOR>APRSRV.MAC.105, 15-Sep-82 19:12:26 by MILLER
;SWPZPG must preserve initial value of CST0X (for the CST write bit)
; UPD ID= 1132, SNARK:<6.MONITOR>APRSRV.MAC.104, 1-Sep-82 22:53:56 by MILLER
;tco 6.1094. Fix SETSPG for CFS support
; UPD ID= 1113, SNARK:<6.MONITOR>APRSRV.MAC.103, 25-Aug-82 12:26:47 by LEACHE
;TCO 6.1237 - Increase size of BUGSPL
; UPD ID= 1070, SNARK:<6.MONITOR>APRSRV.MAC.102, 10-Aug-82 10:00:19 by HALL
;TCO 6.1000 - Support the 2080
; Fix bit name for user mode address break in STEXBK
; UPD ID= 1021, SNARK:<6.MONITOR>APRSRV.MAC.101, 1-Aug-82 09:14:12 by HALL
;TCO 6.1000 - Support the 2080
; Make MONACB and USRACB be global for BOOT
; UPD ID= 1011, SNARK:<6.MONITOR>APRSRV.MAC.100, 28-Jul-82 18:51:24 by PAETZOLD
;More TCO 6.1010 - Fix typo in PGRCSX
; UPD ID= 962, SNARK:<6.MONITOR>APRSRV.MAC.99, 28-Jun-82 13:57:52 by PAETZOLD
;TCO 6.1180 - Move the MCENTR in the gfloat code to avoid ucode/hardware problems
; UPD ID= 956, SNARK:<6.MONITOR>APRSRV.MAC.98, 23-Jun-82 16:48:36 by HALL
;Some comments in EAENT and S0ENT
; UPD ID= 952, SNARK:<6.MONITOR>APRSRV.MAC.97, 18-Jun-82 13:51:46 by MURPHY
;TCO 6.1147 - Move bugdefs from BUGS.MAC to here and put them in-line.
; UPD ID= 944, SNARK:<6.MONITOR>APRSRV.MAC.96, 17-Jun-82 10:40:41 by CDUNN
;Remove CISRV support code in BUGxxx code.
; UPD ID= 934, SNARK:<6.MONITOR>APRSRV.MAC.95, 15-Jun-82 05:04:45 by CDUNN
;Make STEXBK global such that the referance from STG works
; UPD ID= 931, SNARK:<6.MONITOR>APRSRV.MAC.94, 14-Jun-82 17:11:22 by HALL
;TCO 6.1000 - Support the 2080
; Add KC support for address break (KISLOD, SETBRK)
; Add CLRBRK routine
;TCO 6.1156 - Add NOSKED to STEXBK
; UPD ID= 917, SNARK:<6.MONITOR>APRSRV.MAC.93, 10-Jun-82 08:57:53 by WALLACE
;TCO 6.1162 - Add labels .XSTKS and .XTRST since STKVAR and TRVAR
; use them. Leave .STKST and .TRSET intact for symbols in DDT.
; UPD ID= 886, SNARK:<6.MONITOR>APRSRV.MAC.92, 9-Jun-82 16:33:30 by WALLACE
;TCO 6.1162 - Modify the support routines .STKST and .TRSET to properly
; use ADJSP in conjunction with the new count format, EXP n, which follows
; the JSP's of STKVAR and TRVAR. Also see MACSYM and TCO 6.1161.
; UPD ID= 864, SNARK:<6.MONITOR>APRSRV.MAC.91, 7-Jun-82 10:44:21 by HALL
;TCO 6.1156 - ALlow exec mode address break
; KISSAV - Don't clear user break if exec break is set
; KISLOD - Don't set user break if exec break is set
; Add STEXBK and CLEXBK to set and clear exec mode break
; UPD ID= 813, SNARK:<6.MONITOR>APRSRV.MAC.90, 2-Jun-82 16:41:45 by HALL
;TCO 6.1151 - Make TRVAR get a trap on overflow by subtracting the offending
; value before doing the ADJSP.
; UPD ID= 806, SNARK:<6.MONITOR>APRSRV.MAC.89, 1-Jun-82 11:50:40 by PAETZOLD
;TCO 6.1010 - Temporarily add PGRCSX
; UPD ID= 797, SNARK:<6.MONITOR>APRSRV.MAC.88, 27-May-82 20:59:13 by MILLER
;TCO 6.1142. Send parity error messages to OPR
; UPD ID= 794, SNARK:<6.MONITOR>APRSRV.MAC.87, 27-May-82 07:43:24 by HALL
;TCO 6.1000 - Support the 2080
; Make CASHF always contain zero. We don't control the cache on the 2080
; UPD ID= 781, SNARK:<6.MONITOR>APRSRV.MAC.86, 24-May-82 14:43:02 by HALL
;TCO 6.1000 - Support the 2080
; Don't assemble KIMXCT for the 2080
; UPD ID= 775, SNARK:<6.MONITOR>APRSRV.MAC.85, 20-May-82 16:30:37 by HALL
;TCO 6.1000 - Support the 2080
; Change KISSAV and KISLOD to use macros for previous context AC
; load/store
; Change BUGHLT code to use STPAC
; UPD ID= 767, SNARK:<6.MONITOR>APRSRV.MAC.84, 19-May-82 14:39:55 by CDUNN
;TCO 6.1127 - Add code to BUGHLT mechanism to clear the keep alive counter
;for CISRV. This makes coming up alot easier, and possible. All code
;is under IFN FTCI
; UPD ID= 765, SNARK:<6.MONITOR>APRSRV.MAC.83, 19-May-82 14:07:23 by HALL
;TCO 6.1000 - Support the 2080
; Provide CAB field in new flags word of LUUBLK
; Move RLODPC here from STG, and put under processor conditional
; UPD ID= 758, SNARK:<6.MONITOR>APRSRV.MAC.82, 15-May-82 14:25:08 by HALL
;TCO 6.1000 - Fix KC's WRAPR data
; UPD ID= 747, SNARK:<6.MONITOR>APRSRV.MAC.81, 14-May-82 16:29:42 by HALL
;TCO 6.1000 - Support the 2080
; Fix initialization of APR stuff to assign interrupt channel
; UPD ID= 741, SNARK:<6.MONITOR>APRSRV.MAC.80, 13-May-82 11:36:08 by HALL
;TCO 6.1000 - Support the 2080
; Fix definitions for initializing IO page
; UPD ID= 738, SNARK:<6.MONITOR>APRSRV.MAC.79, 12-May-82 12:53:14 by HALL
;TCO 6.1000 - Support the 2080
; PAGRST - fix size of copy of prototype UPT; include CST write bit
; in mask word for KC and KL
; Fix definitions of trap words
; UPD ID= 701, SNARK:<6.MONITOR>APRSRV.MAC.78, 8-May-82 14:10:05 by HALL
;TCO 6.1000 - Support the 2080
; Define USRCTX for describing the user mode flags
; UPD ID= 698, SNARK:<6.MONITOR>APRSRV.MAC.77, 6-May-82 15:10:57 by HALL
;TCO 6.1000 - Support the 2080
; Move definition of flags word fields to PROLOG
; Add USRFLG
; Fix typo in definition of MONFLG
; For the KC, use LDPAC and STPAC for previous context AC's
; UPD ID= 631, SNARK:<6.MONITOR>APRSRV.MAC.76, 12-Apr-82 15:14:24 by HALL
;TCO 6.1000 - Support the 2080
; Define CLNXMF to be a no-op
; UPD ID= 627, SNARK:<6.MONITOR>APRSRV.MAC.75, 12-Apr-82 09:33:28 by HALL
;TCO 6.1000 - Support the 2080
; Fix UPT references in BUGHLT code
; Remove level 5 interrupt code here. Make it go to STG.
; UPD ID= 620, SNARK:<6.MONITOR>APRSRV.MAC.74, 9-Apr-82 14:41:15 by HALL
;Fix typo in definition of PIAPRX for KC
; UPD ID= 619, SNARK:<6.MONITOR>APRSRV.MAC.73, 9-Apr-82 12:08:25 by HALL
;TCO 6.1000 - Fix references to page fail data (names were changed)
; UPD ID= 613, SNARK:<6.MONITOR>APRSRV.MAC.72, 8-Apr-82 16:06:23 by HALL
;TCO 6.1000 - Support the 2080
; Provide KC-specific analysis of MAP instruction format
; UPD ID= 610, SNARK:<6.MONITOR>APRSRV.MAC.71, 8-Apr-82 10:05:09 by PAETZOLD
;Add a comment for TARL to GFLOAT stuff indicating that code is common with TOPS10
; UPD ID= 608, SNARK:<6.MONITOR>APRSRV.MAC.70, 7-Apr-82 16:59:57 by PAETZOLD
;TCO 5.1773 - Add IFIWs to GFLTD
; UPD ID= 600, SNARK:<6.MONITOR>APRSRV.MAC.69, 5-Apr-82 16:43:06 by MILLER
;TCO 6.1066. Add code KC code for BUGMON and BUGPRI
; UPD ID= 599, SNARK:<6.MONITOR>APRSRV.MAC.68, 5-Apr-82 16:38:14 by HALL
;TCO 6.1000 - Support the 2080
; Fix CONOAPR for KC to set "load PIA" bit
; Change software interrupt vectors to generate error on all but
; channels 6 and 7
; PIINIT - fix APR vector
; Don't set cache bits in WREBR. Do disable traps and enable them later.
; IORST - turn off traps. Don't save state of cache. Clear console
; interrupt condition.
; Fix references to MONFLG to use MOVX
; Change names of some paging bits
; Make PIAPR complain if there's no reason for the interrupt.
; Make CASHOF and CASHON do nothing.
; Make UPT words point to section 1 for UUO's
; Don't call KIMXCT for the KC
; Remove DATAO PAG from PGRON.
; PAGRST - turn on traps.
; Change KL-specific page fault handling to use KL-specific UPT
; locations for data: PFCD23, PGNXM0, PFNXM, PFCDPE, PFCD27
; UPD ID= 571, SNARK:<6.MONITOR>APRSRV.MAC.67, 1-Apr-82 20:17:05 by MILLER
;TCO 6.1066 SOME MORE. SETUP AND USE LOCAL STACK IN APR INT.
; UPD ID= 567, SNARK:<6.MONITOR>APRSRV.MAC.66, 31-Mar-82 16:10:30 by MURPHY
;TCO 6.1074 - Revise build procedures, eliminate KLPRE, etc.
; UPD ID= 538, SNARK:<6.MONITOR>APRSRV.MAC.64, 19-Mar-82 16:40:07 by PAETZOLD
;TCO 5.1764 - Make PFCODT a full word table and make PFAID not reference
; bad sections.
; UPD ID= 528, SNARK:<6.MONITOR>APRSRV.MAC.63, 18-Mar-82 07:38:57 by HALL
;TCO 6.1072 - Make SETPFH be global
; UPD ID= 526, SNARK:<6.MONITOR>APRSRV.MAC.62, 18-Mar-82 07:36:30 by MILLER
;TCO 6.1066 SOME MORE
; UPD ID= 523, SNARK:<6.MONITOR>APRSRV.MAC.61, 17-Mar-82 15:45:44 by HALL
;TCO 6.1072 - Make PGRINI use special page fault handler
; Add SETPFH routine
; UPD ID= 477, SNARK:<6.MONITOR>APRSRV.MAC.60, 13-Mar-82 15:08:56 by HALL
;TCO 6.1000 - Support the 2080
; Make KIPFS global
; UPD ID= 454, SNARK:<6.MONITOR>APRSRV.MAC.59, 11-Mar-82 08:25:09 by MILLER
;TCO 6.1066. First set of changes for KCRSP support.
; UPD ID= 448, SNARK:<6.MONITOR>APRSRV.MAC.58, 7-Mar-82 18:54:06 by MILLER
;tco 5.1487 AGAIN. FIX MBERRB
; UPD ID= 431, SNARK:<6.MONITOR>APRSRV.MAC.57, 2-Mar-82 17:38:56 by MILLER
;MORE TCO.5.1735. Fix up analysis to use IOP word correctly
; UPD ID= 422, SNARK:<6.MONITOR>APRSRV.MAC.56, 24-Feb-82 12:19:41 by PAETZOLD
;TCO 5.1735 - Change IO Page Fail code to reflect fact that IOP word
; now gets saved in ACB7 AC2 and not the PFW
; UPD ID= 421, SNARK:<6.MONITOR>APRSRV.MAC.55, 24-Feb-82 11:07:28 by MILLER
;TCO 6.1064. Prevent page faults out of the BUGHLT code
; UPD ID= 416, SNARK:<6.MONITOR>APRSRV.MAC.54, 21-Feb-82 14:34:19 by HALL
;Fix typo in previous edit
; UPD ID= 415, SNARK:<6.MONITOR>APRSRV.MAC.53, 21-Feb-82 14:09:29 by HALL
;TCO 6.1000- Support the 2080
;Clean up problems with linking monitor.
; Make SETAOV, SETPOV, and APRRPT global
; Remove MEMPA and WREQ from KL conditional
; Define CLRMPE as JFCL for PAGEM
; Make BUGM0 and BUGP0 return quietly
; UPD ID= 393, SNARK:<6.MONITOR>APRSRV.MAC.52, 11-Feb-82 10:54:14 by HALL
;Fix previous edit for TCO 6.1000 - Bad reference to bits in IORST
; UPD ID= 390, SNARK:<6.MONITOR>APRSRV.MAC.51, 8-Feb-82 11:12:16 by PAETZOLD
;More TCO 5.1672 - also turn on TRAP1 during overflow in GFLOAT
; UPD ID= 383, SNARK:<6.MONITOR>APRSRV.MAC.50, 5-Feb-82 13:40:05 by HALL
;TCO 6.1000 - Support the 2080
; Remove checks on EXADFL from SECALE, XBLTA, BLTMU1, BLTUM1, BLTUU
; Make CKXADR always return success
; Remove check for EXADF1 and conversion of one-word page fail
; flags/PC in MEMPTP, KIPFS, PFCPTP
; UPD ID= 373, SNARK:<6.MONITOR>APRSRV.MAC.49, 2-Feb-82 09:46:06 by HALL
;TCO 6.1000 - Support the 2080
;Add dummy routine PFERRB for KC
;Add definition of I/O page offset for APR interrupt
; UPD ID= 363, SNARK:<6.MONITOR>APRSRV.MAC.48, 30-Jan-82 16:05:31 by HALL
;TCO 6.1000 - Support the 2080
; In PIINIT, set the I/O page
; UPD ID= 358, SNARK:<6.MONITOR>APRSRV.MAC.47, 28-Jan-82 20:24:24 by HALL
;Fix to my last edit. Restore KICLKP
; UPD ID= 356, SNARK:<6.MONITOR>APRSRV.MAC.46, 27-Jan-82 17:32:11 by PAETZOLD
;TCO 5.1705 - Save BGCCHK and BGCINF calling adrs in BUGCHK and BUGINF
;TCO 5.1672 Simulate GFIX, GFIXR, DGFIX, and DGFIXR in the KL for users
; UPD ID= 355, SNARK:<6.MONITOR>APRSRV.MAC.45, 27-Jan-82 17:23:21 by HALL
;TCO 6.1000 - Support for the 2080
; Add location for physical I/O page
; Set "ignore keep me" in KIPGWD
; Define SETEPT macro
; Initialize I/O page for APR interrupts and I/O page fail
; Do KC versions of IORST, PIRST, PAGRST, PGRON, PGROFF
; remove code for checking for model A
; Add KC code for KIPFS
; Remove "No load AC" bits
;Make KISLOD preserve flags word when setting PCU
; UPD ID= 339, SNARK:<6.MONITOR>APRSRV.MAC.44, 22-Jan-82 11:34:17 by HALL
;Rename mask field for APRID, because it conflicts with another symbol
;FOR KL, USE PAGE FAIL WORD DEFINITIONS FROM PROLOG, REMOVE LOCAL DEFINITIONS
; UPD ID= 309, SNARK:<6.MONITOR>APRSRV.MAC.43, 18-Jan-82 08:00:44 by HALL
;Put DEQERR under KL conditional
; UPD ID= 307, SNARK:<6.MONITOR>APRSRV.MAC.42, 16-Jan-82 14:37:48 by HALL
;TCO 6.1000 - Support for the 2080
; Rearrange timer data base and add KC stuff
; Change initialization of TIMINT to use RSI macro
; Add lots of KC stuff for APR control
; UPD ID= 292, SNARK:<6.MONITOR>APRSRV.MAC.41, 11-Jan-82 13:31:42 by MILLER
;More non-vectored int. fix-up. Make BUGCHL preserve PION/PIOFF
; UPD ID= 289, SNARK:<6.MONITOR>APRSRV.MAC.40, 10-Jan-82 12:54:31 by MILLER
;CLEAN UP THE MOS MEMORY CODE A BIT
; UPD ID= 387, SNARK:<5.MONITOR>APRSRV.MAC.47, 9-Jan-82 18:31:05 by MILLER
;TCO 5.1661. ADD CODE TO UNLATCH CONTROLLERS AFTER TGHA RUNS
; UPD ID= 286, SNARK:<6.MONITOR>APRSRV.MAC.38, 8-Jan-82 15:34:16 by MILLER
;Make sure non-vector PI routines have a stack.
; UPD ID= 275, SNARK:<6.MONITOR>APRSRV.MAC.37, 5-Jan-82 11:05:49 by MILLER
;TCO 5.1652. Open code CHKINT at power fail interrupt.
; UPD ID= 260, SNARK:<6.MONITOR>APRSRV.MAC.36, 16-Dec-81 11:24:55 by MILLER
;TCO 6.1047. Check for INSKED at BUGH5
; UPD ID= 257, SNARK:<6.MONITOR>APRSRV.MAC.35, 16-Dec-81 00:28:26 by PAETZOLD
;More TCO 6.1010 - fix up early CST references
;Remove TCO 5.1505 for now (this edit by MILLER)
;Remove TCO 5.1505 for now
; UPD ID= 218, SNARK:<6.MONITOR>APRSRV.MAC.33, 30-Nov-81 08:40:18 by PAETZOLD
;More TCO 6.1010 - Remove all CST0, CST1, CST2, and CST3 references
; UPD ID= 207, SNARK:<6.MONITOR>APRSRV.MAC.32, 12-Nov-81 16:22:59 by HALL
;Move routines for setting overflow to be with routines for detecting it
;TCO 6.1037 and TCO 6.1000- fix bug in storing into PSB (forgot T1)
; Remove definition of flag bit (It's in MONSYM)
; UPD ID= 204, SNARK:<6.MONITOR>APRSRV.MAC.31, 11-Nov-81 16:39:48 by HALL
;TCO 6.1000 - Support the 2080
; Add support for trap functions
;TCO 6.1037 - add support for PDL overflow
; UPD ID= 196, SNARK:<6.MONITOR>APRSRV.MAC.30, 8-Nov-81 15:40:18 by HALL
;Fix typo in previous edit
; UPD ID= 195, SNARK:<6.MONITOR>APRSRV.MAC.29, 8-Nov-81 15:28:15 by HALL
;TCO 6.1000 - Remove setting of PCU in MUUO locations -- ucode does it
; Add MUUO code for KC. Add prototype UPT and EPT for KC
; UPD ID= 127, SNARK:<6.MONITOR>APRSRV.MAC.28, 19-Oct-81 14:30:09 by COBB
;TCO 6.1029 CHANGE SE1CAL TO EA.ENT
; UPD ID= 99, SNARK:<6.MONITOR>APRSRV.MAC.26, 12-Oct-81 11:20:38 by COBB
;TCO 6.1026 MAKE INSTRUCTION ADDRESS LITERALS BE SECTION 1
; UPD ID= 84, SNARK:<6.MONITOR>APRSRV.MAC.23, 29-Sep-81 11:53:50 by MILLER
; More TCO 5.1487. Clean up type out
; UPD ID= 83, SNARK:<6.MONITOR>APRSRV.MAC.22, 29-Sep-81 08:24:33 by PAETZOLD
;TCO 5.1531 - Check for ILLUUO's caused by PXCT of byte instruction
;with bad pointer
; UPD ID= 78, SNARK:<6.MONITOR>APRSRV.MAC.21, 17-Sep-81 01:50:11 by PAETZOLD
;More TCO 6.1010 - Change field references to CST0, CST1
; UPD ID= 71, SNARK:<6.MONITOR>APRSRV.MAC.20, 15-Sep-81 16:01:53 by PAETZOLD
;TCO 6.1010 - Start moving CSTs to CSTSEC
;Change non-mask cst references CST0, CST1, CST2
; UPD ID= 67, SNARK:<6.MONITOR>APRSRV.MAC.19, 14-Sep-81 13:21:34 by MURPHY
;TCO 5.1505 - IN MPE PAGE FAULT, ZERO THE BAD WORD IN MEMORY.
;FIX TYPEO IN LAST EDIT
;Hand merge more changes from 5
; UPD ID= 59, SNARK:<6.MONITOR>APRSRV.MAC.16, 3-Sep-81 15:45:54 by MILLER
;TCO 5.1487. Fix parity error stuff
; UPD ID= 53, SNARK:<6.MONITOR>APRSRV.MAC.15, 22-Aug-81 16:12:38 by PAETZOLD
;TCO 5.1008X - ADD SPCSNZ ROUTINE
; UPD ID= 52, SNARK:<6.MONITOR>APRSRV.MAC.14, 15-Aug-81 16:57:23 by HALL
;TCO 6.1000 - remove XJRSTF at KISSAV and DATAO at KIMUOM
; UPD ID= 49, SNARK:<6.MONITOR>APRSRV.MAC.13, 11-Aug-81 14:24:05 by HALL
;comments
; UPD ID= 46, SNARK:<6.MONITOR>APRSRV.MAC.12, 8-Aug-81 14:01:29 by HALL
;TCO 6.1000 - Add comments, make LUUO block be defined by RSI, remove
;reduntant jump in BUGHLT code.
; UPD ID= 40, SNARK:<6.MONITOR>APRSRV.MAC.11, 24-Jul-81 05:20:06 by PAETZOLD
;TCO 5.1380 - Add call to IMPFPF in APRIOP to see if AN20 caused IOPGF
; UPD ID= 35, SNARK:<6.MONITOR>APRSRV.MAC.10, 20-Jul-81 13:56:31 by MURPHY
;Args for BUG UNXMPE
; UPD ID= 34, SNARK:<6.MONITOR>APRSRV.MAC.9, 17-Jul-81 14:18:06 by PAETZOLD
;Fix typo in previous edit
; UPD ID= 33, SNARK:<6.MONITOR>APRSRV.MAC.8, 17-Jul-81 13:51:50 by PAETZOLD
;TCO 5.1380 - increase size of MEMPP stack
; UPD ID= 1856, SNARK:<6.MONITOR>APRSRV.MAC.7, 21-Apr-81 07:10:29 by WACHS
;TCO 5.1289 RETURN DIAG RESOURCES PROCESS OWNS ON THE BUGCHK
; UPD ID= 1836, SNARK:<6.MONITOR>APRSRV.MAC.6, 17-Apr-81 14:56:57 by MURPHY
;FIX .ENTER FOR NEW BLSUB. MACRO
;FIX .ENTER FOR NEW BLSUB. MACRO
;DITTO
;Make BUGCHK and BUGINF called with PUSHJ
; UPD ID= 1712, SNARK:<6.MONITOR>APRSRV.MAC.5, 16-Mar-81 15:13:27 by MURPHY
;MOVE ENTSKD TO SCHED
; UPD ID= 1632, SNARK:<6.MONITOR>APRSRV.MAC.4, 2-Mar-81 16:35:02 by MURPHY
;NEW EXT ADR ENTER/LEAVE ROUTINES
; UPD ID= 1627, SNARK:<6.MONITOR>APRSRV.MAC.3, 2-Mar-81 11:55:33 by HALL
;TCO 6.1000 - Fix conditional on XPCW definitions
; UPD ID= 1617, SNARK:<6.MONITOR>APRSRV.MAC.2, 28-Feb-81 11:39:05 by HALL
;TCO 6.1000 - Support the 2080
; Change PIINIT -- build XPCW words statically, copy to EPT at PIINIT.
; define KCIOPG
; Move data definitions to start of module
; Add TTITLE for KC
; Initialize LUUBLK with RSI instead of in PIINIT.
; IN PIINIT, CLEAR APCDPE ALONG WITH OTHER ERROR CONDITIONS
; UPD ID= 146, SNARK:<5.MONITOR>APRSRV.MAC.35, 3-Sep-81 15:04:36 by MILLER
; UPD ID= 144, SNARK:<5.MONITOR>APRSRV.MAC.34, 3-Sep-81 12:40:59 by MILLER
;TCO 5.1487. FIX PARITY ERROR CODE
; UPD ID= 113, SNARK:<5.MONITOR>APRSRV.MAC.33, 21-Aug-81 16:12:42 by PAETZOLD
;TCO 5.1008X - ADD SPCSNZ ROUTINE
; UPD ID= 71, SNARK:<5.MONITOR>APRSRV.MAC.32, 24-Jul-81 05:19:09 by PAETZOLD
;TCO 5.1380 - Add call to IMPFPF in APRIOP to see if AN20 caused IOPGF
; UPD ID= 41, SNARK:<5.MONITOR>APRSRV.MAC.31, 17-Jul-81 14:15:25 by PAETZOLD
;Fix typo in previous edit
; UPD ID= 40, SNARK:<5.MONITOR>APRSRV.MAC.30, 17-Jul-81 13:50:28 by PAETZOLD
;TCO 5.1380 - increase size of MEMPP stack
; UPD ID= 2122, SNARK:<5.MONITOR>APRSRV.MAC.29, 3-Jun-81 17:04:46 by PAETZOLD
;MORE OF TCO 5.1318 ADD BAD DATA WORD TO UPTMPE AND EPTMPE BUGHLT'S
; UPD ID= 1975, SNARK:<5.MONITOR>APRSRV.MAC.28, 11-May-81 11:40:03 by PAETZOLD
;FIX TYPO IN PREVIOUS EDIT
; UPD ID= 1971, SNARK:<5.MONITOR>APRSRV.MAC.27, 11-May-81 10:05:02 by PAETZOLD
;TCO 5.1318 DETECT PARITY ERRORS FOR EPT AND UPT RELATIVE ADDRESSING
; UPD ID= 1882, SNARK:<5.MONITOR>APRSRV.MAC.26, 24-Apr-81 09:07:59 by GRANT
;Fix typo in previous edit
; UPD ID= 1880, SNARK:<5.MONITOR>APRSRV.MAC.24, 23-Apr-81 17:52:30 by LYONS
;FIX AN20 ABILITY TO HANG SYSTEM
; UPD ID= 1854, SNARK:<5.MONITOR>APRSRV.MAC.23, 21-Apr-81 07:02:21 by WACHS
;TCO 5.1289 RETURN DIAG RESOURCES ON A BUGCHK
; UPD ID= 1775, SNARK:<5.MONITOR>APRSRV.MAC.22, 27-Mar-81 13:30:28 by MURPHY
;FIX .ENTER FOR NEW BLSUB. MACRO
; UPD ID= 1764, SNARK:<5.MONITOR>APRSRV.MAC.21, 24-Mar-81 16:36:44 by MURPHY
;DITTO
; UPD ID= 1757, SNARK:<5.MONITOR>APRSRV.MAC.20, 23-Mar-81 16:29:15 by MURPHY
;Make BUGCHK and BUGINF called with PUSHJ
; UPD ID= 1705, SNARK:<5.MONITOR>APRSRV.MAC.19, 16-Mar-81 11:42:07 by MURPHY
;MOVE ENTSKD TO SCHED
; UPD ID= 1631, SNARK:<5.MONITOR>APRSRV.MAC.18, 2-Mar-81 16:26:48 by MURPHY
;NEW EXT ADR ENTER/LEAVE ROUTINES
; UPD ID= 1505, SNARK:<5.MONITOR>APRSRV.MAC.17, 27-Jan-81 16:54:04 by HALL
;Miscellaneous cleanup and comments
; UPD ID= 1494, SNARK:<5.MONITOR>APRSRV.MAC.16, 26-Jan-81 12:35:08 by HALL
;Clean up conditionals, add comments. Put MEMPJ0 under Kl conditional.
; UPD ID= 1482, SNARK:<5.MONITOR>APRSRV.MAC.15, 23-Jan-81 09:09:05 by HALL
;Change IFE SMFLG to IFN KLFLG
; UPD ID= 1268, SNARK:<5.MONITOR>APRSRV.MAC.14, 12-Nov-80 16:27:00 by DONAHUE
;TCO 5.1196 - REMOVE SAVET MACRO IN GENBLK
; UPD ID= 1195, SNARK:<5.MONITOR>APRSRV.MAC.13, 25-Oct-80 12:14:54 by HALL
;TCO 5.1180 - MOVE THE DST INTO NON-ZERO SECTION
; FKSETK - MAKE UPTPFN INCLUDE SECTION 1 SO PAGE FAULT HANDLER
; RUNS IN SECTION 1
; UPD ID= 1182, SNARK:<5.MONITOR>APRSRV.MAC.12, 20-Oct-80 17:59:16 by MURPHY
;BLSUBR SUPPORT CODE
; UPD ID= 1148, SNARK:<5.MONITOR>APRSRV.MAC.11, 10-Oct-80 14:45:41 by MURPHY
;SASUBR SUPPORT CODE
; UPD ID= 1082, SNARK:<5.MONITOR>APRSRV.MAC.10, 1-Oct-80 11:54:58 by MURPHY
;FIX ACVAR
;NEW SAVEAC SUPPORT ROUTINES
;MAKE STKVAR AND TRVAR GET REAL TRAP ON STACK OVERFLOW
; UPD ID= 1035, SNARK:<5.MONITOR>APRSRV.MAC.9, 23-Sep-80 15:21:44 by HALL
;FIX BUGM0 AND BUGP0 ON KS -- FORGOT TO TAKE OUT THE ZERO WHEN MOVING
; BUGMON AND BUGPRI TO RSDAT PSECT
; UPD ID= 1002, SNARK:<5.MONITOR>APRSRV.MAC.8, 11-Sep-80 17:57:35 by GRANT
;Change MONX01 to MONX05 in GENGEN routine
; UPD ID= 785, SNARK:<5.MONITOR>APRSRV.MAC.7, 23-Jul-80 12:26:44 by HALL
;CLEAN UP COMMENTS ON SECONDARY PROTOCOL OUTPUT ROUTINES
; UPD ID= 687, SNARK:<5.MONITOR>APRSRV.MAC.6, 24-Jun-80 09:50:50 by MURPHY
;NOW MAKE SECALL, SECALE WORK AGAIN
; UPD ID= 652, SNARK:<5.MONITOR>APRSRV.MAC.5, 16-Jun-80 16:00:54 by MURPHY
;MAKE SECALL, SECALE FASTER
; UPD ID= 464, SNARK:<5.MONITOR>APRSRV.MAC.4, 23-Apr-80 13:22:03 by MURPHY
;ALLOW DDT BREAKPOINT WHEN MONITOR WRITE PROTECTED
; UPD ID= 420, SNARK:<5.MONITOR>APRSRV.MAC.3, 8-Apr-80 15:30:37 by HALL
;CHANGED BUGMON AND BUGPRI FOR KS MONITOR (MORE OF PRECEDING EDIT)
; UPD ID= 406, SNARK:<5.MONITOR>APRSRV.MAC.2, 3-Apr-80 16:12:26 by HALL
;CHANGES TO WRITE-PROTECT THE RESIDENT MONITOR:
; MOVE DEFINITION OF CONOPG TO STG
; MAKE CASHF BE AN RS
; MAKE BUG-HANDLING CODE AVOID BREAKPOINT IF MONITOR IS WRITE-PROTECTED
; TAKE OUT JSR LOCATIONS
; UPD ID= 335, SNARK:<4.1.MONITOR>APRSRV.MAC.264, 14-Mar-80 11:42:52 by HALL
;GET THE NAME FOR FATCDP RIGHT THIS TIME
; UPD ID= 333, SNARK:<4.1.MONITOR>APRSRV.MAC.263, 14-Mar-80 11:04:04 by HALL
;PUT NAMES IN OPTIONAL DATA FOR IOPGF AND FATCDP
; UPD ID= 254, SNARK:<4.1.MONITOR>APRSRV.MAC.262, 7-Feb-80 17:18:52 by HALL
;put names in optional data for bug ilpsec
; UPD ID= 249, SNARK:<4.1.MONITOR>APRSRV.MAC.261, 6-Feb-80 17:24:32 by HALL
;ADD NAMES OF OPTIONAL DATA TO BUG EBSPER
; UPD ID= 238, SNARK:<4.1.MONITOR>APRSRV.MAC.260, 1-Feb-80 14:39:25 by ENGEL
;CALL RQTAD1 AT CLKINI IF KS
; UPD ID= 90, SNARK:<4.1.MONITOR>APRSRV.MAC.259, 5-Dec-79 09:03:00 by OSMAN
;tco 4.1.1043 - Change XCT APHLT1 to BUG(APRNX1)
;<4.1.MONITOR>APRSRV.MAC.258, 15-Nov-79 16:15:46, EDIT BY MILLER
;<4.1.MONITOR>APRSRV.MAC.257, 15-Nov-79 16:12:09, EDIT BY MILLER
;<4.1.MONITOR>APRSRV.MAC.256, 15-Nov-79 16:05:13, EDIT BY MILLER
;SUPPRESS MEM SCAN ON MB PARITY IF CHANNEL WRITE IS CAUSE
;<4.1.MONITOR>APRSRV.MAC.255, 13-Nov-79 06:44:04, EDIT BY R.ACE
;ADD PC ARGUMENT TO ILLDMS AND ILLFLT BUGCHKS
;<4.1.MONITOR>APRSRV.MAC.254, 8-Nov-79 17:39:44, EDIT BY MURPHY
;ADD LSTPFK IN SETPSK
;<4.1.MONITOR>APRSRV.MAC.253, 6-Nov-79 05:45:43, EDIT BY R.ACE
;CHANGE NAMES OF ARGUMENTS TO ILLUUO BUGHLT
; COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1976, 1988.
; ALL RIGHTS RESERVED.
;
; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED
; ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE
; INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER
; COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
; OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY
; TRANSFERRED.
;
; THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE
; AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT
; CORPORATION.
;
; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
; SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.
;PROCESSOR SERVICE, PROCESSOR-DEPENDENT PAGING. D. MURPHY
SEARCH PROLOG,SERCOD
EXTN <PI7P,PIXCX,XPISK,PIXSTK,PIBITS,WROPR0>
TTITLE APRSRV
IFN KLFLG,<
EXTN <DTEINA,DTEACT,ENDRGN,NMD16K,MEMTAB,DTICON,SYRMAP>
> ;END OF IFN KLFLG
IFN KCFLG,<
EXTN <CNBOUT> ;NON-PI TYPE-OUT ROUTINE
> ;END OF IFN KCFLG
;NEED FX FOR BUGH0 -- BUGHLT CODE
FX==Q3 ;DEFINE AC FOR FKJSB
Subttl Table of Contents
; Table of Contents for COPYRIGHT
;
; Section Page
;
;
; 1. Definitions . . . . . . . . . . . . . . . . . . . . . 4
; 2. Generally Used Constants . . . . . . . . . . . . . . . 23
; 3. Utility routines . . . . . . . . . . . . . . . . . . . 25
; 4. System Initialization . . . . . . . . . . . . . . . . 43
; 5. PI System Initialization . . . . . . . . . . . . . . . 49
; 6. APR Interrupt Service . . . . . . . . . . . . . . . . 55
; 7. Memory Parity Error routines (KL only) . . . . . . . . 65
; 8. Gather KL10 Status Block . . . . . . . . . . . . . . . 94
; 9. Routines to handle BUGHLT, BUGCHK, BUGINF . . . . . . 99
; 10. Write to CTY when PI's are off . . . . . . . . . . . . 110
; 11. Routines to switch protocols with front end . . . . . 113
; 12. Clock Service . . . . . . . . . . . . . . . . . . . . 116
; 13. DTE Control Routines . . . . . . . . . . . . . . . . . 121
; 14. Cache Control . . . . . . . . . . . . . . . . . . . . 123
; 15. Context Handling Routines . . . . . . . . . . . . . . 125
; 16. Address Break . . . . . . . . . . . . . . . . . . . . 151
; 17. Pager Control Routines . . . . . . . . . . . . . . . . 157
; 18. Page Fail Handler (Hard Error Codes and Unusual Cases) 173
; 19. KA floating point simulation . . . . . . . . . . . . . 193
; 20. Gfloat to Integer Conversion Simulation Routines . . . 200
; 21. METER JSYS . . . . . . . . . . . . . . . . . . . . . . 204
; 22. End of APRSRV . . . . . . . . . . . . . . . . . . . . 205
SUBTTL Definitions
;CONI/CONO APR BIT DEFINITIONS
IFN KLFLG,<
;FLAG FUNCTIONS (CONO APR)
APIOPR==:1B19 ;IOB RESET
APEINT==:1B20 ;FLAG ENABLE
APDINT==:1B21 ;FLAG DISABLE
APFCLR==:1B22 ;FLAG CLEAR
APFSET==:1B23 ;FLAG SET
;FLAGS - AFFECTED AS CONTROLLED BY FLAG FUNCTION BITS
APSBER==:1B24 ;SBUS ERROR
APNXM==: 1B25 ;NONX MEM
APIOPF==:1B26 ;IO PAGE FAIL
APMPE==: 1B27 ;MBOX-DETECTED DATA PARITY ERROR
APCDPE==:1B28 ;CACHE DIRECTORY PARITY ERROR
APAPE==: 1B29 ;ADDRESS PARITY ERROR
APPWF==: 1B30 ;POWER FAIL
APSWPD==:1B31 ;SWEEP DONE
APIRQ==: 1B32 ;INTERRUPT REQUEST (CONI ONLY)
APPIA==: 7B35 ;PI ASSIGNMENT
GOPDEF CLRMPE,<CONO APR,APFCLR+APSBER+APMPE+APRCHN> ;CLEAR PAR FLAG
GOPDEF CLNXMF,<CONO APR,APFCLR+APNXM+APRCHN> ;CLEAR NXM FLAG
APSWPB==:1B19 ;SWEEP BUSY (CONI APR OR RDAPR)
;CONO APR WHERE PI CHANNEL IS ALWAYS NEEDED
DEFINE CONOAPR (E)<
CONO APR,E+APRCHN>
;SKIP IF RESULT OF MAP INSTRUCTION SAYS PAGE CAN BE REFERENCED.
DEFINE SMAPOK (AC)<
TXNN AC,TWHPFF ;HARD FAILURE?
TXNN AC,TWVALD> ;NO. VALID MAPPING?
;HERE FOR FAILURE
;HERE FOR SUCCESS
> ;END IFN KLFLG
;Bits for WRAPR/RDAPR
IFN KCFLG,<
APLDPI==:1B18 ;LOAD PI LEVEL FROM BITS 33-35
APIOPR==:1B19 ;ASSERT RESET ON THE I/O BUS
APEINT==:1B20 ;ENABLE INTERRUPTS ON LEVELS IN BITS 24-31
APDINT==:1B21 ;DISABLE INTERRUPTS ON LEVELS IN BITS 24-31
APFCLR==:1B22 ;CLEAR FLAGS IN BITS 24-31
APFSET==:1B23 ;SET FLAGS IN BITS 24-31
;In WRAPR, these bits select particular conditions in conjunction with
;bits APEINT,APDINT,APFCLR,APFSET.
;In RDAPR, each of these bits indicates a condition for which an interrupt
;is pending.
;BITS 24-29 RESERVED
APCONS==:1B30 ;CONSOLE ATTENTION
APPWF==:1B31 ;POWER FAILURE
APPIA==: 7B35 ;PI ASSIGNMENT
APIRQ==: 1B32 ;INTERRUPT REQUEST (RDAPR ONLY)
GOPDEF CLRMPE,<JFCL> ;NO KC EQUIVALENT OF "CLEAR MEMORY PARITY ERROR"
; BECAUSE IT'S NOT AN APR CONDITION
GOPDEF CLNXMF,<JFCL> ;NO KC EQUIVALENT OF "CLEAR NXM" BECAUSE
; IT'S NOT AN APR CONDITION
;CONO APR WHERE PI CHANNEL IS ALWAYS NEEDED
DEFINE CONOAPR (E)<
WRAPR E+APLDPI+APRCHN>
;SKIP IF RESULTS OF MAP INSTRUCTION SAYS PAGE CAN BE REFERENCED
DEFINE SMAPOK (AC)<
TXNN AC,MPHPFF ;HARD FAILURE?
TXNN AC,MPVALD> ;NO. DOES MAPPING EXIST?
> ;END OF IFN KCFLG
;local storage
RSI PTPARC,<-2> ;Allow 2 PT parity errors before dying
;GET PROCESSOR SERIAL NUMBER
IFN KLFLG,<
APRSN==:MASKB(24,35)
> ;END OF IFN KLFLG
IFN KCFLG,<
APRSN==:MASKB(18,35)
> ;END OF IFN KCFLG
RS PI1ACS,20 ;STORAGE FOR AC'S DURING APR INTERRUPT
IFN DTFLG,<
;DTE20 SERVICE
RS DTESV,4 ;PC AND DISPATCH FOR JSR
;DTE20 CONI/CONO BITS
DTE0==200 ;DEVICE CODE, DTE #0
DTECHN==DLSCHN ;PI CHANNEL ASSIGNMENT
DEFINE CONODTE (E)<
CONO DTE0,E>
;DTE20 DATAO BITS AND FIELDS
; 0-22 ;UNUSED
DTETI==:1B23 ;TO-10 "I" BIT
DTEBYC==:007777 ;(NEGATIVE) BYTE COUNT
;KLDTE PROTOCOL
DTEDAT==377 ;DATA BYTE IN DTECMD
DTECCD==17B27 ;COMMAND CODE IN DTECMD
;COMMAND CODES
DTETTO==0B27 ;TTY OUTPUT
; 1 - PROGRAM CONTROL, NOT USED
DTECOF==2B27+0 ;CLOCK OFF
DTECON==2B27+1 ;CLOCK ON
; 3 - SWITCHES, NOT USED
; 4 - TTY OUTPUT, SAME AS 0?
; 5 - TTY INPUT, NOT USED
DTEPTN==6B27+0 ;PRINT NORMAL
DTEPTF==6B27+1 ;PRINT FORCED
DTEDDI==7B27 ;DDT INPUT
DTEMNO==10B27 ;MONITOR TTY OUTPUT
DTEMMN==11B27 ;MONITOR MODE ON
DTEMMF==12B27 ;MONITOR MODE OFF
DTERMM==13B27 ;READ MONITOR MODE
> ;END OF IFN DTFLG
;STORAGE FOR PARITY ROUTINES
RS MEMPA,1 ;ONE WORD FOR PAGEM TO USE
RS WREQ,1 ;WRITE ERROR QUEUE
IFN KLFLG,<
RS MEMAP,1 ;FOR STACK STORAGE
RS DEVMPE,1 ;AOS'D TO REQUEST CORE SCAN
RS MPITIM,1 ;TIME OF LAST PAR ERR
RS MPISEB,PI%LN2 ;TEMP SYSERR DATA
NMEMPP==^D54 ;SIZE OF LOCAL STACK
RS MEMPP,NMEMPP ;LOCAL STACK
RS MEMPDP,1 ;SAVE AC BLOCK SETTINGS
RS MEMPFF,1 ;FATAL FLAG
RS MTSADR,1 ;HOLD MEMORY TEST ADDRESS
;DEFINITIONS FOR MF20 CONTROLLERS
MOSTBL: -10,,10 ;FIRST GROUP OF CONTROLLERS
-5,,0 ;THE MB/MB AND DMA CONTROLLERS
MOSLEN==.-MOSTBL ;# OF GROUPS
FMOS==:10 ;FIRST MF20 CONTROLLER
MOS==5 ;MEMORY TYPE FOR MF20
DEFSTR (MEMTYP,,11,4) ;FIELD IS SBUSD FNC 1 FOR MEMORY TYPE
MOSCER==1B1 ;CORRECTABLE ERROR BIT
MOSWPE==1B4 ;DATA WRITE PARITY ERROR
MOSDBL==1B25 ;DISABLE BIT IN FNC 1 FOR MOS
SBSHER==57B5 ;HARD ERROR BITS FOR ANY SBSUS CONTROLLER
SBSRPE==1B3 ;READ PARITY ERROR
SBSMAX==2 ;# OF SBDIAG'S TO READ
MFBXDS==1B14 ;BOX DISABLE IN FNC 12
;OTHER KNOWN MEMORY TYPES FOR SBDIAG USED BY MEMLOK ROUTINE
DMA20==2
MA20==1
MB20==3
ARQENB==17B35 ;TO TEST ANY REQUESTS ENABLED FOR MA20/MB20
MX20==4 ;NOT CURRENTLY IMPLEMENTED
;DEFINE NEEDED ERA BITS
ER%CHN==:1B3 ;CHANNEL DETECTED ERROR
ER%WRT==:1B6 ;WRITE TO MEMORY
SBCLER==1B5 ;SBUSDIAG CLEARR ERROR BIT
PFCPT: SEBPTR 0,SBTEVC,SEC%PT ;EVENT CODE
SEBPTR 0,SBTFNA,PFCPJ0 ;FUNCTION ADDRESS--JOB 0 FIXUP
NPFCPT==.-PFCPT
RS CCHECT,1 ;CACHE HARD ERROR COUNT
> ;END OF IFN KLFLG
RSI CASHF,,1 ;STATE OF THE CACHE (-1 FOR ON, 0 FOR OFF)
;(used early before RS zeroed)
;AC BLOCK ASSIGNMENTS
MONACB==:0 ;MONITOR
USRACB==:1 ;USER
APRACB==2 ;APR INT AC BLOCK
CH6ACB==3 ;FOR CONSOLE TTY HANDLING ON THE KC
IFN KLFLG,<
HW7ACB==7 ;HARDWARE HAS SOME THINGS IN BLOCK 7
BK7PFD==0 ;DATA WORD ON AR/ARX PARITY ERROR
BK7IOP==2 ;PF WORD ON IO PAGE FAIL
> ;END OF IFN KLFLG
;Fields in a flags word for AC blocks for instructions that load flags.
;MONFLG sets context for monitor; USRFLG sets context for user.
IFN KLFLG,<
MONFLG=:0
USRFLG=:0
>
IFN KCFLG,<
MONFLG=:FLD(MONACB,EXCAB)+FLD(USRACB,EXPAB)
USRFLG=:FLD(USRACB,EXCAB)
>
;COMPLETE MONITOR FLAG WORD (I.E. MONITOR ENVIRONMENT)
MONENV==:PCU+MONFLG+1 ;DEFAULT PCS TO 1
USRCTX=:UMODF+USRFLG ;FLAGS WORD WHEN SETTING USER CONTEXT
;ASSORTED STANDARD FORMS OF DATAO PAG/WRCTX.
;KIPGW0 - LOAD UBR TO POINT TO SCHEDULER'S UPT, CLEAR KEPT ENTRIES, DON'T
; DO ACCOUNTING
;SETMON - SET CURRENT AC'S TO MONITOR'S AC'S (0), PREVIOUS TO USER'S (1)
;SETUSR - SET CURRENT AC'S TO USER'S AC'S (1)
;SETBK7 - SET CURRENT AC'S TO MONITOR'S, PREVIOUS TO AC'S USED BY HARDWARE
;SETAPI - SET CURRENT AC'S TO AC'S USED BY HARDWARE, PREVIOUS TO APR INTERRUPT AC'S
;Initial DATAO PAG sets PGNSAC so that the previous UPT won't be updated.
;We don't have a previous UPT at this point. The update could cause a
;bad reference.
IFN KLFLG,<
KIPGW0: PGLUBR+PGNSAC+SKHWPT/PGSIZ
SETMON::PGLACB+FLD(MONACB,PGCACB)+FLD(USRACB,PGPACB) ;SET MON CONTEXT
SETUSR::PGLACB+FLD(USRACB,PGCACB) ;SET USER CONTEXT
SETBK7::PGLACB+FLD(MONACB,PGCACB)+FLD(HW7ACB,PGPACB) ;SET BK7 PREVIOUS
SETAPI: PGLACB+FLD(HW7ACB,PGPACB)+FLD(APRACB,PGCACB) ;APR INT ACS
SETHWR::PGLACB+FLD(MONACB,PGCACB)+FLD(HWRACB,PGPACB) ;HARDWARE REGISTERS
> ;END OF IFN KLFLG
IFN KCFLG,<
; * * * *
;Temporarily clear all ignoring "keep me" bit
; * * * *
KIPGW0: PGLUBR+PGNSAC+PGCLKP+FLD(SKHWPT/PGSIZ,PGUBRM)
SETMON::PGLACB
FLD(MONACB,PGCACB)+FLD(USRACB,PGPACB)
SETUSR::PGLACB
FLD(USRACB,PGCACB)
;Local storage for APR conditions
NDG APRSIZ,10
RS APRSTK,APRSIZ ;STACK FOR APR INT
> ;END OF IFN KCFLG
;This location is used in all WRCTX (DATAO PAG) instructions after the
;monitor has been initialized. It is updated with the physical page number
;of the new UPT when a new process is scheduled. It is not used to change
;AC blocks. SETMON, SETUSR, etc., load AC blocks and do NOT change the UPT.
IFN KLFLG,<
RS KIPGWD,1 ;PAGER WORD FOR DATAO
> ;END OF IFN KLFLG
IFN KCFLG,<
RS KIPGWD,2
> ;END OF IFN KCFLG
DEFINE CLHWPT<
DATAO PAG,KIPGWD> ;CLEAR AND LOAD PAGING HARDWARE
RS PFSA1,2 ;SAVED ACS AT KIPFS
RS PFSA3,1 ;MORE SAVED ACS AT KIPFS
;Data for clocks and timers
;Four "clocks" are used.
;The hardware provides a time base, which counts in 1 usec units and stores
;its current value in two words, and a timer, which counts in 10 usec units
;and causes an interrupt when its count reaches a value set by the software.
;The software maintains a "high precision clock", which it computes from
;the hardware time base. This clock is stored in one word in units of 10
;usecs. Other clock values, including TODCLK, are in 1 ms units.
;Various constants provide conversion among these clocks.
;TIME BASE
;Time base ticks every usec. This converts between time base ticks and
;milliseconds. The value of BASUNT reflects the placement of the units
;digit of the time base in a two-word format.
;On the KL, only bits 0-23 of the second word are used. On the KC both words
;are used fully.
BASTMS==^D1000 ;TICKS/MS OF TIME BASE CLOCK
IFN KLFLG,<
BASBIT==^D23
BASUNT==1B<BASBIT> ;UNITS POSITION TIME BASE CLOCK 2ND WORD
> ;END IFN KLFLG
IFN KCFLG,<
BASUNT==1B35 ;UNITS POSITION TIME BASE CLOCK 2ND WORD
> ;end of IFN kcflg
BASDIV::BASTMS*BASUNT ;CONVERT TO MILLISECONDS
;HIGH PRECISION CLOCK
;Software high precision clock is in 10 usec units. This converts between
;high precision ticks and milliseconds.
NTMS==:^D100 ;TICKS/MS OF SOFTWARE HIGH PRECISION CLOCK
;Number of time base ticks per high precision tick, taking into account format
;of time base
BASND0==<BASTMS/NTMS>*BASUNT ;HW UNITS PER HP UNIT
BASNDV::BASND0 ;CONVERT TO HP UNITS
BASDV2: BASTMS/NTMS
;Number of time base ticks at which high precision counter overflows one word
BASOV0==1B<^L<BASND0>> ;VALUE AT WHICH HP WORD OVERFLOWS
RS BASOVV,1 ;OVERFLOW VALUE FOR HP CLOCK
;TIMER
;Interval timer ticks every 10 usec. This converts between timer ticks and
;milliseconds
TIMTMS==^D100 ;TICKS/MILLISECOND INTERVAL COUNTER
RS JFDAY,1 ;JIFFIES PER DAY - USED IN GTAD, STAD
RS JFDAY2,1 ;JIFFIES/DAY/2 - FOR ROUNDING
;Bits and instructions for controlling clocks for the KL
IFN KLFLG,<
;CONI/CONO MTR,
MTR==024 ;DEVICE CODE
MTRLOD==1B18 ;LOAD ACCOUNTING BITS 21-23
; 19-20 ;UNUSED, MBZ
MTREPA==1B21 ;ENABLE EXEC PI ACCOUNTING
MTRENA==1B22 ;ENABLE EXEC NON-PI ACCOUNTING
MTRAMN==1B23 ;ACCOUNTING METERS ON
MTRTBF==1B24 ;TIME BASE OFF
MTRTBN==1B25 ;TIME BASE ON
MTRCTB==1B26 ;CLEAR TIME BASE
; 27-32 ;UNUSED, MBZ
MTRPIA==7B35 ;PI ASSIGNMENT FOR INTERVAL COUNTER
;The following EPT locations are used for clocks
TIMBAS=KIEPT+510 ;TIME BASE CLOCK DOUBLEWORD
; KIEPT+512 ;PERF ANAL CLOCK DOUBLEWORD
TIMVIL=KIEPT+514 ;VECTOR INTERRUPT LOCATION
;Timer interrupts execute location at TIMVIL, which is XPCW TIMINT.
;This causes the monitor to run at TIMIN0
RSI TIMINT,<0,0,0,<MSEC1,,TIMIN0>>
> ;END IFN KLFLG
;Bits and instructions for controlling clocks for the KC
IFN KCFLG,<
;For WRTMB and RDTMB (controls time base and interrupt level for
;interval timer)
TMBLPI==1B18 ;LOAD PI LEVEL FROM BITS 33-35
TMBLTB==1B19 ;LOAD TIME BASE FROM BITS 20 AND 23
TMBCTB==1B20 ;CLEAR TIME BASE
TMBBON==1B23 ;TURN ON TIME BASE
TMBPIA==<MASKB 33,35> ;PI LEVEL FOR INTERVAL TIMER
;For WRACT and RDACT (controls user runtime meter)
ACTLOD==1B18 ;LOAD CONTROLS FROM BITS 19-21
ACTEPI==1B19 ;ENABLE METER DURING EXEC PI
ACTENP==1B20 ;ENABLE METER DURING EXEC NON-PI
ACTAON==1B21 ;TURN ON USER RUNTIME METER
;Timer interrupt executes XPCW block pointed to by offset 202 in the I/O
;page. This initializes the XPCW block to go to TIMIN0.
TIMVIL=KCIOPG+202
RSI TIMINT,<0,0,<FLD(MONACB,EXCAB)>,<MSEC1,,TIMIN0>>
> ;End of IFN KCFLG
;Common clock definitions
;Interrupt level for the clock (same as APR)
TIMCHN==APRCHN ;PI ASSIGNMENT
;CONI/CONO TIM on KL, WRINT and RDINT on KC (controls interval counter)
TIMCIC==1B18 ;CLEAR INTERVAL COUNTER
; 19-20 ;UNUSED, MBZ
TIMITO==1B21 ;INTERVAL TIMER ON
TIMDON==1B22 ;DONE (FOR READ)/CLEAR DONE (FOR WRITE)
TIMICO==1B23 ;COUNTER OVERFLOW (FOR READ)
TIMPER==<MASKB 24,35> ;PERIOD REGISTER
IFN KLFLG,<
TIM==020 ;DEVICE ASSIGNMENT
DEFINE RDTIME (XX)<
DATAI TIM,XX>
> ;END OF IFN KLFLG
;Data for PI system initialization
IFN KLFLG,<
;Set common names for initialization of vector words
VECST==40+KIEPT ;WHERE TO START VECTOR WORDS
VECINC==2 ;HOW MUCH TO INCREMENT FOR NEXT LEVEL
;Generate XPCW blocks for non-vectored interrupts
;NOTE: Hardware requires that XPCW block be in section 0
RSI PI0ER,<0,0,0,PIERR0> ;LEVEL 0
RSI PI1ER,<0,0,0,PIERR1> ;LEVEL 1
RSI PI2ER,<0,0,0,PIERR2> ;LEVEL 2
RSI PIAPRX,<0,0,0,PIAPR> ;LEVEL 3
RSI PI4ER,<0,0,0,PIERR4> ;LEVEL 4
RSI PI5R,<0,0,0,PISC5> ;LEVEL 5
RSI PI6R,<0,0,0,PISC6> ;LEVEL 6
RSI PISC7R,<0,0,0,PISC7> ;LEVEL 7
;Edit [7463] was made to help diagnose broken RH20s. These next 8 lines
;must be in order ALWAYS! If you must change them, then you must change
;EPTINI in PHYH2.
RSI RH0ERR,<0,0,0,RH0BAD> ;[7463] No RH in channel 0
RSI RH1ERR,<0,0,0,RH1BAD> ;[7463] No RH in channel 1
RSI RH2ERR,<0,0,0,RH2BAD> ;[7463] No RH in channel 2
RSI RH3ERR,<0,0,0,RH3BAD> ;[7463] No RH in channel 3
RSI RH4ERR,<0,0,0,RH4BAD> ;[7463] No RH in channel 4
RSI RH5ERR,<0,0,0,RH5BAD> ;[7463] No RH in channel 5
RSI RH6ERR,<0,0,0,RH6BAD> ;[7463] No RH in channel 6
RSI RH7ERR,<0,0,0,RH7BAD> ;[7463] No RH in channel 7
;THESE XPCW WORDS ARE COPIED TO THE EPT BY PIINIT
;When a nonvectored interrupt occurs, the word corresponding to its
;level is executed.
PIVEC: XPCW PI0ER ;LEVEL 0
XPCW PI1ER ;LEVEL 1
XPCW PI2ER ;LEVEL 2
XPCW PIAPRX ;LEVEL 3
XPCW PI4ER ;LEVEL 4
XPCW PI5R ;LEVEL 5
XPCW PI6R ;LEVEL 6
XPCW PISC7R ;LEVEL 7
NPISET==:.-PIVEC
RSI LUUBLK,<0,0,0,LUUBUG> ;XPCW BLOCK FOR LUUO IN NON-ZERO SECTION
RSI RLODPC,<0,0,0,RLDHLT> ;XPCW BLOCK FOR KEEP ALIVE RELOAD
> ;END IFN KLFLG
;Data for PI system initialization
IFN KCFLG,<
KCIOPG==:1000 ;Virtual address of I/O page
RSI KCIPHY,KCIOPG/PGSIZ ;Physical page for I/O page
IOPVEC==230 ;OFFSET IN IO PAGE WHERE VECTORS START
VECST==IOPVEC+KCIOPG ;WHERE TO START VECTOR WORDS
VECINC==1 ;HOW MUCH TO INCREMENT FOR NEXT LEVEL
;Generate 4-word blocks pointed to by interrupt vector words for
;software-requested interrupts
RSI PI0ER,<0,0,<FLD(MONACB,EXCAB)>,<MSEC1,,PIERR0>>
RSI PI1ER,<0,0,<FLD(MONACB,EXCAB)>,<MSEC1,,PIERR1>>
RSI PI2ER,<0,0,<FLD(MONACB,EXCAB)>,<MSEC1,,PIERR2>>
RSI PI3ER,<0,0,<FLD(MONACB,EXCAB)>,<MSEC1,,PIERR3>>
RSI PI4ER,<0,0,<FLD(MONACB,EXCAB)>,<MSEC1,,PIERR4>>
RSI PI5R,<0,0,<FLD(MONACB,EXCAB)>,<MSEC1,,PISC5>>
RSI PI6R,<0,0,<FLD(CH6ACB,EXCAB)>,<MSEC1,,PISC6>>
RSI PISC7R,<0,0,<FLD(MONACB,EXCAB)>,<MSEC1,,PISC7>>
;THESE WORDS ARE COPIED INTO THE I/O PAGE BY PIINIT
;When a software-requested interrupt occurs, the microcode looks at
;the word in the I/O page corresponding to its level. That word contains
;the address of a 4 word block similar to an XPCW block.
PIVEC: MSEC1,,PI1ER ;LEVEL 1
MSEC1,,PI2ER ;LEVEL 2
MSEC1,,PI3ER ;LEVEL 3
MSEC1,,PI4ER ;LEVEL 4
MSEC1,,PI5R ;LEVEL 5
MSEC1,,PI6R ;LEVEL 6
MSEC1,,PISC7R ;LEVEL 7
NPISET==:.-PIVEC
IOPAPR==201 ;OFFSET IN I/O PAGE FOR APR INTERRUPT VECTOR
IOPNPC==247 ;OFFSET IN I/O PAGE FOR NEW FLAGS/PC FOR IO PAGE FAIL
;Interrupt vector for APR interrupt.
RSI PIAPRX,<0,0,<FLD(APRACB,EXCAB)>,<MSEC1,,PIAPR>>
RSI LUUBLK,<0,0,<FLD(MONACB,EXCAB)>,LUUBUG> ;XPCW BLOCK FOR LUUO IN NON-ZERO SECTION
RSI RLODPC,<0,0,<FLD(MONACB,EXCAB)>,RLDHLT> ;XPCW BLOCK FOR KEEP ALIVE RELOAD
;Offsets in the I/O page:
; 0-77 Port register access blocks
;IOPAPR 201 APR interrupt
;TIMVIL 202 Interval timer
; 210-217 Port interrupt vectors
; 220-230 Reserved for ucode
;IOPVEC 231-237 Software interrupt vectors
; 240-246 Data for I/O page fail
;IOPNPC 247-250 New flags/PC for I/O page fail
; 400-777 Console comm region
> ;END OF IFN KCFLG
SUBTTL Generally Used Constants
;6-BIT POINTER TABLE
POINT 6,0,-1
CH6TAB::POINT 6,0,5
POINT 6,0,11
POINT 6,0,17
POINT 6,0,23
POINT 6,0,29
POINT 6,0,35
;BHC+N CONTAINS N,,N
XX=0
BHC:: REPEAT 20,<EXP XX*1000001
XX=XX+1>
;BITS+N CONTAINS A WORD WITH A 1 IN BIT N
XX==0
BITS:: REPEAT ^D36,<EXP 1B<XX>
XX=XX+1>
SUBTTL Utility routines
;GLOBAL STANDARD RETURNS
;POP AC'S DOWN TO 1 AND RETURN
PA7:: POP P,7
PA6:: POP P,6
PA5:: POP P,5
PA4:: POP P,4
PA3:: POP P,3
PA2:: POP P,2
PA1:: POP P,1
RET
;POP AC'S DOWN TO 2 AND RETURN
PB7:: POP P,7
PB6:: POP P,6
PB5:: POP P,5
PB4:: POP P,4
PB3:: POP P,3
PB2:: POP P,2
RET
;FALSE (AC1=0) AND TRUE (AC1#0) RETURNS
RETZ:: ;RETURN ZERO
RFALSE::SETZ 1,
RET
RETO:: ;RETURN ONES
RTRUE:: SETO 1,
RET
;SKIP AND NO-SKIP RETURNS
RSKP:: AOS 0(P)
RTN::
R:: RET
repeat 0,<
;This is an artifact of the SZCOD PSECT which takes up space that we need
; it might be nice to have it back sometime
RESCD (SEC0) ;These kinda have to be in section 0
>
RESCD
;$EAENT - Routine to jump into extended section if necessary and set stack for
;automatic return to caller's section. Called upon entry into a routine that
;must run in an extended section.
;Invoked via EA.ENT macro (JSP CX,$EAENT)
$EAENT::
; The proper section 0 test would be these 2 instructions, but efficiency
; forbids this solution.
; XHLLI CX,. ;GET SECTION NUMBER INTO CX
; TLNE CX,-1 ;ALREADY IN NON-0 SECTION?
TXNE CX,EXSCBT ;ALREADY IN NON-0 SECTION?
JRST 0(CX) ;YES, DO NOTHING
;When routine returns via POPJ, it will be in extended section. Fix return
;PC on stack so that section number is zero.
HRRZS 0(P) ;FIX UP STACK FOR RETURN TO SECTION 0
;Now return to the routine, running in extended section.
HRLI CX,MSEC1 ;MAKE RETURN PC BE IN SECTION 1
XJRST CX ;DO 30 BIT JRST
;S0ENT - Routine to cause subroutine to run in section 0. Causes automatic return
;to section of caller on return. Called upon entry to a routine that must run
;in section 0
;Invoked via S0.ENT macro (JSP CX,$S0ENT)
;NOTE: The check for PC section assumes that section number and flags
;cannot overlap. Therefore, this is invalid if PC section is greater than 32
$S0ENT::TXNN CX,EXSCBT ;ALREADY IN SECTION 0?
JRST 0(CX) ;YES, DO NOTHING
;Routine was called from extended section. Jump into section 0 and call
;the routine again.
JRST @[.+1] ;JUMP INTO SECTION 0
PUSHJ P,0(CX) ;CONTINUE WITH ROUTINE
CAIA ;HERE IF ROUTINE RETURNS +1
AOS 0(P) ;HANDLE SKIP RETURN
;Routine returned from section 0. Construct flags/PC block on the stack
;so that we can go to extended section.
ADJSP P,1 ;SET ASIDE STACK SPACE
XSFM 0(P) ;STORE FLAGS
PUSH P,[MSEC1,,S0ENT1] ;STORE PC IN EXTENDED SECTION
XJRSTF -1(P) ;JUMP INTO EXTENDED SECTION, KEEPING FLAGS
S0ENT1: ADJSP P,-2 ;FLUSH STACK
;Return from extended section to caller in extended section.
RET
;Debugging check for code running in section 0. Invoked
;by TSTMS0 macro defined in PROLOG.
IFN SEC0SW,< ;IF SECTION 0 CHECKING ENABLED
$TSMS0::TXNE CX,EXSCBT ;NOW IN NON-0 SECTION?
JRST 0(CX) ;YES, ALL IS WELL
BUG.(CHK,MCSEC0,APRSRV,SOFT,<MONITOR CODE RUNNING IN SECTION 0>,<<CX,PC>>,<
Cause: Monitor code which should not be running in section 0 and does
not expect to run in section 0 has run in section 0. This should
be investigated and fixed. This is under the SEC0SW debug switch
and should not be seen in the field.
Data: PC at which check was made.
>)
ADJSP P,1 ;MAKE STACK SPACE
XSFM 0(P) ;SAVE FLAGS
PUSH P,[MSEC1,,TSTM1] ;CONSTRUCT PC, FLAGS
XJRSTF -1(P) ;JUMP .+1 AND KEEP FLAGS
TSTM1: ADJSP P,-2 ;CLEAN UP STACK
HRLI CX,MSEC1 ;FIX UP LOCAL RETURN
JRST 0(CX) ;RETURN, NOW IN SE 1
> ;END SEC0SW
;SECALL -- SUPPORT FOR SECTION CALL TO CALL SECTION 1
;SECALE -- REMOVES THE SECTION NUMBER FROM HIGH ORDER BITS OF -1(P)
; SO POPJ WILL WORK THEN ENTERS SECTION 1
;
; REQUIRES A STACK (P) AND IS CALLED USING THE
; SE1ENT AND SE1CAL MACRO'S
;
; ALWAYS RETURNS +1
;
SECALE::MOVX CX,EXFLBT ;GET FLAGS TO CLEAR
ANDCAM CX,-1(P) ;CLEAR FLAGS FROM RETURN PC
SECALL::MOVE CX,[MSEC1,,SCALL1] ;SECTION TO ENTER AND LOCAL PC
HLLM CX,0(P) ;SET IT
PUSH P,P6 ;ASSUME P6 = CX-1
XSFM P6 ;PRESERVE FLAGS
XJRSTF P6 ;ENTER NEW SECTION AND PRESERVE FLAGS
SCALL1: POP P,P6 ;RESTORE AC
RET ;RETURN
; SE0CAL -- SUBROUTINE TO SUPPORT SE1ENT MACRO
;
; ENTRY SE0ENT (MACRO)
; REQUIRES STACK BUT DOES NOT DESTROY ANYTHING
SE0CAL::JRST @[.+1]
RET
; SPCSNZ - Skip if Previous Context Section Non Zero
; Destroys no ACs but uses the stack
RESCD ;ASSUME NO SECTION 0 CALLERS HEREAFTER
SPCSNZ::
PUSH P,T1 ; SAVE AN AC
SETZ T1, ; ZERO THE AC
XCTU [XHLLI T1,0] ; GET PCS INTO LEFT HALF T1
SKIPE T1 ; PCS NON-ZERO?
AOS -1(P) ; YES SO BUMP RETURN PC
POP P,T1 ; GET THE AC BACK
RET ; RETURN TO CALLER OR CALLER+1
; EXTENDED ADDRESSING BLT SIMULATION FOR CROSSING SECTIONS
; XBLTA SIMULATE AN XBLT 1
;
; CALLING SEQENCE:
;
; T1 LENGTH TO BLT
; T2 FROM ADDRESS
; T3 TO ADDRESS
; CALL XBLTA
;RETURNS +1 ALWAYS
; PRESERVES T4 AND DESTROYS T1,T2,T3
;
XBLTAT::TLNE T1,-1 ;MAKE SURE REASONABLE SIZE
BUG.(HLT,XBLTAL,APRSRV,SOFT,<XBLTA asked to copy too much>,<<T1,LENGTH>>,<
Cause: XBLTA was called with a 'length to BLT' of more than one section.
It is unlikely that the caller really intended to copy this much.
Data: LENGTH - Number of words XBLTA was asked to copy
>)
XBLTA:: HRRZS T1 ;SOME CALLERS DEPEND ON THIS
XBLT. T1
RET
;EXTENDED BLT MONITOR TO USER FOR EXTENDED ADDRESSING
;
; CALLING SEQUENCE:
;
; T1 LENGTH TO BLT
; T2 FROM ADDRESS
; T3 TO ADDRESS
; CALL BLTMU
; OR
; CALL BLTMU1
;RETURNS +1 ALWAYS
; PRESERVES T4 ALTERS T1,T2,T3
;BLTMU1 IS ALTERNATE ENTRY POINT THAT APPLIES PREVIOUS CONTEXT
;SECTION TO THE USER'S ADDRESS. THIS IS USED IF THE CALLER HAS
;NOT PREVIOUSLY SET UP A 30-BIT ADDRESS AND WANTS THE SECTION FROM
;WHICH THE USER ENTERED THE MONITOR.
BLTMU1::XSFM CX ;GET FLAGS, INCLUDING PCS
ANDI CX,EXPCS ;GET JUST PREVIOUS CONTEXT SECTION
TXNN T3,VSECNO ;USER'S ADDRESS IN NON-ZERO SECTION?
CAIGE T3,20 ;NO. STARTING IN THE AC'S?
SKIPA ;SECTION GIVEN OR AC'S. DON'T APPLY PCS
HRL T3,CX ;NEED A SECTION. USE PCS
BLTMU:: HRRZS T1 ;ASSURE REASONABLE SIZE
XCT 1,[XBLT. T1] ;DO PXCT OF XBLT
RET ;RETURN
; BLTUM -- EXTENDED BLT FROM USER TO MONITOR SPACE
;
; CALLING SEQUENCE:
;
; T1 -- COUNT OF WORDS TO TRANSFER
; T2 -- FROM ADDRESS
; T3 -- TO ADDRESS
; CALL BLTUM
;RETURNS +1 ALWAYS AND PRESERVES T4 ALTERS T1,T2,T3
;
;BLTUM1 IS ALTERNATE ENTRY POINT THAT APPLIES PREVIOUS CONTEXT
;SECTION TO THE USER'S ADDRESS. THIS IS USED IF THE CALLER HAS
;NOT PREVIOUSLY SET UP A 30-BIT ADDRESS AND WANTS THE SECTION FROM
;WHICH THE USER ENTERED THE MONITOR.
BLTUM1::XSFM CX ;GET FLAGS, INCLUDING PCS
ANDI CX,EXPCS ;GET JUST PREVIOUS CONTEXT SECTION
TXNN T2,VSECNO ;USER'S ADDRESS IN NON-ZERO SECTION?
CAIGE T2,20 ;NO. STARTING IN THE AC'S?
SKIPA ;SECTION GIVEN OR AC'S. DON'T APPLY PCS
HRL T2,CX ;NEED A SECTION. USE PCS
BLTUM:: HRRZS T1 ;ASSURE REASONABL SIZE
XCT 2,[XBLT. T1] ;DO PXCT OF XBLT
RET ;RETURN TO CALLER
; BLTUU -- EXTENDED BLT FROM USER TO USER SPACE
;
; CALLING SEQUENCE:
;
; T1 -- COUNT OF WORDS TO TRANSFER
; T2 -- FROM ADDRESS
; T3 -- TO ADDRESS
; CALL BLTUU
;RETURNS +1 ALWAYS AND PRESERVES T4 ALTERS T1,T2,T3
;
BLTUU:: HRRZS T1 ;ASSURE REASONABLE SIZE
XCT 3,[XBLT. T1] ;DO PXCT OF XBLT
RET ;RETURN TO CALLER
;COMMON ENTRY AND EXIT ROUTINE FOR STACK VARIABLE FACILITY
.STKST::
.XSTKS::ADJSP P,@0(CX) ;Adjust stack pointer for variables used
PUSH P,0(CX) ;Save block size for return
PUSHJ P,1(CX) ;Call routine and return following here
.STKRT::IFSKP. ;Skip return comes here so
POP P,CX ; recover count,
MOVNS CX ; get size for deallocation,
ADJSP P,(CX) ; adjust stack to remove block,
AOS 0(P) ; and now adjust for skip return
ELSE. ;Now for Non-Skip return so
POP P,CX ; recover count,
MOVNS CX ; get size for deallocation,
ADJSP P,(CX) ; and adjust stack to remove block
ENDIF.
RET ;Now just return
;SUPPORT ROUTINE FOR TRVAR
.TRSET::
.XTRST::PUSH P,P6 ;Save old frame pointer
MOVE P6,P ;Set up new frame pointer
ADJSP P,@0(CX) ;Adjust stack pointer for variables used
PUSHJ P,1(CX) ;Call routine and return following here
.TRRET::IFSKP. ;Skip return comes here so
MOVEM P6,P ; deallocate space for variables,
POP P,P6 ; restore old frame pointer,
AOS 0(P) ; and now adjust for skip return
ELSE. ;Now for Non-Skip return so
MOVEM P6,P ; deallocate space for variables
POP P,P6 ; and restore old frame pointer
ENDIF.
RET ;Now just return
;SUPPORT ROUTINE FOR ASUBR
.ASSET::PUSH P,P6 ;SAVE AC FOR STACK POINTER
MOVE P6,P ;SETUP FRAME PTR
ADJSP P,4 ;ALLOCATE SPACE
DMOVEM T1,1(P6) ;SAVE ARGS
DMOVEM T3,3(P6)
PUSHJ P,0(CX) ;CONTINUE ROUTINE
.ASRET:: JRST [ MOVEM P6,P ;NO-SKIP RETURN, CLEAR STACK
POP P,P6
RET]
MOVEM P6,P
POP P,P6
RETSKP
;SUPPORT ROUTINE FOR SASUBR
.SASET::PUSH P,P6 ;SAVE P6
MOVE P6,P ;SETUP FRAME POINTER
ADJSP P,4 ;BUMP STACK
DMOVEM A,1(P6) ;SAVE ARGS
DMOVEM C,3(P6)
PUSHJ P,0(CX) ;CONTINUE ROUTINE
.SARET:: JRST [ DMOVE A,1(P6) ;RESTORE
DMOVE C,3(P6)
MOVEM P6,P ;NO-SKIP RETURN, CLEAR STACK
POP P,P6
POPJ P,]
DMOVE A,1(P6) ;RESTORE
DMOVE C,3(P6)
MOVEM P6,P ;SKIP RETURN, CLEAR STACK
POP P,P6
AOS 0(P)
POPJ P,
;SUPPORT CODE FOR BLSUBR
.ENTER::PUSH P,P6
MOVE P6,P
ADD P,0(CX) ;ALLOCATE LOCAL STORAGE
JUMPGE P,ENTOV ;JUMP IF OVERFLOW
ENTOV1: PUSHJ P,1(CX)
JRST [ MOVE P,P6 ;RESET STACK PTR
JRST ENTX1]
MOVE P,P6
AOS -1(P) ;PROPAGATE SKIP
ENTX1: POP P,P6
MOVN CX,-1(P) ;get -<n,,n>
HRRZM CX,-1(P) ;Store 0,,-n
POP P,CX ;REcover return address
ADJSP P,@0(P) ;Clean up the stack
JRST 0(CX) ;RETURN
ENTOV: MOVE P,P6 ;STACK OVERFLOW, UNDO ADD
PUSH P,CX ;SAVE LOCAL RETURN IN 1(P6)
HRRZ CX,0(CX) ;GET COUNT
ADJSP P,-1(CX) ;ALLOCATE SPACE, GET TRAP HERE OR ON PUSH
MOVE CX,1(P6) ;RESTORE LOCAL RETURN
JRST ENTOV1 ;CHARGE AHEAD
;SUPPORT ROUTINE FOR JSBVAR.
;BUILDS A STACK FRAME AS FOLLOWS
; -5(P) := RETURN PC FROM CALLING PROGRAM
; -4(P) THRU -1(P) := PLACE TO SAVE T1-T4
; 0(P) := PLACE TO SAVE PREVIOUS FRAME PNTR
.JSSET::ADJSP P,5 ;BUILD STACK FRAME
DMOVEM T1,-4(P) ;SAVE T1-T2
DMOVEM T3,-2(P) ; AND T3-T4
MOVEM CX,0(P) ;SAVE TEMP
HLRZ T2,0(CX) ;SIZE OF BLOCK REQUIRED
NOINT ;PROTECT FREE SPACE
CALL ASGJFS ;ASSIGN SPACE IN JSB
IFNSK.
MOVE CX,0(P) ;RETURN ADDRS
HRRZ T1,0(CX) ;SEE IF USER ERROR ROUTINE?
OKINT ;UNDO NOINT ABOVE
IFE. T1
MOVEI T1,MONX02
ITERR
ENDIF.
DMOVE T1,-4(P) ;RESTORE ACS
DMOVE T3,-2(P)
MOVEI T1,MONX02 ;ERROR CODE
ADJSP P,-5 ;CLEAN OFF STACK
HRRZ CX,0(CX) ;GET ERROR ADDRS
JRST 0(CX) ;XFER TO USER ROUTINE
ENDIF.
OKINT ;UNDO NOINT ABOVE
MOVE CX,0(P) ;RESTORE CONTEXT
MOVEM P6,0(P) ;SAVE PREVIOUS FRAME
MOVEI P6,1(T1) ;POINT TO FIRST LOC
DMOVE T1,-4(P) ;RESTORE T1-T4
DMOVE T3,-2(P)
PUSHJ P,1(CX) ;RETURN TO CALLER
.JSRET:: SKIPA ;NORMAL RETURN
AOS -5(P) ; SET UP SKIP RETURN
DMOVEM T1,-4(P) ;SAVE T1-T4 AGAIN
DMOVEM T3,-2(P)
MOVEI T1,JSBFRE ;RELEASE STG FROM HER
MOVEI T2,-1(P6) ;POINT TO BLOCK
NOINT ;BE NOINT FOR ENTIRE RELEASE
CALL RELFRS ;RELEASE IT
OKINT ;STORAGE FREE
MOVE P6,0(P) ;RESTORE FRAME PNTR
DMOVE T1,-4(P) ;RESTORE T1-T4
DMOVE T3,-2(P)
ADJSP P,-5 ;REMOVE STACK FRAME
RET ;RETURN APPROPRIATELY
;FACILITY TO SAVE ALL ACS.
;NORMALLY INVOKED BY ACSAV MACRO, = JSP CX,ACSAV0
;DUMMY RETURN PUT ON STACK TO DO AUTOMATIC RESTORE ON RETURN
ACSAV0::ADJSP P,16 ;MAKE ROOM FOR 16 ACS
DMOVEM 0,-15(P)
DMOVEM 2,-13(P)
DMOVEM 4,-11(P)
DMOVEM 6,-7(P)
DMOVEM 10,-5(P)
DMOVEM 12,-3(P)
DMOVEM 14,-1(P)
PUSHJ P,0(CX) ;CONTINUE ROUTINE, EXIT VIA .+1
ACRET0:: SKIPA ;NO-SKIP ENTRY
AOS -16(P) ;SKIP ENTRY, PASS IT UPWARD
DMOVE 0,-15(P)
DMOVE 2,-13(P)
DMOVE 4,-11(P)
DMOVE 6,-7(P)
DMOVE 10,-5(P)
DMOVE 12,-3(P)
DMOVE 14,-1(P)
ADJSP P,-16 ;CLEAR STACK
RET
;ROUTINES TO SAVE P1-P6, OR Q1-Q3, OR Q1-Q3 AND P1-P6
;CALLED WITH SAVEP, SAVEQ, AND SAVEPQ MACROS
SAVP:: ADJSP P,6 ;NEED TO SAVE 6 REGS
DMOVEM P1,-5(P)
DMOVEM P3,-3(P)
DMOVEM P5,-1(P) ;SAVE THEM ALL
PUSHJ P,0(CX) ;CONTINUE ROUTINE, EXIT VIA .+1
RESTP:: SKIPA ;NON-SKIP RETURN
AOS -6(P) ;SKIP RETURN
DMOVE P1,-5(P)
DMOVE P3,-3(P)
DMOVE P5,-1(P) ;RESTORE THEM ALL
ADJSP P,-6 ;FIX UP STACK
RET ;AND RETURN
.SAV3:: ;USED BY ACVAR FACILITY
SAVQ:: ADJSP P,3 ;NEED TO SAVE 3 REGS
DMOVEM Q1,-2(P) ;SAVE Q1 AND Q2
MOVEM Q3,0(P) ;SAVE Q3
PUSHJ P,0(CX) ;CONTINUE ROUTINE, EXIT VIA .+1
RESTQ:: SKIPA ;NON-SKIP RETURN
AOS -3(P) ;SKIP RETURN
DMOVE Q1,-2(P) ;RESTORE Q1 AND Q2
MOVE Q3,0(P) ;RESTORE Q3
ADJSP P,-3 ;CLEAN UP THE STACK
RET
IFN Q3+1-P1,<PRINTX ?SAVPQ REQUIRES P1 TO FOLLOW Q3>
SAVPQ:: ADJSP P,11 ;GET STACK SPACE
DMOVEM Q1,-10(P)
DMOVEM Q3,-6(P)
DMOVEM P2,-4(P)
DMOVEM P4,-2(P)
MOVEM P6,0(P)
PUSHJ P,0(CX) ;CONTINUE ROUTINE, RETURN VIA .+1
RESTPQ:: SKIPA ;NON-SKIP RETURN
AOS -11(P) ;SKIP RETURN
DMOVE Q1,-10(P)
DMOVE Q3,-6(P)
DMOVE P2,-4(P)
DMOVE P4,-2(P)
MOVE P6,0(P)
ADJSP P,-11 ;FIX UP STACK
RET
;SAVE/RESTORE TEMP ACS
SAVT:: ADJSP P,4 ;NEED FOUR LOCATION
DMOVEM T1,-3(P) ;SAVE T1 AND T2
DMOVEM T3,-1(P) ;SAVE T3 AND T4
PUSHJ P,0(CX) ;CONTINUE ROUTINE, RETURN VIA .+1
RESTT:: SKIPA ;NO-SKIP RETURN
AOS -4(P) ;PASS ALONG SKIP RETURN
DMOVE T1,-3(P) ;RESTORE T1 AND T2
DMOVE T3,-1(P) ;RESTORE T3 AND T4
ADJSP P,-4 ;CLEAN UP THE STACK
RET
;VARIOUS AC SAVE COMBINATION - INVOKED BY SAVEAC MACRO
.SAV24::PUSH P,T2
PUSH P,T3
PUSH P,T4
PUSHJ P,0(CX)
TRNA
AOS -3(P)
POP P,T4
POP P,T3
POP P,T2
RET
.SAV34::PUSH P,T3
PUSH P,T4
PUSHJ P,0(CX)
TRNA
AOS -2(P)
POP P,T4
POP P,T3
RET
.SAV44::PUSH P,T4
PUSHJ P,0(CX)
TRNA
AOS -1(P)
POP P,T4
RET
.SAV33::PUSH P,T3
PUSHJ P,0(CX)
TRNA
AOS -1(P)
POP P,T3
RET
.SAV22::PUSH P,T2
PUSHJ P,0(CX)
TRNA
AOS -1(P)
POP P,T2
RET
.SAV11::PUSH P,T1
PUSHJ P,0(CX)
TRNA
AOS -1(P)
POP P,T1
RET
.SAV12::PUSH P,T1
PUSH P,T2
PUSHJ P,0(CX)
TRNA
AOS -2(P)
POP P,T2
POP P,T1
RET
.SAV13::PUSH P,T1
PUSH P,T2
PUSH P,T3
PUSHJ P,0(CX)
TRNA
AOS -3(P)
POP P,T3
POP P,T2
POP P,T1
RET
;SUPPORT ROUTINES FOR AC VARIABLE FACILITY
.SAV1:: PUSH P,Q1
PUSHJ P,0(CX) ;CONTINUE PROGRAM
SKIPA
AOS -1(P)
POP P,Q1
POPJ P,
.SAV2:: ADJSP P,2 ;NEED TWO WORDS OF STACK
DMOVEM Q1,-1(P) ;SAVE REGS
PUSHJ P,0(CX)
SKIPA
AOS -2(P)
DMOVE Q1,-1(P) ;RESTORE REGS
ADJSP P,-2 ;CLEAN UP STACK
POPJ P,
.SAV4:: ADJSP P,4 ;NEED TO SAVE FOUR REGS
DMOVEM Q1,-3(P) ;SAVE Q1 AND Q2
DMOVEM Q1+2,-1(P) ;SAVE Q3 AND P1
PUSHJ P,0(CX)
SKIPA
AOS -4(P)
DMOVE Q1,-3(P) ;RESTORE Q1 AND Q2
DMOVE Q1+2,-1(P) ;RESTORE Q3 AND P1
ADJSP P,-4 ;CLEAN UP THE STACK
POPJ P,
.SAV8:: ADJSP P,10 ;NEED TO SAVE EIGHT REGS
DMOVEM Q1,-7(P)
DMOVEM Q1+2,-5(P)
DMOVEM Q1+4,-3(P)
DMOVEM Q1+6,-1(P)
PUSHJ P,0(CX)
SKIPA
AOS -10(P)
DMOVE Q1+6,-1(P)
DMOVE Q1+4,-3(P)
DMOVE Q1+2,-5(P)
DMOVE Q1,-7(P)
ADJSP P,-10 ;CLEAN UP THE STACK
POPJ P,
.SAVP1::PUSH P,P1 ; Save it on stack
CALL 0(CX) ; Call the routine
SKIPA ; +1 return
AOS -1(P) ; Add to return PC
POP P,P1 ; Restore old one
RET ; And return
SUBTTL System Initialization
;The following routines are executed during system initialization before
;paging has been turned on. Locations in the EPT and I/O page are referenced
;virtually even though their physical page numbers must be specified to the
;hardware. This is legal because, with paging off, virtual page n and physical
;page n are the same.
;PIRST - Clear PI system
;Invoked via XCT PIRST
IFN KLFLG,<
PIRST:: CONO PI,PICLPI
> ;END OF IFN KLFLG
IFN KCFLG,<
PIRST:: WRPI PICLPI
> ;END OF IFN KCFLG
;IORST - Reset I/O and put machine into a known state. Clear all flags that
;can cause errors. Turn off paging. Preserve the state of the cache as
;the front end set it. Set the current UPT to be the scheduler's UPT.
;NOTE: This routine does not change the page number of the EPT
IFN KLFLG,<
IORST:: JSP T1,IORST0 ;Done by XCT IORST only
IORST0: MOVEM T1,CONOPG ;SAVE AN AC
;Set up the standard word for CONO PAG. Preserve the state of the cache as
;it was set by the front end and preserve the current EPT. Turn off paging.
;Initialize CASHF to reflect the state of the cache (-1 means on, 0 means off)
CONI PAG,T1 ;READ THE CACHE BITS
ANDI T1,PGCLKE!PGCLDE!PGEBRM ;CLEAR ALL BUT CACHE & EBR
SETZM CASHF ;INITIALIZE CACHE FLAG
TRNE T1,PGCLKE!PGCLDE ;IS CACHE ON?
SETOM CASHF ;YES, REMEMBER THAT
EXCH T1,CONOPG ;SAVE THE PAGER CONO BITS
;Clear APR conditions, and issue IO reset.
CONO APR,APIOPR+APFCLR+APSBER+APNXM+APIOPF+APMPE+APAPE+APPWF+APSWPD
CONO PAG,@CONOPG ;CLEAR PAGING AND CACHE
;Tell hardware to use special UPT for now
DATAO PAG,KIPGW0 ;USE SCHED CONTEXT UPT
JRST 0(T1)
> ;END IFN KLFLG
IFN KCFLG,<
IORST:: JSP T1,IORST0
IORST0: MOVEM T1,CONOPG ;SAVE AN AC
SETZM CASHF ;PRETEND THAT CACHE IS ALWAYS OFF
;Set up the standard word for WREBR. Preserve the current EPT.
;Turn off paging by clearing PGENPG. Turn off trap processing by
;setting PGLTPE and clearing PGENTP.
RDEBR T1 ;GET CURRENT EPT BASE
ANDX T1,PGEBRM ;CLEAR PAGING BITS, KEEP EBR
TXO T1,PGLTPE ;LOAD TRAP ENABLE (TURN OFF TRAPS)
EXCH T1,CONOPG ;SAVE THE PAGER CONO BITS, RESTORE AC
;Clear APR conditions, and issue IO reset.
WRAPR APIOPR+APFCLR+APPWF+APCONS ;CLEAR ERROR CONDITIONS, RESET IO
WREBR CONOPG ;TURN OFF PAGING
;Tell hardware to use special UPT for now
WRCTX KIPGW0 ;USE SCHED CONTEXT UPT
JRST 0(T1)
> ;END IFN KCFLG
;* * * * *
;Need to define default port interrupt vector words
; * * * * *
;PAGRST - Called during system startup to initialize data for turning on
;paging. Paging is assumed to be turned off, and virtual-to-physical mapping
;is one-to-one.
IFN KLFLG,<
;Initialize standard word used in DATAO PAG. This will load the UBR
;to point to the scheduler's hardware page table.
PAGRST::
MOVEI T1,KIEPT/PGSIZ ;PAGE NUMBER OF EPT
DPB T1,[POINTR CONOPG,PGEBRM] ;STORE FOR PGRON/PGROFF
MOVE 1,KIPGW0
TXZ T1,PGNSAC ;STORE ACCOUNT DATA FROM NOW ON
MOVEM 1,KIPGWD ;SET UP FOR DATAO PAG
;Initialize the EPT by copying the prototype version. Initialize the
;scheduler's UPT by copying the prototype.
MOVE 1,[XWD IEPT0,EPTTPI]
BLT 1,EPTTPI+NIEPT-1
MOVE 1,[IUPT0,,SKHWPT+420]
BLT 1,SKHWPT+437 ;INIT SYSTEM HWPT
;Set the previous AC block to block 6. Use this to initialize SPT base
;register, CST base register, CST mask and data.
DATAO PAG,SETHWR ;SET TO REFERENCE HARDWARE RESERVED ACS
MOVEI T1,SPT ;DECLARE SPT BASE
UMOVEM T1,SPTBR ;(WORD IN RESERVED AC BLOCK)
MOVE T1,CSTLOC ;PHYSICAL LOC OF CST0
UMOVEM T1,CSTBR ;(WORD IN RESERVED AC BLOCK)
MOVX T1,XGAGE+CORMB+PSTFLD+CSWRB ;SET BITS TO BE PRESERVED ON PAGER REFILL
UMOVEM T1,CSTMSK ;(WORD IN RESERVED AC BLOCK)
MOVX T1,PSASM ;SET AGE TO ARBITRARY LEGAL VALUE
UMOVEM T1,CSTDAT ;(WORD IN RESERVED AC BLOCK)
DATAO PAG,SETMON ;SET TO MONITOR ACS
;Initialize new PC for page fail in the scheduler.
MOVE A,[KIPFS] ;SETUP PAGE FAIL DISPATCH
MOVEM A,UPTPFN-HWPTA+SKHWPT ;SETUP PAGE FAIL DISPATCH
;DDT works better if this is done. (Why? I dont know! But its the
; result of 4 days debugging of a problem....)
CONI PAG,T1 ;Read PAGER status
CONO PAG,(T1) ; and write it back resetting pager
RET
> ;END IFN KLFLG
IFN KCFLG,<
;Initialize standard word used in DATAO PAG. This will load the UBR to
;point to the scheduler's hardware page table.
PAGRST::
MOVEI T1,KIEPT/PGSIZ ;PAGE NUMBER OF EPT
DPB T1,[POINTR CONOPG,PGEBRM] ;STORE FOR PGRON/PGROFF
MOVE T1,KIPGW0
TXZ T1,PGNSAC ;UPDATE ACCOUNTS FROM NOW ON
MOVEM T1,KIPGWD ;SET UP FOR WRCTX
SETZM KIPGWD+1 ;NOT USED, BUT THIS SHOULD AVOID CONFUSION
;Initialize the EPT by copying the prototype version. Initialize the
;scheduler's UPT by copying the prototype.
MOVE T1,[XWD IEPT0,EPTTPI]
BLT T1,EPTTPI+NIEPT-1 ;INIT TRAP FUNCTION WORDS IN EPT
MOVE T1,[IUPT0,,SKHWPT+420] ;INIT TRAP FUNCTION WORDS AND MUUO
BLT T1,SKHWPT+420+NIUPT-1 ; BLOCKS IN UPT
;Initialize SPT base register, CST base register, CST mask and data.
MOVEI T1,SPT ;DECLARE SPT BASE
WRSPB T1
XMOVEI T1,@CST0X ;DECLARE CST BASE
WRCSB T1
MOVX T1,XGAGE+CORMB+PSTFLD+CSWRB ;SET BITS TO BE PRESERVED ON PAGER REFILL
WRCSTM T1
MOVX T1,PSASM ;SET AGE TO ARBITRARY LEGAL VALUE
WRPUR T1
;Initialize new PC for page fail in the scheduler.
MOVE T1,[KIPFS] ;SETUP PAGE FAIL DISPATCH
MOVEM T1,KCPFNP-HWPTA+SKHWPT ;SETUP PAGE FAIL DISPATCH
MOVX T1,MONENV ;NEW FLAGS WORD
MOVEM T1,KCPFNF-HWPTA+SKHWPT ;STORE IN THE UPT
;Set up standard word for WREBR to turn on KL paging and enable
;trap processing. Note that WREBR is not done here.
MOVX T1,PG20MD+PGENPG+PGENTP
IORM A,CONOPG ;USE KL MODE PAGING
RET
> ;END IFN KCFLG
;SETPFH - Set the page fault handler
;ACCEPTS:
; T1/ ADDRESS OF ROUTINE
; CALL SETPFH
;RETURNS +1: ALWAYS
;This routine is called from PGRINI to set the page fault handler address
;in the UPT. It assumes that the caller has done a WRUBR setting the
;scheduler's UPT (SKHWPT) to be the UPT. This stores the routine in the
;"new PC" word for page faults.
SETPFH::
IFN KLFLG,<
MOVEM T1,UPTPFN-HWPTA+SKHWPT
>
IFN KCFLG,<
MOVEM T1,KCPFNP-HWPTA+SKHWPT
>
RET
SUBTTL PI System Initialization
;Initialize nonvectored interrupt words in EPT for KL, or software-
;requested interrupts in the IOPAGE for KC
PVINIT::MOVSI T4,-NPISET
MOVEI T2,VECST ;POINT TO FIRST WORD IN I/O PAGE OR EPT
PIINI1: MOVE T1,PIVEC(T4) ;GET THE VECTOR WORD
MOVEM T1,0(T2) ;STORE IT IN I/O PAGE OR EPT
ADDI T2,VECINC ;INCREMENT TO NEXT LEVEL
AOBJN T4,PIINI1 ;LOOP THROUGH ALL WORDS
;Set up instructions for front end to execute on power failure and
;keep-alive cease
MOVE T1,[JRST PWRRST] ;INITIALIZE LOCATION EXECUTED BY FRONT END
MOVEM T1,PWRTRP ; ON POWER FAILURE
MOVE T1,[XPCW RLODPC] ;INITIALIZE LOCATION EXECUTED BY FRONT END
MOVEM T1,RLDADR ; ON KEEP-ALIVE CEASE
SETZM FEFLG ;FORCE SECONDARY PROTOCOL
;Set up for LUUO from EXEC section 0. This causes location 41 to be
;executed. This will lead to a BUGHLT.
MOVE T1,[XPCW LUUBLK] ;SET UP BUGHLT FOR LUUO'S
MOVEM T1,41
IFN KCFLG,<
;Initialize locations in the I/O page for APR interrupt and I/O page fail.
MOVE T2,[PIAPRX] ;GO TO PIAPR ON APR INTERRUPT
XMOVEI T1,KCIOPG ;POINT TO THE I/O PAGE
MOVEM T2,IOPAPR(T1) ;TELL HARDWARE WHERE XPCW BLOCK IS
MOVX T2,MONENV ;NEW FLAGS WORD
MOVE T3,[MSEC1,,APRFAT] ;GO HERE WHEN I/O PAGE FAIL OCCURS
DMOVEM T2,IOPNPC(T1) ;POINT TO IT FROM THE I/O PAGE
;Note: In theory this instruction is unnecessary. The console should initialize
;this value to page 1, which is what the monitor expects. For now we'll be
;paranoid and do it since we've just initialized the things that we need.
>; End of IFN KCFLG
RET
; Initialize the PI system. Turn on the meters, and start the system clock.
PSINIT::
IFN KLFLG,<
SKIPL PWRDWN ;DOING POWER-FAIL RESTART
CALL DTEINS ;START MONITOR IN SECONDARY PROTOCOL
CALL MEMLOK ;LOOKUP MEMORY TYPES
> ;END IFN KLFLG
IFN KCFLG,<
WRIOP KCIPHY ;SET THE PAGE NUMBER OF THE I/O PAGE
> ;END OF IFN KCFLG
;Initialize the clocks
CALL CLKINI ;INIT INTERVAL TIMER, ETC.
;Clear APR condition flags, turn on all interrupt levels and interrupt system,
;and enable interrupts for all conditions. On the KC, this is also the first
;time we have assigned the interrupt level.
IFN KLFLG,<
CONOAPR APFCLR+APSBER+APNXM+APIOPF+APMPE+APCDPE+APAPE+APPWF
CONO PI,PICHON+PIPION+PICHNM
CONOAPR APEINT+APSBER+APNXM+APIOPF+APMPE+APCDPE+APAPE+APPWF
> ;END IFN KLFLG
IFN KCFLG,<
WRAPR APFCLR+APPWF+APCONS
WRPI PICHON+PIPION+PICHNM
WRAPR APLDPI+APEINT+APPWF+APCONS+FLD(APRCHN,APPIA)
> ;END OF IFN KCFLG
RET
;Here when unexpected interrupt occurs. On KL, unvectored interrupt comes
;here. On KC, software-requested interrupt comes here.
;Level 0
PIERR0: PIOFF ;TURN OFF PIS
DMOVEM CX,PIXCX ;SAVE SOME ACS
MOVE P,[IOWD XPISK,PIXSTK] ;GET A STACK
BUG.(HLT,PI0ERR,APRSRV,HARD,<Unvectored interrupt on channel 0>,,<
Cause: The monitor has received an unvectored hardware interrupt on PI
channel 0. This is not supposed to happen. This could possibly
be faulty hardware generating incorrect PI requests.
>)
HALT . ;JUST IN CASE
;Level 1
PIERR1: PIOFF ;TURN OFF PIS
DMOVEM CX,PIXCX ;SAVE REGS
MOVE P,[IOWD XPISK,PIXSTK]
BUG.(CHK,PI1ERR,APRSRV,HARD,<Unexpected unvectored interrupt on channel 1>,,<
Cause: The monitor has received an unvectored hardware interrupt on PI
channel 1. Currently, there is no processing assigned to this
channel. This could possibly indicate faulty hardware that is
generating spurious PI requests.
>,,<DB%NND>) ;[7.1210]
CLSB 1 ;CLEAR THE INTERRUPT ON 1
DMOVE CX,PIXCX
PION
XJEN PI1ER ;DISMISS INTERRUPT AND RETURN
;Level 2
PIERR2: PIOFF ;TURN OFF PIS
DMOVEM CX,PIXCX
MOVE P,[IOWD XPISK,PIXSTK]
BUG.(CHK,PI2ERR,APRSRV,HARD,<Unexpected unvectored interrupt on channel 2>,,<
Cause: The monitor has received an unvectored hardware interrupt on PI
channel 2. Currently, there is no processing assigned to this
channel. This could possibly indicate faulty hardware that is
generating spurious PI requests.
>,,<DB%NND>) ;[7.1210]
CLSB 2 ;CLEAR THE INTERRUPT ON 2
DMOVE CX,PIXCX
PION
XJEN PI2ER ;DISMISS INTERRUPT AND RETURN
IFN KCFLG,<
;Level 3
PIERR3: PIOFF ;TURN OFF PIS
DMOVEM CX,PIXCX ;SAVE REGS
MOVE P,[IOWD XPISK,PIXSTK]
BUG.(CHK,PI3ERR,APRSRV,HARD,<Unexpected unvectored interrupt on channel 3>,,<
Cause: The monitor has received an unvectored hardware interrupt on PI
channel 3. Currently, there is no processing assigned to this
channel. This could possibly indicate faulty hardware that is
generating spurious PI requests.
>)
CLSB 3 ;CLEAR THE INTERRUPT ON 3
DMOVE CX,PIXCX
PION
XJEN PI3ER ;DISMISS INTERRUPT AND RETURN
> ;END OF IFN KCFLG
;Level 4
PIERR4: PIOFF
DMOVEM CX,PIXCX
MOVE P,[IOWD XPISK,PIXSTK]
BUG.(CHK,PI4ERR,APRSRV,HARD,<Unexpected unvectored interrupt on channel 4>,,<
Cause: The monitor has received an unvectored hardware interrupt on PI
channel 4. Currently, there is no processing assigned to this
channel. This could possibly indicate faulty hardware that is
generating spurious PI requests.
>,,<DB%NND>) ;[7.1210]
CLSB 4 ;CLEAR THE INTERRUPT ON 4
DMOVE CX,PIXCX
PION
XJEN PI4ER ;DISMISS INTERRUPT AND RETURN
;Here when monitor executes an LUUO in section 0.
;PIINIT makes 41 point to this XPCW block
LUUBUG: BUG.(HLT,LUUMN0,APRSRV,SOFT,<LUUO in monitor context>,,<
Cause: While running in section 0, the monitor has executed an LUUO.
The flags and PC are stored in LUUBLK and LUUBLK+1, respectively.
>)
;FIND MEMORY TYPES AND BUILD TABLE
IFN KLFLG,<
MEMLOK: MOVSI T1,-40 ;# OF CONTROLLERS
MEMLK1: MOVEI T2,1 ;FUNC 1
DPB T1,[POINT 5,T2,4] ;SET CONTROLLER NUMBER
SBDIAG T2 ;GET BOUNDS
LOAD T2,MEMTYP,T3 ;GET MEM TYPE
CAIE T2,MA20
CAIN T2,MB20
JRST MEMLK5 ;MA/MB HAVE UPPER LOWER BOUNDS
CAIN T2,MOS
JRST MEMLK6 ;MOS MUST BE POLLED
MEMLK4: AOBJN T1,MEMLK1 ;CHECK ALL CONTROLLERS
RET ;NOW, BIT OFF MEANS EXT OR NON-EX
MEMLK5: TRNN T3,ARQENB ;ANY REQUESTS ENABLED?
JRST MEMLK4 ;NO, SKIP THIS ONE
LDB T2,[POINT 8,T3,21] ;GET LOWER BOUND
LDB T3,[POINT 4,T3,25] ;GET UPPER BOUND
SUBI T3,(T2)
ANDI T3,17 ;GET NUMBER OF HUNKS - 1
MOVNI T3,1(T3) ;MAKE IT - NUMBER OF HUNKS
HRL T2,T3 ;MAKE AOBJN POINTER
MEMLK2: HRRZ T3,T2 ;HUNK # IN T3
CALL STHUNK
AOBJN T2,MEMLK2 ;NEXT HUNK
JRST MEMLK4
MEMLK6: TXNE T3,MOSDBL ;DISABLED?
JRST MEMLK4 ;YES, SKIP IT
MOVEI T2,12 ;FUNC 12
DPB T1,[POINT 5,T2,4] ;SET CONTROLLER NUMBER
MEMLK7: SBDIAG T2
TXNE T3,MFBXDS ;DESELECTED?
JRST MEMLK8 ;YES, SKIP
LDB T3,[POINT 8,T2,27] ;GET BOX #
CALL STHUNK ;SET BIT FOR HUNK
MEMLK8: ADDI T2,1B27 ;INC BOX #
TXNN T2,1B19 ;OVERFLOWED?
JRST MEMLK7 ;NO, KEEP GOING
JRST MEMLK4
;CALL WITH 16K HUNK # IN T3
STHUNK: CAIL T3,NMD16K ;LEGAL HUNK?
RET
IDIVI T3,^D36 ;GET WORD AND BIT #
MOVE T4,BITS(T4) ;GET BIT
IORM T4,MEMTAB(T3) ;AND LIGHT IT
RET
> ;END IFN KLFLG
;RESTORE APR PI ASSIGNMENT
SETPPI::CONOAPR 0
SUBTTL APR Interrupt Service
IFN KCFLG,<
;Here when the hardware generates an APR interrupt. The I/O page points to a
;4-word block at PIAPRX, which contains this location as the new PC. It also
;selects a special AC block for APR interrupts. Thus no AC-saving is required.
PIAPR: MOVE P,[IOWD APRSIZ,APRSTK] ;LOCAL STACK
SZAPR APPWF ;IS IT A POWER FAILURE?
JRST [ WRAPR APDINT+APPWF ;YES. DISABLE FURTHER INTERRUPTS ON THIS CONDITION
AOS PWRDWN ;SIGNAL THIS TO SCHED
AOS SKEDF3 ;GET SCHEDULER TO RUN
ISB SCDCHN ;ISSUE CHANNEL 7 INTERRUPT
JRST PIAP5] ;DISMISS THE INTERRUPT
SZAPR APCONS ;CONSOLE DID SOMETHING?
CALL [ WRAPR APFCLR+APCONS ;CLEAR CONDITION
CALL CNINTC ;GO DO THE PROCESSING.
JRST PIAP5]
;Here when an APR interrupt occurred but there's no condition bit set in the
;APR word. Record this and dismiss the interrupt.
BUG.(CHK,SPUAPR,APRSRV,HARD,<SPURIOUS APR INTERRUPT>,,<
Cause: An APR interrupt occurred but no condition bit was set.
>)
PIAP5: XJEN PIAPRX ;DISMISS THE INTERRUPT
> ;END OF IFN KCFLG
;What happens on a power failure:
;APR interrupt leads to PIAPR. PIAPR AOS's PWRDWN, which was initialized to 0,
;and signals the scheduler to run. SPWFFL is set to zero assuming that the
;power fail is a real one.
;Scheduler goes to SCHPRF, which dismisses the running fork and executes any
;special code pointed to by PWRFLE. It JRST's to SCHPF0 in APRSRV.
;SCHPF0 SETOM's PWRDWN and waits in a loop for power to go away. If it is a
;real power fail, the front end will start the monitor at location 70 before
;the loop is done. However, if it is spurious, the loop will complete, a
;SPWRFL BUGCHK is issued, SPWFFL is set to -1 to indicate spurious, and the
;system is restarted at SYSRST.
;After the failure, the front end starts the monitor at location 70, which
;contains JRST PWRRST.
;At PWRRST, the following conditions are possible:
; PWRDWN/ 0 -- we never saw the interrupt - PWRFL BUGHLT
; PWRDWN .GT. 0 -- we didn't have time to finish shutting down - PWRFL
; PWRDWN/ -1 -- we finished shutting down in time - restart at PWRRS1
;Here on APR interrupt.
IFN KLFLG,<
PIAPR: DATAI PAG,MEMPDP ;SAVE STATE
DATAO PAG,SETAPI ;SET APR STATE
CONSZ APR,APPWF ;POWER FAIL?
JRST [ CONOAPR APDINT+APPWF ;YES, DISABLE FLAG
AOS PWRDWN ;NOTIFY SCHED, ETC.
SETZM SPWFFL ;Assume it is not spurious
AOS SKEDF3 ;SIGNAL SCHEDULER
ISB SCDCHN ; ""
JRST OV0] ;DEBREAK
; MOVEI P,^D10000
; SOJG P,. ;WAIT FOR CONDITIONS TO SETTLE
MOVE P,[IOWD NMEMPP,MEMPP] ;GET A STACK FOR STATUS BLOCK
MOVEI T1,APRBUG-BUGBUG ;GET TYPE OF ERROR
CALL GENBLK ;DO ERROR REPORTING IF ENABLED
;Get the APR conditions and transfer according to them.
CONI APR,A ;GET CONI BITS FOR POSSIBLE BUGHLT
CONSZ APR,APIOPF ;IO PAGE FAIL?
JRST APRIOP ;GO SEE ABOUT THE PAGE FAIL
CONSZ APR,APAPE ;ADDRESS PARITY ERROR?
JRST ADRPER ;YES. GO DO IT
CONSZ APR,APNXM ;NXM?
JRST P1NXM ;YES
CLSB APRCHN ;CLEAR SOFTWARE REQUEST IF ANY
CONSZ APR,APSBER ;SBUS ERROR?
JRST SBSERR ;YES. GO POLL SBUS CONTROLLERS
SKIPN DEVMPE ;DEVICE MPE REQUEST?
CONSZ APR,APMPE ;MEM PAR ERROR?
JRST MEMPAR ;YES. MEMORY SCAN
CONSZ APR,APCDPE ;CACHE DIR PARITY ERROR?
BUG.(HLT,FATCDP,APRSRV,HARD,<Fatal cache directory parity error>,<<A,CONIAP>>,<
Cause: An APR interrupt occurred because a physical page number with
even parity was encountered in the cache directory.
Data: CONIAP - Result of CONI APR
>)
JRST OV0 ;GO DEBREAK
;P1NXM - Here on NXM (APNXM set in CONI word)
P1NXM: PIOFF ;OWN THE MACHINE
MOVE P,[IOWD NMEMPP,MEMPP] ;SET UP A STACK
MOVEI T1,[SIXBIT '$$NXM DETECTED BY /']
CALL APRCMN ;DO COMMON STUFF
PION ;AND RESTORE MACHINE
BUG.(HLT,APRNX1,APRSRV,HARD,<NXM detected by APR>,,<
Cause: An APR interrupt occurred because the processor attempted to
access a memory that did not respond within a preset time. This
can indicate broken hardware or a software bug. The monitor
has printed a description of the problem on the CTY.
Action: The analysis of this BUGHLT is extremely complicated.
The physical address from the error register is printed on the
CTY ("ERA="). If there is physical memory at this address, the
problem is probably in the hardware. If the address does not
exist, the problem may be in either hardware or software.
One software problem that has led to this BUGHLT in the past
is code that returns an SPT slot to the free pool while leaving
a pointer to that slot in some page table. The content of
the SPT entry, instead of being a pointer to memory, is a
pointer to another SPT slot.
In this case, a page fault will have occurred just before the
interrupt. The PC will point into the page fault handler. The page
fault word and PC (TRAPSW and TRAPPC, respectively) will
indicate the virtual address and instruction at the time of
the page fault. Tracing this virtual address to the SPT will
produce the erroneous SPT entry.
Note, however, that this BUGHLT is rarely caused by software
in the field. The hardware is probably broken.
>) ;CAUSE A BUGHLT
CONOAPR APFCLR+APSBER+APMPE ;CLEAR SUPRIOUS PARITY ERROR INDICATIONS
CLNXMF ;CLEAR FLAG
JRST OV0
;COMMON PROCESSING FOR NXM AND ADDRESS PARITY ERROR
; CALL APRCMN
;RETURNS +1: ALWAYS
APRCMN: JSR BUGMON ;ENTER SECONDARY PROTOCOL
JSR BUGMSG
RDERA T2 ;GET THE ERA
MOVEI T1,[SIXBIT 'APR/'] ;ASSUME APR DETECTED ERROR
TXNE T2,ER%CHN ;CHANNEL DETECTED?
MOVEI T1,[SIXBIT 'CHANNEL/'] ;YES
JSR BUGMSG ;SAY SO
MOVEI T1,[SIXBIT ', ERA= /']
JSR BUGMSG ;NEED TO OUPTUT THE ERA
RDERA T1 ;GET THE ERA
CALL BUGWPT ;OUTPUT IT
MOVEI T3,PI%SBA+MPISEB
MOVEI T2,PI%MXS ;MAX SPACE FOR DATA
CALL RDDIAG ;READ SBUS DIAGS
HLL T1,T3 ;GET COUNT
HRRI T1,PI%SBA+MPISEB ;WHERE THEY ARE
CALL PRISBS ;TYPE THEM OUT
JSR BUGPRI ;RESTORE INCOMING PROTOCOL
RET ;AND RETURN
;ADRPER - Address parity error (APAPE was on in CONI word)
ADRPER: PIOFF ;OWN MACHINE
MOVE P,[IOWD NMEMPP,MEMPP] ;GET A STACK
MOVEI T1,[SIXBIT '$$ADDRESS PARITY ERROR DETECTED BY /']
CALL APRCMN ;DO COMMON CODE
PION ;RESTORE MACHINE
BUG.(HLT,APRAPE,APRSRV,HARD,<Address parity error>,,<
Cause: An APR interrupt occurred because a memory controller
signaled that it received an address with even parity
from the processor. There is a description of the problem
on the CTY.
Action: Using SBUS diag 0 for all memory controllers, check the
address parity error bit(s). Test the bus and controller.
>)
CONOAPR APFCLR+APAPE+APSBER ;CLEAR ERROOR
CLNXMF ;CLEAR NXM INDICATORS
JRST OV0 ;AND TRY AGAIN
> ;END IFN KLFLG
IFN SMFLG,<
PIAPR: XWD PIAPRX,.+1
CONSZ APR,APTMR ;TIMER REQUEST?
JRST TIMIN0 ;YES -- GO DO TIMER
CONSZ APR,APINK ;CTY INTERRUPT?
JRST [ ISB DLSCHN ;REQUEST TERMINAL INTERRUPT
CONO APR,APFCLR+APINK+APRCHN ;CLEAR INTERRUPTING FLAG
XJEN PIAPRX] ;EXIT
CONSZ APR,APPWF ;POWER FAIL?
JRST [ CONO APR,APDINT+APPWF ;YES, DISABLE FLAG
AOS PWRDWN ;NOTIFY SCHED, ETC.
CHKINT
XJEN PIAPRX] ;DEBREAK
CONSZ APR,APNXM ;NXM?
JRST P1NXM ;YES
CLSB APRCHN ;CLEAR SOFTWARE REQUEST IF ANY
XJEN PIAPRX ;RETURN
P1NXM: BUG(APRNX1)
CONOAPR APFCLR+APHMP+APSMP ;CLEAR SUPRIOUS PARITY ERROR
CLNXMF ;CLEAR FLAG
XJEN PIAPRX
> ;END IFN SMFLG
;EXIT FROM APR PI SERVICE
OV0: DATAO PAG,MEMPDP ;RESTORE ACS
XJEN PIAPRX ;Dismiss the interrupt
;FINAL PHASE OF POWERDOWN SEQUENCE, ENTERED FROM SCHED
;THIS WILL LOOP IN THE ACS UNTIL POWER ACTUALLY VANISHES.
;IF THE POWER FAIL INTERRUPT WAS SPURIOUS, THE LOOP WILL TIME OUT
;AFTER A FEW SECONDS AND THE SYSTEM WILL BE CONTINUED.
SCHPF0::PIOFF ;QUIET DOWN MACHINE
SETOM PWRDWN ;SAYS WE FINISHED PWR DWN SEQUENCE
DMOVE Q1,[SOJG T1,Q1 ;PUT COUNT LOOP IN ACS
JRST SCHPR2]
MOVX T1,^D5000000 ;INIT COUNT. DEPENDING ON MACHINE
JRST Q1 ; SPEED, THIS WILL TAKE FROM 1 TO 20 SECS
;Timed out. BUGCHK and go restart as if front end had restarted us.
SCHPR2: XCT KEPALV ;Update keep alive counter
BUG.(CHK,SPWRFL,APRSRV,HARD,<Spurious power fail indication>,,<
Cause: A power-fail indication was given and the monitor has
executed its sequence for an orderly power-down. The machine
is still running after a long delay, so the monitor has
declared the power-fail warning to be a mistake. The system
will restart as if power had failed.
>,,<DB%NND>) ;[7.1210]
SETOM SPWFFL ;Indicate that it was spurious
JRST SYSRST ;GO RESTART IMMEDIATELY
;I/O PAGE FAIL DETECTED. IF ON A KL10, SEE IF IT WAS CAUSED BY
;A MISCREANT FE
IFN KLFLG,< ;IF THE KL
;Note Well....As of KL microcode version 275
;
; IO Page Fails now return the IOP word in AC block 7 AC 2.
; The IOP word will also be in UPTPFW. If the IOPGF should
; happen during the initial code of page fault handling before
; UPTPFW is saved in a permanent location then the monitor will get very
; confused.
IOPDEV==17B10 ;DEVICE FIELD IN IOP WORD
IODTE0==10 ;CODE FOR DTE0
IODTE3==13 ;CODE FOR DTE3
IODIA==17 ;IO BUS
APRIOP: PIOFF ;PREVENT INTS
JSR BUGMON ;GET IN SECONDARY PROTOCOL
MOVE P,[IOWD NMEMPP,MEMPP] ;BORROW PAR ERROR STACK
UMOVE Q1,BK7IOP ;GET THE IOP WORD
MOVEI T1,[SIXBIT "$$IO PAGE FAIL, IOP= /"]
JSR BUGMSG ;TELL CTY
MOVE T1,Q1
CALL BUGWPT ;AND OUTPUT THE IOP
MOVEI T1,[SIXBIT "$$/"]
JSR BUGMSG ;MAKE IT PRETTY
LOAD T1,IOPDEV,Q1 ;GET DEVICE CODE
CAIL T1,IODTE0 ;CHECK FOR A DTE
CAILE T1,IODTE3 ;IS IT?
IFSKP. ;IF SKIP, IT IS
SUBI T1,IODTE0 ;COMPUTE DEVICE NUMBER
CAMN T1,MSTRDT ;IS THIS THE MASTER?
JRST APRFAT ;YES. CAN'T SHUT IT OFF
CALL DTEIOP ;SHUT OFF THE DTE
ELSE.
CAIE T1,IODIA ;IS THE DEVICE ON THE IOBUS?
JRST APRFAT ;NO
LOAD T1,VPGNO,Q1 ;GET VIRTUAL PAGE ADDRESS
CALL IMPFPF ;SEE IF AN20 DID IT
JRST APRFAT ;NO. CAN'T RECOVER THEN
ENDIF.
APRIO0: JSR BUGPRI ;ENTER PRIMARY PROTOCOL
; MOVEI T1,IOBUG-BUGBUG ;INDEX TO PROPER MESSAGE
; CALL GENBLK ;REPORT THE PROBLEM
CONOAPR APFCLR+APIOPF ;TURN OFF THE INDICATOR
PION ;TURN ON INTS
JRST OV0 ;AND LET IT GO
> ;END OF IFN KLFLG
;Could not find the reason for the IO page fail, or the condition
;was caused by something we can't proceed without having.
APRFAT: BUG.(HLT,IOPGF,APRSRV,SOFT,<IO page fail>,<<Q1,IOP>>,<
Cause: An APR interrupt occurred because an interrupt instruction caused
a page failure. This probably indicates that the interrupt instruction
provided by the monitor referenced a page that was not in memory.
The monitor has already checked for a DTE that made the reference
and found none. (However, it is possible for a software bug
to cause a DTE to generate an I/O page fail that the monitor
cannot detect.) The monitor has printed a description of the problem
on the CTY.
Data: IOP - IOP word
>)
;BUGHLT GOTTEN TO BY AN XCT 71 DONE BY THE FE (OR THE OPERATOR)
;ON A KEEP ALIVE CEASED. THE PC IS IN RLODPC AND RLODPC+1
RLDHLT::BUG.(HLT,KPALVH,APRSRV,SOFT,<Keep alive ceased>,,<
Cause: The immediate cause of this BUGHLT is the execution of
location 71. The front end does this if the monitor has
not updated its keep-alive counter recently. This usually
indicates that the monitor is looping and preventing the
scheduler from running. This can be due to a software
bug or hardware that interrupts abnormally frequently.
This BUGHLT can be caused manually by requesting the
front end to jump to location 71.
Action: Look at the CTY output to see which case occurred. Look at
the PC to see where the monitor was running. If the crash was
done manually, the PC will contain 72.
>)
;ROUTINE USED BY PHYSIO TO OUTPUT RH20/CHANNEL MEMORY
;ERROR INFORMATION
; T1/ CHANNEL NUMBER
; T2/ LOGOUT STATUS WORD
; T3/ UPDATED CCW
;STACK MUST BE SET UP
;REGRETTABLY CLOBBERS T1-T4
IFN KLFLG,< ;ONLY NEEDED FOR THE KL
APRRPT::SAVEQ
DMOVE Q1,T1 ;SAVE ARGS
MOVE Q3,T3 ;SAVE ALL OF THEM
PIOFF ;OWN MACHINE
JSR BUGMON ;REALLY OWN IT
MOVEI T1,[SIXBIT '$$RH20 OR CHANNEL DETECTED MEMORY ERROR$CHANNEL /']
JSR BUGMSG ;DO THE MESSAGE
MOVE T1,Q1 ;GET CHANNEL #
CALL BUGOPT ;PRINT IT
MOVEI T1,[SIXBIT '$CHANNEL STATUS WORD /']
JSR BUGMSG
MOVE T1,Q2 ;GET WORD
CALL BUGWPT ;TYPE IT
MOVEI T1,[SIXBIT '$FINAL CCW /']
JSR BUGMSG
MOVE T1,Q3 ;GET FINAL CCW
CALL BUGWPT
MOVEI T1,[SIXBIT '$$/']
JSR BUGMSG ;MAKE OUTPUT PRETTY
JSR BUGPRI ;TURN ON FE
PION ;TURN ON PIS
RET ;AND DONE
> ;END OF IFN KLFLG
;DUMMY ROUTINES FOR HARD PAGE FAILS
IFN KCFLG,<
MASBGX==:0 ;DUMMY VALUE TO KEEP PHYSIO HAPPY
MEMPAR::JRST OV0
DEQERR::
MOSULE::
MEMSTR::
RET
MEMSCN::RETSKP
GENGEN::
UNGEN::
GENBLK::
APRRPT::RET
> ;END OF IFN KCFLG
SUBTTL Memory Parity Error routines (KL only)
IFN KLFLG,<
;MEMPAR - MEMORY PARITY ERROR DETECTED
;Here when APR interrupt occurs with bit 27 (MB parity error) set or
;when APR interrupt occurs with bit 24 (SBUS error) set but no MOS
;controller reports a correctable error
MEMPAR::PIOFF
MOVE P,[IOWD NMEMPP,MEMPP]
CONSO APR,APMPE ;MB PARITY ERROR?
JRST MEMPRX ;NO
RDERA T1 ;GET ERROR INFORMATION
TXC T1,ER%CHN!ER%WRT ;SEE IF "CHANNEL WRITE" ERROR
TXNE T1,ER%CHN!ER%WRT ;IS IT?
JRST MEMPRX ;NO. DO NORMAL PROCESSING
;A CHANNEL WRITE PARITY ERROR HAPPENED. GATHER INFORMATION
LDB T2,[POINT 2,T1,1] ;GET WORD OFFSET
ANDX T1,<PHCPNO!PGWD> ;GET PHYSICAL ADDRESS
IORI T1,0(T2) ;PUT IN WORD OFFSET
SKIPN T2,WREQ ;ANY QUEUED ENTRIES?
JRST MEMRXX ;NO
MEMRX0: CAMN T1,1(T2) ;ALREADY QUEUE?
JRST NOBLK0 ;YEP
MOVE T2,0(T2) ;GET NEXT
JUMPN T2,MEMRX0
MEMRXX: PUSH P,T1 ;SAVE ERA
MOVX T1,<.RESP1,,3>
MOVX T2,RS%SE0!.RESGP ;FROM GENERAL POOL, SECTION 0
CALL ASGRES ;GET SOME SPACE
JRST [ MOVEI T1,[SIXBIT '$?No free space for channel error$/']
CALL MEMOUT
JRST MEMNBK]
POP P,1(T1) ;SAVE ERROR ADDRESS
MOVE T2,TODCLK ;TIME
MOVEM T2,2(T1) ;TIME STAMP
EXCH T1,WREQ ;ENQUEUE IT
MOVEM T1,@WREQ ;""
;ADDRESS IS QUEUED ON THE ERROR QUEUE AND ACCOUNTED FOR
MEMNBK: MOVEI Q3,MPISEB ;BLOCK TO STORE ERROR INFORMATION
CALL PARGER ;GET ERROR STUFF INTO BLOCK
MOVEI P1,0(T1) ;SAVE COUNT
ADDI T1,PI%SZ2 ;COMPUTE WORDS TO PUT IN SYSERR
MOVE T2,T1 ;COPY WORD COUNT
CALL ALCSEB ;GET SYSERR BLOCK
JRST [ MOVEI T1,[SIXBIT '$? No SYSERR block on channel error$/']
CALL MEMOUT
JRST NOBLK0]
PUSH P,T1 ;SAVE BLOCK ADDRESS
ADDI P1,SEBDAT+PI%SZ2-1(T1) ;WORDS TO MOVE
MOVEI T1,SEBDAT(T1) ;START OF DEST.
HRL T1,Q3
BLT T1,0(P1) ;COPY DATA
MOVE T1,0(P)
MOVE T2,[-NMEMPT,,MEMPT]
CALL SEBCPY ;FINISH OFF DATA COPYING
NOP
POP P,T1
CALL QUESEB ;AND QUEUE IT
NOBLK0: CONOAPR APFCLR+APMPE ;CLEAR CONDITION
CONSO APR,APSBER ;SBUS ERROR PENDING?
CALL UNLCON ;NO
NOBLKS: PION ;AND PIS
JRST OV0 ;AND DONE
;Routine to output a message in secondary protocol
MEMOUT: ASUBR <ERRSTR>
JSR BUGMON ;STOP MACHINE
MOVE T1,ERRSTR
JSR BUGMSG ;DO MESSAGE
JSR BUGPRI ;BACK TO PRIMARY
RET ;AND DONE
;NOT A CHANNEL WRITE PARITY ERROR. DO NORMAL PROCESSING
MEMPRX: EA.ENT ;RUN IN SECTION 1
MOVE T1,MPITIM ;GET TIME OF LAST ERROR
ADDI T1,^D5000 ;PROJECT INTO THE FUTURE
CAMLE T1,TODCLK ;WITHIN 5 SECS OF LAST ERROR?
JRST [ CLRMPE ;YES. SKIP THIS ONE
JRST NOBLKS] ;DONE
SETZM MEMPFF ;CLEAR FATAL ERROR FLAG
PUSH P,UPTPFO ;SAVE PAGE TRAP VARIABLES
PUSH P,UPTPFL
PUSH P,UPTPFN
PUSH P,UPTPFW
XPSHUM [PUSH P,BK7PFD] ;SAVE BAD DATA WORD AS WELL
MOVEI T1,MEMPTP ;SETUP LOCAL TRAP ROUTINE
MOVEM T1,UPTPFN
MOVEI Q3,MPISEB ;SETUP BLOCK TO RECEIVE SYSERR INFO
CALL PARGER
MOVE P1,T1 ;SAVE COUNT
CONSO APR,APMPE ;AN MB PARITY ERROR?
AOS MEMPFF ;NO. REMEMBER THIS
MEMPR0: CONOAPR APFCLR+APMPE ;CLEAR CONDITION
; ..
;MEMORY SCAN LOOP. THIS IS EXECUTED ONLY FOR MB PARITY ERRORS DETECTED
;BY THE APR OR BY A CHANNEL READ. THE PAGE CONTAINING THE BAD
;ADDRESS (FROM THE ERA) IS SCANNED FOR ERRORS.
; ..
LOAD P2,PHCPNO,PI%ER2(Q3); GET ERROR PAGE
LOAD T1,CSTAGE,+P2 ;GET AGE OF THIS PAGE
LOAD T2,CSTPST,+P2 ;GET STATE
CAIE T1,PSSPQ ;ON SPECIAL MEM QUEUE?
CAIN T2,PSTERR ;NO. ALREADY HAVE AN ERROR?
JRST MEMP45 ;YES. NO SCAN THEN
MOVE T1,CONOPG
TXZ T1,PGCLDE ;TURN CACHE LOAD OFF
CONO PAG,0(T1)
MOVSI Q1,-PGSIZ ;LOOP COUNTER
PUSH P,@CST0X+P2 ;SAVE CST0 FOR THIS PAGE
MOVX T2,<PSASM+CSWRB> ;SET CST0 TO ALLOW ACCESS TO PAGE
IORM T2,@CST0X+P2
MOVE T1,P2
CALL MAPRCA
MOVE T4,T1 ;SAVE VIRT ADR WHERE MAPPED
HRLI T4,T3 ;MAKE IT INDEXED BY T3
MEMP3: CALL MEMPXX ;DO THE REFERENCE
CONSZ APR,APNXM ;NXM?
JRST MEMP44 ;YES. DONE THEN
CONSZ APR,APMPE+APSBER ;MPE IN THIS LOCATION?
JRST MEMP1 ;YES, GO REPORT IT
MEMP4: AOBJN Q1,MEMP3 ;DO NEXT LOCATION
MEMP44: POP P,@CST0X+P2 ;RESTORE CST0
CONO PAG,@CONOPG ;RESTORE CACHE STATE
; ..
; ..
MEMP45: CONSO APR,APSBER ;SBUS ERROR PENDING?
CALL UNLCON ;NO. CLEAR CONTROLLERS THEN
MOVEI T1,PI%SZ2
MOVE T2,P1 ;WORDS USED IN SBDIAGS
ADDB T1,T2 ;COMPUTE WORDS NEEDED
CALL ALCSEB ;ALLOCATE SYSERR DATA BLOCK
JRST [ MOVEI 1,[SIXBIT '?NO SYSERR BUFFER FOR MB PARITY ERROR$$/']
CALL MEMOUT
JRST MEMP10] ;SKIP SYSERR STUFF
MOVEM T1,Q1 ;SAVE SYSERR BUFFER ADDRESS
MOVE T2,P1 ;WORDS USED IN SBDIAGS
ADDI T2,SEBDAT+PI%SZ2-1(T1) ;COMPUTE END OF DATA
MOVEI T1,SEBDAT(Q1)
HRL T1,Q3 ;COPY DATA INTO SYSERR BUFFER
BLT T1,0(T2)
;Copy data to the buffer, and arrange to have MEMPJ0 run from job 0
MOVE T1,Q1
MOVE T2,[-NMEMPT,,MEMPT]
CALL SEBCPY ;INCLUDE EVENT CODE
JFCL
MOVE T1,Q1
CALL QUESEB ;QUEUE SYSERR BLOCK
MEMP10:
XPOPMU [POP P,BK7PFD] ;RESTORE BAD DATA WORD
POP P,UPTPFW ;RESTORE PAGE TRAP VARIABLES
POP P,UPTPFN
POP P,UPTPFL
POP P,UPTPFO
; ..
;ALL DONE. RESTORE PROPER PROTCOLS
; MOVEI T1,MBBUG-BUGBUG ;INDEX TO PROPER MESSAGE
; CALL GENBLK ;REPORT STATUS
CALL UPDTCK ;UPDATE TODCLK NOW
PION
; BUG(MPEDEV)
SKIPE MEMPFF ;FATAL ERRORS FOUND?
JRST MEMP8 ;YES
SETZM DEVMPE
MOVE T1,TODCLK ;GET NOW
MOVEM T1,MPITIM ;SET TIME OF MP INTERRUPT
JRST OV0 ;CONTINUE RUNNING
MEMP8: BUG.(HLT,FATMER,APRSRV,HARD,<Fatal memory error>,,<
Cause: An APR interrupt occurred indicating an SBUS error and no
MB parity error. However, no MOS controller reports an error.
The monitor is unable to determine the cause of the SBUS error.
The monitor has printed a description of the problem on the CTY.
Action: Diagnose the memory system.
>)
MEMPT: SEBPTR 0,SBTEVC,SEC%P1 ;EVENT CODE
SEBPTR 0,SBTFNA,MEMPJ0 ;joB 0 CLEANUP ROUTINE
NMEMPT==.-MEMPT
;TEST REFERENCE TO CHECK FOR PARITY ERROR
MEMPXX: LOAD T3,PGWD,Q1 ;GET WORD WITHIN CURRENT PAGE
MEMPXY: MOVE T1,@T4
RET
;LOCAL PAGE TRAP ROUTINE. WE EXPECT TO COME HERE WHEN A REFERENCE GENERATES
;AN ERROR DURING THE MEMORY SCAN. PC SHOULD POINT TO MEMPXY.
;IF NOT, SOME OTHER ERROR OCCURRED.
MEMPTP: HRRZ T1,UPTPFO ;CHECK PC OF TRAP
CAIE T1,MEMPXY ;FROM EXPECTED PLACE?
CALL MEMXXX
CONOAPR APFSET+APMPE ;make damn sure bit is set
AOS UPTPFO ;SIMULATE COMPLETION OF INSTRUCTION
UMOVE T1,BK7PFD ;GET BAD DATA FROM AC BLOCK 7
XJRSTF UPTPFL ;UNTRAP
;Common error place for unexpected page fault. To figure out which
;page fault routine was working, look at UPTPFN!!!
MEMXXX:BUG.(HLT,UNPGF1,APRSRV,HARD,<MEMPAR - Parity error during mem scan>,,<
Cause: A page fault occurred while the monitor was scanning memory
looking for an MB parity error. The monitor expects to cause
such a fault when it references the bad word in memory. However,
the PC indicates that the error occurred somewhere other than
in the instruction that is expected to fail. The monitor has printed
a description of the problem on the CTY. A SYSERR block has been
created and will be placed in the SYSERR file when the monitor is
rebooted. If the memory scan has detected any errors, the monitor has
printed a description of them on the CTY, too.
>) ;ERROR!
;FOUND MEM PAR ERR ON DIRECT REFERENCE
; T4/ 3,,ADDRESS
MEMP1:
PUSH P,T4 ;SAVE MAP ADDRESS
CONOAPR APFCLR+APMPE ;CLEAR APR PE BITS
MOVE T4,P2 ;GET PAGE NUMBER
LSH T4,PGSFT ;MAKE IT AN ADDRESS
ADDI T4,0(Q1) ;AND WITH THE RIGHT WORD
ANDM T1,PI%AD2(Q3) ;COMPUTE LOGICAL AND/OR OF DATA AND ADR
IORM T1,PI%OD2(Q3)
ANDM T4,PI%AA2(Q3)
IORM T4,PI%OR2(Q3)
MOVE Q2,PI%ERC(Q3) ;GET ERROR COUNT
AOS PI%ERC(Q3) ;BUMP IT
CAIL Q2,PI%NB2 ;REPORTED MAX NUMBER ERRORS?
JRST MPEX1 ;YES, DON'T REPORT THIS ONE
ADD Q2,Q3 ;OFFSET TO SYSERR BLOCK
MOVEM T1,PI%DA2(Q2) ;SAVE DATA
MOVEM T4,PI%BAD(Q2) ;SAVE ADDRESS
LOAD T1,PHCPNO,T4 ;GET PAGE NUMBER
CCHUO 0(T1) ;UNLOAD CACHE FOR PAGE
CONSO APR,APSWPD ;WAIT FOR COMPLETION
JRST .-1
CONOAPR APFCLR+APSWPD+APMPE
CALL MEMPXX ;TRY REFERENCE WITHOUT CACHE
CONSZ APR,APMPE+APSBER ;ERROR?
JRST [ SETONE PI%FAT,PI%BAD(Q2) ;YES. MARK HARD ERROR THEN
JRST MEMP11] ;AND PROCEED
MOVEM T1,PI%MDA(Q2) ;NO, SAVE DATA
MEMP11: CONOAPR APFCLR+APMPE ;CLEAR CONDITION
;END NOCACHE TEST
MPEX1:
POP P,T4 ;RESTORE ADDRESS
JRST MEMP4 ;CONTINUE CORE SCAN
;common code to setup SYSERR block and gather processor info
;Entered with Q3/Pointer to SYSERR block
;returns +1 T1/ count of words used
PARGER: CONI APR,PI%CN2(Q3) ;GATHER ERROR INFO, CONI...
CONSZ APR,APMPE ;MB PARITY ERROR?
RDERA PI%ER2(Q3) ; ...ERA...
DMOVE T1,PIAPRX ; ...PC...
MOVEM T1,PI%FL2(Q3) ;STORE FLAGS
MOVEM T2,PI%PC2(Q3) ;STORE PC
SETZM PI%ERC(Q3) ;INIT ERROR COUNT
SETZM PI%OR2(Q3) ;INIT LOGICAL AND/OR WORDS
SETZM PI%OD2(Q3)
SETOM PI%AA2(Q3)
SETOM PI%AD2(Q3)
;READ SBUS DIAG INFO FOR ALL CONTROLLERS
MOVEI T1,PI%DA2(Q3) ;BAD ADDRESS BLOCK
HRLI T1,-PI%NB2 ;# OF ENTRIES
SETZM 0(T1)
AOBJN T1,.-1 ;ZERO THE BLOCK
MOVEI T3,PI%SBA(Q3) ;SBDAG DATA ADDRESSES
MOVEI T2,PI%SBA ;GET OFFSET
MOVEM T2,PI%SB2(Q3) ;POINTER TO OFFSET
MOVEI T2,PI%MXS ;MAX AREA FOR SBDIAGS
CALL RDDIAG ;READ SBUSDIAG'S
HLLM T3,PI%SB2(Q3) ;SAVE COUNT OF CONTROLLERS FOUND
MOVE T1,T2
RET
;ROUTINE TO READ SBUSDIAG DATA INTO A BUFFER
;ACCEPTS: T3/ FIRST ADDRESS TO USE
; T2/ COUNT OF WORDS AVAIALABLE
;RETURNS: +1 ALWAYS
RDDIAG: SAVEAC <Q3,P1>
MOVSI T4,-PI%MXS/2 ;SETUP NUMBER OF CONTROLLERS
SETZM T1 ;INIT CONTROL WORD
MOVNI Q3,-<SBSMAX+1>(T2) ;WORDS AVAILABLE
HRLZS Q3 ;COMPUTE AOBJN WORD
MEMPS1: SETZM T1 ;SET UP TO READ FUNCTIONS
DPB T4,[POINT 5,T1,4] ;SET CONTROLLER NUMBER
SBDIAG T1 ;DO FIRST FUNCTION, DATA TO T2
CAMN T2,[-1] ;NON-EX FBUS CONTROLLER?
JRST RDDIA3 ;YES. SKIP PROCESSING
MOVE P1,T2 ;SAVE DATA
HRRI T1,1 ;SET NEXT FUNCTION NUMBER
SBDIAG T1 ;DO SECOND FUNCTION
SKIPN P1 ;EXIST?
JUMPE T2,RDDIA3 ;?
MOVEM P1,1(T3) ;YES. SAVE IT
MOVEM T2,2(T3) ;SAVE THEM BOTH
MOVEM T4,0(T3) ;SAVE CONTROLLER #
LOAD T2,MEMTYP,T2 ;GET MEM TYPE
CAIN T2,MOS ;MOS MEMORY?
JRST RDMOS ;YES. SEE IF ANY MOS ERRORS AROUND
CALL CLRCON ;NO, CLEAR CONTROLLER NOW
RDDIA1: MOVNI T2,SBSMAX ;# OF SBDIAGS
RDDIA2: HRLM T2,0(T3) ;SAVE COUNT
ADD T3,[-1,,SBSMAX+1] ;ADJUST VALUE
ADD Q3,BHC+SBSMAX ;ACCOUNT FOR 2 OF THE WORDS
AOBJP Q3,RDDIA4 ;ROOM FOR MORE?
RDDIA3: AOBJN T4,MEMPS1 ;LOOP FOR ALL CONTROLLERS
RDDIA4: HRRZ T2,Q3 ;RETURN WORDS USED
RET ;DONE
;ROUTINE TO TYPE OUT ALL SBUS ERROR REGS
;ACCEPTS: T1/ -COUNT,,ADDRESS
PRISBS: SAVEAC <Q1,Q2> ;GET SOME WORK REGS
JUMPGE T1,R ;IF NONE, GIVE UP NOW
MOVE Q1,T1 ;SAVE START ADDRESS
MOVEI T1,[SIXBIT '$$SBUS DIAGS$$CNTRLR FNC 0 FNC 1$/']
JSR BUGMSG
PRISB1: HRRZ T1,0(Q1) ;GET CONTROLLER #
CAIN T1,PI%DMA ;IS THIS THE DMA?
CALL [ MOVEI T1,[SIXBIT 'DMA /'] ;YES
JSR BUGMSG ;SAY SO
RETSKP] ;AND PROCEED
CALL BUGOPT ;OUTPUT IT
MOVEI T1," " ;A SPACE
JSR BUGTYO
MOVE T1,1(Q1) ;GET FUNCTION 1
CALL BUGWPT ;OUTPUT 36 BITS
MOVEI T1," " ;A SPACE AGAIN
JSR BUGTYO
MOVE T1,2(Q1) ;GET FUNCTION 2
CALL BUGWPT ;OUTPUT IT
MOVEI T1,[SIXBIT '$/'] ;GET EOL
JSR BUGMSG ;AND GET A NEW LINE
HLRE T1,0(Q1) ;GET COUNT OF SBDIAGS DONE
SUB Q1,T1 ;SKIP UNWANTED AND WANTED FUNCTIONS
AOBJN Q1,PRISB1 ;DO IT
RET ;DONE
;RDDIAG CONTINUED...
;READING FOR A MOS CONTROLLER. LOOK FOR ANY MOS HARD ERRORS
; P1/ SBUSDIAG FUNCTION 1
RDMOS: TXNN P1,MOSCER ;MOS CORRECTABLE ERROR?
TXNN P1,SBSHER ;NO. ANY HARD ERRORS?
CALL CLRCON ;CLEAR CONTROLLER
HLRZ T2,Q3 ;GET REMAINING COUNT
CAIL T2,-<SBSMAX+1+.PIMSZ> ;ROOM TO RECORD A MOS HARD ERROR?
SKIPN T2,ERRTBL ;HAVE ANY?
JRST RDDIA1 ;NO. PROCEED AS NORMAL
HRRZ T1,T4 ;YES. GET CONTROLLER
RDMOS0: OPSTR <CAME T1,>,SBSCN,(T2) ;IS THIS THE CONTROLLER?
JRST RDMOS1 ;NO. SKIP THIS ENTRY
JE SBHEB,(T2),RDMOS1 ;IF ALREADY RECORDED, GO ON
;FOUND ONE TO RECORD
SETZRO SBHEB,(T2) ;MARK IT RECORDED
MOVE T1,SBSEAD(T2) ;GET ERROR ADDRESS
MOVEM T1,PI%MEA(T3) ;STORE IT
LOAD T1,SBSBN,(T2) ;GET BLOCK NUMBER
MOVEM T1,PI%MBN(T3) ;STORE IT
LOAD T1,SBSSB,(T2) ;GET SPARE BIT NUMBER
MOVEM T1,PI%MSB(T3) ;STORE IT
LOAD T1,SBSSY,(T2) ;GET SYNDROME OF ERROR
MOVEM T1,PI%MSY(T3) ;STORE IT
ADDI T3,.PIMSZ ;ACCOUNT FOR USED WORDS
ADD Q3,BHC+.PIMSZ ;HERE TOO
MOVNI T2,SBSMAX+.PIMSZ ;NUMBER OF ENTRIES
JRST RDDIA2 ;AND PROCEED
;THIS ENTRY NOT INTERESTING
RDMOS1: SKIPE T2,SBSLNK(T2) ;GET NEXT ONE
JRST RDMOS0 ;FOUND ONE
JRST RDDIA1 ;PROCEED
;LOCAL ROUTINE TO CLEAR A CONTROLLER.
; T4/ COUNT,,CONTROLLER# IF CLRCON CALLED
; Q1/ COUNT,,CONTROLLER# IF CLRCN0 CALLED
CLRCN0: MOVE T4,Q1 ;ENTRY FOR CONTROLLER NUMBER IN Q1
CLRCON: MOVX T1,SBCLER ;GET CLEAR BIT
DPB T4,[POINT 5,T1,4] ;STORE CONTROLLER NUMBER
SBDIAG T1 ;CLEAR CONTROLLER
RET ;AND DONE
;PROCESS SBUS ERROR FOR KL10. THIS CODE IS GOTTEN TO
;ON AN APR INTERRUPT INDICATING SBUS ERROR.
;THE CODE LOOKS FOR MOS CONTROLLERS THAT INDICATE
;CORRECTABLE ERROR SO THAT THE MOS DIAGNOSITC (TGHA) CAN ANALYZE
;THE PROBLEM. IF A HARD ERROR IS FOUND IN ANY CONTROLLER
;(MOS OR CORE), THEN A MEMORY SCAN WILL BE DONE LATER.
;THE MEMEORY SCAN IS ARRANGED BY TREATING THE HARD SBUS ERROR
;AS A MEM PAR ERROR. ANY CERS THAT ARE FOUND ARE LOGGED IN
;A RESIDENT BUFFER FOR LATER RETRIEVAL BY TGHA.
;Here on APR interrupt with bit 24 on
SBSERR: MOVE P,[IOWD NMEMPP,MEMPP] ;ESTABLISH TEMP STACK
RDERA PI%ER2+MPISEB ;SAVE ERA IN CASE
SETZM P3 ;NO HARD ERRORS YET
CONOAPR APFCLR+APSBER ;CLEAR APR FLAG NOW
MOVEI Q2,MOSLEN ;# OF CONTROLLER GROUPS
JRST SBSER3 ;DO IT
SBSER1: MOVEI T1,0 ;START WITH FUNCTION ZERO
DPB Q1,[POINT 5,T1,4] ;STORE CONTROLLER NUMBER
SBDIAG T1 ;GET CONTROLLER INFORMATION
CAME T2,[-1] ;CONTROLLER EXIST?
TXNN T2,SBSHER!MOSCER ;ANY SORT OF ERROR?
JRST SBSER2 ;NO. GO ON
MOVE Q3,T2 ;SAVE FNC 0 RESULTS
HRRI T1,1 ;DO FNC 1
SBDIAG T1 ;""
LOAD T3,MEMTYP,T2 ;GET TYPE OF THIS MEMORY
CAIN T3,MOS ;MOS CONTROLLER?
TXNE T2,MOSDBL ;ENABLED?
JRST SBSER2 ;NO. SKIP THIS CONTROLLER THEN
JRST SBSER0 ;MAYBE. GO LOOK
;NOT MOS OR NOT A CORRECTABLE ERROR. GO ON TO NEXT
SBSER2: AOBJN Q1,SBSER1 ;DO NEXT CONTROLLER
SBSER3: SOJL Q2,[SKIPN MEMPDP ;FOUND ERROR?
JRST [ CONOAPR APSBER+APFSET ;NO. REASSERT ERROR AND DO SCAN
JRST MEMPAR] ;GO CHECK FOR MB PARITY ERROR
JRST OV0] ;AND PROCEED
MOVE Q1,MOSTBL(Q2) ;GET NEXT GROUP
JRST SBSER1 ;AND DO IT
;FOUND A MOS CONTROLLER WITH ERROR UP. GET INFORMATION
;FOR TGHA.
; Q1/-N,,CNTRL#
; Q3/SBDIAG FNC 0 RESULTS
SBSER0: MOVE F,Q3 ;SAVE SBDIAG FNC 0
SKIPE T1,MTSADR ;TESTING AN ADDRESS?
JRST [ XOR T1,Q3 ;YES. SEE IF IN ERROR PAGE
TXNE T1,PHCPNO ;IS IT?
JRST .+1 ;NO
CALL CLRCN0
AOJA P3,SBSER2] ;AND DONE
REPEAT 0,<
CONSZ APR,APMPE ;ACCOMPANYING MB PARITY ERROR?
JRST [ RDERA T1 ;YES. GET ERA
TXNN T1,ER%WRT ;WRITING?
JRST .+1 ;NO
ANDX T1,<PHCPNO!PGWD> ;GET ADDRESS
LOAD T2,<PHCPNO!PGWD>,Q3 ;GET MEM ADDRESS
CAME T2,T1 ;SAME ADDRESS?
JRST .+1 ;NO
CALL CLRCNO ;CLEAR IT
AOJA P3,SBSER2] ;AND DONE
> ;END OF REPEAT 0
TXNE F,MOSWPE ;A WRITE ERROR?
JRST SBSER7 ;YES. GO ANALYZE
SBSER8: TXNE F,MOSCER!MOSWPE ;A CORRECTABLE ERROR?
AOS P3 ;YES. REMEMBER THIS
MOVX T1,<.RESP1,,ERRSIZ> ;GET A BLOCK TO STORE DATA
MOVX T2,RS%SE0!.RESGP ;FROM GENERAL POOL, SECTION 0
CALL ASGRES ;GET IT
JRST [ BUG.(INF,SBSERF,APRSRV,SOFT,<SBSERR - Could not get error block>,,<
Cause: An APR interrupt occurred because a memory controller detected
an error in its own operation or in information received over
the S bus or from a memory module. The monitor has determined
that a MOS controller is involved. Normally the monitor creates
a block and records information about the error for later
retrieval by TGHA. However, no free space is available so this
information will be lost.
>,,<DB%NND>) ;[7.1210]
JRST SBSER6] ;CAN'T DO IT THEN
MOVE P1,T1 ;SAVE BLOCK ADDRESS
EXCH T1,ERRTBL ;MAKE THIS NEW HEAD.
MOVEM T1,@ERRTBL ;LINK IN REMAINDER OF CHAIN
STOR Q1,SBSCN,(P1) ;STORE CONTROLLER NUMBER
MOVEI T1,.PMMER ;ENTRY TYPE
STOR T1,SBSTP,(P1) ;STORE THIS TOO
RDERA SBSERA(P1) ;SAVE ERA AT TIME OF ERROR
TRZ Q3,3 ;GET LEFT-MOST 34 BITS OF ERROR ADDRESS
MOVEI T1,2 ;NEED TO GET FNC 2
DPB Q1,[POINT 5,T1,4] ;FOR THIS CONTROLLER
SBDIAG T1 ;""
LDB T2,[POINT 2,T2,6] ;GET LOW ORDER-TWO BITS OF ADDRESS
IOR Q3,T2 ;FORM FULL WORD ADDRESS
MOVEM Q3,SBSEAD(P1) ;SAVE ERROR ADDRESS
HRRI T1,1B27+6 ;DO FUNCTION 6.1
SBDIAG T1 ;TO GET SYNDROME
LDB T2,[POINT 6,T2,12] ;GET SYNDROME
STOR T2,SBSSY,(P1) ;SAVE SYNDROME IN ERROR BLOCK
HRRI T1,12 ;SET UP TO GET BN
LDB T2,[POINT 8,Q3,21] ;GET RAM ADDRESS FROM EA
DPB T2,[POINT 8,T1,27] ;PUT IN THE FUNCTION
SBDIAG T1 ;GET IT
LDB T2,[POINT 4,T2,13] ;GET BN
STOR T2,SBSBN,(P1) ;SAVE IN ERROR BLOCK
HRRI T1,7 ;NOW GET SPARE BIT NUMBER
DPB T2,[POINT 4,T1,24] ;PUT IN BLOCK #
LDB T3,[POINT 3,Q3,35] ;GET OFFSET IN INTERLEAVE GROUP
DPB T3,[POINT 3,T1,27] ;STORE IN FUNCTION
SBDIAG T1 ;GET SPARE BIT #
LDB T3,[POINT 6,T2,12] ;GET IT
STOR T3,SBSSB,(P1) ;SAVE IT IN THE ERROR BLOCK
TXC T2,7B15 ;COMPLEMENT ICE FIELD
IOR T1,T2 ;SET UP TO SUPPRESS ERROR REPORTING
TXNE F,MOSCER ;HARD ERROR?
SBDIAG T1 ;NO, DO IT
; ..
;NOW READ THE 4 32-BIT SERIAL NUMBERS FROM THE CONTROLLER.
MOVEI T1,2 ;DO IT WITH FUNCTION 2
DPB Q1,[POINT 5,T1,4] ;STORE CONTROLLER #
LOAD T2,SBSBN,(P1) ;GET BACK BN
LSH T2,-2 ;DIVIDE BY 4
DPB T2,[POINT 2,T1,10] ;INTO THE INPUT WORD
MOVE P2,[POINT 8,SBSSER(P1)] ;BYTE POINTER TO SERIAL # STORAGE
MOVEI T4,^D16 ;# OF BYTES TO GET
SBSER5: SBDIAG T1 ;GET NEXT BYTE
LDB T2,[POINT 8,T2,14] ;GET BYTE
IDPB T2,P2 ;SAVE BYTE
ADD T1,[1B14] ;NEXT ONE
SOJG T4,SBSER5 ;GET REST OF THIS ONE
TXNE F,MOSCER!MOSWPE ;HARD ERROR?
JRST SBSER6 ;NO. PROCEED
SETONE SBHEB,(P1) ;YES. MARK IT
;DONE WITH ERROR ANALYSIS. CLEAR ERROR AND PROCEED
SBSER6:
IFNDEF DODBE,< ;IF NOT DOING DOUBLE-BIT CORRECTION
TXNN F,MOSCER!MOSWPE ;HARD ERROR?
JRST SBSER2 ;YES. LEAVE EVERYTHING ALONE
> ;END OF IFNDEF DODBE
LOAD T2,PHCPNO,Q3 ;GET PHYSICAL PAGE NUMBER
LOAD T3,PGWD,Q3 ;GET WORD WITHIN PAGE
IFDEF DODBE,< ;FOR CORRECTING 2-BIT ERRORS
TXNN F,MOSCER!MOSWPE ;HARD ERROR?
JRST SBSDBE ;YES. GO SEE IF CORRECTABLE
> ;END OF IFDEF DODBE
MOVE T4,[MOVES PIPGA(T3)] ;TO CORRECT IT
TXNN F,MOSWPE ;WRITE ERROR?
CALL XCTRCA ;NO, DO CORRECTION
MOVX T1,SBCLER ;SET UP FOR CLEAR
DPB Q1,[POINT 5,T1,4] ;THE CONTROLLER
SBDIAG T1 ;CLEAR IT
JRST SBSER2 ;AND PROCEED WITH SCAN
;Here if a controller indicates "write data parity error".
SBSER7: CONSZ APR,APMPE ;MB ERROR PENDING?
AOJA P3,SBSER2 ;YES. GO ON
MOVE T1,PI%ER2+MPISEB ;NO. GET LAST MB ERROR REPORTED
XOR T1,Q3 ;SEE IF IN SAME PAGE
TXNE T1,PHCPNO ;IS IT?
JRST SBSER8 ;NO. REPORT IT THEN
CALL CLRCN0 ;YES. UNLATCH CONTROLLER THEN
AOJA P3,SBSER2 ;DONE
;ROUTINE TO CORRECT DOUBLE BIT ERRORS. AT THIS POINT:
IFDEF DODBE,< ;IF WANT TO CORRECT 2-BIT ERRORS
SBSDBE: PIOFF ;OWN MACHINE
SKIPE P1,CASHF ;GET CACHE STATE
CALL CASHOF ;WAS ON. TURN IT OFF
LOAD T1,PHCPNO,Q3 ;GET MEM PAGE NUMBER
PUSH P,@CST0X+T1 ;SAVE CST0 ENTRY FOR THIS PAGE
PUSH P,T1 ;SAVE PAGE NUMBER
SETOM @CST0X+T1 ;MAKE IT FULLY ACCESSIBLE
CALL MAPRCA ;GET ACCESS TO IT
LOAD T4,PGWD,Q3 ;GET WORD NUMBER IN PAGE
ADD T4,T1 ;FORM ADDRESS OF ERROR WORD
MOVX T1,SBCLER ;NEED TO CLEAR ERROR NOW
DPB Q1,[POINT 5,T1,4]
SBDIAG T1 ;DO IT
MOVE P2,0(T4) ;GET ERROR WORD
TXZ T1,SBCLER ;SEE IT STILL HAVE AN ERROR
SBDIAG T1 ;"
TXNN T2,MOSCER ;STILL UNCORRECTABLE?
TXNN T2,SBSRPE ;DO WE?
JRST SBSHR5 ;NO. FLAKEY MEMORY. IT IS HOPELESS
SETCAM P2,0(T4) ;COMPLEMENT BAD LOCATION
MOVE T1,P2 ;GET ORIGINAL WORD AGAIN
EQV T1,0(T4) ;FORM EQUIVALENCE
MOVE Q3,T1 ;SAVE EQV
JUMPE T1,SBSHR0 ;IF ZERO, FATAL ERROR
;NOW COUNT # OF BITS IN RESULTING WORD AND ACCUMULATE SYNDROME
SETZM P3 ;WHERE TO ACCUMULATE SYNDROME
MOVEI T3,1 ;HAVE AT LEAST ONE BIT
SBSHR1: JFFO T1,.+1 ;GET NEXT ONE BIT
TDZ T1,BITS(T2) ;TURN OFF THE BIT
ADJBP T2,[POINT 6,SYNWRD,5] ;GET TO PROPER SYNDROME
LDB T2,T2 ;GET SYNDROME FOR BIT
XOR P3,T2 ;COMPUTE SYNDROME
SKIPE T1 ;DONE YET?
AOJA T3,SBSHR1 ;NO. FIND NEXT BIT THEN
;FOUND ALL BITS
SOJE T3,SBSHR2 ;ONE BIT FOUND?
SOJG T3,SBSHR0 ;NO. TWO BITS THEN?
MOVEI T1,1B27+6 ;READ ERROR SYNDROME
DPB Q1,[POINT 5,T1,4]
SBDIAG T1 ;GET THE SYNDROME
LDB T2,[POINT 6,T2,12] ;FETCH IT FROM THE WORD
CAME T2,P3 ;SAME SYNDROME?
JRST SBSHR0 ;NO. FLAKEY AGAIN
;..
;COMPUTED SYNDROME MATCHES REPORTED SYNDROME. CAN CORRECT ERROR
;..
SBSHR4: XOR P2,Q3 ;GET CORRECT DATA
SBSHR0: MOVEM P2,0(T4) ;PUT BACK DATA
SBSHR5: POP P,T1 ;GET BACK MEM PAGE NUMBER
POP P,@CST0X+T1 ;RESTORE PAGE STATE
CALL UNMRCA ;FREE MAPPING
SKIPE P1 ;WAS CACHE ON?
CALL CASHON ;YES. TURN IT ON AGAIN THEN
PION ;TURN ON SYSTEM AGAIN
AOJA P3,SBSER2 ;AND DONE. BUT RECORED HARD ERROR
;EQV WORD HAS ONE BIT ON. SEE IF CAN FIND A MATCHING SYNDROME
SBSHR2: MOVEI T1,1B27+6 ;SET UP TO READ SYNDROME
DPB Q1,[POINT 5,T1,4]
SBDIAG T1 ;GET SYNDROME OF ERROR
LDB T2,[POINT 6,T2,12] ;EXTRACT THE SYNDROME
XOR P3,T2 ;COMPUTE SYNDROME OF OTHER BIT
;NOW HAVE SYNDROME OF THE OTHER BIT. SEE IF WE CAN FIND THE BIT
CAMN P3,T2 ;MAKE SURE NOT SELF
JRST SBSHR0 ;IT IS. BOO HIS!!!
MOVEI T3,^D43 ;# OF BITS IN A WORD
SBSHR3: MOVE T2,T3 ;COPY BIT NUMBER
ADJBP T2,[POINT 6,SYNWRD,5] ;GET POINTER TO SYNDROME
LDB T2,T2 ;GET SYNDROME
CAMN P3,T2 ;FOUND IT?
JRST [ CAIG T3,^D35 ;A DATA BIT?
TDO Q3,BITS(T3) ;YES. PUT IT IN CORRECTION WORD
JRST SBSHR4] ;AND GO CORRECT DATA
SOJGE T3,SBSHR3 ;NO. DO OTHER BITS
JRST SBSHR0 ;NOT FOUND. CAN'T CORRECT IT
;DEFINE SYNDROMES OF BITS
SYNWRD: BYTE (6)14B37,24B37,30B37,34B37,44B37,50B37,54B37,60B37,64B37,70B37,74B37,104B37
BYTE (6)110B37,114B37,120B37,124B37,130B37,134B37,140B37,144B37,150B37,154B37,160B37,164B37
BYTE (6)170B37,174B37,204B37,210B37,214B37,220B37,224B37,230B37,234B37,240B37,244B37,250B37
BYTE (6)200B37,100B37,40B37,20B37,10B37,4B37,0B37
> ;END OF IFDEF DODBE
> ;END OF IFN KLFLG IN MEMPAR
;UTILITY ROUTINE TO GET NEXT MEM ERROR BLOCK
;ACCEPTS: T1/ TYPE OF ENTRY WANTED
;RETURNS: +1 NONE FOUND
; +2 FOUND. T1/ ADDRESS
IFN KLFLG,< ;FOR THE KL, HOWEVER,
DEQERR::
CAIE T1,.PMMER ;WANT MOS ERRORS?
RET ;NO. YES, WE HAVE NONE OF THESE
PIOFF ;OWN MACHINE FOR A WHILE
SKIPN T1,ERRTBL ;ANY ENTRIES?
RETBAD (,<PION>) ;NO. GIVE UP THEN
MOVE T2,SBSLNK(T1) ;YES. GET LINK WORD
MOVEM T2,ERRTBL ;REMOVE TOP ENTRY
PION ;RELEASE MACHINE
RETSKP ;AND DONE
> ;END OF IFN KLFLG
;Routine to unlatch all MOS memory controllers. MOS controllers
;latch error information and will not report subsequent errors
;while latched. This code is used by the monitor start up routines
;in PAGEM, by the channel write parity error code in APRSRV and MEXEC.
IFN KLFLG,<
MOSULE::PIOFF ;OWN THE MACHINE
SKIPN ERRTBL ;ANY ERRORS?
CALL MEMSTR ;NO. UNLATCH CONTROLLERS
PION
RET
MEMSTR::MOVSI T3,-MOSLEN ;# OF CONTROLLER PAIRS
MEMST1: MOVE T4,MOSTBL(T3) ;GET GROUP
CALL CLRCON ;CLEAR CONTROLLER
AOBJN T4,.-1 ;DO ALL OF THE CONTROLLERS
AOBJN T3,MEMST1 ;DO ALL GROUPS
RET ;DONE
;ROUTINE TO CLEAR ALL CONTROLLERS WITH WRITE PARITY ERROR
UNLCON: MOVSI T3,-MOSLEN ;SIZE OF TABLE
UNLCN0: MOVE T4,MOSTBL(T3) ;GET NEXT GROUP
UNLCN1: SETZM T1
DPB T4,[POINT 5,T1,4] ;PUT IN CONTROLLER #
SBDIAG T1 ;GET FUNCTION 0
TXNE T2,MOSWPE ;WRITE ERROR?
CALL CLRCON ;YEP. UNLATCH THEN
AOBJN T4,UNLCN1 ;DO ALL OF GROUP
AOBJN T3,UNLCN0 ;DO ALL GROUPS
RET ;AND DONE
> ;IF OF IFN KLFLG
IFN KLFLG,<
;JOB 0 CLEANUP ROUTINE--MARK PAGES FOUND AS BAD
; T1/ SYSERR BLOCK PTR
; CALL MEMPJ0
; RETURNS +1 ALWAYS
SWAPCD
MEMPJ0: SAVEQ
STKVAR <<CTYBLK,^D70>> ;LOTS OF WORDS FOR THE STRING
MOVEI Q1,SEBDAT(T1) ;SETUP PTR TO DATA BLOCK
;DO TYPEOUT OF PROCESSOR INFORMATION
HRROI T1,CTYBLK ;GET ADDRESS OF STRING
HRROI T2,[ASCIZ /
Parity Error Detected by/]
TMNN APMPE,PI%CN2(Q1)
HRROI T2,[ASCIZ /
SBUS Error Detected by/]
SETZM T3
SOUT ;COPY STRING
HRROI T2,[ASCIZ / APR/]
TMNE ER%CHN,PI%ER2(Q1)
HRROI T2,[ASCIZ / CHANNEL/]
SOUT
HRROI T2,[ASCIZ /, ERA = /]
SOUT
MOVE T2,PI%ER2(Q1)
MOVX T3,<NO%MAG!NO%LFL!NO%ZRO+10>+FLD(^D12,NO%COL)
NOUT
NOP
HRROI T2,[ASCIZ /
/]
SETZM T3
SOUT ;TIE OFF THE STRING
MOVEI T2,CTYBLK
MOVEI T3,.QBSYS ;.QBDTY VALUE FOR SYSTEM MESSAGE
CALL WROPR0 ;SEND IT OUT
MOVE T1,PI%SB2(Q1) ;GET SDBIAG WORD
ADDI T1,0(Q1) ;ADD IN START IF BLOCK
CALL PPRSBS ;TYPE OUT INFO
HRROI T1,[ASCIZ /
LOC CONTENTS
/]
PSOUT
HRLI Q1,-PI%NB2 ;SCAN BLOCK OF BAD ADDRESSES
SETO Q2,
;Now look at bad word and report on each of them
MEMPJ1: JN ER%WRT,PI%ER2(Q1),MEMPJ2 ;IF WRITE, DON'T KILL PAGE
JE PI%FAT,PI%BAD(Q1),MEMPJ2 ;IF NOT FATAL, SKIP IT
LOAD T1,PHCPNO,PI%BAD(Q1) ;GET PHYS PAGE NUMBER THIS ADDRESS
CAME T1,Q2 ;SAVE AS PREVIOUS?
SKIPN T1 ;OR NONE?
JRST MEMPJ2 ;YES, DO NOTHING
MOVEM T1,Q2 ;SAVE
CALL BADCPG ;MARK PAGE BAD
JFCL
MEMPJ2: SKIPN T2,PI%BAD(Q1) ;HAVE AN ADDRESS?
RET ;NO. ALL DONE THEN
ANDX T2,<PHCPNO+PGWD> ;JUST USE ADDRESS BITS
MOVEI T1,.PRIOU ;YES
MOVX T3,<NO%LFL!NO%ZRO+10>+FLD(^D8,NO%COL)
NOUT ;TYPE IT OUT THEN
NOP
MOVEI T2," "
BOUT ;SPACE
MOVE T2,PI%DA2(Q1) ;GET BAD DATA
MOVX T3,<NO%MAG!NO%LFL!NO%ZRO+10>+FLD(^D12,NO%COL)
NOUT ;TYPE IT OUT ALSO
NOP
MOVEI T2," "
BOUT
JN PI%FAT,PI%BAD(Q1),MEMPJ3 ;IF HARD NO GOOD DATA
MOVE T2,PI%MDA(Q1)
NOUT
NOP
MEMPJ3: HRROI T1,[ASCIZ /
/]
PSOUT
AOBJN Q1,MEMPJ1 ;DO ALL ADDRESSES
RET
ENDSV.
;PRINT SBUS DIAGS FOR JOB 0 ROUTINES
PPRSBS: SAVEAC <Q1,Q2> ;GET SOME WORK REGS
JUMPGE T1,R ;IF NONE, GIVE UP NOW
MOVE Q1,T1 ;SAVE START ADDRESS
HRROI T1,[ASCIZ '
SBUS DIAGS
CNTRLR FNC 0 FNC 1
']
PSOUT
PPRSB1: HRRZ T2,0(Q1) ;GET CONTROLLER #
CAIN T2,PI%DMA ;IS THIS THE DMA?
JRST [ HRROI T1,[ASCIZ 'DMA '] ;YES
PSOUT ;SAY SO
MOVEI T1,.PRIOU ;PRIMARY OUTPUT
JRST PPRSB2]
MOVEI T1,.PRIOU
MOVX T3,<NO%MAG!NO%LFL!NO%ZRO+10>+FLD(2,NO%COL)
NOUT
NOP
HRROI T2,[ASCIZ / /]
SETZM T3
SOUT ;SPACES
PPRSB2: MOVE T2,1(Q1) ;GET FUNCTION 1
MOVX T3,<NO%MAG!NO%LFL!NO%ZRO+10>+FLD(^D12,NO%COL)
NOUT
NOP
MOVEI T2," " ;A SPACE
BOUT
MOVE T2,2(Q1) ;GET FUNCTION 2
NOUT
NOP
HRROI T1,[ASCIZ /
/] ;EOL
PSOUT
HLRE T1,0(Q1) ;GET COUNT OF SBDIAGS DONE
SUB Q1,T1 ;SKIP UNWANTED AND WANTED FUNCTIONS
AOBJN Q1,PPRSB1 ;DO IT
RET ;DONE
> ;END OF IFN KLFLG
;ROUTINE TO FINISH LOGGING OF PARITY ERROR - RUN IN JOB 0 CONTEXT
; T1/ ADDRESS OF SYSERR BLOCK
PFCPJ0: SAVEQ
STKVAR <<CTYBLK,70>>
HLRZ Q3,SEBDAT+PT%JOB(T1) ;GET FORKX AT TRAP
CAIE Q3,-1
SKIPGE FKPT(Q3)
JRST PFCPJ1
LOAD T2,FKJBN ;GET JOB NUMBER
HRRM T2,SEBDAT+PT%JOB(T1) ;REPORT IT
HRRZ T3,JOBDIR(T2) ;GET LOGGED-IN DIRECTORY
HRLI T3,USRLH ;MAKE IT A USER NUMBER
MOVEM T3,SEBDAT+PT%USR(T1) ;REPORT IT
MOVE T3,JOBPNM(T2) ;GET PROGRAM NAME
MOVEM T3,SEBDAT+PT%PGM(T1) ;REPORT IT
; Report on CTY
PFCPJ1: MOVEI Q1,SEBDAT(T1)
HRROI T1,CTYBLK
HRROI T2,[ASCIZ '
AR/ARX Parity error
PFW= ']
SETZM T3
SOUT
MOVE T2,PT%PFW(Q1)
MOVX T3,<NO%MAG!NO%LFL!NO%ZRO+10>+FLD(^D12,NO%COL)
NOUT
NOP
HRROI T2,[ASCIZ / MAP WORD= /]
SETZM T3
SOUT
MOVE T2,PT%PMA(Q1)
MOVX T3,<NO%MAG!NO%LFL!NO%ZRO+10>+FLD(^D12,NO%COL)
NOUT
NOP
HRROI T2,[ASCIZ /
BAD DATA= /]
SETZM T3
SOUT
MOVE T2,PT%BDW(Q1)
MOVX T3,<NO%MAG!NO%LFL!NO%ZRO+10>+FLD(^D12,NO%COL)
NOUT
NOP
TMNE PT%HRD,PT%TRY(Q1)
IFSKP.
HRROI T2,[ASCIZ /
GOOD DATA= /]
SETZM T3
SOUT
MOVX T3,<NO%MAG!NO%LFL!NO%ZRO+10>+FLD(^D12,NO%COL)
MOVE T2,PT%GDW(Q1)
NOUT
NOP
ENDIF.
HRROI T2,[ASCIZ/
/]
SETZM T3
SOUT
MOVEI T2,CTYBLK
MOVEI T3,.QBSYS ;.QBDTY VALUE FOR SYSTEM MESSAGE
CALLRET WROPR0
ENDSV.
;Routine to scann portion of memory looking for parity errors.
; This is called from Channel logout code when channel write
; parity errors have occurred.
;
; T1/ STARTING PHYSICAL ADDRESS
; T2/ WORD COUNT
; RETURNS:
; +1 ONE OR MORE ERRORS FOUND
; +2 NO ERRORS FOUND
IFN KLFLG,<
RESCD
MEMSCN::SAVEP ;SAVE ACS
SETZM P1 ;NO ERRORS YET
DMOVE P2,T1 ;SAVE ARGS
;MUST SCAN ERROR QUEUE
MOVE P4,T1 ;START ADDRESS
ADDI P4,-1(T2) ;END ADDRESS
MEMSC3: PIOFF
SKIPN T1,WREQ ;HEAD OF QUEUE
JRST MEMSC1 ;NONE TO DO
MOVE T4,TODCLK ;TIME
SUBI T4,^D30000 ;MAX TIME TO HOLD AN ETNRY
MOVEI T2,WREQ ;PREVIOUS
MEMSC2: MOVE T3,1(T1) ;GET ERROR ADDRESS
CAML T3,P2 ;WITHIN RANGE?
CAMLE T3,P4 ;STILL?
JRST [ CAMG T4,2(T1) ;TIME TO FLUSH IT?
JRST MEMSC4 ;NO. KEEP IT FOR THE NEXT TIME
JRST MEMSC6] ;YES
AOS P1 ;FORCE ERROR
MEMSC6: MOVE T3,0(T1) ;NXT
MOVEM T3,0(T2) ;UNLINK THIS ONE
CALL RELRES ;FREE BLOCK
JRST MEMSC3 ;AND TRY AGAIN
MEMSC4:
MOVE T2,T1 ;NEW PREVIOUS
MOVE T1,0(T1) ;NEW NEXT
JUMPN T1,MEMSC2 ;DO IT
;Scan of error queue all done
MEMSC1: EA.ENT ;RUN INSECTION 1
PUSH P,UPTPFO ;SAVE PAGE FAIL STATE
PUSH P,UPTPFL
PUSH P,UPTPFN
PUSH P,UPTPFW
XMOVEI T3,MEMPT0 ;LOCAL PAGE FAIL ROUTINE
MOVEM T3,UPTPFN ;STASH IT
;SCAN THE MEMORY
MOVEM P2,MTSADR ;SAVE AS TEST ADDRESS
LOAD T3,PGWD,P2 ;GET WORD OFFSET
LSH P2,-PGSFT ;PAGE NUMBER
MOVE T1,P2
CALL MAPRCA ;MAP ADDRESS
PUSH P,@CST0X+P2 ;SAVE CST STATE
MOVX T4,<PSASM+CSWRB>
IORM T4,@CST0X+P2 ;MAKE IT WRITABLE
ADDI T1,0(T3) ;STARTING WORD
MEMSC5: MOVES 0(T1) ;TOUCH IT
ADDI T1,1
SOJG P3,MEMSC5 ;DO ALL OF RANGE
;SCAN IS DONE
POP P,@CST0X+P2 ;RESTORE CST STATE
CALL UNMRCA ;UNMAP PAGE
POP P,UPTPFW
POP P,UPTPFN
POP P,UPTPFL
POP P,UPTPFO
PION ;RETURN MACHINE TO OTHERS
CONSZ APR,APSBER ;SBUS ERROR UP?
JRST .-1 ;YEP. WAIT FOR IT
SETZM MTSADR ;AND CLEAR TEST LOCATION
JUMPN P1,R ;IF ERRORS, SAY SO
RETSKP ;OTHERWISE, DONE
;PAGE fault handler for MEMSCN
MEMPT0: HRRZ T3,UPTPFO ;GET PAGE FAIL PLACE
CAIE T3,MEMSC5 ;RIGHT PLACE?
CALL MEMXXX ;ERROR!
SETZM 0(T1) ;ZAP THE WORD
CONOAPR APFCLR+APMPE ;CLEAR MB ERROR
AOJA P1,1(T3) ;INDICATE ERROR, AND PROCEED WITH SCAN
> ;END OF IFN KLFLG
SUBTTL Gather KL10 Status Block
;THIS CODE GENERATES THE KL10 STATUS BLOCK. THIS BLOCK CONTAINS
;INFORMATION ABOUT THE SYSTEM THAT MAY BE RELEVANT IN DEBUGGING
;HARDWARE FAULTS. THIS ROUTINE IS CALLED ON EVERY BUGHLT,BUGCHK,
;BUGINF AND MASSBUS ERROR.
;ACCEPTS: T1/ TYPE OF ERROR THAT OCCURRED
;USES PRIVATE STACK BUT CALLER MUST PROVIDE SMALL STACK FOR REG SAVES
;TABLE OF TITLES
IFN KLFLG,< ;ONLY ON THE KL
BUGBUG: [SIXBIT 'BUGHLT,BUGCHK, OR BUGINF$/']
MASBUG: [SIXBIT 'MASSBUS ERROR$/']
ARBUG: [SIXBIT 'AR ARX PARITY ERROR$/']
APRBUG: [SIXBIT "APR INTERRUPT$/"]
MASBGX==:MASBUG-BUGBUG ;INDEX VALUE FOR MASSBUS ERROR
BUGPL==^D54 ;REQUIRED PDL
RS BUGSP,1 ;TO HOLD OLD PDL
RS BUGSPL,BUGPL ;ALLOCATE A STACK
GENBLK::SKIPN STSBLK ;HAVE A STATUS BLOCK
RET ;NO. NO REPORT THEN
CONI PI,BUGSPL ;SAVE INCOMING PI STATE
MOVEM T1,BUGSPL+1 ;SAVE INCOMING MESSAGE POINTER
PIOFF ;YES. STOP MACHINE
JSR BUGMON ;AND THE FE AS WELL
MOVEI T1,[SIXBIT '$$$CPU STATUS BLOCK FOR /']
JSR BUGMSG
MOVE T1,BUGSPL+1 ;GET MESSAGE POINTER
MOVE T1,BUGBUG(T1) ;GET ADDRESS OF MESSAGE
JSR BUGMSG
MOVE P1,STSBLK ;GET BLOCK ADDRESS
APRID SB%API(P1) ;GET APR ID
CONI APR,SB%APR(P1) ;GET APR STATUS
RDERA SB%ERA(P1) ;GET ERROR REG
MOVE P2,BUGSPL ;GET INCOMING PI STATUS
MOVEM P2,SB%PIC(P1) ;SAVE IT
MOVEM P,BUGSP ;SAVE INCOMING STACK
MOVE P,[IOWD BUGPL,BUGSPL] ;GET TEMP STACK
DATAI PAG,SB%PGD(P1) ;GET PAGING DATA
CONI PAG,SB%PGC(P1) ;GET PAGING STATUS
MOVEI P2,SB%RHC(P1)
MOVE P3,[CONI 540,0(P2)] ;THE INSTRUCTION
MOVEI P4,10 ;# OF RH20'S
CTLBL0: XCT P3 ;GET CONI
ADD P3,[4B11+1] ;NEXT RH20, NEXT MEM LOC
SOJG P4,CTLBL0 ;DO THEM ALL
; ..
;GENBLK CODE CONTINUED
CONI DTE0,SB%DTC(P1) ;DTE0 STATUS
CONI DTE1,SB%DTC+1(P1) ;DTE1 STATUS
CONI DTE2,SB%DTC+2(P1) ;DTE2 STATUS
CONI DTE3,SB%DTC+3(P1) ;DTE2 STATUS
MOVEI P2,SB%EP0(P1) ;DEST OF EPT LOCS 0-37
HRLI P2,KIEPT ;SOURCE OF SAME
BLT P2,SB%EP0+37(P1) ;DO THEM ALL
MOVEI P2,SB%EP1(P1) ;DEST OF EPT LOCS 140-177
HRLI P2,KIEPT+140
BLT P2,SB%EP1+37(P1) ;DO THEM ALL
MOVEI P2,SB%UP0(P1) ;DEST OF UPT LOCS 424-427
HRLI P2,HWPTA+424
BLT P2,SB%UP0+3(P1) ;DO THEM ALL
MOVEI P2,SB%UP1(P1) ;DEST OF UPT LOCS 500-503
HRLI P2,HWPTA+500
BLT P2,SB%UP1+3(P1) ;DO THEM ALL
MOVE P4,SB%PGD(P1) ;GET INCOMING DATAI PAG,
MOVEI P3,HWRACB ;SWITCH TO AC BLOCK 6
STOR P3,PGPACB,P4 ;SET UP TO REFERENCE AC BLOCK 6
DATAO PAG,P4 ;DO IT
XCTU [DMOVE P2,CSTMSK] ;GET FIRST TWO
DMOVEM P2,SB%6(P1) ;STORE THEM
XCTU [DMOVE P2,CSTBR] ;GET NEXT SET
DMOVEM P2,SB%6+2(P1)
UMOVE P2,12 ;GET REG 12
MOVEM P2,SB%6+4(P1) ;SAVE IT FOR LATER SCRUTINY
MOVEI P3,HW7ACB ;AC BLOCK 7
STOR P3,PGPACB,P4 ;INTO DATAO WORD
DATAO PAG,P4 ;SWITCH TO AC BLOCK 7
XCTU [DMOVE P2,0] ;GET REGS 0 AND 1
UMOVE P4,2 ;GET REG 2
DMOVEM P2,SB%7(P1) ;STORE IT
MOVEM P4,SB%7+2(P1) ;SAVE ALL REGS
DATAO PAG,SB%PGD(P1) ;BACK TO STANDARD AC BLOCKS
MOVEI T2,SB%SBL ;COUNT OF WORDS IN SBUSDIAG BLOCK
MOVEI T3,SB%SBD+1(P1) ;WHERE TO PUT BLOCK
CALL RDDIAG ;READ THEM
HRRI T3,SB%SBD+1 ;START OF SBUSDIAG DATA
MOVEM T3,SB%SBD(P1) ;STORE IT
; ..
;ALL DATA GATHERED. NOW TYPE SOME OF IT OUT ON THE CTY.
;FIRST TRY TO QUEUE UP A SYSERR BLOCK
MOVE P3,T2 ;GET COUNT OF WORDS USED BY RDDIAG
MOVEI T1,SB%SBD-SB%API+1(P3) ;GET WORDS NEEDED
MOVEM T1,T2 ;THIS NEEDED AS WELL
CALL ALCSEB ;GET A SYSERR BLOCK
JRST [ MOVEI T1,[SIXBIT '$$?NO SYSERR BUFFER. EVENT NOT RECORDED$$/']
JSR BUGMSG ;TYPE IT OUT
JRST STSBL1] ;AND GO ON
MOVSI P2,SB%API(P1) ;GET START OF DATA
HRRI P2,SEBDAT(T1) ;GET DEST OF DATA
ADDI P3,SB%SBD+SEBDAT(T1) ;COMPUTE END ADDRESS OF DATA
BLT P2,0(P3) ;MOVE IT
MOVE P2,T1 ;SAVE POINTER
MOVE T2,[-1,,[SEBPTR 0,SBTEVC,SB%BLK]]
CALL SEBCPY ;COPY EVENT CODE
JFCL
MOVE T1,P2 ;GET BACK BLOCK ADDRESS
CALL QUESEB ;QUEUE UP THE BLOCK
STSBL1: MOVEI T1,[SIXBIT '$/']
JSR BUGMSG ;GET SOME SPACING
; ..
;ALL DATA GATHERED AND RECORDED IN SYSERR. NOW TYPE OUT SOME
;IMPORTANT RESULTS ON THE CTY
MOVEI T1,[SIXBIT '$ERA = /']
JSR BUGMSG
MOVE T1,SB%ERA(P1) ;GET ERA
CALL BUGWPT ;OUTPUT IT
MOVEI T1,[SIXBIT '$CONI APR, = /']
JSR BUGMSG
MOVE T1,SB%APR(P1)
CALL BUGWPT ;TYPE IT
MOVEI T1,[SIXBIT '$CONI PI, = /']
JSR BUGMSG
MOVE T1,SB%PIC(P1) ;GET DATA
CALL BUGWPT ;TYPE IT
MOVEI T1,[SIXBIT '$CONI PAG, = /']
JSR BUGMSG
MOVE T1,SB%PGC(P1) ;GET DATA
CALL BUGWPT
MOVEI T1,[SIXBIT '$DATAI PAG, = /']
JSR BUGMSG
MOVE T1,SB%PGD(P1) ;GET DATA
CALL BUGWPT ;TYPE IT
MOVEI T1,[SIXBIT '$AR ARX DATA WORD = /']
JSR BUGMSG
MOVE T1,SB%7(P1) ;GET IT
CALL BUGWPT ;TYPE IT
MOVEI T1,[SIXBIT '$IO PAGE FAIL WORD = /']
JSR BUGMSG
MOVE T1,SB%7+2(P1) ;GET DATA
CALL BUGWPT ;TYPE IT
MOVEI T1,SB%SBD+1(P1) ;START OF SBUSDIAG DATA
HLL T1,SB%SBD(P1) ;GET NEG COUNT
CALL PRISBS ;PRINT SBUS DIAGS
MOVEI T1,[SIXBIT '$$$$/'] ;CLEAN UP OUTPUT
JSR BUGMSG ;CLEAN UP CTY OUTPUT
JSR BUGPRI ;TURN ON FE
MOVE T1,SB%PIC(P1) ;GET CONI PI,
MOVE P,BUGSP ;GET INCOMING STACK
TXNE T1,PIPION ;WAS PI ON WHEN WE GOT HERE?
PION ;YES, TURN ON MACHINE
RET ;AND WE ARE DONE
;ROUTINES TO ENABLE/DISABLE STATUS BLOCK REPROTING
SWAPCD ;FROM JSYS ONLY
GENGEN::SKIPE STSBLK ;NOW ENABLED?
RET ;YES. DONE
MOVE T1,[.RESP3,,SB%SBD+SB%SBL+1] ;REQUIRED LENGTH
MOVX T2,RS%SE0!.RESGP ;FROM GENERAL POOL, SECTION 0
CALL ASGRES ;GET SPACE
ITERR (MONX05) ;INSUFFICIENT RESOURCES - NO RESIDENT FREE PSACE
MAP T2,0(T1) ;FIND PHYSICAL ADDRESS OF BLOCK
DMOVEM T1,STSBLK ;START IT UP
RET ;AND DONE
;DISABLE STATUS BLOCK REPORTING
UNGEN:: SKIPN T1,STSBLK ;HAVE ONE?
RET ;NO
SETZM STSBLK ;NOW DISABLED
CALLRET RELRES ;AND DONE
RESCD ;AND RETURN TO RESIDENT MONITOR
> ;END OF IFN KLFLG
SUBTTL Routines to handle BUGHLT, BUGCHK, BUGINF
;DDT BREAKPOINT LOCATIONS - THESE ARE EXECUTED BY THE ROUTINES
;BELOW DEPENDING ON THE SETTING OF DBUGSW AND DDTPRS. THEY
;MUST BE IN A WRITABLE AREA SO THAT DDT CAN INSERT THE BREAKPOINT
;INSTRUCTION
RSI HLTADR,<NOP> ;BUGHLT
RSI CHKADR,<NOP> ;BUGCHK
RSI INFADR,<NOP> ;BUGINF
;IMPOSSIBLE SITUATION HALT
;ACTION DEPENDS ON SETTING OF DBUGSW AND DCHKSW
;REACHED VIA JSR BUGHLT
BUGH0:: AOS BUGNUM ;COUNT UP BUG CHECKS SINCE STARTUP
SOS BUGHLT
SKIPE DBUGSW ;BREAKPOINT WANTED?
SKIPN DDTPRS ;YES. DDT LOCKED?
JRST SKPHLT ;SKIP THE BREAKPOINT
;HERE WHEN DEBUGGING IS ENABLED, DDT IS LOCKED DOWN.
;BREAKPOINT CAN BE PLACED HERE TO ALLOW ANALYSIS OF
;A BUGHLT BEFORE THE DUMP IS TAKEN. PROCEED THE BREAKPOINT TO EFFECT A
;NORMAL RELOAD.
HLTAD0::XCT HLTADR ;EXECUTE THE BREAKPOINT
SKPHLT:
; SKIPN INSKED ;IN SCHEDULER?
; CONSZ PI,177B27 ;OR IN PI?
; JRST .+2
; JRST EXBUGH ;NO, CRASH THIS JOB
CONI PI,PISV1 ;Save PI state for a moment
PIOFF ;TURN OFF SYSTEM
AOSE BUGLCK ;FIRST TIME?
HALT . ;NO!!
EXCH T1,PISV1 ;Get PI state before PIOFF
MOVEM T1,PISAV ;Put it in a safer place (in case of recursive
; BUGHLT)
MOVE T1,PISV1 ;Restore T1
MOVEM 17,BUGACS+17 ;SAVE ACS FOR DUMP
MOVEI 17,BUGACS
BLT 17,BUGACS+16
;THIS CODE IS REPLACED BECAUSE OF A KL MICROCODE BUG WHERE PREV CONTEXT IS
;MONITOR AND PC NOT SECTION 0/1 (XCDSEC) THEN WE PF ON XCDSEC,,0 INSTEAD OF
;GETTING AC0 IF U-CODE IS FIXED CHANGE THIS BACK
REPEAT 0,< ;MICROCODE HACK
STPAC. 17,BUGACU ;SAVE PREVIOUS CONTEXT AC'S
> ;END U-CODE HACK
REPEAT 1,< ;MICROCODE HACK
MOVEI T1,20 ;NUMBER OF ACS
SETZ T2, ;SOURCE
XMOVEI T3,BUGACU ;DEST
XCT 2,[XBLT. T1] ;DO PXCT OF XBLT
> ;END U-CODE HACK
;HAVE PRIMARY PROTOCOL?
JSR BUGMON ;YES. SWITCH TO MONITOR FOR THIS
MOVE P,[-BUGPLN,,BUGPDL-1]
XMOVEI T1,[HALT .] ;GET A HALT INSTUCTION
IFN KLFLG,<
PUSH P,UPTPFN ;SAVE OLD PF HANDLER
MOVEM T1,UPTPFN ;AND SET IT UP IN CASE
> ;END OF IFN KLFLG
IFN KCFLG,<
PUSH P,KCPFNP ;SAVE OLD PAGE FAULT HANDLER
MOVEM T1,KCPFNP ;AND SET IT UP IN CASE
> ;END OF IFN KCFLG
CALL CASHOF ;TURN CASH OFF IN CASE DUMP
CALL SYRMAP ;CHECK OUT SYSERR BLOCKS
CALL [ CAIN T1,SEC%PT ;AR/ARX ERROR?
JRST [ CALLRET PFERRB] ;YEP. DO IT
CAIN T1,SEC%P1 ;MB PARITY?
CALL MBERRB ;YEP. DO IT
RET]
MOVEI 1,[SIXBIT \$**********$*BUGHLT "/\]
JSR BUGMSG ;TYPE CRASH MESSAGE
MOVE T1,BUGHLT ;Get address of BUGHLT block
MOVE T2,T1 ;Save T1
XHLLI T1,(T2) ;Get section #
HRR T1,(T2) ; and section-local part of BUGHLT address
MOVE Q1,T1 ;STORE ADDRESS
;..
;..
BUGH3: XMOVEI T2,1000(Q1) ;Get ending address
CAML T1,T2 ;Looked far enough?
HALT . ;SUPER LOSSAGE
MOVE T2,1(T1) ;FIND THE SIXBIT NAME
TLNN T2,770000 ;IS THIS SIXBIT?
AOJA T1,BUGH3 ;NO, KEEP LOOKING
MOVEM T2,BUGNAM ;[7.1158] Save SIXBIT name for SETSPD's use
MOVE T3,[POINT 6,T2] ;SET UP TO TYPE OUT NAME
BUGH1: ILDB T1,T3 ;GET A CHARACTER
ADDI T1," " ;MAKE IT ASCII
JSR BUGTYO ;TYPE IT OUT
TLNE T3,770000 ;DONE?
JRST BUGH1 ;NO, LOOP BACK TILL ALL ARE TYPED
MOVEI T1,42 ;TYPE OUT DOUBLE QUOTE
JSR BUGTYO
SKIPN BUGTIM ;ARE DATE AND TIME SET UP YET
JRST BUGH7 ;NO, JUST LOOK FOR ADDITIONAL INFO
MOVEI T1,[SIXBIT \ AT /\]
JSR BUGMSG
MOVNI T2,17 ;MAX NUMBER OF CHARACTERS IN TIME & DATE
MOVE T3,[POINT 7,BUGTIM] ;GET POINTER TO TIME & DATE
BUGH4: ILDB T1,T3 ;GET A CHARACTER
JUMPE T1,BUGH5 ;JUMP IF END OF STRING
JSR BUGTYO ;TYPE CHARACTER OUT
AOJN T2,BUGH4 ;JUMP IF MORE CHARACTERS
BUGH5: CONSZ PI,177B27 ;ARE WE AT INTERRUPT LEVEL?
JRST BUGH7 ;YES, FORGET USER AND JOB
SKIPG INSKED ;IN PROCESS CONTEXT?
SKIPGE FX,FORKX ;WAS A USER RUNNING? SNAG FX FOR LOAD.
JRST BUGH7 ;NO, CONTINUE ON
LOAD T1,FKJSB ;GET JSB PAGE ADDRESS
MOVE T1,SPT(T1)
TXNE T1,NCORTM ;IS JSB IN CORE
JRST BUGH7 ;NO, FORGET THIS
MOVEI T1,[SIXBIT \$*JOB: /\]
JSR BUGMSG
MOVE T1,GBLJNO ;GET JOB NUMBER
JSR BUGNO ;PRINT IT
MOVEI T1,[SIXBIT \, USER: /\]
JSR BUGMSG
MOVE T3,USRNAM ;GET NUMBER OF WORDS IN USER NAME
IMULI T3,5 ;5 CHARACTERS PER WORD
MOVE T2,[POINT 7,USRNAM+1] ;GET POINTER TO USER NAME
BUGH6: ILDB T1,T2
JUMPE T1,BUGH7 ;JUMP IF END OF STRING
JSR BUGTYO ;TYPE CHARACTER
SOJN T3,BUGH6 ;JUMP IF MORE CHARACTERS
BUGH7: MOVE T2,1(Q1) ;GET FIRST WORD OF BUGHLT BLOCK
TLNE T2,770000 ;IS THIS SIXBIT?
JRST BUGH10 ;YES, THERE IS NO ADDITIONAL INFO
MOVEI T1,[SIXBIT \$*ADDITIONAL DATA: /\]
JSR BUGMSG
;..
;..
BUGH8:
REPEAT 0,< ;**NEW FEATURE NOT YET FULLY READY **
MOVE T1,2(Q1) ;GET DATUM IDENTIFIER TO PRINT FIRST
JSR BUGMSG
MOVEI T1,[SIXBIT /=/]
JSR BUGMSG
>
MOVE T2,1(Q1) ;GET DATA ADDRESS
CAIG T2,17 ;IS THIS AN AC?
JRST [ MOVE T1,BUGACS(T2) ;YES,GET CONTENTS OF AC
JSR BUGNO ;PRINT CONTENTS
JRST BUGH9]
MAP T1,(T2) ;IS THIS ADDRESS IN CORE?
SMAPOK T1 ;SKIP IF REF WOULD BE OK
JRST BUGH9 ;NO MAPPING. DON'T TRY TO PRINT IT
MOVE T1,(T2) ;GET THE CONTENTS OF LOCATION
JSR BUGNO ;PRINT IT OUT
BUGH9: AOS Q1
REPEAT 0,<AOS Q1> ;GOES WITH NEW FEATURE ABOVE
MOVE T2,1(Q1) ;GET NEXT ARGUMENT WORD
TLNE T2,770000 ;IS IT SIXBIT?
JRST BUGH10 ;YES, FINISHED
MOVEI T1,[SIXBIT \, /\]
JSR BUGMSG
JRST BUGH8 ;GET NEXT DATUM PRINTED
BUGH10: MOVEI 1,[SIXBIT \$**********$/\]
JSR BUGMSG
JSR BUGPRI ;BACK INTO PRIMARY
BUGH2:
;**** NOTE WELL **** The following instruction assmues that the PC and flags
;do not overlap.
LOAD T1,EXPCBT,BUGHLT ;GET ADDRESS OF BUGHLT
MOVX P1,BG%HLT ;SAY THIS IS A BUGHLT
CALL BUGSTO ;QUEUE UP A SYSERR BLOCK
IFN KLFLG!KCFLG,<
CALL XCKLP ;STOP THE CI
CALL XCKNI ;STOP THE NI
CALL LOADME ;LET THE FRONT END REBOOT US
> ; END IFN KLFLG!KCFLG
HALT . ;WAIT TO BE REBOOTED
JRST SYSGO ;RELOAD AND RESTART
;LESS SERIOUS HALT - BUGCHK
BGCCHK:: ;HERE VIA CALL BGCCHK
BUGC0:: AOS BUGNUM ;COUNT UP BUGCHK'S AND BUGINF'S SINCE STARTUP
SKIPE DCHKSW ;BREAKPOINT WANTED?
SKIPN DDTPRS ;YES. DDT LOCKED?
JRST SKPCHK ;SKIP THE BREAKPOINT
MOVEM T1,BUGCHK ;SAVE T1
MOVE T1,0(P) ;GET THE CALLING ADDRESS
EXCH T1,BUGCHK ;RESTORE T1 AND SET BUGCHK
;HERE WHEN DEBUGGING IS ENABLED, DDT IS LOCKED DOWN.
;A BREAKPOINT CAN BE PLACED HERE TO ALLOW ANALYSIS OF
;A BUGCHK
CHKAD0::XCT CHKADR ;YES, EXECUTE BREAKPOINT
SKPCHK: PUSH P,0 ;MAKE SLOT ON STACK
CONI PI,0(P) ;SAVE PI STATE HERE
PIOFF
AOSN BUGLCK ;[7.1081] First time through here?
IFSKP. ;[7.1081] If not
PUSH P,T1 ;[7.1081] Save an AC
MOVE T1,DOBSTS ;[7.1081] Load DOB status word
TXNN T1,DB%DIP ;[7.1081] Is there a dump in progress?
HALT . ;[7.1081] No, halt now
POP P,T1 ;[7.1081] Remove saved T1 from stack
EXCH T1,(P) ;[7.1081] Swap origional T1 with saved CONI PI
TXNE T1,PIPION ;[7.1081] PI was ON?
PION ;[7.1081] Yes, turn it back on
POP P,T1 ;[7.1081] Get back the saved T1
AOS BUGLST ;[7.1081] Count lost BUG
RET ;[7.1081] Return doing very little
ENDIF. ;[7.1081]
MOVEM 17,BUGACS+17 ;SAVE ACS
MOVEI 17,BUGACS
BLT 17,BUGACS+16
;NOW START LOOKING FOR INFORMATION TO PUT IN SYSERR BLOCK
MOVE P,BUGACS+P ;GET BACK P FOR A MOMENT
MOVE T1,-1(P) ;BUGCHK ADR
MOVEM T1,BUGCHK ;LEAVE TRACKS
MOVE P,[-BUGPLN,,BUGPDL-1] ;GET A STACK
XMOVEI T1,-1(T1) ;MAKE PTR TO INSTRUCTION
MOVX P1,BG%CHK ;SAY THIS IS A BUGCHK
;COMMON FINISH FOR BUGCHK AND BUGINF
BUGFIN: PUSH P,T1 ;[7.1081] Save address of BUG
PUSH P,P1 ;[7.1081] and CHK/INF bit
CALL BUGSTO ;GO CREATE SYSERR ENTRY
POP P,T2 ;[7.1081] Restore CHK/INF bit
POP P,T1 ;[7.1081] and BUG address
CALL DODOB ;[7.1081] (T1,T2/) See if we should dump this
MOVSI 17,BUGACS ;RESTORE ACS
BLT 17,17
SETOM BUGLCK ;UNLOCK
EXCH T1,0(P) ;SAVE T1, GET PI STATUS
TXNE T1,PIPION ;NEED TO ENABLE?
PION
POP P,T1 ;RESTORE T1
AOS JB0FLG ;GET IT REPORTED
RET ;RETURN
;PROCESS BUGINF
BGCINF:: ;HERE VIA CALL BUGINF
BUGI0:: AOS BUGNUM ;COUNT UP BUGCHK'S AND BUGINF'S SINCE STARTUP
SKIPE DINFSW ;BREAKPOINT WANTED?
SKIPN DDTPRS ;YES. DDT LOCKED?
JRST SKPINF ;SKIP THE BREAKPOINT
MOVEM T1,BUGINF ;SAVE T1
MOVE T1,-1(P) ;GET THE ADDRESS OF THE CALLER
EXCH T1,BUGINF ;SAVE BUGINF AND RESTORE T1
;HERE WHEN DEBUGGING IS ENABLED, DDT IS LOCKED DOWN. A BREAKPOINT CAN BE
;PLACED HERE TO ALLOW ANALYSIS OF A BUGINF
INFAD0::XCT INFADR ;YES, EXECUTE BREAKPOINT
SKPINF: PUSH P,0 ;MAKE SLOT ON STACK
CONI PI,0(P) ;SAVE PI STATUS
PIOFF
AOSN BUGLCK ;[7.1081] First time through here?
IFSKP. ;[7.1081] If not
PUSH P,T1 ;[7.1081] Save an AC
MOVE T1,DOBSTS ;[7.1081] Load DOB status word
TXNN T1,DB%DIP ;[7.1081] Is there a dump in progress?
HALT . ;[7.1081] No, halt now
POP P,T1 ;[7.1081] Remove saved T1 from stack
EXCH T1,(P) ;[7.1081] Swap origional T1 with saved CONI PI
TXNE T1,PIPION ;[7.1081] PI was ON?
PION ;[7.1081] Yes, turn it back on
POP P,T1 ;[7.1081] Get back the saved T1
AOS BUGLST ;[7.1081] Count lost BUG
RET ;[7.1081] Return doing very little
ENDIF. ;[7.1081]
MOVEM 17,BUGACS+17 ;SAVE ACS
MOVEI 17,BUGACS
BLT 17,BUGACS+16
;ROUTINE TO GENERATE INFORMATION FOR SYSERR BLOCK FOR BUGINFS.
MOVE P,BUGACS+P ;GET BACK P FOR A MOMENT
MOVE T1,-1(P) ;GET ADDRESS OF BUGINF
MOVEM T1,BUGINF ;LEAVE TRACKS
XMOVEI T1,-1(T1) ;...
MOVE P,[-BUGPLN,,BUGPDL-1] ;GET A STACK
MOVX P1,BG%INF ;SAY THIS IS A BUGINF
JRST BUGFIN ;JOIN BUGCHK TO FINISH UP
;ROUTINE TO BUILD A SYSERR BLOCK
;ACCEPTS IN T1/ POINTER TO BUG HLT/CHK BLOCK
; P1/ HLT/CHK
;CALLED BY BUGHLT, BUGCHK, AND BUGINF CODE
BUGSTO: EA.ENT ;NEEDED TO REFERENCE FORK TABLES
ACVAR <BLK> ;USED TO SAVE BLOCK ADDRESS
MOVE T2,T1 ;To T2
XHLLI T1,(T2) ;Get section #
HRR T1,(T2) ; and destination address of block
MOVEM T1,BUGP1 ;SAVE POINTER TO BLOCK
SETOM CRSTD1 ;INITIALIZE TIME OF CRASH
SKIPGE TADIDT ;TIME AND DATE NOW SET?
JRST BUGST0 ;NO
MOVE T1,TADIDT ;GET INITIAL TIME
MOVEM T1,CRSHTM ;SAVE IN LOW CORE FOR RELOAD
MOVE T1,TODPWL ;YES, REMEMBER IT FOR RESTART
MUL T1,[1B17] ;COMPUTE UNIV FORMAT (SEE GTAD)
DIV T1,JFDAY
CAML T2,JFDAY2
AOS T1
ADD T1,TADIDT
MOVEM T1,CRSTD1 ;PUT WHERE WILL SURVIVE OVER RELOAD
BUGST0: MOVE T1,BUGCNT ;SEE HOW MANY ARE IN QUEUE
CAIL T1,BUGMAX ;TOO MANY?
JRST BUGSTX ;[7.1158] Yes, count lost BUG and lose
MOVX T1,BG%LEN ;GET LENGTH OF DATA SEG OF SYSERR BLK
MOVX T2,BG%SIZ ;GET SIZE OF BLOCK
CALL ALCSBX ;ALLOCATE A SYSERR BLOCK
JRST BUGSTX ;[7.1158] No space left, count lost BUG & exit
AOS BUGCNT ;COUNT UP THE QUEUED UP BLOCKS
MOVEM T1,BUGSEB ;SAVE ADR OF BLOCK
MOVE T2,[-BUGTLN,,BUGTBL]
CALL SEBCPY ;LOAD UP BLOCK
JFCL ;IGNORING ERRORS
MOVEI T1,20 ;LENGTH OF BLT FOR ALL THE ACS
XMOVEI T2,BUGACS ;GET THEM FROM THE BUGGY ACS
MOVE T3,BUGSEB ;GET POINTER TO BLOCK
XMOVEI T3,SEBDAT+BG%ACS(T3) ;PUT THEM INTO BG%ACS
EXTEND T1,[XBLT] ;BLT
MOVE T1,BUGSEB ;GET BACK THE POINTER TO THE BLOCK
MOVEM P1,SEBDAT+BG%FLG(T1) ;SAVE CHK/HLT FLAG
CONI PI,SEBDAT+BG%PIS(T1) ;SAVE PI FLAGS IN BLOCK
CONI APR,SEBDAT+BG%APS(T1) ;SAVE APR FLAGS IN BLOCK
CONI PAG,SEBDAT+BG%PGS(T1) ;SAVE PAGER FLAGS IN BLOCK
DATAI PAG,SEBDAT+BG%PGD(T1) ;SAVE PAGER DATA IN BLOCK
IFN KLFLG,< ;IF ON THE KL
RDERA SEBDAT+BG%ERG(T1) ;READ ERROR REGISTER
> ;END OF IFN KLFLG
HRRZ T2,FORKX ;SEE IF THERE IS A FORK RUNNING
HRLOM T2,SEBDAT+BG%JOB(T1) ;SAVE FORK NUMBER IN BLOCK
CAIE T2,-1 ;ANY FORK THERE?
SKIPGE FKPT(T2) ;...
JRST BUGST1 ;NO, NO JOB EITHER
MOVE BLK,T1 ;[7240]SAVE THE BLOCK ADDRESS
HLRZ T1,FKJOB(T2) ;[7240]GET LOCAL JOB NUMBER
HRR T2,JOBDIR(T1) ;[7240]GET LOGGED-IN DIRECTORY NUMBER
HRLI T2,USRLH ;[7240]MAKE THIS A USER NUMBER
MOVEM T2,SEBDAT+BG%USR(BLK) ;[7240]STORE IN BLOCK
CALL LCL2GL ;[7240](T1/T1)CONVERT JOB NUMBER TO GLOBAL
IFNSK.
MOVE T1,BLK ;[7240]RESTORE THE BLOCK ADDRESS
JRST BUGST1 ;[7240]ASSUME NO SUCH JOB
ENDIF.
MOVE T2,T1 ;[7240]GET GLOBAL JOB NUMBER IN T2
MOVE T1,BLK ;[7240]RESTORE BLOCK ADDRESS
HRRM T2,SEBDAT+BG%JOB(T1) ;[7240]SAVE JOB NUMBER
ENDAV. ;[7240]
;..
;..
BUGST1: SETZM SEBDAT+BG%RCT(T1) ;MARK NO REGISTERS CURRENTLY
ADDI T1,SEBDAT+BG%REG ;MAKE POINTER TO REGISTER BLOCK
MOVEM T1,BUGP2 ;SAVE POINTER
CAIE P1,BG%HLT ;[7.1081] Was it a BUGHLT?
AOS BUGP1 ;[7.1081] No, bump pointer past config word
BUGSTL: AOS BUGP1 ;STEP POINTER TO BUG CHECK BLOCK
MAP T2,@BUGP1 ;CHECK ADDRESS BEFORE REFERENCING
SMAPOK T2 ;OK TO REF PAGE?
IFNSK.
SETZ T2,
JRST BUGSTD ;CAN'T REFERENCE BLOCK, USE 0 FOR NAME
ENDIF.
MOVE T2,@BUGP1 ;GET FIRST DATA WORD IN BLOCK
TLNE T2,770000 ;SIXBIT NAME?
JRST BUGSTD ;YES, DONE
MOVEM T2,BUGP3 ;SAVE POINTER TO REGISTER TO GET
CAIL T2,20 ;AN AC?
IFSKP.
MOVE T2,BUGACS(T2) ;YES, GET IT FROM SAVED AC BLOCK
ELSE.
MAP T2,@BUGP3 ;CHECK ADDRESS BEFORE REFERENCING
SMAPOK T2 ;OK TO REFERENCE IT?
TDZA T2,T2 ;NO, USE 0 AND SKIP REF
MOVE T2,@BUGP3 ;GET CONTENTS OF REGISTER
ENDIF.
MOVEM T2,@BUGP2 ;SAVE IT IN SYSERR BLOCK
AOS BUGP2 ;STEP POINTER TO SYSERR BLOCK
MOVE T2,BUGSEB ;GET POINTER TO BLOCK
AOS SEBDAT+BG%RCT(T2) ;COUNT UP REGISTER COUNT
JRST BUGSTL ;LOOP BACK TIL ALL COPIED
BUGSTD::MOVE T1,BUGSEB ;GET POINTER TO BLOCK AGAIN
MOVEM T2,SEBDAT+BG%NAM(T1) ;SAVE SIXBIT NAME OF BUG CHECK
MOVEM T2,BUGNAM ;[7.1081] Save SIXBIT name for SETSPD's use
CALL QUESEB ;QUEUE UP ERROR BLOCK
BUGST2:
IFN KLFLG,< ;IF THE KL
MOVEI T1,BUGBUG-BUGBUG ;GET PROPER INDEX FOR MESSAGE
CALL GENBLK> ;DO STATUS
RET
;HERE ON FAILURE.
BUGSTX: AOS BUGLST ;[7.1158] Count lossage, no SYSERR entry
JRST BUGST2 ;[7.1158] Continue with CPU status then return
BUGTBL: SEBPTR 0,SBTEVC,SEC%BG ;EVENT CODE
SEBPTR 0,SBTFNA,LOGBUG ;CALL LOGBUG TO GET MESSAGE STRING
SEBPTR BG%ADR,SBTWD,BUGP1 ;ADDRESS OF BUG HLT/CHK
SEBPTR BG%DAT,SBTWD,CRSTD1 ;TIME AND DATE OF CRASH
SEBPTR BG%SER,SBTWD,APRSER ;APR SERIAL NUMBER
SEBPTR BG%VER,SBTWD,[EXP SVNM] ;VERSION
SEBPTR BG%SDT,SBTWD,SYSTAD ;BUILD TAD OF MONITOR BUILD
SEBPTR BG%CNT,SBTWD,BUGNUM ;NUMBER OF BUG CHECKS SINCE STARTUP
BUGTLN==.-BUGTBL
SUBTTL Write to CTY when PI's are off
;THESE ROUTINES SEND DATA TO THE CTY WHEN PI'S ARE OFF. NOTE THAT
;BUGT0 WAITS FOR CONFIRMATION THAT A CHARACTER WAS SENT
;HERE VIA JSR BUGTYO
;SEND A CHARACTER, AND FILL WITH NULLS IF IT'S A LINE FEED
BUGTY0::
JSR BUGTYC ;OUTPUT THE CHARACTER
CAIN 1,12 ;LF?
JRST [ MOVEI 1,0 ;YES, PAD
JSR BUGTYC
JSR BUGTYC
JSR BUGTYC
JSR BUGTYC
JRST .+1]
JRST @BUGTYO ;RETURN TO CALLER
;HERE VIA JSR BUGTYC
;OUTPUT A SINGLE CHARACTER AND WAIT FOR IT TO GO.
; T1/ CHARACTER TO BE SENT
BUGT0::
IFN KCFLG,< ;KC TYPE OUT ROUTINE
CALL CNBOUT ;DOES A CALL, SO MUST HAVE A STACK!
> ;END OF KCFLG NE CONDITIONAL
IFN DTFLG,< ;THE KL BUG TYPE OUT CODE
SETZM DTETMD ;CLEAR FLAG
TXO A,DTEMNO ;SET COMMAND FOR OUTPUT
MOVEM A,DTECMD ;SET IN COMMAND WORD
MOVEI A,DTEEDB ;MUST RING BELL
XCT DTSCNW ;DO IT
SKIPN DTETMD ;WAIT FOR RESPONSE
JRST .-1
LDB A,[POINT 7,DTECMD,35] ;RESTORE CHARACTER
> ;END OF DTFLG NE CONDITIONAL
JRST @BUGTYC ;RETURN TO CALLER
;HERE VIA JSR BUGMSG
;TYPE A STRING. REPLACE "$" WITH <CR><LF>. TERMINATE ON "/".
; T1/ ADDRESS OF STRING
BUGMS0::
MOVEM 7,BUG7 ;PRESERVE AN AC
MOVE 7,1
HRLI 7,440600
BUGM2: ILDB 1,7
ADDI 1,40
CAIN 1,"/"
JRST BUGM5 ; / MARKS END OF STRING
CAIN 1,"$"
JRST BUGM1
BUGM3: JSR BUGTYO
JRST BUGM2
;FOUND A "$". REPLACE IT WITH <CR><LF>.
BUGM1: MOVEI 1,15
JSR BUGTYO
MOVEI 1,12
JRST BUGM3
;FOUND A "/". THIS COMPLETES THE STRING
BUGM5:
BUGM6: MOVE 7,BUG7 ;RESTORE AC
JRST @BUGMSG ;RETURN TO CALLER
RS BUG7,2 ;TEMP
;HERE VIA JSR BUGNO
;TYPE A NUMBER
; T1/ THE VALUE TO BE TYPED
BUGNO0::
DMOVEM T2,BUG7 ;PRESERVE AN AC
MOVE T2,T1
MOVNI T3,14 ;THERE ARE 14 DIGITS IN NUMBER
BUGN1: SETZ T1,
LSHC T1,3 ;GET FIRST DIGIT
ADDI T1,60 ;MAKE IT ASCII
JSR BUGTYO ;TYPE IT OUT
AOJN T3,BUGN1 ;LOOP FOR ALL DIGITS
DMOVE T2,BUG7 ;RESTORE AC'S
JRST @BUGNO ;RETURN
;LOCAL TYPOUT OF WORD IN OCTAL
BUGWPT: PUSH P,T1
HLRZ T1,T1
CALL BUGOPT ;TYPE LH
MOVEI T1,","
JSR BUGTYO
JSR BUGTYO
POP P,T1
HRRZ T1,T1
CALL BUGOPT ;TYPE RH
RET
;NON-PI OCTAL NUMBER TYPEOUT ON CONSOLE TTY
;8-OCTIT, USED FOR PHYSICAL ADDRESSES
BUGOP8: SAVEAC <Q1,Q2>
MOVE Q2,[POINT 3,Q1,11]
JRST BUGOP0
;6-OCTIT
BUGOPT: SAVEAC <Q1,Q2>
MOVE Q2,[POINT 3,Q1,17]
BUGOP0: MOVEM T1,Q1 ;SAVE NUMBER
BUGOPA: ILDB T1,Q2 ;GET NEXT OCTIT
ADDI T1,"0" ;CONVERT TO ASCII
JSR BUGTYO ;TYPE IT
TXNE Q2,77B5 ;BYTE PTR AT END OF WORD?
JRST BUGOPA ;NO, LOOP
RET ;YES, DONE
SUBTTL Routines to switch protocols with front end
IFN DTFLG,<
;HERE VIA JSR BUGMON
;ENTER SECONDARY PROTOCOL
BUGM0::
DMOVEM T1,BUG7 ;SAVE WORK REGISTERS
MOVE T2,MSTRDT ;GET ID OF MASTER DTE
LSH T2,SDTE ;FIND DTE SET
SKIPN T1,DTEEPW(T2) ;IN PRIMARY?
JRST BUGEXT ;NO. ALL DONE
MOVEM T1,SVVEXM ;SAVE VALUE
SETZM DTEEPW(T2) ;FORCE MONITOR PROTOCOL
MOVEI T1,DTEEDB ;GET CODE FOR DOOR BELL
MOVE T2,DTSCNW ;GET CONO WORD
ADD T2,[<CONSZ 0>-<CONO 0>] ;MAKE A TEST INSTRUCTION
XCT T2 ;WAIT FOR -11 DOORBELL TO CLEAR
JRST .-1
MOVEI T1,DTEEMP ;GET COMMAND
SETZM DTEFLG ;CLEAR FLAG
MOVEM T1,DTECMD ;THE COMMAND WORD
MOVEI T1,DTEEDB ;MUST RING BELL
XCT DTSCNW ;DO IT
SKIPN DTEFLG ;-11 ANSWER?
JRST .-1 ;NO
BUGEXT: DMOVE T1,BUG7 ;RESTORE REGS
JRST @BUGMON ;YES. DONE
;HERE VIA JSR BUGPRI
;ENTER PRIMARY PROTOCOL
BUGP0::
DMOVEM T1,BUG7 ;SAVE REGS
MOVE T2,MSTRDT ;GET ID OF MASTER DTE
LSH T2,SDTE ;FIND EPT SET
SKIPE DTEEPW(T2) ;NOW IN MONITOR PROTOCOL?
JRST BUGEX1 ;NO. JUST GET OUT
SKIPN T1,SVVEXM ;GET SAVED VALUE
JRST BUGEX1 ;NO. NOTHING TO DO
SETZM SVVEXM ;LEAVE IT 0 FOR THE NEXT GUY
MOVEM T1,DTEEPW(T2) ;TURN ON VALID EXAMINE
MOVEI T1,DTEEPP ;ENTER PRIMARY
SETZM DTEFLG ;THE FLAG
MOVEM T1,DTECMD ;THE COMMAND WORD
MOVEI T1,DTEEDB ;SET UP TO RING -11'S BELL
XCT DTSCNW ;DO IT
SKIPN DTEFLG ;ANSWER YET?
JRST .-1 ;NO
BUGEX1: DMOVE T1,BUG7 ;RESTORE REGS
JRST @BUGPRI ;YES. ALL DONE
>
IFN KCFLG,<
BUGM0:: JSR KCMON ;Go do KC style of protocol switch
JRST @BUGMON ;And done
BUGP0:: JSR KCPRI ;Go do KC style
JRST @BUGPRI ;And done
> ;End of IFN KCFLG
IFN SMFLG,<
;HERE VIA JSR BUGMON -- ENTER MONTIOR MODE
BUGM0:: SKIPE PROFLG ;IF PROTOCOL POSSIBLE DO IT
JRST [ SETZM FEFLG ;CLEAR FE FLAG
MOVEM T1,SVVEXM ;SAVE REGISTER
MOVE T1,RLWORD ;GET RELOAD WORD
EXCH T1,SVVEXM ;RESTORE REGISTER AND SAVE RELOAD WORD
SETZRO KPACT ;STOP KEEPALIVE
JRST .+1]
JRST @BUGMON
;HERE VIA JSR BUGPRI -- ENTER PRIMARY MODE
BUGP0:: SKIPE PROFLG ;IF PROTOCOL POSSIBLE DO IT
AOS FEFLG ;SET FLAG
EXCH T1,SVVEXM ;RESTORE RELOAD WORD
MOVEM T1,RLWORD
MOVE T1,SVVEXM ;RESTORE REGISTER
JRST @BUGPRI ;RETURN
> ;END IFN SMFLG
SUBTTL Clock Service
;CLOCK INITIALIZATION
CLKINI: MOVE T1,[^D<24*3600*1000>]
MOVEM T1,JFDAY ;COMPUTE JIFFIES PER DAY
IDIVI T1,2 ;AND HALF THAT FOR ROUNDING
MOVEM T1,JFDAY2
MOVX T1,BASOV0 ;COMPUTE HP CLOCK OVERFLOW VALUE
SETZ T2,
DIV T1,BASNDV
MOVEM T1,BASOVV ;SAVE IT FOR USE BY MTIME CALLERS
IFN KLFLG,<
MOVE T1,[XPCW TIMINT]
>
IFN KCFLG,<
MOVE T1,[TIMINT]
>
MOVEM T1,TIMVIL
CALL MTRON ;TURN ON METER AND INTERVAL TIMER
RET
;MTRON - Enable meter updates.
MTRON::
;Turn on the interval counter. Clear it (TIMCIC), turn it on (TIMITO),
;clear flags (TIMDON), and initialize its period (TIMTMS)
IFN KLFLG,<
CONO TIM,TIMCIC+TIMITO+TIMDON+TIMTMS
>
IFN KCFLG,<
WRINT TIMCIC+TIMITO+TIMDON+TIMTMS
>
IFN KLFLG,<
;Turn on the time base, and assign interrupt level for interval counter
;Load accounts (MTRLOD), turn on time base (MTRTBN), clear time base (MTRCTB),
;turn on accounting (MTRAMN), assign interrupt level (TIMCHN).
;PIBITS is defined in STG as 0 but can be changed to enable accounting
;for PI or non-PI exec mode
CONO MTR,MTRLOD+MTRTBN+MTRCTB+MTRAMN+PIBITS+FLD(TIMCHN,MTRPIA)
> ;END OF IFN KLFLG
IFN KCFLG,<
;Turn on the time base, and assign interrupt level for interval counter
;Load PI level for timer (WRBLPI), load time base controls (TMBLTB),
;clear time base (WTBCTB), turn on time base (TMBBON), assign interrupt
;level (TIMCHN).
WRTMB TMBLPI+TMBLTB+TMBCTB+TMBBON+FLD(TIMCHN,TMBPIA)
;Turn on user run time meter. Load controls (ACTLOD), turn on meter (ACTAON)
;PIBITS is defined in STG as 0 but can be changed to enable accounting
;for PI or non-PI exec mode
WRACT ACTLOD+ACTAON+PIBITS
> ;End of IFN KCFLG
RET ;AND DONE
;INTERVAL TIMER INTERRUPT SERVICE
;The timer counts in units of 10 usec. We set it to interrupt once per ms.
;The scheduler stores a number of milliseconds in SCKATM. When the clock
;interrupts, this routine decrements the count. When the count goes to zero,
;it issues a channel 7 interrupt, which causes the scheduler to run at PISC7.
;NOTE: On both the KL and the KC, the counter is automatically cleared
;when DONE is set and the interrupt occurs. Thus this code turns on the timer
;(TIMITO), clears flags (TIMDON), and sets the interval (TIMTMS). It does
;not clear the counter.
TIMIN0:
IFN KLFLG,<CONO TIM,TIMITO+TIMDON+TIMTMS> ;CLEAR DONE
IFN KCFLG,<WRINT TIMITO+TIMDON+TIMTMS>
SOSN SCKATM ;DECREMENT SCHED ALARM, DUE NOW?
ISB SCDCHN ;YES. CAUSE LEVEL 7 INTERRUPT
XJEN TIMINT ;DISMISS INT
;UPDATE TODCLK - DONE ONLY ON REQUEST
;Read the time base and convert to milliseconds for TODCLK
UPDTCK::RDTIME T1 ;READ TIME BASE
DIV T1,BASDIV ;CONVERT TO MILLISECONDS
MOVEM T1,TODCLK ;UPDATE MS CLOCK
MOVEM T1,TODPWL ;UPDATE GTAD CLOCK
RET
;read clock, convert to normal millisecond units
GETMST::RDTIME T1 ;READ TIME BASE
DIV T1,BASDIV
RET
;READ HIGH-PRECISION CLOCK
;Convert time base to high precision clock units modulo 2**36-1.
; JSP T4,MTIME
;Returns via T4: always
; T1/ time base as converted in 10 microsec
; CX/ time base in units as small as possible /WARNING- CX IS USED/
MTIME:: RDTIME T1 ;READ TIME BASE
ANDI T1,BASOV0-1 ;DO MODULO 76 HOURS
; ASHC T1,-<^D35-BASBIT> ;TIME IN T2 IN MICROSECONDS
; MOVE CX,T2 ;STORE IT IN CX
; DIV T1,BASDV2 ;CONVERT TO HP UNITS
DIV T1,BASNDV ;CONVERT TO HP UNITS
JRST 0(4)
;GETMID - ROUTINE TO GENERATE A MEDIA ID FOR A STRUCTURE. THE LOW ORDER
; PART OF TIMBAS IS USED, SINCE AT STRUCTURE CREATION TIME THE
; NORMAL TIME AND DATE (A LA LGTAD) MAY NOT YET EXIST.
;
;CALL: CALL GETMID
;RETURNS: +1 ALWAYS, WITH T1/ MEDIA ID
IFN KLFLG,<
GETMID::MOVE T1,TIMBAS+1 ;GET LOW ORDER PART OF TIMBAS AS MEDIA ID
> ;END IFN KLFLG
IFN KCFLG,<
GETMID::PUSH P,T2 ;SAVE T2
RDTIME T1 ;READ TIME BASE
EXCH T1,T2 ;RETURN LOW ORDER TIME BASE
POP P,T2 ;RESTORE T2
> ;END IFN KCFLG
RET ;RETURN
SUBTTL DTE Control Routines
;DTE20 INITIALIZATION
;START MONITOR IN SECONDARY PROTOCOL
IFN DTFLG,<
DTEINS: MOVE T1,[MSEC1,,DTESV0]
MOVEM T1,DTESV+3 ;INTERRUPT INITIATION
SETZM DTESV+2
MOVE T2,MSTRDT ;GET MASTER DTE
LSH T2,SDTE ;FIND CORRECT EPT SET
MOVE T1,[XPCW DTESV]
MOVEM T1,DTEINT(T2)
MOVEI T1,DTEMMN ;TURN ON MONITOR MODE TTY
SETZM DTEFLG
MOVEM T1,DTECMD
MOVEI T1,DTEEDB+DTEPIE+DTECHN ;POKE -11 AND SET UP PI
XCT DTSCNW ;DO IT
SKIPN DTEFLG ;WAIT FOR COMPLETION
JRST .-1
RET
;SEND TTY CHARACTER VIA DTE20
; T1/ CHARACTER
; T2/ LINE NUMBER
; CALL DTECHO
; RETURN +1, FAILURE, UNKNOWN LINE.
; RETURN +2, SUCCESS CHARACTER SENT. TTODON WILL BE CALLED WHEN
; OUTPUT HAS BEEN COMPLETED
DTECHO::CAME T2,CTYLNO ;CTY?
RET ;NO, NOTHING ELSE SUPPORTED YET
TXO T1,DTEMNO ;SET MONITOR MODE OUTPUT
MOVEM T1,DTECMD ;PUT WHERE -11 SEES IT
MOVEI T1,DTEEDB ;NEED TO RING -11'S BELL
XCT DTSCNW ;DO IT
RETSKP
;DTE20 INTERRUPT SERVICE
;HERE FROM JSR IN VECTOR INTERRUPT LOCATION
DTESV0: MOVEM P,DTEACB+P ;SAVE HIGH ONE
MOVEI P,DTEACB ;WHERE TO SAVE THE REGS
BLT P,DTEACB+T4 ;SAVE TEMPS
MOVE P,DTESTK ;SET UP LOCAL STACK
PUSH P,CX ;SAVE GENERAL TEMP
MOVEI T1,DTETDB ;CLEAR OUR BELL
XCT DTSCNW ;DO IT
SKIPE DTETMD ;TTY OUTPUT DONE?
JRST DTECO ;YES
SKIPE DTEMTI ;TTY INPUT READY?
JRST DTECI ;YES
DTESVX: POP P,CX ;RESTORE REGS
MOVSI T4,DTEACB
BLT T4,T4
MOVE P,DTEACB+P
XJEN DTESV ;DISMISS
DTECO: SETZM DTETMD ;CLEAR FLAG
MOVE T2,CTYLNO ;ASSUME CTY
CALL TTODON ;NOTIFY TTYSRV
JRST DTESVX
DTECI: MOVE T1,DTEF11 ;GET FROM-11 DATA
MOVE T2,CTYLNO ;ASSUME CTY
SETZM DTEMTI ;CLEAR FLAG
CALL TTIDON ;PASS CHAR TO TTYSRV
JRST DTESVX
> ; END IFN DTFLG
SUBTTL Cache Control
;CACHE CONTROL
IFN KLFLG,<
;TURN CACHE ON
CASHON::SETOM CASHF ;INDICATE CACHE ON
CONSZ PAG,PGCLKE+PGCLDE ;CASH NOW ON?
RET ;YES, DO NOTHING
CONI PI,T2 ;SAVE PI STATE
PIOFF
CCHIA ;INVALIDATE ALL
CONSO APR,APSWPD ;WAIT UNTIL DONE
JRST .-1
CONOAPR APFCLR+APSWPD ;CLEAR DONE BIT
MOVX A,PGCLKE+PGCLDE
IORM A,CONOPG ;SET CACHE ENABLE BITS
CONO PAG,@CONOPG ;DO IT
TXNE T2,PIPION ;RESTORE PI STATE
PION
RET
;TURN CACHE OFF
CASHOF::SETZM CASHF ;INDICATE CACHE OFF
CONSO PAG,PGCLKE+PGCLDE ;CASH NOW OFF?
RET ;YES, DO NOTHING
MOVX A,PGCLDE ;NO. GET LOAD BIT
ANDCAB A,CONOPG ;CLEAR LOAD LEAVING ONLY LOOK
CONO PAG,@A ;SET CACHE TO LOOK ONLY
CCHUA ;STORE ALL CACHE DATA
CONSO APR,APSWPD
JRST .-1 ;WAIT FOR DONE
CONOAPR APFCLR+APSWPD ;CLEAR DONE BIT
TXZ A,PGCLKE+PGCLDE ;CLEAR CACHE ENABLE BITS
CONO PAG,@A ;TELL HARDWARE
MOVEM A,CONOPG
RET
;FLUSH A SPECIFIED PAGE FROM THE CACHE
;T1/ PHYSICAL PAGE
; CALL CASHFP
;RETURNS+1(ALWAYS):
; PAGE WRITTEN BACK AND INVALIDATED
;PRESERVES ALL ACS
CASHFP::CCHUO (T1) ;START UNLOAD SWEEP
CONSO APR,APSWPD ;WAIT FOR DONE FLAG
JRST .-1 ; ...
CONOAPR APFCLR+APSWPD ;CLEAR FLAG
RET ;DONE
> ;END IFN KLFLG
IFN KCFLG,<
;The state of the cache is controlled by the hardware and the console, not
;by the operating system. We can determine the state of the cache via RDEBR.
CASHON::RET
CASHOF::RET
CASHFP::RET
> ;END IFN KCFLG
SUBTTL Context Handling Routines
;INIT NEWLY CREATED FORK
FKSETK::MOVE 1,[XWD IUPT0,UPTTPI]
BLT 1,UPTTPI+NIUPT-1 ;INIT UPT
MOVE 1,[MSEC1,,ENSKED]
MOVEM 1,ENSKR+3
MOVX T1,MONENV ;NEW FLAGS WORD
MOVEM T1,ENSKR+2
MOVE A,[MSEC1,,PGRTRP]
IFN KLFLG,<
MOVEM A,UPTPFN ;SETUP PAGE FAIL NEW PC
SETZM UPTPFL
>
IFN KCFLG,<
MOVEM A,KCPFNP
SETZM KCPFOF ;OLD FLAGS
MOVX T1,MONENV ;NEW FLAGS WORD
MOVEM T1,KCPFNF
>
RET
;UPT AND EPT TEMPLATES
LUUNUL==<7777,,-1> ;DEFAULT ADDRESS -- CAUSES LUUO TO CONVERT TO
;ILLEGAL MEMORY REFERENCE
IFN KLFLG,<
GSOPDEF .AROVT,<41B8> ;AR OV, USER ONLY
GSOPDEF .PDOVT,<42B8> ;PDL OV, USER OR MONITOR
;IUPT0 - TEMPLATE FOR UPT. COPIED INTO A PROCESS'S PSB WHEN IT IS CREATED
;First location is LUUO word. If left as initalized below, an
;LUUO by the user (from non-zero section) will cause an illegal memory
;reference. User can change the location via SWTRP JSYS.
IUPT0: LUUNUL ;LUUO TRAP WORD (420)
;Next three locations are trap words. Initial values cause trap 1 and trap 3
;to be ignored. Trap 2 (push down overflow) executes an MUUO.
;If user has executed SWTRP JSYS or enabled for interrupts on arithmetic
;overflow, next location contains an MUUO.
JFCL ;USER ARITHMETIC OVERFLOW TRAP (421)
.PDOVT ;USER PDL OV TRAP (422)
JFCL ;USER TRAP 3 (423)
;Next 4 words are MUUO block. Microcode stores into them when MUUO is
;executed.
0 ;FLAGS, OP CODE, AC, PCS (424)
0 ;PC (425)
0 ;E (426)
0 ;PROCESS CONTEXT WORD (427)
;Next 8 words are trap function words. Each contains location to which
;control is transferred when an MUUO is executed under the conditions
;indicated (trap/no-trap, EXEC mode/user mode)
MSEC1,,KIMUOM ;KERNAL NO-TRAP (JSYS) (430)
MSEC1,,KITRPM ;KERNAL TRAP (PAGING, PDL OV) (431)
MSEC1,,KIMUOS ;SUPV. NO-TRAP (NOT USED) (432)
MSEC1,,KITRPS ;SUPV. TRAP (NOT USED) (433)
MSEC1,,KIMUOU ;USER (CONC.) NO-TRAP (434)
MSEC1,,KITRPU ;USER (CONC.) TRAP (435)
MSEC1,,KIMUOU ;USER (PUBLIC) NO-TRAP (JSYS, 10/50) (436)
MSEC1,,KITRPU ; " TRAP (PAGING, OV, PDL OV) (437)
NIUPT==.-IUPT0
> ;END IFN KLFLG
IFN KCFLG,<
TRFUNC==:MASKB(0,1)
TRNOP==:FLD (0,TRFUNC) ;IGNORE ERROR
TRMON==:FLD (1,TRFUNC) ;TRAP TO MONITOR
TRUSER==:FLD (2,TRFUNC) ;TRAP DIRECTLY TO USER
AROVPC==:TRMON+<MSEC1>B17+KIAROV ;WHERE TO GO ON USER ARITHMETIC OVERFLOW
PDOVPC==:TRMON+<MSEC1>B17+KIPDOV ;WHERE TO GO ON USER PDL OVERFLOW
EXOVPC==:TRMON+<MSEC1>B17+KITRPM ;WHERE TO GO ON EXEC MODE PDL OVERFLOW
;IUPT0 - TEMPLATE FOR UPT. COPIED INTO A PROCESS'S PSB WHEN IT IS CREATED
;First location is LUUO word. If left as initalized below, an
;LUUO by the user (from non-zero section) will cause an illegal memory
;reference. User can change the location via SWTRP JSYS.
IUPT0: LUUNUL ;LUUO TRAP WORD
;Next three locations are trap words. Initial values cause trap 1 and trap 3
;to be ignored. Trap 2 (push down overflow) simulates an MUUO.
;If user has executed SWTRP JSYS or enabled for interrupts on arithmetic
;overflow, next location contains monitor PC
TRNOP ;NOP function word -- arithmetic overflow (420)
PDOVPC ;Monitor address -- PDL overflow (421)
TRNOP ;NOP function word -- trap 3 (422)
;Next four words are stored on any kind of MUUO.
0 ;Flags, CAB, PAB, PCS (424)
0 ;PC (425)
0 ;op code and AC (426)
0 ;E (427)
;Next word is new flags word for all MUUO's.
MONFLG ;Flags, CAB and PAB(430)
;Next words are transfer addresses for various kinds of MUUO.
MSEC1,,VMENT ;Trapped instruction in virtual machine mode (431)
MSEC1,,EXUUO ;Exec mode unassigned op code or 0 (432)
MSEC1,,USUUO ;User mode unassigned op code or 0 (433)
MSEC1,,EXUIO ;Exec mode unassigned I/O op code (434)
MSEC1,,USUIO ;User mode unassigned or illegal I/O op code (435)
MSEC1,,EXEXT ;Exec mode undefined EXTEND code (436)
MSEC1,,USEXT ;User mode undefined EXTEND code (437)
MSEC1,,EXJSYS ;Exec mode JSYS (440)
MSEC1,,USJSYS ;User mode JSYS (441)
MSEC1,,EXMUUO ;Exec mode other MUUO (442)
MSEC1,,USMUUO ;User mode other MUUO (443)
NIUPT==.-IUPT0
> ;END IFN KCFLG
IFN KLFLG,<
;Prototype EPT LUUO and trap words
;If the monitor executes an LUUO from non-zero section, it BUGHLT's
;at .LBCHK.
IEPT0: MSEC1,,.LUTRP ;LUUO FROM MONITOR
JFCL ;MONITOR AROV
.PDOVT ;MONITOR PDL OV
JFCL ;MONITOR TRAP 3
NIEPT==.-IEPT0
> ;End of IFN KLFLG
IFN KCFLG,<
;Prototype EPT LUUO and trap words
IEPT0: MSEC1,,.LUTRP ;LUUO from monitor non-zero section (420)
TRNOP ;Exec mode arithmetic overflow (421)
EXOVPC ;Exec mode PDL overflow (422)
TRNOP ;Exec mode trap 3 (423)
NIEPT==.-IEPT0
> ;End of IFN KCFLG
; LUUO FROM MONITOR CONTEXT TRAP
RSI .LUTRP,<0,0,0,<MSEC1,,.LBCHK>> ;LUUO BLOCK
.LBCHK: BUG.(HLT,LUUMON,APRSRV,SOFT,<.LBCHK: Illegal LUUO from monitor context>,,<
Cause: While running in a non-zero section, the monitor executed an
LUUO. The LUUO block is at the 4 locations starting at .LUTRP.
Note that the hardware reference manual incorrectly states that
an LUUO in exec mode becomes an MUUO.
>)
;Here when monitor executed a JSYS. Transferred through UPT offset 440 (KC)
IFN KCFLG,<
EXJSYS:
;..
> ;End of IFN KCFLG
;Here for Kernel or Supervisor No-trap MUUO (KL)
IFN KLFLG,<
KIMUOS:
KIMUOM: LDB CX,[POINT 9,KIMUFL,26] ;GET OPCODE
CAIE CX,<JSYS>B62 ;JSYS?
JRST KIMUO4 ;NO
> ;End of IFN KLFLG
;Monitor executed a JSYS. See what kind it is.
HRRZ CX,KIMUEF ;YES, GET E
CAIGE CX,1000 ;EXEC JSYS?
JRST MENTM ;YES, GO TO ENTRY SEQUENCE
CAIG CX,DMSMAX ;DMS JSYS?
JRST BADDMS ;YES, NOT ALLOWED FROM THE MONITOR
;This is "JSYS E", where E points to a word containing (where to store old
;PC,,new PC). Transfer control to the new PC.
BUG.(CHK,ILLMJS,APRSRV,SOFT,<JSYS with E GTR 1000 executed in monitor>,<<FPC,PC>>,<
Cause: A JSYS with E greater than 1000 has been executed in the monitor.
There should be no such cases.
Data: PC - PC of JSYS
>)
MOVS CX,0(CX) ;NO, SIMULATE JSYS (NOT USED BY
HRRZ 2,CX ;GET ADDRESS ONLY
MOVEM 1,0(2) ; ANY MONITOR CODE, ONLY MDDT)
MOVE 1,FPC ;GET PC
EXCH 1,0(2) ;STORE IT VIA LH OF E
HLRM CX,FPC ;SETUP JUMP ADDRESS
XCT MJRSTF ;JUMP
;Monitor executed a DMS JSYS. Complain.
BADDMS: BUG.(HLT,ILLDMS,APRSRV,SOFT,<BADDMS - Illegal DMS JSYS from monitor context>,<<KIMUPC,PC>>,<
Cause: The monitor has issued a JSYS that requests a service of the
RMS-20 package. These JSYSs are legal in user mode only.
An illegal instruction trap will be given to the current
process.
Data: PC - PC in monitor address space where JSYS was invoked
>)
;Here when monitor executed an unassigned op code. Transferred through UPT
;offset 432. (KC)
IFN KCFLG,<
EXUUO: LDB CX,[POINT 9,KIMOAC,26] ;GET THE OP CODE
;..
>
;Here when op code is not 104 (for JSYS). See what it is.
;The cause appears to be an ILLUUO. It is possible that
;the cause of the ILLUUO is a PXCT of a byte instruction with a bad
;byte pointer. If the user sends a <<77B5>!<ANYTHING ELSE>> as a
;byte pointer to a JSYS (EG. PSOUT) then an ILLUUO will result.
;We will check the PC that caused the ILLUUO. If it contains a PXCT
;of a byte instruction then we will generate an illegal instruction
;trap and not crash. This code assumes that section zero and section
;one have a common map. This code also assumes that monitor code will
;never execute code in sections other than zero and one.
; CX/ opcode
KIMUO4: IFN KCFLG,<
JRST KIBADU ;ILLUUO ON KC
> ;END OF IFN KCFLG
IFN KLFLG,<
ADJSP P,10 ;LEAVE RECENT STACK ALONE IN CASE DEBUGGING
;SEE IF IT WAS A PXCT OF A BYTE POINTER
BLOCK. ;BE A SUBROUTINE
SAVET ;SAVE ALL TEMP ACS
STKVAR <<KIMXT,2>,KIMXPC> ;WE NEED SOME STORAGE
DMOVEM T1,KIMXT ;SAVE CURRENT T1 AND T2
HRRZ T1,KIMUPC ;GET THE UUO PC
SOJ T1, ;GET THE PC OF INST THAT CAUSED ILLUUO
MOVEM T1,KIMXPC ;SAVE THE ILLUUO PC
MOVE T1,KIMXT ;RESTORE T1
MOVE T2,@KIMXPC ;GET THE INSTRUCTION WORD
LDB T1,[POINT 9,T2,8] ;GET THE OPCODE
CAIE T1,<<IBP>_-^D27> ;IS IT AN IBP OR ADJBP
JRST [CAIE T1,<<XCT>_-^D27> ;NO, AN XCT?
JRST KIBADU ;NO, THAT'S TOO BAD.
JRST KIMXLP] ;YES, TRACE IT DOWN
;BYTE INSTR OR XCT OF BYTE INSTR IS OK
KIMXOK: MOVEI T1,ARGX09 ;SAVE ERROR CODE
MOVEM T1,LSTERR
DMOVE T1,KIMUFL ;GET FL AND PC
CALL ITRSIM ;ERRJMP AVAILABLE?
IFNSK.
MOVEI 1,.ICILI ;INITIATE ILLEGAL INSTRUCTION INTERRUPT
CALL PSIRQ0
CHKINT ;GET THE INTERRUPT "SEEN"
ELSE.
MOVEM T3,KIMUPC ;HAS AN ERRJMP SAVE NEW PC
ENDIF.
ENDBK.
ADJSP P,-10 ;RESET STACK
XCT MJRSTF ;RETURN
;TRACE XCT
KIMXLP: CAIE T1,<<XCT>_-^D27> ;IS IT AN XCT?
JRST [CAIL T1,133 ;NO, IS IT A BYTE INSTRUCTION?
CAILE T1,137 ;IS IT A BYTE INSTRUCTION?
JRST KIBADU ;NO, LOSER.
JRST KIMXOK] ;YES, OK
TXZ T2,<777>B8 ;ZERO THE OPCODE FIELD
TXO T2,IFIW ;MAKE THIS AN IFIW POINTER
MOVEM T2,KIMXPC ;SAVE IT AS THE NEW PC
DMOVE T1,KIMXT ;RESTORE ACS SO THAT INDEXING IN THE INDIRECT
MOVE T2,@KIMXPC ;GET THE INSTRUCTION WORD
LDB T1,[POINT 9,T2,8] ;GET THE OPCODE
JRST KIMXLP ;LOOP TO FIND NEXT INSTRUCTION
> ;END OF IFN KLFLG
IFN KCFLG,<
;Here when monitor executed an unassigned I/O instruction. Transferred
;through UPT offset 434. (KC)
EXUIO::
;Here when monitor executed an unassigned EXTEND instruction. Transferred
;through UPT offset 436. (KC)
EXEXT::
;Here when monitor executed an MUUO. Transferred through UPT offset 442. (KC)
EXMUUO::
;..
> ;End of IFN KCFLG
;Monitor executed illegal UUO. Complain.
KIBADU: BUG.(HLT,ILLUUO,APRSRV,SOFT,<KIBADU - Illegal UUO from monitor context>,<<KIMUFL,FLAGS>,<KIMUPC,PC>,<KIMUEF,EFFADR>>,<
Cause: The monitor has executed an instruction that the microcode
treats as an MUUO. The op code is not 104 (for a JSYS) or one
of the KA10 floating point instructions.
Action: Look for the software bug. Repeated occurrence of this
BUGHLT may indicate a hardware problem.
Data: FLAGS - Processor flags when MUUO was executed
PC - PC in monitor address space where MUUO was executed
EFFADR - Effective address of MUUO
>)
;Here when user executed a JSYS. Transferred through UPT offset 441. (KC)
IFN KCFLG,<
USJSYS: HRR CX,KIMOAC ;GET OP CODE AND AC
HLL CX,KIMUFL ;GET FLAGS WORD
MOVEM CX,KIMUU1 ;SAVE FIRST WORD
MOVE CX,KIMUEF ;GET E
MOVEM CX,KIMUU1+1 ;SAVE SECOND WORD
;..
>
;Here for concealed or public (user) no-trap MUUO. Transferred through
;UPT offset 434 or 436. (KL)
IFN KLFLG,<
KIMUOU: DATAO PAG,SETMON ;SET MONITOR CONTEXT
;Save PC and effective address. Transfer according to op code
KIMUOT: MOVE CX,KIMUFL ;GET FLAGS,OP CODE, AC
MOVEM CX,KIMUU1 ;SAVE IT AS LAST USER UUO
MOVE CX,KIMUEF ;GET EFFECTIVE ADDRESS
MOVEM CX,KIMUU1+1
LDB CX,[POINT 9,KIMUFL,26] ;GET OPCODE
CAIE CX,<JSYS>B62 ;JSYS?
JRST KIMUO2 ;NO
;..
> ;End of IFN KLFLG
;User executed a JSYS. See what kind it is.
;..
HRRZ CX,KIMUEF ;YES, GET E
CAIGE CX,1000 ;EXEC JSYS?
JRST MENTU ;YES, GO TO ENTRY SEQUENCE
CAIG CX,DMSMAX ;DMS JSYS?
JRST DMSENT ;YES, GO JUMP TO DMS CODE
;This is "JSYS E", where E points to a word containing (where to store old
;PC,,new PC). Transfer control to the new PC in user mode. This works only
;if JSYS is called from section 0.
MOVE 1,FPC ;NO, SIMULATE ORDINARY JSYS
TXNE 1,VSECNO ;SECTION 0?
JRST ILUUO ;NO. ERROR THEN
HLL 1,FFL ;SAVE FLAGS
XCTU [MOVS CX,0(CX)] ;GET C(E)
HRRZ 2,CX ;GET ADDRESS ONLY
XCTU [MOVEM 1,0(2)] ;STORE PC PER LH OF C(E)
HLR 1,CX ;JUMP ADDRESS - COMBINE WITH FLAGS
TLZ 1,(FPD) ;FLAGS UNCHANGED EXCEPT FPD CLEARED
HLLM 1,FFL ;SET FLAGS AND PC (NO EXADR BITS!)
HRRZM 1,FPC
JRST GOUSR ;RETURN TO USER
IFN KCFLG,<
;Here when user executed an MUUO. Tranferred through UPT offset 442.
;Call the compatibility package
USMUUO: HRR CX,KIMOAC ;GET OP CODE AND AC
HLL CX,KIMUFL ;GET FLAGS WORD
MOVEM CX,KIMUU1 ;SAVE FIRST WORD
MOVE CX,KIMUEF ;GET E
MOVEM CX,KIMUU1+1 ;SAVE SECOND WORD
JRST UU1050 ;CALL THE COMPATIBILITY PACKAGE
> ;End of IFN KCFLG
IFN KLFLG,<
;Not a JSYS. See what it is. If TOPS-10 UUO, go to the compatibility package.
KIMUO2: CAIL CX,100 ;POSSIBLY A TOPS10 UUO?
JRST KIMUO3 ;NO
CAIL CX,40
JRST UU1050 ;YES, GO TO COMPATBILITY PACKAGE
JUMPE CX,ILUUO ;0 IS ALWAYS ILLEG
;Remaining op codes are LUUO's. They shouldn't come to the monitor
BUG.(HLT,IMPUUO,APRSRV,HARD,<Impossible MUUO>,,<
Cause: The monitor was called at its MUUO handler because the user
executed an MUUO. However, the op code reported by the
microcode is in the range 1-37, which should have caused
an LUUO.
>)
>
IFN KCFLG,<
;Here when user executed an unassigned op code. See if it was a KA
;floating point instruction.
USUUO: HRR CX,KIMOAC ;GET OP CODE AND AC
HLL CX,KIMUFL ;GET FLAGS WORD
MOVEM CX,KIMUU1 ;SAVE FIRST WORD
MOVE CX,KIMUEF ;GET E
MOVEM CX,KIMUU1+1 ;SAVE SECOND WORD
LDB CX,[POINT 9,KIMOAC,26] ;GET THE OP CODE
>
;Not a JSYS or a UUO. TEST FOR INTERPRETED OPCODES
KIMUO3:
IFN KLFLG,< ;IF KL CHECK FOR GFLT STUFF
CAIN CX,<<EXTEND>_-^D27> ;IS OPCODE AN EXTEND?
JRST GFLT0 ;YES...GO CHECK FOR GFLT
>
;Here for user mode KA floating point instructions.
;DISPATCH TO KA10 LONG FLOATING POINT SIMULATION ROUTINE, UFA(130),
;DFN(131), FADL(141), FSBL(151), FMPL(161), FDVL(171).
MCENTR ;ESTABLISH CONTEXT
LDB CX,[POINT 9,KIMUU1,26] ;GET OPCODE
CAIL CX,130 ;WITHIN LONG FLOATING POINT RANGE?
CAILE CX,171
JRST ILUUO1 ;NO, UNKNOWN
CAIG CX,131 ;UFA OR DFN?
IFNSK.
TRZ CX,110 ;YES, TRANSLATE TO 20,21
ELSE.
TRNN CX,6 ;NO BITS 33 OR 34
TRNN CX,1 ;BUT MUST HAVE 35
JRST ILUUO1 ;OR IT IS AN ERROR
LSH CX,-3 ;FADL, ETC. TRANSLATE TO 14-17
ENDIF.
HRRZ CX,FLONGD-14(CX) ;GET ADDRESS
CALL 0(CX) ;DO FUNCTION
JRST MRETN ;RETURN +1
;DISPATCH ON DIDDLED OPCODES
FLONGD: SFADL
SFSBL
SFMPL
SFDVL
SUFA
SDFN
IFN KLFLG,< ;GFLT CODE FOR KL'S
; The following code simulates the GFLOAT to INTEGER conversion instructions.
; These instructions were removed from the KL microcode to make room for other
; features and bug fixes. This code also exists in TOPS10. If any changes are
; made to this code they should also be made for TOPS10
GFLT%O==1B1 ;GFLOAT OVERFLOW FLAG
GFLT%2==1B2 ;GFLOAT TWO AC STORE FLAG
PC%TP1==1B10 ;TRAP1 PC FLAG...ONLY USED BY GFLOAT
OPDEF DGFIX [023000,,0] ;GFLT TO DOUBLE INTEGER
OPDEF GFIX [024000,,0] ;GFLT TO INTEGER
OPDEF DGFIXR [025000,,0] ;GFLT TO DOUBLE INTEGER ROUNDED
OPDEF GFIXR [026000,,0] ;GFLT TO INTEGER ROUNDED
GFLT0: ;HERE TO CHECK FOR GFLT'S
MCENTR ;ENTER JSYS CONTEXT
MOVE T4,KIMUU1+1 ;GET E FOR THE MUUO
UMOVE T4,(T4) ;GET THE EXTENDED INSTRUCTION
LDB T3,[POINT 9,T4,8] ;GET THE EXTENDED OPCODE
CAIL T3,<<DGFIX>_-^D27> ;IS IT A GFLT INSTRUCTION?
CAILE T3,<<GFIXR>_-^D27>
JRST ILUUO1 ;NO
SUBI T3,<<DGFIX>_-^D27> ;CONVERT TO GFLTD OFFSET
MOVE T1,T4 ;GET THE EXTENDED INSTRUCTION
TLZ T1,777740 ;TURN OFF EVERYTHING EXCEPT I,X,AND Y
TLO T1,(DMOVE T1,) ;GET THE INSTRUCTION
XCTUU T1 ;GET THE USERS ARGUMENTS
CALL @GFLTD(T3) ;DISPATCH TO WORKER ROUTINES
TXNE T4,GFLT%O ;DID IT OVERFLOW
JRST GFLT1 ;YES...GO HANDLE IT
LDB T3,[POINT 4,KIMUU1,30] ;GET THE AC THE USER USED
UMOVEM T1,(T3) ;SAVE THE FIRST AC
TXNN T4,GFLT%2 ;IS IT A TWO AC RESULT?
JRST MRETN ;NO...SO WE ARE DONE
ADDI T3,1 ;YES...SO BUMP THE AC VALUE
ANDI T3,17 ;MAKE ADDITION MODULO 16
UMOVEM T2,(T3) ;SAVE THE SECOND AC RESULT
JRST MRETN ;RETURN TO USER
GFLT1: EXCH T2,MPP ;HERE ON AN OVERFLOW...GET STACK FRAME
MOVX T1,PC%OVF!PC%TP1 ;GET OVERFLOW FLAGS
IORM T1,0(T2) ;SET THE BIT IN THE USER'S FLAGS
EXCH T2,MPP ;GET OUR STACK BACK
JRST MRETN ;AND RETURN
GFLTD: IFIW!.DGFX ;DGFIX
IFIW!.GFX ;GFIX
IFIW!.DGFXR ;DGFIXR
IFIW!.GFXR ;GFIXR
> ;END OF IFN KLFLG
IFN KCFLG,<
;Here when user executed an unassigned I/O instruction or one that is
;illegal without User IOT. Transferred through UPT offset 435.
USUIO:
;Here when user executed an unassigned EXTEND instruction. Transferred
;through UPT offset 437.
USEXT: HRR CX,KIMOAC ;GET OP CODE AND AC
HLL CX,KIMUFL ;GET FLAGS WORD
MOVEM CX,KIMUU1 ;SAVE FIRST WORD
MOVE CX,KIMUEF ;GET E
MOVEM CX,KIMUU1+1 ;SAVE SECOND WORD
JRST ILUUO
;Here when user executed a trapped instruction with virtual machine mode
;set
VMENT: BUG.(HLT,VMMODE,APRSRV,SOFT,<MUUO in virtual machine mode>,,<
Cause: The microcode transferred through the UPT location for execution of
an instruction in virtual machine mode. This should not happen, because no
code exists to handle this case, and the mode should never be enabled.
Action: Determine how the mode was set, or debug the microcode.
>) ;No code in monitor for VM mode yet
> ;End of IFN KCFLG
;Here when user executed a trap MUUO.
;UPT locations for trap conditions contain JFCL or MUUO. If here, a trap
;condition occurred, and the monitor had stored an MUUO in the UPT slot.
;Op code indicates which one was executed.
IFN KLFLG,<
KITRPU: DATAO PAG,SETMON
LDB CX,[POINT 9,KIMUFL,26]
CAIL CX,40 ;RANGE OK?
CAIL CX,40+MAXUTU
KITRPX: JRST KIMUOT ;NOT INTERSTING. GO SEE ABOUT STANDARD STUFF
JRST UTUTAB-40(CX) ;DISPATCH
;Transfer vector. Transfer according to op code.
UTUTAB: JRST KITRPX ;PAGER (Op code 40) (OBSOLETE)
JRST KIAROV ;OVERFLOW (Op code 41)
JRST KIPDOV ;PDL OV (OP code 42)
MAXUTU==.-UTUTAB
> ;END OF IFN KLFLG
;Here on EXEC mode trap MUUO
;The monitor has executed an MUUO during a trap. The only location in the
;EPT that causes an MUUO is push-down list overflow.
KITRPS:
KITRPM: BUG.(HLT,MONPDL,APRSRV,SOFT,<Stack fault in monitor>,<<FPC,PC>>,<
Cause: The monitor has executed a PUSH instruction that
caused a stack overflow. The central processor
detected this condition and reported it to the monitor.
Data: PC - PC of instruction which caused stack overflow
>)
;Here if user trap word for overflow had an MUUO in it and user got
;arithmetic overflow. User either has executed SWTRP JSYS, providing a block
;address, or has enabled for an interrupt.
KIAROV: SKIPE T3,ARTHTR ;USER SPECIFIED-TRAP ADDRESS?
JRST OVERFL ;YES. GO HANDLE IT THEN
;User did not provide trap address. Give interrupt on channel for specific
;overflow condition.
SETZ 1,
MOVE 2,KIMUFL ;GET FLAGS AT TIME OF TRAP
MOVE 3,PSICHM ;USER'S CHANNEL ENABLED WORD
TLNE 3,(1B7) ;FOV ENB?
JRST [ TLNN 2,(1B3) ;AND FOV ON?
JRST .+1 ;NO
MOVEI 1,7 ;YES, CHANNEL 7 INTERRUPT
JRST KITRP1]
TLNE 3,(1B6) ;OV ENB?
JRST [ TLNN 2,(1B0) ;AND OV ON?
JRST .+1 ;NO
MOVEI 1,6 ;YES, CHANNEL 6 INTERRUPT
JRST KITRP1]
JRST KITRP1 ;ENTER SCHED, FINISH UP
;User has done SWTRP JSYS. Fill in the user's block with the necessary
;information
; T3/ address of block in previous context
OVERFL: MOVE T4,KIMUPC ;Get PC of error
SUBI T4,1 ;Back up
HLL T4,KIMUPC ;But stay in the same section
UMOVE T4,@T4 ;Get the instruction
OVERF2: LDB T1,[POINT ^D13,T4,12] ;GET OPCODE AND AC
LSH T1,5 ;POSITION IT
MOVE P1,T1 ;Save it for later
LSH T1,-<5+4> ;ISOLATE OPCODE
TXZ T4,-1B12 ;CLEAR INST AND AC
TXO T4,<XMOVEI T2,>
XCTUU T4 ;GET EFFECTIVE ADDRESS
;Chase XCT chain if necessary to get real op code
CAIN T1,<XCT>B62 ;IS IT AN XCT?
JRST [ UMOVE T4,@T2 ;YES. GET TARGET OF XCT INSTRUCTION
JRST OVERF2] ;AND PROCEED
;Found the effective address. Now that we are finished using the
;original value of PCS, we can change it so that we can reference
;the SWTRP block. So,...
XSFM Q1 ;Get flags
TXNE Q1,EXPCS ;Previous context = 0?
IFSKP. ;If so.
DO.
XMOVEI Q2,ENDLP. ;Make it a non-zero section
TXO Q1,FLD(1,EXPCS) ;""
XJRSTF Q1 ;Do it
ENDDO.
ENDIF.
MOVE T4,T3 ;ADDRESS OF USERS BLOCK
ADDI T4,.AREFA
UMOVEM T2,@T4 ;STORE EFFECTIVE ADDRESS
DMOVE T1,KIMUFL ;Get trap flags and PC
HRR T1,P1 ;GET OPCODE/AC FROM PREVIOUS SEARCH
ADD T4,[.ARPFL-.AREFA]
XCTU [DMOVEM T1,@T4] ;STORE TRAP FLAGS AND PC
ADD T4,[.ARNPC-.ARPFL]
UMOVE T2,@T4 ;GET NEW PC WORD
TXZ T1,FPD ;CLEAR FPD SO NEW INSTRUCTION WILL WORK
DMOVEM T1,FFL ;SET UP NEW PC FOR USER
JRST GOUSR ;AND RETURN
;Here if user had PDL overflow. Trap word contained an MUUO, stored by the
;monitor. Give an interrupt.
KIPDOV: SKIPE T3,PDOVTR ;HAS USER DONE AN SWTRP FOR PDL OVERFLOW?
JRST OVERFL ;YES. GO FILL IN THE BLOCK
MOVEI T1,^D9 ;YES. GIVE CHANNEL 9 INTERRUPT
JRST KITRP1 ;GO GIVE THE INTERRUPT
;ROUTINES USED BY SWTRP TO VERIFY TRAP ARGS
;VERIFY AND SET ARITHMETIC TRAP INSTRUTION
; T1/ FORK PSB INDEX
; T2/ USER'S FLAGS
; T3/ BLOCK ADDRESS TO USE
;RETURNS +1: ALWAYS
;Clobbers T2,T3,T4
SWAPCD ;SWAPPABLE
SETART::TXNN T2,SW%NMI ;WILLING TO ACCEPT UCODE'S DATA?
JRST SETAR1 ;NO. DON'T SIGNAL IT THEN
IFN KCFLG,<
TXO T3,1B0 ;ON THE KC, DON'T INVOKE THE MONITOR
> ;END OF IFN KCFLG
SETAR1: MOVEM T3,ARTHTR(T1) ;SAVE USER'S ADDRESS PLUS FLAG
CALL SETAOV ;SET UP THE UPT
RET
;SETAOV - Routine to set the UPT trap word.
;ACCEPTS:
; T1/ Offset to address PSB for desired fork
; CALL SETAOV
;RETURNS +1: ALWAYS
;On entry, ARTHTR contains one of the following:
; 0 - don't give user a trap on overflow
; 1B0+address - make processor handle overflow without monitor intervention
; address - make monitor intervene; address is of user block
;If SWTRP has been done, ARTHTR is non-zero, and SWTRP takes precedence over
;interrupts. If ARTHTR is 0, the monitor will intervene if interrupts are
;enabled. Otherwise, overflow is ignored.
IFN KLFLG,<
SETAOV::SKIPE ARTHTR(T1) ;USER-SPECIFIED TRAP INSTRUCTION?
JRST SETOV1 ;YES. SET UP TRAP THEN
MOVE T3,PSICHM(T1) ;PROCESS CHN MASK
MOVSI T2,<JFCL>B53 ;USE JFCL IF NO INTS
TLNE T3,(1B6+1B7) ;OVERFLOW OR FLOATING OV?
SETOV1: MOVSI T2,<.AROVT>B53 ;YES, USE TRAP MUUO
MOVEM T2,UPTOVI(T1)
RET
> ;END OF IFN KLFLG
IFN KCFLG,<
SETAOV::SKIPE T4,ARTHTR(T1) ;GET USER'S BLOCK ADDRESS
IFSKP.
MOVE T4,TRNOP ;DEFAULT IS IGNORE
MOVE T3,PSICHM(T1) ;GET ENABLED CHANNELS
TLNE T3,(1B6+1B7) ;EITHER OVERFLOW?
MOVX T4,AROVPC ;YES. MONITOR MUST INTERVENE
ELSE.
JUMPG T4,[ MOVX T4,AROVPC
JRST SETOV1]
TXZ T4,1B0 ;NO. CLEAR THE FLAG
TXO T4,TRUSER ;SET FUNCTION FOR USER ONLY
ENDIF.
SETOV1: MOVEM T4,UPTOVI(T1) ;SET THE UPT
RET
> ;END OF IFN KCFLG
;SETLUU - ROUTINE TO VERIFY AND SET LUUO BLOCK ADDRESS
; T1/ PSB OFFSET
; T3/ BLOCK ADDRESS
;RETURNS: +1 INVALID
; +2 VALID
;Clobbers T3
SETLUU::SKIPN T3 ;CLEARING?
MOVE T3,[LUUNUL] ;YES. GET NULL VALUE
MOVEM T3,KLLUUO(T1) ;SET IT
RET ;DO IT THEN
;ROUTINE TO RETURN LUUO BLOCK ADDRESS SETTING
;RETURNS: +1 ALWAYS
; T3/ VALUE OF LUUO BLOCK SETTING
GTLUUB::MOVE T3,KLLUUO(T1) ;GET IT
CAMN T3,[LUUNUL] ;NULL SETTING
SETZM T3 ;YES,. RETURN A ZERO THEN
RET ;DONE
;SETPDL - Routine to set up PDL overflow trap information for SWTRP JSYS
;ACCEPTS:
; T1/ OFFSET TO REFERENCE FORK'S PSB
; T2/ FLAGS,,FUNCTION CODE FROM USER
; T3/ ADDRESS OF USER'S BLOCK
; CALL SETPDL
;RETURNS +1: ALWAYS
;Clobbers T3,T4
SETPDL::TXNN T2,SW%NMI ;WILLING TO ACCEPT UCODE'S DATA?
JRST SETPD1 ;NO. DON'T SIGNAL IT THEN
IFN KCFLG,<
TXO T3,1B0 ;NO MUUO ONLY ON THE KC
> ;END OF IFN KCFLG
SETPD1: MOVEM T3,PDOVTR(T1) ;SAVE USER'S ADDRESS PLUS FLAG
CALL SETPOV ;SET UP THE UPT
RET
;SETPOV - Routine to set the UPT trap word.
;ACCEPTS:
; T1/ Offset to address PSB for desired fork
; CALL SETPOV
;RETURNS +1: ALWAYS
;On entry, PDOVTR contains one of the following:
; 0 - don't give user a trap on overflow
; 1B0+address - make processor handle overflow without monitor intervention
; address - make monitor intervene; address is of user block
;If SWTRP has been done, PDOVTR is non-zero, and SWTRP takes precedence over
;interrupts. If PDOVTR is 0, the monitor will intervene if interrupts are
;enabled. Otherwise, overflow is ignored.
IFN KLFLG,<
SETPOV::RET
> ;END OF IFN KLFLG
IFN KCFLG,<
SETPOV::SKIPE T4,PDOVTR(T1) ;GET USER'S BLOCK ADDRESS
IFSKP.
MOVX T4,PDOVPC ;MONITOR MUST INTERVENE
ELSE.
JUMPG T4,[ MOVX T4,PDOVPC ;GOING STRAIGHT TO USER?
JRST SETPO1] ;NO.
TXZ T4,1B0 ;YES. CLEAR THE FLAG
TXO T4,TRUSER ;SET FUNCTION FOR USER ONLY
ENDIF.
SETPO1: MOVEM T4,UPTOVI(T1) ;SET THE UPT
RET
> ;END OF IFN KCFLG
;PAGE FAIL ENTRY WHEN IN SCHED CONTEXT
RESCD
KIPFS::
KIPFS1: DMOVEM T1,PFSA1 ;SAVE ACS
MOVEM T3,PFSA3 ;SAVE MORE ACS
IFN KLFLG,<
MOVE T1,UPTPFW ;CHECK PAGE FAIL CODE
> ;END OF IFN KLFLG
IFN KCFLG,<
MOVE T1,KCPFCD
> ;END OF IFN KCFLG
TXNE T1,TWHPFF ;SPECIAL?
IFSKP.
IFN KLFLG,<
MOVE T2,TRAPPC ;NO. MAKE SURE WE HAVE THIS DATUM
MOVE T3,TRAPFL ;MAKE SURE WE HAVE THIS DATUM
> ;END OF IFN KLFLG
BUG.(HLT,SKDPF1,APRSRV,SOFT,<Page fail in scheduler context>,<<T1,UPTPFW>,<T2,TRAPPC>,<T3,TRAPFL>>,<
Cause: A page fault occurred while the monitor was running in scheduler
context and the page fail word did not indicate a "hard"
failure. This is probably a software bug because the
scheduler executes only resident code. One cause of this failure is a
reference to a piece of swappable code or data that is not currently in
memory.
Data: UPTPFW - Page fail word
TRAPPC - The PC of the instruction that caused the page fault
TRAPFL - The PC flags of the instruction that caused the page fault
>) ;NO
ENDIF.
JSP T2,PFAID ;YES, DISPATCH ON TYPE
CLHWPT ;CONTINUE
DMOVE T1,PFSA1
XJRSTF TRAPFL
;SAVE AND RESTORE STUFF POSSIBLY VULNERABLE WHEN SCHEDULER
;IS STARTING AND STOPPING PROCESS
;CALLED WITH JSP 7,
;Here when stopping a process. Save its data away.
KISSAV::JSP 4,MTIME ;READ HIGH PRECISION CLOCK
MOVEM 1,SKDLST ;NOTE TIME SCHED OVERHEAD STARTED
;If the process had address break turned on, turn it off
SKIPE ADRBRK ;ADDRESS BREAK IN PLACE?
SKIPE EXECBK ;DON'T CLEAR BREAK IF EXEC MODE IN EFFECT
SKIPA ;EXEC MODE BREAK, OR NO USER MODE. DON'T CLEAR
JSP T4,CLRBRK ;CLEAR IT
;Save previous context AC's in the PSB.
STPAC. 5,UAC
JRST 0(7)
;KISLOD - Restore user context information
KISLOD::
XSFM T1
TXO T1,PCU
XMOVEI T2,KISLD1
XJRSTF T1
KISLD1:
;Load previous context AC's from the PSB.
LDPAC. 5,UAC
;If process requested address break, tell the hardware.
OPSTR <SKIPE T2,>,ABFLG ;ADDRESS BREAK IN PLACE?
SKIPE EXECBK ;IF EXEC MODE BREAK, DON'T ENABLE USER MODE
SKIPA ;EXEC MODE, OR NO USER MODE
JRST [ LOAD T1,ABLOW ;YES, GET LOWER ADDRESS
IFN KCFLG,<
LOAD T3,ABUPP ;GET UPPER ADDRESS
>
JSP T4,SETBRK ; AND SET IT UP
JRST .+1]
JSP 4,MTIME ;READ HIGH PRECISION CLOCK
MOVEM 1,FKT0 ;INIT MEASURING INTERVAL
SKIPE FKTOFF ;CLOCK OFF?
MOVEM T1,FKTOFF ;YES, UPDATE OFF TIME
SUB 1,SKDLST ;COMPUTE TIME SINCE LAST SCHED UPDATE
CAIGE T1,0 ;OVERFLOW?
ADD T1,BASOVV ;YES, CORRECT
ADDM 1,SKDOVH ;CHARGE IT TO SCHED OVERHEAD
JRST 0(7)
SUBTTL Address Break
IFN KLFLG,<
;SET ADDRESS BREAK.
;ACCEPTS:
; T1/ ADDRESS
; T2/ FLAGS, RIGHT-JUSTIFIED
; JSP T4,SETBRK
;RETURNS VIA JRST 0(T4)
SETBRK: LSH T2,<^D35-^L<AB%SEC>> ;PUT BITS IN RIGHT PLACE (ASSUMES THAT
; AB%XCT IS RIGHTMOST FLAG BIT)
TXZE T2,AB%RED ;CONVERT SOFTWARE BITS TO
TXO T1,ABDR ; HARDWARE BITS
TXZE T2,AB%WRT ; ..
TXO T1,ABDW
TXZE T2,AB%XCT
TXO T1,ABIF
TXO T1,ABUM ;ALL REFERENCES TO USER ADDRESSES
DATAO APR,T1 ;SET IT UP
JRST 0(T4) ;RETURN
> ;END OF IFN KLFLG
IFN KCFLG,<
;SET ADDRESS BREAK.
;ACCEPTS:
; T1/ LOWER BOUND ADDRESS
; T2/ FLAGS, RIGHT-JUSTIFIED
; T3/ UPPER BOUND ADDRESS
; JSP T4,SETBRK
;RETURNS VIA JRST 0(T4)
;Note: This code uses a resident block to hold arguments to WRCTX. It is called
;only from the scheduler in order to avoid interlock problems.
SETBRK::MOVX T3,PGLABC!PGLABE!PGENAB ;MASK FOR ENABLING AND SETTING CONDITIONS
MOVEM T3,BRKBLK+WRCTFG ;SET UP FIRST WORD OF WRCTX BLOCK
MOVEM T1,BRKBLK+WRCTLO ;SET LOWER BOUND
MOVEM T3,BRKBLK+WRCTUP ;SET UPPER BOUND
SETZM T1 ;INITIALIZE FLAGS WORD
LSH T2,<^D35-^L<AB%SEC>> ;PUT BITS IN RIGHT PLACE (ASSUMES THAT
; AB%XCT IS RIGHTMOST FLAG BIT)
TXNE T2,AB%RED ;CONVERT SOFTWARE BITS TO
TXO T1,PGABRD ; HARDWARE BITS
TXNE T2,AB%WRT ; ..
TXO T1,PGABWR
TXNE T2,AB%XCT
TXO T1,PGABPC
TXNE T2,AB%SEC
TXO T1,PGABIS
TXO T1,PGAUSR ;ALL REFERENCES TO USER ADDRESSES
MOVEM T1,BRKBLK+WRCTAB ;STORE FLAGS WORD
WRCTX BRKBLK ;TELL THE HARDWARE
JRST 0(T4) ;RETURN
> ;END OF IFN KCFLG
;BRKAVL - CHECK AVAILABILITY OF ADDRESS BREAK (DOESN'T EXIST ON KS10)
IFN KLFLG!KCFLG,<
BRKAVL::RETSKP
> ;END OF IFN KLFLG!KCFLG
;CLRBRK - CLEAR ADDRESS BREAK
IFN KLFLG,<
CLRBRK::DATAO APR,[0]
JRST 0(T4)
> ;END OF IFN KLFLG
IFN KCFLG,<
CLRBRK::WRCTX [PGLABE] ;TELL THE HARDWARE TO DISABLE BREAKS
JRST 0(T4)
> ;END OF IFN KCFLG
;STEXBK - Set exec mode address break
;Accepts:
; T1/ word for DATAO APR
; CALL STEXBK
;Returns +1: failure because user mode break is set
; +2: success
;Alternate entry, STEXDM, sets break even though users may be using it. If
;so, address break will cease to work for the users.
;Format of T1:
;Bit 9: PC fetch
;Bit 10: Data read
;Bit 11: Data write
;Bit 12: user mode reference
;Bits 13-35: Address to break on
;NOTE: This code clears the user mode bit but otherwise does not check
;or correct T1!!!
IFN KLFLG,<
STEXBK::NOSKD1
SKIPN USERBK ;ANY USER MODE BREAK IN EFFECT?
JRST STEXB2 ;NO. WE CAN DO OURS
OKSKD1
RET ;YES. FAIL, THEN
STEXDM: NOSKD1
STEXB2: TXZ T1,ABUM ;NO REFERENCES TO USER ADDRESSES
JUMPE T1,R ;IF NOTHING TO DO, INDICATE FAILURE
MOVEM T1,EXECBK ;INDICATE THAT IT WAS SET TO LOCK OUT USERS
DATAO APR,T1 ;SET THE BREAK
OKSKD1
RETSKP ;RETURN SUCCESS
;CLEXBK - Clear exec mode break
CLEXBK: NOSKD1
DATAO APR,[0] ;CLEAR BREAKS
SETZM EXECBK ;ALLOW USERS TO ENABLE ADDRESS BREAK
OKSKD1
RET
> ;END OF IFN KLFLG
;STEXBK - Set exec mode address break
;Accepts:
; T1/ flags
; T2/ lower bound address
; T3/ upper bound address
; CALL STEXBK
;Returns +1: failure
; +2: success
IFN KCFLG,<
STEXBK::SAVET
STKVAR <<EXBRK,5>>
NOSKD1
SKIPN USERBK
JRST STEXB1
OKSKD1
RET
STEXDM: SAVET
STKVAR <<EXBRK,5>>
NOSKD1
STEXB1: TXZ T1,PGAUSR ;NO USER MODE BREAK
MOVEI T4,EXBRK ;GET ADDRESS OF BLOCK
MOVEM T1,WRCTAB(T4) ;STORE FLAGS IN BLOCK
MOVEM T2,WRCTLO(T4) ;STORE LOWER ADDRESS
MOVEM T3,WRCTUP(T4) ;STORE UPPER ADDRESS
MOVX T1,PGLABC!PGLABE!PGENAB ;MASK FOR ENABLING AND SETTING CONDITIONS
MOVEM T1,WRCTAC(T4) ;SET IT
MOVEM T2,EXECBK ;SAVE ADDRESS AS SIGNAL TO JSYS
WRCTX EXBRK ;TELL THE HARDWARE
OKSKD1
RETSKP
CLEXBK: NOSKD1
WRCTX [PGLABE]
SETZM EXECBK
OKSKD1
RET
> ;END OF IFN KCFLG
;CKXADR - CHECK IF MACHINE SUPPORTS EXTENDED ADDRESSING
;
;call: call CKXADR
;returns: +1 EXTENDED ADDRESSING NOT SUPPORTED, T1/ ERROR CODE
; +2 EXTENDED ADDRESSING SUPPORTED
CKXADR::RETSKP ;YES
;Routine to check for CFS microcode.
;Returns: +1 if CFS UCODE running.
; BUGHLT if not
CHKCFS::
IFN KLFLG,< ;If KC, it will be
PIOFF ;Own it all for a bit
MOVEI T1,CHKCFS/PGSIZ ;Page number to test
PUSH P,@CST0X+T1 ;Save CST entry for this page
PUSH P,UPTPFN ;Save PF word
XMOVEI T2,CHKCF0 ;New PF PC
MOVEM T2,UPTPFN
MOVX T2,PSASM ;Make it accessible, but not writable
MOVEM T2,@CST0X+T1 ;Do it
MOVE T2,IMMPTR ;Page pointer
HRR T2,T1 ;Page number
MOVEM T2,MMAP+PIPG ;Into MMAP
MOVES PIPGA ;Try to write it
CHKCFX: BUG. (HLT,CFSWMC,APRSRV,HARD,<Wrong UCODE for CFS>,,<
Cause: The KL microcode currently running does not support CFS.
Action: Install the correct microcode on the front end and reload the
system. Be sure to answer "YES" to the "RELOAD MICROCODE" prompt
from KLI.
>) ;Yes. Wrong UCODE then
CHKCF0: MOVE T2,UPTPFW ;Get PF word
TXNE T2,TWHPFF ;Hard error?
JRST CHKCFX ;Yes.
POP P,UPTPFN
POP P,@CST0X+T1 ;Restore CST
SETZM MMAP+PIPG ;Restore CST entry
CLRPT PIPGA ;Clear map
PION
> ;IFN KLFLG
RET
SUBTTL Pager Control Routines
Repeat 0,< ;[7.1002] Obsolete PMOVE/PMOVEM instructions do the work
;MOVE FROM REAL CORE ADDRESS
; T1/ WORD NUMBER
; T2/ PHYSICAL CORE PAGE NUMBER
; CALL MOVRCA
; RETURN +1 ALWAYS, T1/ WORD FROM PAGE
;MAY BE CALLED AT ANY PI LEVEL
; Edit 7363 is put in to take advantage of the PMOVE instruction within
; the microcode (if it is there). This edit will be modified in the future
; when everyone has the PMOVE microcode. There will no longer be a need for
; this edit!
MOVRCA::
MOVE T4,[PMOVE T1,T1] ;[7363] Load the PMOVE instruction
MOVE CX,APRFLW ;[7363] Get APRID word
TXNE CX,PMOV ;[7363][7376] Is PMOVE present?
CALLRET XCTPMV ;[7363] Yes, use it
MOVE T4,[MOVE T1,PIPGA(T1)] ;INSTR TO EXECUTE
CALLRET XCTRCA ;DO INSTR WITH ADDR MAPPED
;STORE TO REAL CORE ADDRESS
;T1/ WORD NUMBER
;T2/ PHYSICAL CORE PAGE NUMBER
;T3/ WORD TO STORE
; CALL STORCA
;RETURNS+1(ALWAYS)
STORCA::
EA.ENT ;RUN IN SECTION 1
MOVX T4,CORMB
IORM T4,@CST0X+T2 ;NOTE PAGE MODIFIED
MOVE T4,[PMOVEM T3,T1] ;[7363] Load the PMOVEM instruction
MOVE CX,APRFLW ;[7363] Get APRID word
TXNE CX,PMOV ;[7363][7376] Is PMOVEM present?
CALLRET XCTPMV ;[7363] Yes, use it
MOVE T4,[MOVEM T3,PIPGA(T1)] ;INSTR TO EXECUTE
; CALLRET XCTRCA ;DO INSTR WITH ADDR MAPPED
> ;[7.1002] End obsolete code
;LOCAL ROUTINE TO EXECUTE AN INSTRUCTION WITH PIPGA SETUP
;T2/ CORE PAGE NUMBER
;T4/ INSTR TO EXECUTE
;T1 & T3 MAY BE USED BY THE INSTRUCTION.
;THE USUAL CASE IS TO HAVE T1 CONTAIN THE RELATIVE WORD ADDRESS.
XCTRCA: EA.ENT ;RUN IN SECTION 1
PIOFF
PUSH P,@CST0X+T2 ;SAVE OLD CST ENTRY
SETOM @CST0X+T2 ;FORCE NO AGE FAULT
HLL T2,IMMPTR ;CONSTRUCT POINTER
MOVEM T2,MMAP+PIPG ;PUT IN MON MAP TEMP SLOT
CLRPT PIPGA ;CLEAR HDWR
XCT T4 ;DO INSTR FOR CALER
SETZM MMAP+PIPG ;CLEAR TEMP MAPPING
HRRZS T2 ;CLEAR BACK TO ADDRESS ONLY
POP P,@CST0X+T2 ;RESTORE CST
CLRPT PIPGA ;CLEAR HARDWARE
PION
RET
Repeat 0,< ;[7.1002] More obsolete code
;LOCAL ROUTINE TO EXECUTE AN INSTRUCTION (PMOVE OR PMOVEM)
;T2/ CORE PAGE NUMBER
;T4/ INSTR TO EXECUTE
;T1 & T3 MAY BE USED BY THE INSTRUCTION.
;THE USUAL CASE IS TO HAVE T1 CONTAIN THE RELATIVE WORD ADDRESS.
XCTPMV: LSH T2,PGSFT ;[7363] Tranform T2 from page number to address
IOR T1,T2 ;[7363] Put page and offset together
XCT T4 ;[7363] Do PMOVE/M instruction
RET ;[7363] And continue
> ;[7.1002] End obsolete code.
;MAPRCA - MAP PHYSICAL CORE PAGE FOR LOCAL REFERENCE. ASSUMES PI OFF.
; T1/ PHYSICAL CORE PAGE NUMBER
; CALL MAPRCA
; RETURN +1 ALWAYS, T1/ VIRTUAL ADDRESS WHERE PAGE MAPPED
MAPRCA::HLL T1,IMMPTR ;CONSTRUCT PTR
MOVEM T1,MMAP+PIPG
CLRPT PIPGA
MOVEI T1,PIPGA ;RETURN ADDRESS OF TEMP PAGE
RET
;SET PI SPECIAL PAGE
; T1/ PTN,,PN
; or
; T1/ 0,,SPTN
; CALL MAPIPG
; RETURN +1 ALWAYS, PTN MAPPED INTO PIPGA
MAPIPG::CONSZ PI,PIPION ;PI OFF?
BUG.(HLT,PIRACE,APRSRV,SOFT,<MAPIPG - Called with PI on>,,<
Cause: This routine uses a MMAP entry which may be used at PI level.
To avoid races the PI should be off when it is called.
This particular caller did not turn off the PI.
Action: Check the stack to find the caller.
>)
EA.ENT ;RUN IN SECTION 1
PUSH P,T1
TLNE T1,-1 ;PTN in LH or RH?
HLRZ T1,T1 ;GET PTN
LOAD T1,STGADR,SPT(T1) ;GET ADDRESS
CAMLE T1,NHIPG ;LEGAL PAGE?
BUG.(HLT,PINIC1,APRSRV,SOFT,<MAPIPG - Page table not in core>,,<
Cause: A routine has been called to map a page into a special
address slot. The requested page is not in memory.
>)
IOR T1,IMMPTR ;CONSTRUCT PRIVATE PTR
MOVEM T1,MMAP+PIPG ;PUT IN MON MAP
HRRZS T1
HLL T1,@CST0X+T1 ;CHECK AGE
TXNN T1,PSASM ;NOW ASSIGNED?
CALL AGESN ;NO, SET AGE
CLRPT PIPGA
POP P,T1
RET
;UNMRCA - CLEAR MAPPING SETUP BY MAPRCA
;NO ARGUMENTS, PRESERVES ALL REGISTERS
UNMRCA::SETZM MMAP+PIPG ;CLEAR MAP SLOT
CLRPT PIPGA ;CLEAR HARDWARE PAGER
RET
;CLEAR PAGING MEMORY - VARIOUS AREAS. ALL DO COMPLETE CLEAR AT PRESENT.
;KICLDP -- accepts physical page number in T1
MONCLA:: ;CLEAR ALL MONITOR PAGES
PGRCLD:: ;CLEAR ALL PAGES
KICLKP:: ;CLEAR AND LOAD SELECTED PAGE (T1)
CLHWPT
RET
;CLEAR PAGING MEMORY FOR SPECIFIC PAGE
; T1/ PAGE NUMBER
; CALL MONCLR
; RETURNS +1 ALWAYS
MONCLR::JUMPE T1,MONCLA ;0 MEANS CLEAR ALL
CLRPT 0(T1) ;CLEAR
RET
;Clear all of pager, including kept pages
;Preserves all ACs
CLRALL: CONO PAG,@CONOPG ;Clear the pager
RET ;And done
;SET BIT IN KIPGWD THAT SAYS "DO NOT CLEAR KEPT ENTRIES". CALLED ONCE DURING
;SYSTEM STARTUP AFTER AT LEAST ONE PAGER CLEAR HAS BEEN DONE. CHECK FOR THE
;PRESENCE OF THE MCA25, AND DO NOT SET THE BIT IF MCA25 IS NOT INSTALLED.
; CALL STKEEP
;RETURNS +1: ALWAYS
STKEEP::APRID T1
TXNN T1,MCA25 ;IS MCA25 INSTALLED
RET ;NO.
MOVX T1,PGCLKP ;YES. GET THE KEEP BIT.
IORM T1,KIPGWD ;SET IT.
RET
;TESTKP - test to see if particular address is "kept"
;ACCEPTS:
; T1/ VIRTUAL ADDRESS
; CALL TESTKP
;RETURNS +1: INVALID MAPPING OR NOT KEPT
; +2: KEPT
;Clobbers T1
TESTKP::MAP T1,(T1)
SMAPOK T1 ;CHECK FOR VALID MAPPING
RETBAD () ;INVALID MAPPING
TXNN T1,TWKEEP ;VALID. IS IT KEPT?
RETBAD () ;NO.
RETSKP ;YES.
;Routine to test if two adjacent virtual pages are also physicall
;adjacent.
; T1/ virtual address of first page.
;Pages must be accessible, and preferably locked. This routine
;does not insure that the current page accessibility is maintained!
;Returns: +1 not adjacent
; +2 they are.
;Clobbers all T regs.
;As a bonus, T1 is returned with the mapping for VA+PGSIZ
CPPCON::MAP T2,0(T1) ;Get mapping of first page
SMAPOK T2 ;Is it OK?
RETBAD() ;No. Can't be contiguous then
MAP T1,PGSIZ(T1) ;Get second page
SMAPOK T1 ;Is it OK?
RETBAD() ;No
ADDI T2,PGSIZ ;They should be the same now
XOR T2,T1 ;Check it out
TXNE T2,PHCPNO ;Are they the same now?
RETBAD() ;No. Not adjacent
RETSKP ;yes.
;LOAD AGE
; T1/ AGE
; CALL LDAGER
; RETURN +1 ALWAYS
;Called by PGRINI to initialize the age field in the CST data word
;For the KL, stores age in AC block 6
IFN KLFLG,<
LDAGER::DATAO PAG,SETHWR ;SET TO LOAD SPECIAL AC BLOCK
XCTBU [STOR T1,AGEMSK,CSTDAT] ;SET NEW AGE IN CST UPDATE DATA
DATAO PAG,SETMON ;RESTORE NORMAL AC BLOCKS
CLHWPT
RET
> ; END IFN KLFLG
;Read the process use register, and update its age
IFN KCFLG,<
LDAGER::RDPUR T2 ;FIND OLD VALUE
STOR T1,AGEMSK,T2 ;SET NEW AGE
WRPUR T2 ;RE-WRITE
CLHWPT
RET
> ;END IFN KCFLG
;MOVE TO AGE
; T2 /NEW AGE WORD
; CALL MVAGER
; RETURN +1 ALWAYS
;Called by SETPPG when switching processes. Stores new values (age and process
;handle) in CST data word, and sets the new UPT.
IFN KLFLG,<
MVAGER::DATAO PAG,SETHWR ;SET HARDWARE AC BLOCK ADDRESS
UMOVEM T2,CSTDAT ;SET CST AGE WORD
DATAO PAG,SETMON ;SET AC'S BACK
CLHWPT ;CLEAR HARDWARE PAGE TABLE
RET ;RETURN
> ;END IFN KLFLG
;Write full word to process use register
IFN KCFLG,<
MVAGER::WRPUR T2 ;WRITE NEW CST AGE WORD
CLHWPT ;CLEAR HARDWARE PAGE TABLE
RET ;RETURN
> ;END IFN KCFLG
;Routine to set the EPT base address. Assumes CONOPG has been set up
;with address of EPT.
SETEPT::
IFN KLFLG,<
CONO PAG,@CONOPG>
IFN KCFLG,<
WREBR CONOPG>
RET
;TURN PAGER ON
PGRON:: SAVEAC <A>
MOVX A,PGKLMD+PGTPEN
IORM A,CONOPG ;USE KL MODE PAGING
IFN KLFLG,<
CONO PAG,@CONOPG
> ;END OF IFN KLFLG
IFN KCFLG,<
WREBR CONOPG
> ;END OF IFN KCFLG
; CLHWPT
RET
;PGROFF - TURN PAGER OFF
REPEAT 0,< ;Not presently used. It would be fatal in any case.
;This routine unconditionally turns off paging. It sets the EPT base
;address according to whatever the caller has set in CONOPG.
PGROFF::MOVE A,CONOPG
IFN KLFLG,<
TXZ A,PGTPEN ;CLEAR TRAP ENABLE
CONO PAG,0(A)
>
IFN KCFLG,<
TXZ A,PGENPG ;TURN OFF PAGING
WREBR A
>
RET
> ;END REPEAT 0
;SET PAGER FOR SCHEDULER CONTEXT
SETPSK::MOVEI T1,SKHWPT/PGSIZ ;CORE PAGE NUMBER OF SYSTEM PSB
STOR T1,PAGUBA ;PUT IT IN DATAO WORD
MOVE T2,PSBBAS
STOR T1,STGADR,SPT(T2) ;PUT IT IN MMAP BASE
CLHWPT
SETOM LSTPFK ;NO FORK NOW SETUP
RET
;SPECIAL ROUTINES USED BY DIAG MEM MEANAGEMENT TO ENABLE AND
;DISABLE METER UPDATES IN THE EPT.
;DISABLE UPDATES. ARRANGES FOR METER UPDATES TO BE DISABLED
;UPON RETURN TO THE USER.
RESCD
MTROFF::
IFN KLFLG,<
CONO MTR,MTRLOD+MTRTBF ;TURN OFF METER
CONO TIM,0 ;TURN OFF TIME BASE
> ;END OF IFN KLFLG
IFN KCFLG,<
WRTMB TMBLTB ;TURN OFF TIME BASE
WRINT 0 ;TURN OFF INTERVAL COUNTER
> ;END OF IFN KCFLG
RET ;DONE
;SPECIAL ROUTINE TO WAIT FOR EPT USERS TO FINISH.
;MUST BE CALLED WITH PIOFF. MAY NOT RETURN FOR A LONG
;TIME, SO CALLER MUST INSURE THAT KEEP-ALIVE CHECKING
;IS DISABLED. WAITS FOR CHANNELS AND DEVICES THAT
;MAY MODIFY MEMORY (THE EPT ESPECIALLY) TO COMPLETE
WATEPT::
IFN KLFLG,< ;FOR THE KL ONLY
CALL DTEINA ;WAIT FOR DTE TO ABATE
> ;END OF IFN KLFLG
MOVX T1,^D500000
SOJG T1,.
RET ;HACK FOR NOW.
;ROUTINE TO REVERSE EFFECT OF WATEPT. USED BY DIAG TO
;TURN SYSTEM ON AGAIN
;This routine is similar to MTRON. However, it does not clear the
;interval counter when turning it on. It also does not clear the
;time base when turning that back on.
UNWEPT::
IFN KLFLG,< ;IF ON THE KL
CALL DTICON ;SUPPRESS "CONTINUED" MESSAGE
CALL DTEACT ;REACTIVATE DTES
CONO TIM,TIMDON+TIMITO+TIMTMS ;TURN ON TIMER, BUT DON'T CLEAR
CONO MTR,MTRLOD+MTRTBN+MTRAMN+PIBITS+TIMCHN ;AND TURN ON MTR
> ;END OF IFN KLFLG CONDITIONAL
IFN KCFLG,<
WRINT TIMDON+TIMITO+TIMTMS
WRTMB TMBLPI+TMBLTB+TMBBON+TIMCHN
WRACT ACTLOD+ACTAON+PIBITS
> ;END OF IFN KCFLG
RET ;AND DONE
;ROUTINE TO CHECK IF A RESIDENT MONITOR PAGE IS MOVABLE.
;CALLED FROM PAGEM
; T1/ PAGE NUMBER
;RETURNS: +1 NOT MOVABLE
; +2 MOVABLE
RMPCHK::
IFN KLFLG,< ;FOR THE KL NEED TO CHECK COMM REGION
CAIL T1,COMBUF/PGSIZ ;WITHIN THE COMM REGION?
CAILE T1,<ENDRGN-1>/PGSIZ ;?
RETSKP ;NO. GOOD THEN
RETBAD() ;YES IT IS. CAN'T MOVE IT
> ;END OF IFN KLFLG
;* * * *
;Not clear what's needed here
; * * * *
IFN KCFLG,<RETSKP> ;DONE
;SET SWAPPER SPECIAL PAGE TO CURRENT PAGE TABLE
; T1/ PTN,,PN
; or
; T1/ 0,,SPTN
; CALL SETSPG
; RETURN +1 ALWAYS, PTN MAPPED INTO CSWPGA
SETSPG::EA.ENT ;RUN IN SECTION 1
PUSH P,T1
TLNE T1,-1 ;PTN in LH or RH?
HLRZ T1,T1 ;GET PTN
LOAD T1,STGADR,SPT(T1) ;GET ADDRESS
SETSP1: CAMLE T1,NHIPG ;LEGAL PAGE?
BUG.(HLT,PTNIC1,APRSRV,SOFT,<SWPIN - Page table not in core>,,<
Cause: A routine has been called to map a page table into a special
page used only by the swapping routines. The caller is expected
to provide an identifier for a page that is in memory. When a
page is in memory, the page table that points to it must be
in memory. The BUGHLT indicates that the storage address for
the page table is not a valid core page. This can indicate that the
page is not in memory or that its memory address is larger
than the physical memory on the machine. The most likely
cause is corruption of the monitor's data base.
>)
IOR T1,IMMPTR ;CONSTRUCT PRIVATE PTR
MOVEM T1,MMAP+CSWPG ;PUT IN MON MAP
HRRZS T1
HLL T1,@CST0X+T1 ;CHECK AGE
TXNN T1,PSASM ;NOW ASSIGNED?
CALL AGESN ;NO, SET AGE
CLRPT CSWPGA
POP P,T1
RET
;GIVEN CORE PAGE NUMBER IN 1, SETUP CSWPG
SETSP0::IOR T1,IMMPTR ;CONSTRUCT PTR
MOVEM T1,MMAP+CSWPG ;PUT IN MON MAP
CLRPT CSWPGA
RET
RELSPG::SETZM MMAP+CSWPG
CLRPT CSWPGA
RET
;ZERO CORE PAGE GIVEN IN 1
SWPZPG::EA.ENT ;RUN IN SECTION 1
; PUSH P,@CST0X+T1 ;Save CST entry
MOVX T2,<PSASM!CSWRB> ;SET LEGAL AGE FOR LOCAL REF
IORM T2,@CST0X+T1
MOVE T2,IMMPTR
STOR T1,STGADR,T2 ;CONSTRUCT PRIVATE PTR
MOVEM T2,MMAP+CSWPG ;PUT IN MON MAP
CLRPT CSWPGA
MOVE T2,[XWD CSWPGA,CSWPGA+1]
SETZM CSWPGA ;CLEAR FIRST LOCATION
BLT T2,CSWPGA+PGSIZ-1 ;ZERO THE PAGE
SETZM MMAP+CSWPG
CLRPT CSWPGA
; POP P,@CST0X+T1 ;Restore the CST entry
RET
;SETUP TEMP MAPPING UNDER SCHED CONTEXT
; T1/ SPTN OF DESIRED PAGE
; CALL SFITPG
; RETURNS +1 ALWAYS, PAGE MAPPED AT FITPGA
SFITPG::JUMPE T1,[SETZM MMAP+FITPG ;CLEAR SLOT IF 0 GIVEN
JRST SFITP1]
PUSH P,SHRPTR ;CONSTRUCT SHARE PTR
STOR T1,SPTX,0(P)
POP P,MMAP+FITPG ;PUT IN MON MAP
SFITP1: CLRPT FITPGA
RET
;SETUP TEMP MAPPING UNDER SCHED CONTEXT
; T1/ SPTN OF DESIRED PAGE
; CALL SFITPG
; RETURNS +1 ALWAYS, PAGE MAPPED AT PRLPGA
SPRLPG::JUMPE T1,[SETZM MMAP+PRLPG ;CLEAR SLOT IF 0 GIVEN
JRST SPRLP1]
PUSH P,SHRPTR ;CONSTRUCT SHARE POINTER
STOR T1,SPTX,0(P)
POP P,MMAP+PRLPG
SPRLP1: CLRPT PRLPGA
RET
;SET SWAPPER SPECIAL PAGE TO GIVEN PTN
; 6/ SPTX OF DESIRED PAGE
; CALL SETSP6
; RETURN +1 ALWAYS, PAGE MAPPED INTO CSWPG,
; 6/ PHYSICAL ADDRESS OF PAGE
SETSP6::PUSH P,1
LOAD 6,STGADR,SPT(6) ;GET ADR AND RETURN IT IN 6
MOVE 1,6
JRST SETSP1 ;JOIN STANDARD CASE
SUBTTL Page Fail Handler (Hard Error Codes and Unusual Cases)
IFN KCFLG,<
PFAID::JRST 0(T2)
PGMPE0::RETSKP
MBERRB: RET
SYRMAP: RETSKP
PFERRB: RET
> ;END OF IFN KCFLG
;DIAGNOSE PAGE FAIL WITH FAIL CODE
; 1/ PAGE FAIL WORD
; JSP T2,PFAID ;JSP USED BECAUSE NO STACK SETUP HERE
; RETURN +1 IF PROGRAM TO BE CONTINUED
;Here on a page fail where the code indicates "hard" failure. Called
;by
; 1. PIPTRP (PAGEM) when page fail code is 36 or 37 (AR or ARX parity
;error) and page fail occurred when processing an interrupt
; 2. PGRTH (PAGEM) when page fail code is 20 or 22 (undefined) or 25
;(page table parity error)
; 3. KIPFS when page fault occurred in scheduler context
IFN KLFLG,<
PFAID:: LOAD T1,TWCOD,T1 ;GET PAGE FAIL CODE
CAIL T1,PECOD0 ;MPE GROUP?
JRST PFCDPE ;YES
;Page fail code is not AR or ARX parity error. We expect some sort of
;hard error code here. BUGHLT if that is not the case.
;Otherwise transfer according to the vector below
CAIL T1,KLCOD0 ;KL PAGING CODE?
JRST PFCDX ;YES, NOT EXPECTED HERE
HRRZ T1,PFCODT-PFCOD0(T1) ;GET DISPATCH ADDRESS
JRST 0(T1) ;AND GO THERE
;Transfer vector for page fail codes 20 to 27
PFCOD0==20 ;FIRST SPECIAL TRAP CODE
KLCOD0==30 ;LOWER BOUND OF CODES FOR KL PAGING
PECOD0==36 ;MPE GROUP
PFCODT: PFCD20 ;NXM
PFCD21 ;PROPRIETARY VIOLATION
PFCD22 ;REFILL ERROR
PFCD23 ;ADDRESS BREAK
PFCDX ;ILLEGAL INDIRECT
PFCD25 ;PAGE TABLE PARITY ERROR
PFCDX ;UNKNOWN
PFCD27 ;ILLEGAL ADDRESS
;Didn't expect this page fail. BUGHLT
PFCDX:: BUG.(HLT,UNPGF2,APRSRV,HARD,<Unknown page failure type>,,<
Cause: A page fault has occurred and the page fail word indicates
a "hard" error. The monitor has read the type of failure from
the page fail word and one of the following is true:
1. The hardware is never supposed to generate the code.
2. The code is valid, but the scheduler is running, and this
code should never be generated from scheduler context.
>)
;Page fail code is 20. BUGHLT on KL. Complain and continue on KS
PFCD20::JRST PFCDX ;ILLEGAL ON OTHER THAN SM10
;Page fail code is 21 (proprietary violation).
PFCD21: BUG.(HLT,PVTRP,APRSRV,HARD,<Proprietary violation trap>,,<
Cause: A page fault occurred indicating a proprietary violation while
the monitor was running in scheduler context. An instruction in
a public page attempted to reference a concealed page. Since TOPS-20
uses only concealed mode, this BUGHLT should never happen.
>)
;Page fail code is 22 (refill error). This is not supposed to happen
;in TOPS-20 paging.
PFCD22::BUG.(CHK,RFILPF,APRSRV,HARD,<Refill error page fail>,,<
Cause: A page fault occurred indicating a refill error. This condition
is indicated by a "hard" failure code of 22 in the page fail
word and should occur only under KI-style paging.
TOPS-20 does not use this style of paging. The monitor will retry
the instruction.
>)
JRST 0(T2) ;TRY AGAIN
;Page fail code is 27 (illegal address). Scheduler referenced a
;section greater than 37
PFCD27::BUG.(HLT,ILPSEC,APRSRV,SOFT,<Illegal section number>,<<UPTPFO,PC>,<UPTPFW,PFW>>,<
Cause: While running in scheduler context, the monitor made a reference to an
address whose section number exceeded 37.
Data: PC - PC when instruction was executed
PFW - page fail word
>)
HRRZS UPTPFO ;CLEAR SECTION
; JRST PFCD23
;ADDRESS COMPARE - MAY BE SETUP WITH DATAO APR,[ADDRESS]
;Page fail code is 23 (address compare). Address break is set on
;the location in the page fail word
;note -- address break in user context goes to ADRCMP in PAGEM
PFCD23::MOVX T1,PC%AFI ;(CAN PUT BREAKPOINT HERE)
IORM T1,UPTPFL ;INHIBIT TRAP ONCE SO PGM CAN CONTINUE
JRST 0(T2) ;CONTINUE
;Page fail code is 25 (page table parity error). Hardware failure.
PFCD25::AOSLE PTPARC ;Should we forge ahead?
BUG.(HLT,PTMPE,APRSRV,HARD,<Page table parity error>,,<
Cause: The monitor encountered multiple page table parity errors.
>)
CALL CLRALL ;Clear all of pager, including KEPT entries
BUG. (CHK,PTPTE1,APRSRV,HARD,<Page table parity error>,<<UPTPFW,PFW>>,<
Cause: A page table entry has bad parity. The monitor will clear
the entry and try again. If it fails repeatedly, PTMPE
will result.
Data: PFW - Page fail word
>,,<DB%NND>) ;[7.1210]
JRST 0(T2) ;And try again
;Here when page fail code is 36 or 37, indicating parity error.
PFCDPE: HRRZ T1,UPTPFO ;FIND TRAP ADDRESS
CONSZ APR,APNXM ;NXM CAUSED THIS?
JRST PFNXM ;YES
CONSO PI,PIPION ;PI ON?
JRST [ CAIGE T1,PGRI6 ;NO -- CHECK FOR LEGAL PARITY ERRORS
CAIGE T1,PGRI2A ;THE ONLY LEGAL TIMES ARE DURING CORE SCAN IN PGRINI
JRST PFCDP1 ;NOT LEGAL. QUIT
JRST PFNXM] ;TREAT AS NXM (SKIP INSTRUCTION)
;PI system is on. Let memory scan finish
MOVX T1,1B17 ;GET A LARGE NUMBER
CONSZ APR,APMPE ;SWEEP DONE?
SOJG T1,.-1 ;WAIT A WHILE FOR IT TO COMPLETE
PIOFF ;TURN OFF PI SYSTEM NOW
PFCDP1: MOVEM P,MEMAP ;SAVE OLD STACK JUST IN CASE
MOVE P,[IOWD NMEMPP,MEMPP] ;SET UP A STACK
CALL PGMPE0 ;GO HANDLE AR/ARX TRAP
JFCL ;DON'T CARE IF IT WAS HARD OR NOT
BUG.(HLT,SKDMPE,APRSRV,HARD,<MPE in scheduler or PI context>,,<
Cause: A page fault occurred indicating an AR or ARX parity error
while the monitor was processing an interrupt or running
the scheduler. This BUGHLT occurs regardless of whether the
error is repeated when the reference is retried or not.
The monitor has printed a description of the problem on the CTY.
A SYSERR block has been created and will be placed in the
SYSERR file when the monitor is rebooted.
>)
;Here on a NXM. This also causes an AR/ARX parity error. Normally we
;don't get here because NXM causes an interrupt, wich leads to an
;APRNX1 BUGHLT.
PFNXM:: CONOAPR APFCLR+APSBER+APMPE ;CLEAR SPURIOUS FLAGS
CONSZ PI,PIPION ;PI SYSTEM ON?
BUG.(HLT,APRNX2,APRSRV,HARD,<NXM detected by APR>,,<
Cause: A page fault occurred, indicating that the processor
attempted to access a memory that did not respond within
a preset time. The monitor is presently processing an
interrupt or running in the scheduler and the interrupt
system is turned on. Since non-existent memory also
produces an APR interrupt, which results in an APRNX1 BUGHLT,
this BUGHLT does not normally occur.
Action: See APRNX1. Note, however, that the occurrence of this BUGHLT
instead of APRNX1 may indicate a failure in the interrupt
system.
>) ;YES
AOS UPTPFO ;FAKE COMPLETION OF INSTRUCTION
JRST 0(T2) ;CONTINUE, ASSUME PGM WILL CHECK FOR NXM
;PARITY ERROR TRAP IN PROCESS CONTEXT - HERE FROM DISPATCH AT PGRTRP
;RETURNS +1, NOT RECOVERABLE; RETURNS +2, RECOVERABLE
;Here from PGRTRP or PFAID when page fail code indicated AR or ARX parity error
;From PGRTRP, in user context. From PFAID, in scheduler or interrupt context.
;LOCAL FLAGS IN F
PFCPF0==1B18 ;ON WHEN EXECUTING TEST REFERENCE
PFCPF1==1B19 ;ON IF LAST TEST REFERENCE FAILED
PFCPF2==1B20 ;ON IF PI SYSTEM ON AT ENTRY
PFCPF3==1B21 ;ON IF TESTING AN EPT WORD
PFCPF4==1B22 ;ON IF TESTING A UPT WORD
;Also in F:
;PT%CCH means cache was on
;PT%ESW means ???
;This code retries with and without cache, creates a SYSERR block and
;prints a message on the CTY
;On a nonrecoverable error in the memory this routine calls BADCPG, which
;will BUGHLT if the page is critical.
PGMPE0::SKIPE T1,DIAGAR ;AR/ARX INTERCEPT SET?
JRST [ JE UMODF,UPTPFL,.+1 ;USER MODE?
AOS UPTPFO ;YES. ASSUME NO INTERVENTION
SKIPL T1 ;AN ADDRESS GIVEN?
MOVEM T1,UPTPFO ;YES. STORE NEW ADDRESS
RETSKP] ;AND RETURN TO THE USER
CONSZ APR,APNXM ;NXM CAUSED THIS?
JRST PGNXM0 ;YES
PUSH P,F ;INIT LOCAL FLAG REG
;Save the state of the PI's.
SETZ F,
CONSO PI,PIPION ;NORMAL SYSTEM OPERATION (PI ON)?
JRST [ CONOAPR APFCLR+APSBER+APIOPF+APMPE+APCDPE+APAPE
JRST PFCP3] ;NO, CLEAR APR BITS, NO INTERRUPT
TXO F,PFCPF2 ;REMEMBER TO RESTORE PI
;Allow memory parity error interrupt to occur
MOVX T1,1B17 ;GET A LARGE NUMBER
CONSZ APR,APMPE!APSBER ;AN APR INT PENDING?
SOJG T1,.-1 ;YES. WAIT FOR IT
;Don't allow loading of the cache
PFCP3: MOVE T1,CONOPG
TXZ T1,PGCLDE ;SET CACHE NO LOAD
CONO PAG,0(T1)
MOVEM P,MEMAP ;[7447] Save current stack pointer
MOVE P,[IOWD NMEMPP,MEMPP] ;[7447] And set up APR stack
;Save current page fail information
PUSH P,UPTPFN ;[7447] Save old and new trap PC
PUSH P,UPTPFO ;[7447]
PUSH P,UPTPFL ;[7447]
;Get SYSERR block and store data
MOVEI T1,PT%LEN
MOVEI T2,PT%SIZ
CALL ALCSEB ;ASSIGN SYSERR BUFFER
BUG.(HLT,NOSEB2,APRSRV,SOFT,<PGMPE-No SYSERR buffer available>,,<
Cause: An AR or ARX parity error has occurred, and the monitor
is creating a SYSERR block. The BUGHLT indicates that no
free space is available for the SYSERR block. UPTPFW
contains the page fail word.
>)
MOVEI Q2,SEBDAT(T1) ;Q2 HOLDS PTR TO DATA BLOCK
HRL Q2,T1 ;LH HOLDS ORIGINAL PTR
PIOFF ;PROCEED WITH PI OFF
;..
;..
;Set up UPT so that page faults will go to special routine, which will
;determine if fault occurred while testing memory.
MOVE T1,UPTPFW
MOVEM T1,PT%PFW(Q2) ;REPORT IT
MOVE T3,[PFCPTP] ;BUILD TEMPORARY PF TRAP DISPATCH
XSFM T2 ;GET FLAGS
TXNE T1,TWUSR ;USER REFERENCE?
TXO T2,PCU ;YES, SET PREVIOUS CONTEXT
MOVEM T3,UPTPFN ;TRAPS WILL GO TO SPECIAL PLACE HEREIN
HRRI T3,.+2
XJRSTF T2 ;SET PCU NOW
TXZ T1,EXFLBT ;CLEAR EXTRANEOUS BITS
CALL PRV1XC ;DO REFERENCE IN SECTION 1
MAP T1,0(T1)
MOVEM T1,PT%PMA(Q2) ;SAVE FOR REPORT
SETZM PT%TRY(Q2) ;CLEAR REPORTED RETRY COUNT
DATAO PAG,SETBK7 ;SET TO REFERENCE AC BLOCK 7
UMOVE T1,BK7PFD ;GET BAD DATA
DATAO PAG,SETMON ;RESTORE NORMAL AC BLOCK
MOVEM T1,PT%BDW(Q2) ;SAVE BAD DATA FOR REPORT
MOVE T1,FORKX ;SAVE USER INFO
HRLOM T1,PT%JOB(Q2)
; THE KL10 EBOX CAN MAKE REQUESTS TO THE MBOX ON AN EPT OR UPT
; RELATIVE BASIS. IF A PARITY ERROR OCCURS ON SUCH A REFERENCE
; THE PAGE FAIL WORD DOES NOT SHOW WHICH KIND OF REFERENCE WAS
; OCCURING. IF PHYSICAL PAGE ZERO IS REFERENCED WE WILL CHECK
; WORDS IN THE EPT AND UPT FOR ERRORS. IF ERRORS ARE PRESENT
; A BUGHLT WILL OCCUR.
SETZM PT%EPD(Q2) ; ZERO OUT DATA CELLS
SETZM PT%EPA(Q2)
SETZM PT%UPD(Q2)
SETZM PT%UPA(Q2)
LOAD T1,VPGNO,PT%PFW(Q2) ; GET THE PAGE NUMBER...IS IT ZERO?
JUMPN T1,PGMPE1 ; NO SO IT CANT BE UPT OR EPT RELATIVE
LOAD T1,PGWD,PT%PFW(Q2) ; GET THE LINE NUMBER IN THE PAGE
TXO F,PFCPF3 ; FLAG THAT WE ARE TOUCHING EPT WORD
MOVE T2,KIEPT(T1) ; GET THE EPT OFFSET WORD
TXZ F,PFCPF3 ; RESET THE FLAG
MOVEM T2,PT%EPD(Q2) ; SAVE THE EPT WORD
MAP T2,KIEPT(T1) ; GET PHYSICAL ADDRESS OF THE EPT WORD
MOVEM T2,PT%EPA(Q2) ; AND SAVE IT
TXO F,PFCPF4 ; FLAG THAT WE ARE TOUCHING UPT WORD
MOVE T2,HWPTA(T1) ; GET THE UPT OFFSET WORD
TXZ F,PFCPF4 ; RESET THE FLAG
MOVEM T2,PT%UPD(Q2) ; SAVE THE UPT DATA WORD
MAP T2,HWPTA(T1) ; GET THE PHYSICAL ADDRESS
MOVEM T2,PT%UPA(Q2) ; SAVE THE PHYSICAL ADDRESS
PGMPE1:
;..
;..
;Flush cache and turn it off
MOVE Q1,CONOPG
TXZN Q1,PGCLKE+PGCLDE ;CACHE ON?
JRST PFCP4 ;NO
TXO F,PT%CCH ;YES, NOTE
CCHUA ;UNLOAD IT
CONSO APR,APSWPD ;WAIT FOR COMPLETION
JRST .-1
CONOAPR APFCLR+APSWPD ;CLEAR FLAG
CONSZ APR,APMPE ;ERROR ON WRITE TO CORE?
JRST [ TXO F,PT%ESW ;YES. REMEMBER THAT
RDERA PI%ER2+MPISEB ;AND SAVE ERA AS WELL FOR SBUS CODE
JRST .+1]
CONO PAG,0(Q1) ;TURN CACHE OFF
;BEGIN RETRY ALGORITHM
;Retry with cache off.
PFCP4: CALL PFCPRT ;RETRY REFERENCE WITHOUT CACHE
JRST PFCPH ;RETRIES FAILED, HARD IN CORE
MOVEM T1,PT%GDW(Q2) ;SAVE GOOD DATA
MOVEM T3,PT%TRY(Q2) ;AND SAVE RETRY COUNT
;If cache was on previously, turn it back on and retry the reference
TXNN F,PT%CCH ;WERE USING CACHE?
JRST PFCP2 ;NO
CONO PAG,PGCLKE(Q1) ;YES, TURN IT BACK ON
CALL PFCPRT ;RETRY REFERENCE WITH CACHE
JRST PFCPHH ;RETRIES FAILED, HARD IN CACHE
;..
;..
;Here when error is recoverable. Either the memory retry succeeded and
;cache was off originally or both retries succeeded and cache was on
;Queue the SYSERR block and restore the context to continue
PFCP2: HLLM F,PT%TRY(Q2) ;SAVE FLAGS
CALL PFCPLG ;LOG INFO
POP P,UPTPFL ;RESTORE PAGE FAIL VARIABLES
POP P,UPTPFO
POP P,UPTPFN
MOVEI T1,ARBUG-BUGBUG ;GET PROPER INDEX FOR MESSAGE
CALL GENBLK ;DO STATUS REPORT
MOVE P,MEMAP ;RESTORE ORIGINAL STACK POINTER
CONO PAG,@CONOPG ;RESTORE CACHE STATE
TXNE F,PFCPF2 ;RESTORE PI
PION
POP P,F
RETSKP ;RETURN RECOVERABLE
;ROUTINE TO EXECUTE A PXCT IN SECTION 1 AND RETURN TO CURRENT SECTION
;Executes the instruction after the call.
;Returns: +2 always
PRV1XC: EA.ENT ;ENTER SECTION 1
MOVE CX,@0(P) ;GET INSTRUCTION TO DO
; NOTE THIS IS DONE SINCE AN
; XCTU @0(P) WOULD EXECUTE THE
; TARGET INST IN THE SECTION OF THE
; CALLING ROUTINE RATHER THAN
; THE SECTION OF THE CURRENT PC
; BOO HIS!
XCTU CX ;DO IT IN SECTION 1
RETSKP ;AND DONE
;Here if BUGHLT and want to type out MB parity error block
; T2/ SYSERR BLOCK
;PIOFF, Secondary protocol
MBERRB: SAVEQ
MOVEI Q1,SEBDAT(T2)
;DO TYPEOUT OF PROCESSOR INFORMATION
MOVEI T1,[SIXBIT '$$PARITY ERROR DETECTED BY /']
TMNN APMPE,PI%CN2(Q1)
MOVEI T1,[SIXBIT '$$SBUS ERROR DETECTED BY /']
JSR BUGMSG
MOVEI T1,[SIXBIT 'APR/']
TMNE ER%CHN,PI%ER2(Q1)
MOVEI T1,[SIXBIT 'CHANNEL/']
JSR BUGMSG
MOVEI T1,[SIXBIT ', ERA = /']
JSR BUGMSG
MOVE T1,PI%ER2(Q1)
CALL BUGWPT
MOVE T1,PI%SB2(Q1) ;GET SDBIAG WORD
ADDI T1,0(Q1) ;ADD IN START IF BLOCK
CALL PRISBS ;DO SBUS DIAGS AS WELL
MOVEI T1,[SIXBIT '$$ LOC CONTENTS$$/']
JSR BUGMSG
HRLI Q1,-PI%NB2 ;SCAN BLOCK OF BAD ADDRESSES
; ..
; ..
;Now look at bad word and report on each of them
MBERR2: SKIPN T1,PI%BAD(Q1) ;HAVE AN ADDRESS?
RET ;NO. ALL DONE THEN
ANDX T1,<PHCPNO+PGWD> ;JUST USE ADDRESS BITS
CALL BUGOP8
MOVEI T1," "
JSR BUGTYO
MOVE T1,PI%DA2(Q1) ;GET BAD DATA
CALL BUGWPT
MOVEI T1," "
JSR BUGTYO
JN PI%FAT,PI%BAD(Q1),MBERR3 ;IF HARD NO GOOD DATA
MOVE T1,PI%MDA(Q1)
CALL BUGWPT
MBERR3: MOVEI T1,[SIXBIT '$/']
JSR BUGMSG
AOBJN Q1,MBERR2 ;DO ALL ADDRESSES
RET
;HERE IF BADCPG WANTS TO BUGHLT. DO FORCE TYPE OUT OF AR/ARX INFO
; T2/ SYSERR BLOCK
PFERRB: SAVEQ
MOVEI Q2,SEBDAT(T2) ;SAVE BLOCK ADDRESS
MOVEI T1,[SIXBIT '$$AR OR ARX PARITY ERROR$PFW= /']
JSR BUGMSG
MOVE T1,PT%PFW(Q2) ;PF WORD
CALL BUGWPT
MOVEI T1,[SIXBIT ' MAP WORD= /']
JSR BUGMSG
MOVE T1,PT%PMA(Q2) ;MAP WORD
CALL BUGWPT
MOVEI T1,[SIXBIT '$BAD DATA= /']
JSR BUGMSG
MOVE T1,PT%BDW(Q2)
CALLRET BUGWPT
;HERE IF ERROR REPEATABLE ON DIRECT REFERENCES TO CORE
;Queue the SYSERR entry, disable the page, and print a message on the CTY
PFCPH: TXO F,PT%HRD ;NOTE HARD ERROR
HLLM F,PT%TRY(Q2) ;SAVE FLAGS FOR REPORT
;Queue the SYSERR entry
CALL PFCPLG ;LOG ERROR INFO
LOAD T2,TWVADR,PT%PFW(Q2) ;SETUP TO REFERENCE BAD WORD AGAIN
TXO F,PFCPF0 ;NOTE CONTROLLED REFERENCE
; CALL PRV1XC ;REF IT
; SETZM 0(T2) ;ZERO THE BAD WORD
TXZ F,PFCPF0+PFCPF1
POP P,UPTPFL ;RESTORE PAGE FAIL VARIABLES
POP P,UPTPFO
POP P,UPTPFN
MOVEI T1,ARBUG-BUGBUG ;GET PROPER INDEX
CALL GENBLK ;DO STATUS
LOAD T1,PHCPNO,PT%PMA(Q2) ;GET PHYS PAGE NUMBER
TXNE F,PFCPF2 ;NON-PI CODE?
MOVE P,MEMAP ;NO. RESTORE INCOMING STACK
CONO PAG,@CONOPG ;RESTORE CACHE STATE
NOSKD1
TXNE F,PFCPF2 ;RESTORE PI
PION
POP P,F
;Turn the page offline. This routine may BUGHLT if page is critical
CALL BADCPG ;MARK CORE PAGE BAD
OKSKD1 ;ALLOW SCHEDULING
RET ;AND DONE
;HERE IF ERROR REPEATABLE ONLY ON REFERENCES THROUGH CACHE
;Turn off the cache and continue
CCHEMX==3 ;MAX CACHE ERRORS ALLOWED
PFCPHH: CONO PAG,0(Q1) ;TURN CACHE OFF
TXO F,PT%CCF+PT%HRD ;NOTE HARD CACHE ERROR
AOS T1,CCHECT ;COUNT HARD CACHE ERRORS
CAIGE T1,CCHEMX ;REACHED MAX?
JRST PFCP2 ;NO, CONTINUE
BUG.(CHK,HARDCE,APRSRV,HARD,<Hard cache errors--cache deselected>,,<
Cause: The hardware has detected an AR or ARX parity error that occurs
only when an address is referenced through the cache. An attempt
to reference the same address from memory with the cache turned
off has succeeded. This has happened more than the allowable
maximum number of times. The monitor will turn off the cache and
proceed.
The monitor has printed a description of the problem on the
CTY and created a SYSERR block, which will be written into
the SYSERR file.
Action: The monitor will continue to run without the cache.
However, when the front end reloads the monitor at some future
time, the front end will enable the cache. Change its configuration
file in order to avoid this until the cache is fixed.
>,,<DB%NND>) ;[7.1210]
MOVEM Q1,CONOPG ;SET CACHE OFF
JRST PFCP2 ;CONTINUE
;LOCAL ROUTINE TO LOG ERROR INFORMATION
PFCPLG: CONOAPR APFCLR+APNXM+APMPE ;CLEAR RESIDUAL FLAGS
HLRZ T1,Q2 ;GET PTR TO SYSERR BLK
MOVE T2,[-NPFCPT,,PFCPT]
CALL SEBCPY ;PUT IN CODE, ETC.
JFCL
HLRZ T1,Q2
CALLRET QUESEB ;QUEUE IT AND RETURN
;LOCAL RETRY ROUTINE
;RETURN +1: HARD FAILURE
;RETURN +2: RETRY SUCCEEDED,
; T1/ GOOD DATA
; T3/ NUMBER OF TRY WHICH WORKED (FIRST TRY = 1)
; Q2/ ADDRESS OF SYSERR BLOCK
;This routine tries to reference data that previously caused an AR or ARX
;parity error. Caller has enabled or disabled cache. UPTPFN has been set up
;so that an error will call PFCPTP below. This routine sets the flag
;PFCPF0 in F to indicate it is retrying an error
PFCPRT: MOVEI T3,1 ;INIT RETRY COUNT
PFCPL1:
LOAD T2,TWVADR,PT%PFW(Q2) ;GET VA OF ORIGINAL TRAP
TXO F,PFCPF0 ;NOTE TEST REFERENCE
CALL PRV1XC ;DO THE REFERENCE
MOVE T1,0(T2) ;IN PROPER SECTION
TXZ F,PFCPF0
TXZN F,PFCPF1 ;ANOTHER ERROR?
RETSKP ;NO, RETURN SUCCESS
CAIGE T3,4 ;REACHED RETRY LIMIT?
AOJA T3,PFCPL1 ;NO
RET ;YES, RETURN FAILURE
;PAGE FAIL TRAPS TO HERE WHILE PROCESSING MPE TRAPS
;PGMPE0 set UPTPFN to point here
PFCPTP: TXNN F,PFCPF0 ;DOING TEST REFERENCE?
BUG.(HLT,UNXMPE,APRSRV,HARD,<PFCDPE - Unexpected parity error trap>,<<T1,PFW>,<T2,PADR>>,<
Cause: The monitor was processing an AR or ARX parity error when
a second error occurred. The monitor retries the reference
that caused the original error and is prepared to handle
a second error. However, the BUGHLT indicates that the
error occurred during the processing but not during the retry.
Data: PFW - Page fail word
PADR - Address of page fail
>) ; NO
LOAD T1,TWCOD,UPTPFW ;YES, CHECK CODE
CAIGE T1,PECOD0 ;ANOTHER PARITY ERROR?
BUG.(HLT,MPEUTP,APRSRV,HARD,<PFCDPE-Unknown trap on test reference>,,<
Cause: The monitor was processing an AR or ARX parity error when a
second error occurred. The monitor retries the reference that
caused the original error and is prepared to handle a second
error. However, the BUGHLT indicates that the second error
(caused by the retry) was not an AR or ARX parity error and
thus was not expected.
>)
TXO F,PFCPF1 ;YES, NOTE REFERENCE FAILED
AOS UPTPFO ;SKIP FAILING INSTRUCTION
XJRSTF UPTPFL ;RETURN
;HERE IF NXM CAUSED TRAP
;Jumped to from PGMPE0 if APNXM is set in CONI APR word.
PGNXM0: CONOAPR APFCLR+APMPE ;CLEAR RESIDUAL FLAGS
CONSZ PI,PIPION ;PI SYSTEM ON?
BUG.(HLT,PRONX2,APRSRV,HARD,<NXM detected by processor>,,<
Cause: A page fault occurred indicating that the processor
attempted to access a memory that did not respond within
a preset time. The monitor is presently running in
process context. The interrupt system is on. Since
non-existent memory also produces an APR interrupt,
which results in an APRNX1 BUGHLT,
this BUGHLT does not normally occur.
Action: See APRNX1. Note, however, that the occurrence of this BUGHLT
instead of APRNX1 may indicate a failure in the interrupt
system.
>)
AOS UPTPFO ;BYPASS FAILING INSTRUCTION
RET
> ;END OF IFN KLFLG
SUBTTL KA floating point simulation
;SIMULATION ROUTINES FOR LONG-MODE FLOATING POINT ARITHMETIC
; (KA10-STYLE DOUBLE PRECISION)
SWAPCD
;HERE WITH INSTRUCTION IN KIMUUO AND PREVIOUS CONTEXT SET UP
SDFN:: EA.ENT
CALL GTARGS
LSHC T2,11 ;EXPONENT TO T2 (ISN'T CHANGED)
SETCM T1,T1 ;ONE'S COMPLEMENT THE HIGH WORD
MOVN T3,T3 ;TWO'S COMPLEMENT THE LOW WORD.
SKIPN T3 ;SKIP UNLESS LOW WORD IS ZERO
ADDI T1,1 ;TWO'S COMPLEMENT THE HIGH WORD
LSHC T2,-11 ;RESTORE OLD BITS 0-8
XCTU [MOVEM T1,0(Q1)] ;HIGH PART TO AC
XCTU [MOVEM T3,@KIMUEF] ;LOW PART TO E
RET
;SUBROUTINE FOR ARGUMENT FETCH AND PREPARATION (EXTRACT EXPONENT, SIGN EXTEND)
GTARGS: LDB Q1,[POINT 4,KIMUU1,30] ;GET AC FIELD OF INSTR
XCTU [MOVE T1,0(Q1)] ;GET AC ARG
XCTU [MOVE T3,@KIMUEF] ;GET (E)
SETZB T2,T4 ;CLEAR LOW PARTS
RET
SFLGET: XCTU [MOVE T2,@KIMUEF] ;FETCH C(E).
SFLGT1: LDB Q1,[POINT 4,KIMUU1,30] ;GET AC FIELD OF INSTR
XCTU [MOVE Q3,(Q1)] ;FETCH C(AC)
SFLGT2: LDB Q2,[POINT 9,Q3,8] ;EXPONENT AND SIGN OF C(AC)
LDB T1,[POINT 9,T2,8] ;EXPONENT AND SIGN OF C(E)
TRNE Q2,400
XORI Q2,777 ;ONES COMPLEMENT OF NEGATIVE EXPONENT
TRNE T1,400
XORI T1,777
SKIPL Q3 ;SKIP IF C(AC) ARE NEGATIVE
TLZA Q3,777000 ;POSITIVE. EXTEND SIGN BIT
TLO Q3,777000 ;NEGATIVE. EXTEND SIGN
SKIPL T2 ;SKIP IF C(E) ARE NEGATIVE
TLZA T2,777000 ;POSITIVE. EXTEND SIGN BIT
TLO T2,777000 ;NEGATIVE. EXTEND SIGN
RET
;SUBROUTINE FOR ADD/SUBTRACT TYPE OPERATIONS. DENORMALIZE SMALLER ARGUMENT
SFAT3A: CAML Q2,T1 ;DECIDE WHICH EXPONENT IS LARGER
JRST SFAT3B ;AND DO PRENORMALIZE (DENORMALIZE)
EXCH Q2,T1 ;INTERCHANGE OPERANDS
EXCH Q3,T2 ;SMALLER OPERAND INTO T1/T2/T3=0
SFAT3B: SUB T1,Q2 ;T1=SHIFT FACTOR (0 OR NEGATIVE)
MOVEI T3,0 ;FOR PEOPLE WHO WANT DOUBLE LENGTH
CAMGE T1,[-100] ;ARE WE GOING TO LOSE ALL SIGNIFIGANCE?
TDZA T2,T2 ;YES. T2=0 SKIP THE SHIFT
ASHC T2,(T1)
TRZ T3,177 ;KA10 MAKES A 54 BIT RESULT
ADD T2,Q3 ;DOUBLE LENGTH RESULT TO T2/T3
SKIPL T2 ;POSITIVE OR NEGATIVE RESULT
SKIPA Q3,[TLNN T2,1000]
MOVE Q3,[TLNE T2,1000]
XCT Q3 ;SKIP IF ADD OVERFLOWED
JRST SFAT3C ;NO OVERFLOW
ASHC T2,-1 ;ADD PRODUCED AN HIGH ORDER BIT.
ADDI Q2,1 ;SHIFT RESULT DOWN AND BUMP EXPONENT
SFAT3C: TLZ T3,400000 ;CLEAR SIGN BIT IN LOW WORD (SET BY ASHC)
RET
SUFA:: EA.ENT
CALL SFLGET ;FETCH AND SETUP ARGUMENTS
CALL SFAT3A ;PRENORMALIZE AND DO THE ADD.
CAIG Q2,377 ;DID EXPONENT OVERFLOW?
JRST SUFA1 ;NO.
MOVSI Q3,440200 ;SET AROV, FOV, AND TRAP1
IORM Q3,-1(P) ;STORE WHERE THEY'LL BE RESTORED.
SUFA1: SKIPN T2 ;SKIP IF RESULT NON ZERO.
JUMPE T3,STORA1 ;HIGH PART IS 0. RETURN 0 IF LOW PART IS 0
DPB Q2,[POINT 8,T2,8] ;STORE EXPONENT
SKIPGE T2 ;SKIP IF RESULT IS POSITIVE
TLC T2,377000 ;ONES COMPLEMENT TO EXPONENT
MOVE T3,T2 ;COPY RESULT TO T3 FOR STORA1
JRST STORA1
SFADL:: EA.ENT
CALL SFLGET ;FETCH AND PREPARE ARGUMENTS
JRST SFADL0
SFSBL:: EA.ENT
CALL SFLGET ;FETCH AND PREPARE ARGUMENTS
MOVN T2,T2 ;NEGATE C(E)
SFADL0: CALL SFAT3A ;PRENORMALIZE AND DO ADD
;POSTNORMALIZE. Q2= EXPONENT, T2--T3 ARE FRACTION
SFLNRM: SKIPN T2 ;Q2=EXPONENT. T2--T3 ARE FRACTION
JUMPE T3,SFLSTR ;JUMP IF RESULT IS ZERO. STORE RESULT
SKIPL T2 ;POSTNORMALIZE BY SHIFTING LEFT
SKIPA T1,[TLNE T2,400] ;SKIP IF POSITIVE NUMBER IS UNNORMALIZED
MOVE T1,[TLNN T2,400] ;SKIP IF NEGATIVE NUMBER IS UNNORMALIZED
SFLNR2: XCT T1 ;SKIP IF UNNORMALIZED
JRST SFLNR3 ;NORMALIZE COMPLETE
ASHC T2,1 ;SHIFT TO NORMALIZE
SOJA Q2,SFLNR2 ;DECREMENT EXPONENT. LOOP UNTIL DONE
SFLNR3: JUMPGE T2,SFLN3A ;JUMP IF POSITIVE
TDNE T2,[777,,-1] ;NEGATIVE. SKIP IF NO SIGNIFICANCE
JRST SFLN3A
ASHC T2,-1 ;GET THAT BIT BACK HERE
ADDI Q2,1
SFLN3A: TLZ T3,400000 ;CLEAR SIGN BIT OF LOW WORD
LSH T3,-10 ;LEAVE ROOM IN LOW WORD FOR EXPONENT
CAIGE Q2,400 ;SKIP IF OVERFLOW
JUMPGE Q2,SFLNR6 ;JUMP UNLESS UNDERFLOW
MOVSI T1,440200 ;AROV, FOV, TRAP 1
CAIL Q2,433 ;DOES EXPONENT EXCEED 128+27?
JRST SFLNR4 ;YES. STORE ZERO IN LOW WORD
JUMPG Q2,SFLNR5
TRNE Q2,200 ;SOMETIMES THE KA10 FORGETS AN UNDERFLOW
TLO T1,100 ;SET FLOATING UNDERFLOW TOO.
SFLNR4: MOVEI T3,0 ;AND CLEAR LOW WORD.
SFLNR5: IORM T1,-1(P) ;STORE FLAGS FOR USER.
SFLNR6: HRREI Q3,-33(Q2) ;COMPUTE EXPONENT OF LOW PART
SKIPGE Q3
MOVEI T3,0 ;ZERO LOW PART, IF EXPONENT TOO SMALL
ANDI Q2,377 ;TRUNCATE EXPONENT
SKIPE T3 ;SKIP IF LOW FRACTION IS ZERO
DPB Q3,[POINT 9,T3,8] ;STORE LOW EXPONENT. CLEAR SIGN BIT.
ROT Q2,-11 ;SHIFT EXPONENT TO RIGHT PLACE
XOR T2,Q2 ;ONES COMPLEMENT OF EXP, IF NEGATIVE
SFLSTR: XCTU [MOVEM T2,(Q1)] ;STORE DOUBLEWORD RESULT IN C(AC)
STORA1: ADDI Q1,1 ;AND IN C(AC+1 MOD 20)
ANDI Q1,17
XCTU [MOVEM T3,(Q1)]
RET
SFMPL:: EA.ENT
CALL SFLGET ;FETCH AND PREPARE ARGUMENTS
MUL T2,Q3 ;DOUBLE WORD PRODUCT TO T2/T3
ADD Q2,T1 ;Q2=EXPONENT OF RESULT
SUBI Q2,200 ;ACCOUNT FOR EXCESS 200 IN EXPONENTS
ASHC T2,10 ;RESULT OF MULTIPLY IS TOO FAR RIGHT BY 8
;PLACES (NOT 9 SINCE BIT 0 OF T3 IS SIGN)
TLZ T3,400000 ;FLUSH SIGNBIT
JRST SFLNRM ;DO POSTNORMALIZE
SFDVL:: EA.ENT
LDB Q1,[POINT 4,KIMUU1,30] ;GET AC FIELD OF INSTR
XCTU [MOVE T2,(Q1)] ;FETCH C(AC)
MOVEI T3,1(Q1)
ANDI T3,17
XCTU [MOVE T3,(T3)] ;FETCH C(AC+1)
SKIPN T2 ;IF DIVIDING ZERO
JUMPE T3,SFLSTR ; WITHOUT FURTHER ADO, STORE ZERO
XCTU [MOVE Q3,@KIMUEF] ;FETCH C(E).
LSH T3,10 ;FLUSH EXPONENT FROM LOW WORD
TLZ T3,400000 ;FLUSH SIGNBIT FROM LOW WORD
CALL SFLGT2 ;SETUP EXPONENTS, ETC
SFDVL1: MOVEI T4,0 ;ASSUME BOTH ARGUMENTS ARE POSITIVE
JUMPGE T2,SFDVL2 ;JUMP IF DIVIDEND IS POSITIVE
SETCA T2, ;DIVIDEND IS NEGATIVE. TAKE TWOS COMPLEMENT
MOVN T3,T3 ;OF THE DOUBLE WORD (THIS SHOULD BE DMOVN
SKIPN T3 ;EXCEPT, WE HAVE TO RUN THIS ON THE KA10 TO
ADDI T2,1 ;VERIFY IT).
MOVSI T4,600000 ;QUOTIENT AND REMAINDER ARE NEGATIVE
SFDVL2: JUMPGE Q3,SFDVL3 ;JUMP IF DIVISOR IS POSITIVE
MOVN Q3,Q3
TLC T4,400000 ;COMPLEMENT SIGN OF QUOTIENT
SFDVL3: CAMGE T2,Q3 ;IS QUOTIENT GREATER THAN 1.0?
JRST SFDVL4 ;NO.
ASHC T2,-1 ;YES. TRY A 1 BIT SHIFT
CAML T2,Q3 ;DID THAT FIX IT?
JRST SFDVLX ;NO. WE HAVE A NO-DIVIDE CONDITION
ADDI T1,1 ;ADJUST EXPONENT OF DIVIDEND
SFDVL4: TLNN Q3,1000 ;ONLY CRETINS DIVIDE BY "SETZ"
JRST SFDVL6
LSH Q3,-1 ;BUT TO KEEP THEM HAPPY...
ADDI Q2,1
SFDVL6: SUBM T1,Q2 ;Q2=EXPONENT OF QUOTIENT
ADDI Q2,200 ;MAKE EXPONENT INTO EXCESS 200.
LSH Q3,10 ;SCALE DIVISOR TO ALLOW ONLY 27 DIVIDE STEPS
DIV T2,Q3 ;T2=QUOTIENT, T3=REMAINDER
JUMPE T2,SFDVL9 ;IF QUOTIENT IS ZERO, DON'T NORMALIZE
SFDVL8: TLNE T2,400 ;NOW, NORMALIZE THE QUOTIENT
JRST SFDVL9
LSH T2,1 ;BEFORE COMPUTING OVERFLOW CONDITION
SOJA Q2,SFDVL8
SFDVL9: CAIGE Q2,400 ;OVERFLOW?
JUMPGE Q2,SFDVL7 ;NO. JUMP UNLESS UNDERFLOW
MOVSI Q3,440200 ;AROV, FOV, TRAP 1
JUMPGE Q2,SFDVL5
TRNE Q2,200 ;SOMETIMES THE KA10 FORGETS FXU
TLO Q3,100 ;FXU
SFDVL5: IORM Q3,-1(P)
ANDI Q2,377
SFDVL7: SKIPE T2 ;AVOID STORING EXPONENT IN A ZERO FRACTION
DPB Q2,[POINT 9,T2,8] ;STUFF EXPONENT
TLNE T4,400000 ;SHOULD QUOTIENT BE NEGATIVE?
MOVN T2,T2 ;YES.
SUBI T1,33 ;CALCULATE EXPONENT OF REMAINDER
SKIPGE T1 ;IF UNDERFLOW, SET REMAINDER TO ZERO
MOVEI T3,0
JUMPE T3,SFLSTR ;IF ZERO REMAINDER, STORE ZERO
LSH T3,-10 ;MAKE ROOM FOR EXPONENT
DPB T1,[POINT 8,T3,8] ;STUFF EXPONENT
TLNE T4,200000 ;SHOULD WE NEGATE REMAINDER?
MOVN T3,T3
JRST SFLSTR ;STORE AC, AC+1
SFDVLX: MOVSI T3,440240 ;AROV, FOV, NO DIVIDE, TRAP1
IORM T3,-1(P)
RET
SUBTTL Gfloat to Integer Conversion Simulation Routines
IFN KLFLG,<
.DGFXR: ;GFLT TO DOUBLE INTEGER ROUNDED
MOVX T4,GFLT%2 ;SET THE DOUBLE AC FLAG
CALL DGFXR0 ;GO TO COMMON CODE
JUMPG T3,DGFXR1 ;IF SHIFT POSITIVE THEN SHIFT LEFT
CAMG T3,[-^D70] ;SHIFT INSTS ARE MOD 256 SO REDUCE
MOVNI T3,^D70 ;EXPONENT IF ITS TOO LARGE
ASHC T1,1(T3) ;SHIFT ROUNDING BIT INTO RIGHTMOST OF T2
DADD T1,[EXP 0,1] ;ROUND
ASHC T1,-1 ;SHIFT ROUNDING BIT OUT
RET ;RETURN TO CALLER
DGFXR1: CAILE T3,^D11 ;CHECK EXPONENT SIZE
JRST DGFXR3 ;TOO BIG THEN OVERFLOW
DGFXR2: ASHC T1,(T3) ;SHIFT LEFT NO ROUNDING
RET ;RETURN TO CALLER
DGFXR3: CAIN T3,^D12 ;CHECK FOR LARGEST NEGATIVE INTEGER
IFL. T1
CAMN T1,[777740000000]
JUMPE T2,DGFXR2 ;LET THAT ONE THROUGH
ENDIF.
DGFXR4: TXO T4,GFLT%O ;SET THE OVERFLOW FLAG
RET ;AND RETURN TO CALLER
DGFXR0: ;COMMON CODE FOR DGFIXR AND DFIXR
LDB T3,[POINT 11,T1,11] ;GET THE EXPONENT
TLNE T1,(1B0) ;PROPAGATE SIGN THROUGH EXPONENT BITS
TLOA T1,777700 ;NEGATIVE SET TO ONES
TLZA T1,777700 ;POSITIVE SET TO ZEROES
TRC T3,3777 ;UNCOMPLEMENT EXPONENT IF NEGATIVE
SUBI T3,2000+^D59 ;GET SHIFT VALUE TO ALIGN INTEGER PART
RET ;RETURN TO CALLER
.GFXR: ;GFLOAT TO SINGLE INTEGER ROUNDED
SETZ T4, ;RESET FLAG AC
CALL DGFXR0 ;GO TO COMMON CODE
JUMPG T3,DFXR1 ;IF SHIFT COUNT POSITIVE GO SHIFT LEFT
CAMG T3,[-^D70] ;SHIFT INSTS ARE MOD 256 SO REDUCE
MOVNI T3,^D70 ;NEW EXPONENT IF IT WAS TOO LARGE
ASHC T1,1(T3) ;SHIFT ROUNDING BIT INTO T2
DADD T1,[EXP 0,1] ;ROUND
ASHC T1,-1 ;SHIFT ROUNDING BIT OUT
JRST DFXR3 ;GO CONVERT TO SINGLE INTEGER
DFXR1: CAILE T3,^D11 ;CHECK EXPONENT SIZE
JRST DGFXR4 ;GO DO OVERFLOW STUFF
DFXR2: ASHC T1,(T3) ;SHIFT LEFT NO ROUNDING NEEDED
DFXR3: CAME T1,[-1] ;HIGH WORD MUST BE ALL SIGN BITS
JUMPN T1,DGFXR4 ;IF IT ISNT THEN OVERFLOW
MOVE T1,T2 ;GET WORD INTO CORRECT AC
RET ;RETURN TO CALLER
.GFX: ;GFLOAT TO SINGLE INTEGER
SETZ T4, ;RESET FLAG AC
PUSH P,T1 ;SAVE ORIGINAL SIGN
SKIPGE T1 ;IS NUMBER POSITIVE?
DMOVN T1,T1 ;NO...GET ABSOLUTE VALUE
LDB T3,[POINT 11,T1,11] ;GET THE EXPONENT
TLZ T1,777700 ;CLEAR EXPONENT FROM NUMBE
SUBI T3,2000+^D59 ;GET SHIFT AMOUNT TO ALIGN INTEGER PART
CAMG T3,[-^D70] ;SHIFT INSTS ARE MOD 256 SO REDUCE
MOVNI T3,^D70 ;EXPONENT IF ITS LARGE
CAILE T3,^D11 ;CHECK EXPONENT SIZE
JRST GFX2 ;TOO BIG...OVERFLOW
ASHC T1,(T3) ;SHIFT FRACTION OFF
SKIPGE 0(P) ;CHECK ORIGINAL SIGN
DMOVN T1,T1 ;IF NEGATIVE COMPLEMENT RESULT
TLNE T1,(1B0) ;COPY HIGH SIGN INTO LOW WORD
TLO T2,(1B0)
CAME T1,[-1] ;HIGH WORD MUST BE ALL SIGN BITS
JUMPN T1,GFX2 ;ELSE OVERFLOW
MOVE T1,T2 ;PUT RESULT INTO PROPER AC FOR RETURN
GFX1: ADJSP P,-1 ;FIX STACK
RET ;AND RETURN TO CALLER
GFX2: TXO T4,GFLT%O ;HERE ON OVERFLOW...SET THE FLAG
JRST GFX1 ;AND RETURN TO USER
.DGFX: ;GFLOAT TO DOUBLE INTEGER
MOVX T4,GFLT%2 ;SET THE TWO ACS FLAG
PUSH P,T1 ;SAVE THE ORIGINAL SIGN
JUMPGE T1,DGFX1 ;IS NUMBER POSITIVE?
DMOVN T1,T1 ;NO...SO GET ABSOLUTE VALUE
CAMN T1,[210740000000] ;CHECK FOR -2^70
JUMPE T2,DGFX5 ;IT IS SPECIAL SO HANDLE IT
DGFX1: LDB T3,[POINT 11,T1,11] ;GET THE EXPONENT
TLZ T1,777700 ;CLEAR THE EXPONENT FIELD
SUBI T3,2000+^D59 ;GET SHIFT AMOUNT TO ALIGN INTEGER PART
CAMG T3,[-^D70] ;SHIFT INSTS ARE MOD 256
MOVNI T3,^D70 ;REDUCE EXPONENT IF IT IS LARGE
CAILE T3,^D11 ;CHECK EXPONENT SIZE
JRST DGFX4 ;TOO BIG SO OVERFLOW
ASHC T1,(T3) ;SHIFT FRACTION OFF
SKIPGE 0(P) ;CHECK ORIGINAL SIGN
DMOVN T1,T1 ;IF NEGATIVE THEN COMPLEMENT
TLNE T1,(1B0) ;COPY HIGH SIGN INTO LOW WORD
TLO T2,(1B0)
DGFX2: ADJSP P,-1 ;FIX UP THE STACK
RET ;AND RETURN TO CALLER
DGFX4: TXO T4,GFLT%O ;SET THE OVERFLOW FLAG
JRST DGFX2 ;AND RETURN
DGFX5: MOVSI T1,(1B0) ;-2^70 SPECIAL CASE
MOVE T2,T1
JRST DGFX2 ;AND GO RETURN
> ;END OF IFN KLFLG
SUBTTL METER JSYS
;METER JSYS FOR KL ONLY
.METER::MCENT ;DO ENTRY STUFF
IFE KLFLG,<
MOVEI T1,METRX1
ITERR> ;IF NOT A KL, ERROR
IFN KLFLG,< ;FOR THE KL
SKIPLE T1 ;CHECK FOR VALID FUNCTION
CAILE T1,METMFC ;STILL?
ITERR (ARGX02) ;NO.
XCT MTRTBL-1(T1) ;DO FUNCTION
XCTU [DMOVEM T1,2] ;RETURN DATA
MRETNG ;AND DONE
;FUNCTION TABLE
MTRTBL: RDEACT T1 ;GET EBOX TICKS
RDMACT T1 ;GET MBOX TICKS
METMFC==.-MTRTBL ;MAX FUNCTION
> ;END OF IFN KLFLG CONDITIONAL
RESCD
SUBTTL End of APRSRV
TNXEND
END