osm$process_error_conditions IDENT
         list      1,1,0
         title     c'Process OS error conditions'
         space     4
.        TRADE SECRET - PROPRIETARY NOTICE.
.        COPYRIGHT CONTROL DATA SYSTEMS INC. 1992
.        The material contained herein is the property of Control Data
.        Systems Inc and is intended soley for use in the  performance
.        of  contracted  Maintenance  under a Control Data maintenance
.        services agreement.  This material is proprietary to  Control
.        Data  Systems Inc  and  is  not to be disclosed other than to
.        employees  of  Control  Data  Systems Inc  or  other  persons
.        specifically authorized to have access to  this  material  in
.        accordance  with  the  terms and conditions of a Control Data
.        maintenance services agreement.
         page
*copy asmregs
*copy osa$ei_constant_definitions
*copy osa$ei_stack_frame
         page
C180EI   SECTION   working,read+execute+write,,0,8
         USE       C180EI
         space     4
..
.        OSP$A170_FATAL_ERROR - This module is called to process 170 OS
.        error conditions.  It is not called with a CALL instruction but
.        by branching here with the return address set in an A register.
.
.        Entry conditions:
.
.        a2    = pointer to previous save area, NIL if called from EI and
.                non NIL if called from NOS/VE.  This module has to be
.                able to determine in which mode it is running.
.        a8    = pva to return to.
.        a_jps = PVA OF TJXP
.        a_static = PVA of EI static storage, not set when called from NOS/VE.
.        a_wrk = PVA OF EI DATA AREA
.        a_nos = PVA OF OPERATING SYSTEM
.        X4    = VMID of JPS package.
.        X6    = Masked MCR.
.
.        Exit conditions:
.
.        x6 = 0 if non fatal error, = 1 if fatal error.
.

         def       osp$a170_fatal_error
osp$a170_fatal_error bss 0             .entry to process fatal error
         shfx      x1,x6,x0,48         .mcr bit 48
         ente      x8,perror
         brxgt     x0,x1,mcr01         .if DUE error
         ente      x8,gencode
mcr01    brreq     x4,x0,abp01         .if failure in 180 process.
         ente      x1,mcr_mask-bit_57
         andx      x1,x6
         brrne     x1,x0,abp03         .if unusual MCR bit set except page fault.
         brrne     x6,x0,mcr02         .if page fault set

.        No interesting MCR bits set, assume UCR bit set.

         entl      x0,BEMHF
         lbit      x1,a_jps,xp_emhf,X0 .GET EXIT MODE HALT FLAG
         brreq     x1,x0,abp03         .if exit mode halt not set

.        Fatal error in 170 monitor mode, halt the process.

stop170  bss       0
         cpyax     x3,a2
         brrgt     x0,x3,stop170_5     .if running in 170 standalone mode.

.        Running in dual state mode, set error flag and return.

         entp      x6,1                .set 170 fatal error.
         brdir     a8,x0               .return to caller.

.        Running in 170 standalone mode.

stop170_5 bss      0
         la        a7,a_static,pva_halt_ei
         brdir     a7,x0               .fake cpu halt
.
.  Process page fault on C170 process.
.
mcr02    la        aa,a_jps,xp_p       .load and verify P
         tpage     x3,aa
         brrgt     x0,x3,abp03         .if page fault on P
         isob      x1,x3,x0,7501(8)    .parcel number
         ente      x2,100(8)*15
         shfx      x3,x3,x0,-3         .form word address relative to C170
         mulx      x2,x1
         lxi       x1,a_nos,x3,0       .fetch word with instruction
         isob      x1,x1,x2,0410(8)    .isolate instruction opcode
         entp      x2,014(8)
         brrne     x2,x1,abp03         .if not and ECS instruction
         entp      x8,1                .set mode 1
         entp      x0,7
         lbit      x1,a_jps,xp_em+1,x0 .fetch mode 1 bit
         brrne     x1,x0,abp03         .if job should be aborted
         addaq     aa,aa,2             .increment and update P
         sa        aa,a_jps,xp_p
         entp      x6,0                .set 170 non fatal error.
         brdir     a8,x0               .restart job
         space     4
