Context Switch Routine for XINU System on LSI-11

/* ----------------------------------------------------------------------
 *  saving/loading registers
 *  The stack contains three items upon entry to this routine:
 *  SP+4 => address of 9 word save area with new registers + PS
 *  SP+2 => address of 9 word save area for old registers + PS
 *  SP   => return address
 *  The saved state consists of: the values of R0-R5 upon entry, SP+2, PC
 *  equal to the return address, and the PS (i.e., the PC and SP are saved
 *  as if the calling process had returned to its caller.
         .globl _ctxsw        /* declare name global */
_ctxsw:                       /* entry point to proc. */
         mov   r0,*2(sp)      /* save old R0 in old register area */
         mov   2(sp),r0       /* get address of old register area in R0 */
         add   $2,r0          /* increment to saved pos. of R1 */
         mov   r1,(r0)+       /* save R1-R5 in successive locations of old */
         mov   r2,(r0)+       /*  process register save are */
         mov   r3,(r0)+
         mov   r4,(r0)+
         mov   r5,(r0)+
         add   $2,sp          /* move SP beyond the return address, as if a */
                              /*  return had occurred */
         mov   sp,(r0)+       /* save stack pointer */
         mov   -(sp),(r0)+    /* save caller’s return address as PC */
         mfps  (r0)           /* save processor status beyond registers */
         mov   4(sp),r0       /* get address of start of new register area */
                              /* ready to load registers for the new process */
                              /*  and abandon the old stack */
         mov   2(r0),r1       /* load R1-R5 and SP from the new area */
         mov   4(r0),r2
         mov   6(r0),r3
         mov   8.(r0),r4      /* dot following a number makes it decimal; */
         mov   10.(r0),r5     /*  otherwise it is octal */
         mov   12.(r0),sp     /* have switched stacks now */
         mov   16.(r0),-(sp)  /* push new process PS on new process stack */
         mov   14.(r0),-(sp)  /* push new process PC on new process stack */
         mov   (r0),r0        /* load R0 from new area */
         rtt                  /* load PC, PS, and reset SP all at once */

UC Davis sigil
Matt Bishop
Office: 2209 Watershed Sciences
Phone: +1 (530) 752-8060
ECS 235B, Foundations of Computer and Information Security
Version of April 1, 2022 at 1:00AM

You can also obtain a PDF version of this.

Valid HTML 4.01 Transitional Built with BBEdit Built on a Macintosh