..       Abort A170 job with predefined error.  The request to abort the job
.        came from the 180 process.  The jps exchange package contains a 180
.        process and the 170 process registers are in the previous stack frame
.        save area.
.

         def       osp$abort_a170_job
osp$abort_a170_job bss 0               .entry to process system call
         LX        x8,a_jps,xp_x0+2*8  .EXIT CONDITION IN C180 x8
         space     4
..
.        ABP       - Abort process.  There are 2 entry points into this routine:
.                       abp01 - if failure in the 180 process.  This sort of failire
.                               occurs in the 170 trap handler which is a 180 process.
.                       abp03 - if failure in the 170 process.
.
.        Entry conditions.
.                  a_jps = PVA of failing 170 exchange package.
.                  a_nos = PVA of first byte of host operating system.
.                  a_wrk = pointer to EI data area.
.                  a8 = pva to return to.
.                  x8 = mode error number.
.                  x4 = VMID of process.
.



.        Abort process that failed in 180.  Failure is in the 170 trap handler.
.        Save the failing process in the save area and then move the 170 process
.        to the job exchange package.


abp01    bss       0

.        Move the job exchange package to the save area, this is a 180 process.

         movb,a_jps,x0  a_wrk,x1  0,9,25*8,0  0,9,25*8,sf_save_job+0
         movb,a_jps,x0  a_wrk,x1  0,0,27*8,25*8  0,9,27*8,sf_save_job+25*8

.        Move the Stack Frame Save Area contents of the 170 process to the job
.        exchange package.

         la        aa,a_jps,xp_a0+2*8  .get stack pointer
         MOVB,aa,X0  a_jps,X1 0,9,123,xp_x0  0,9,123,xp_x0
         ente      x2,xp_x0
         entp      X3,0
abp02    lbyts,6   X1,aa,X3,xp_p
         sbyts,6   X1,a_jps,X3,xp_p
         incr      X3,8
         brrne     x3,x2,abp02         .if more to move
         entp      x1,1
         sbyts,1   x1,a_jps,x0,xp_vmid .set vmid to 1

.        Now abort the 170 process that invoked the 180 process.


.        Abort the 170 process.  Store 170 error information at RA+0 of process.

abp03    sbyts,1   x8,a_wrk,x0,sf_exit_condition
         lbyts,4   X1,a_jps,X0,xp_p+2  .GET C170 P ADDRESS + RA
         lbyts,3   X2,a_jps,X0,xp_rac  .GET C170 RA
         SHFX      X1,X1,X0,-3         .C170 P WORD ADDRESS + RA
         SUBX      X1,X2               .C170 P WORD ADDRESS
         SHFC      X8,X8,X0,63-15      .EXIT CONDITION TO BITS 48 - 53
         SHFC      X1,X1,X0,63-33      .P REGISTER TO BITS 30 - 47
         IORX      X8,X1               .merge exit condition.
         ente      x1,15(8)            .'M' in display code.
         brrne     x6,x0,abp10         .if MCR has bits set.

.        MCR is zero, store UCR.

         lbyts,2   x6,a_jps,x0,xp_ucr  .UCR from failing xp.
         ente      x1,25(8)            .'U' in display code.
abp10    bss       0
         iorx      X8,X6               .merge MCR or UCR.
         shfc      x1,x1,x0,18         .position UCR/MCR designator.
         iorx      x8,x1               .merge UCR/MCR designator.
         SXI       X8,a_nos,X2,0       .STORE ERROR EXIT WORD AT RA
         entl      X0,BMF              .C170 MONITOR FLAG BIT ADDRESS
         lbit      xf,a_jps,xp_mf,X0   .GET C170 MONITOR FLAG
         sbit      xf,a_jps,xp_emhf,x0 .set exit mode halt flag
         brrne     xf,x0,stop170       .if monitor flag set
         brreq     x4,x0,pjec0         .if exchange package already copied
         movb,a_jps,x0  a_wrk,x1  0,9,25*8,0  0,9,25*8,sf_save_job+0
         movb,a_jps,x0  a_wrk,x1  0,0,27*8,25*8  0,9,27*8,sf_save_job+25*8
         brreq     x0,x0,pjec0         .emulate c170 exchange
         PAGE
...
.
.        THE  C170  VIRTUAL MACHINE WAS EXECUTING IN PROGRAM MODE WHEN
.        THE EXIT CONDITION OCCURRED.  THIS  REQUIRES  THAT  THE  C170
.        EXCHANGE  PACKAGE  LOCATED  AT THE ADDRESS IN THE MA FIELD OF
.        THE C180 EXCHANGE PACKAGE  MUST  BE  SWAPPED  WITH  THE  C170
.        EXCHANGE  PACKAGE CONTAINED IN THE C180 PACKAGE.  THE MONITOR
.        FLAG MUST BE SET IN THE C180 PACKAGE  AND  THE  MCR  MUST  BE
.        CLEARED.   When this processing is complete the routine goes
.        to the PVA in A8 where EI exchanges back to the C170 process.
.
pjec0    ADDAQ     aa,a_wrk,sf_170_xp_buffer
         CPYAX     X7,a_dscb
.
.        Purge all cache so that no stale C170 data is picked up from
.        cache.
.
         PURGE     x7,2                .Purge all cache
.
.        pack job exchange package to buffer.
.
         MOVB,a_jps,X0  AA,X1 0,9,64,xp_cx0  0,9,64,ma_x0
.
.        GET ALL OTHER REGISTERS AND INFO FROM TJXP, COMBINE THIS IN
.        C170 EXCHANGE PACKAGE FORMAT, AND STORE RESULTING 8 WORDS
.        into the buffer.
.
         ENTE      X0,0100F(16)
         LMULT     X0,a_jps,xp_ca0/8*8    .GET A AND B REGISTERS FROM XP
         INSB      X8,X0,X0,M18        .COMBINE A AND B REGS, P=0
         INSB      X9,X1,X0,M18
         INSB      XA,X2,X0,M18
         INSB      XB,X3,X0,M18
         INSB      XC,X4,X0,M18
         INSB      XD,X5,X0,M18
         INSB      XE,X6,X0,M18
         INSB      XF,X7,X0,M18
         ISOM      X1,X0,3443(8)
         ANDX      X8,X1
         ANDX      X9,X1
         ANDX      XA,X1
         ANDX      XB,X1
         ANDX      XC,X1
         ANDX      XD,X1
         ANDX      XE,X1
         ANDX      XF,X1
         LBYTS,3   X2,a_jps,X0,xp_rac  .GET RA
         SHFX      X1,X2,X0,3          .SAVE RA BYTE OFFSET
         SHFX      X2,X2,X0,36
         IORX      X9,X2               .RA,A1,B1
         LBYTS,3   X7,a_jps,X0,xp_flc  .GET FL
         SHFX      X7,X7,X0,36
         IORX      XA,X7               .FL,A2,B2
         LBYTS,2   X2,a_jps,X0,xp_em   .GET EXIT MODE SELECTIONS
         ISOB      X2,X2,X0,6413(8)
         INSB      XB,X2,X0,0413(8)    .EM, A3, B3
         LBYTS,3   x3,a_jps,X0,xp_ma   .GET MONITOR ADDRESS
         shfx      x2,x3,x0,3          .save ma byte address
         SHFX      x3,x3,X0,36
         IORX      XE,X3               .MA, A6, B6
         LBYTS,4   X7,a_jps,X0,xp_rae  .GET ECS RA
         SHFX      X7,X7,X0,36
         IORX      XC,X7               .RAE, A4, B4
         LBYTS,4   X7,a_jps,X0,xp_fle  .GET ECS FL
         SHFX      X7,X7,X0,36
         IORX      XD,X7               .FLE, A5, B5
         ENTE      X3,0180F(16)
         SMULT     X3,AA,0             .STORE 1ST 8 WORDS OF C170 XP
         entl      x0,3                .bit 3 = 00010000 = 20(8)
         lbit      x5,a_wrk,sf_exit_condition,x0 .fetch hardware error bit
         ENTL      X0,BMHDWRE
         SBIT      X5,AA,ma_hrdwe,X0   .SET HARDWARE ERROR FLAG
.
.        NOW MOVE THE A, B, X, AND ENVIRONMENT REGISTERS FROM TXPBUF
.        TO THE C180 XP AT TJXP.
.
         CPYAA     AA,a_nos
         ADDAX     aa,x2               .pva for MA
PJEC1    ENTN      XF,7                .INITIALIZE LOOP COUNTER
         ENTP      XC,0                .BYTE OFFSET
PJEC2    LBYTS,3   XA,aa,XC,ma_b0      .GET B REGISTER FIELD
         ISOB      XA,XA,X0,5621(8)    .ISOLATE B REGISTER
         SBYTS,3   XA,a_jps,XC,xp_cb0  .STORE B REGISTER IN TJXP
         INCR      XC,8
         BRINC     X0,XF,PJEC2         .IF MORE B REGISTERS
         ENTP      XC,0
         ENTN      XF,7
PJEC3    LBYTS,3   XA,aa,XC,ma_a0      .GET A REGISTER FIELD
         ISOB      XA,XA,X0,5421(8)
         SBYTS,3   XA,a_jps,XC,xp_ca0  .STORE A REGISTER IN TJXP
         INCR      XC,8
         BRINC     X0,XF,PJEC3         .IF MORE A REGISTERS
         ENTP      XC,0
         ENTN      XF,7
PJEC4    LBYTS,8   XA,aa,XC,ma_x0      .GET X REGISTER
         SHFX      XA,XA,X0,4          .SIGN EXTEND X REGISTER
         SHFX      XA,XA,X0,-4
         SBYTS,8   XA,a_jps,XC,xp_cx0  .STORE X REGISTER IN TJXP
         INCR      XC,8
         BRINC     X0,XF,PJEC4         .IF MORE X REGISTERS
         LX        XB,aa,ma_rac/8*8    .GET RAC FIELD
         ISOB      XB,XB,X0,0724(8)
         SBYTS,3   XB,a_jps,X0,xp_rac  .STORE RAC IN TJXP
         LX        XA,aa,ma_flc/8*8    .GET FLC FIELD
         ISOB      XA,XA,X0,0724(8)
         SBYTS,3   XA,a_jps,X0,xp_flc  .STORE FLC IN TJXP
         LBYTS,3   XA,aa,X0,ma_p       .GET P REGISTER
         ISOB      XA,XA,X0,5221(8)
         ADDX      XA,XB               .ADD REFERENCE ADDRESS
         SHFX      XA,XA,X0,3          .CHANGE TO BYTE ADDRESS
         sbyts,4   xa,a_jps,x0,xp_p+2
         LBYTS,3   XA,aa,X0,ma_ma      .GET MONITOR ADDRESS
         ISOB      XA,XA,X0,5221(8)
         SBYTS,3   XA,a_jps,X0,xp_ma   .STORE MA IN TJXP
         LBYTS,2   XB,aa,X0,ma_em      .GET EXIT MODE BITS
         LX        XF,a_jps,xp_em/8*8  .FETCH WORD WITH EM
         INSB      XF,XB,X0,2413(8)    .INSERT NEW EXIT MODE
         SX        XF,a_jps,xp_em/8*8    .STORE EM INTO TJXP
         LBYTS,4   XB,aa,X0,ma_rae     .GET RAE FIELD
         SHFX      XB,XB,X0,27-31
         SBYTS,4   XB,a_jps,X0,xp_rae  .STORE RAE IN TJXP
         LBYTS,4   XA,aa,X0,ma_fle     .GET FLE FIELD
         SHFX      XA,XA,X0,27-31
         SBYTS,4   XA,a_jps,X0,xp_fle  .STORE FLE IN TJXP
         ENTL      X0,BMF
         ENTP      XF,01(16)
         SBIT      XF,a_jps,xp_mf,X0   .SET C170 MONITOR FLAG
.
.        copy exchange package in buffer to (ma).
.
         movb,a_wrk,x0  aa,x1  0,9,16*8,sf_170_xp_buffer  0,9,16*8,0
         entp      x6,0                .set 170 non fatal error.
         brdir     a8,x0               .return to caller
.
         end
