PST TITLE 'DMTPST (RSCS) VM/370 - RELEASE 6' 00001000
*. 00002000
* MODULE NAME - 00003000
* 00004000
* DMTPST 00005000
* 00006000
* FUNCTION - 00007000
* 00008000
* THE DMTPST MODULE IS A SERVICE ROUTINE WHICH MAY 00009000
* BE CALLED FROM ANYWHERE IN THE RSS SYSTEM. DMTPST 00010000
* IS USED TO SIGNAL THE COMPLETION OF AN EVENT BY 00011000
* MEANS OF POSTING THE EVENT'S ASSOCIATED SYNCH 00012000
* LOCK. DMTPST IS ENTIRELY REENTRANT, USES NO MAIN 00013000
* STORAGE (EXCEPT THE SYNCH LOCK WHICH IS SPECIFIED 00014000
* TO BE POSTED), AND MAY BE ENTERED WITH PSW 00015000
* INTERRUPT MASKS ON OR OFF. DMTPST DOES NOT CHANGE 00016000
* THE STATE OF THE RUNNING PSW IN ANY WAY. 00017000
* 00018000
* ATTRIBUTES - 00019000
* 00020000
* REENTRANT 00021000
* 00022000
* ENTRY POINTS - 00023000
* 00024000
* DMTPST - SIGNAL EVENT COMPLETION TO A TASK 00025000
* 00026000
* ENTRY CONDITIONS - 00027000
* GPR0 = ONE BYTE POST CODE 00028000
* GPR1 = ADDR OF SYNCH LOCK TO BE POSTED 00029000
* GPR14 = RETURN ADDRESS 00030000
* 00031000
* EXIT CONDITIONS - 00032000
* 00033000
* NORMAL - 00034000
* 00035000
* GPR0 = ADDR OF POSTED SYNCH LOCK 00036000
* GPR1 = ADDR OF POSTED SYNCH LOCK 00037000
* 00038000
* ERROR - 00039000
* 00040000
* NONE 00041000
* 00042000
EJECT 00043000
* 00044000
* CALLS TO OTHER ROUTINES - 00045000
* 00046000
* NONE 00047000
* 00048000
* EXTERNAL REFERENCES - 00049000
* 00050000
* NONE 00051000
* 00052000
* TABLES / WORKAREAS - 00053000
* 00054000
* TASK ELEMENT (SUPERVISOR QUEUE) 00055000
* 00056000
* REGISTER USAGE - 00057000
* 00058000
* GPR0 = SCRATCH (SYNCH LOCK ADDR SAVE REG) 00059000
* GPR1 = SYNCH LOCK ADDR, TASK ELEMENT POINTER 00060000
* GPR2 = UNUSED 00061000
* GPR3 = UNUSED 00062000
* GPR4 = UNUSED 00063000
* GPR5 = UNUSED 00064000
* GPR6 = UNUSED 00065000
* GPR7 = UNUSED 00066000
* GPR8 = UNUSED 00067000
* GPR9 = UNUSED 00068000
* GPR10 = UNUSED 00069000
* GPR11 = UNUSED 00070000
* GPR12 = UNUSED 00071000
* GPR13 = UNUSED 00072000
* GPR14 = RETURN ADDRESS 00073000
* GPR15 = UNUSED 00074000
* 00075000
* NOTES - 00076000
* 00077000
* NONE 00078000
* 00079000
* OPERATION - 00080000
* 00081000
* 00082000
* DMTPST POSTS THE SYNCH LOCK SPECIFIED IN THE CALL 00083000
* BY PLACING THE SPECIFIED ONE-BYTE CODE IN THE HIGH 00084000
* ORDER BYTE OF THE SYNCH LOCK (AND FORCING THE HIGH 00085000
* ORDER BIT OF THE SYNCH LOCK TO ONE). IF THE 00086000
* SPECIFIED SYNCH LOCK HAS BEEN WAITED ON (IF A TASK 00087000
* ELEMENT ADDRESS HAS BEEN SET IN THE SYNCH LOCK), 00088000
* THE WAITING TASK'S TASK ELEMENT ADDRESS IS LOADED 00089000
* FROM THE SYNCH LOCK AND THE "WAITING" BIT IN THE 00090000
* TASK TABLE IS SET TO ZERO. (THIS MAKES THE TASK 00091000
* DISPATCHABLE.) THE LOW ORDER THREE BYTES OF THE 00092000
* SYNCH LOCK ARE SET TO ZERO, AND CONTROL IS 00093000
* RETURNED DIRECTLY TO THE CALLER BY MEANS OF A 00094000
* BRANCH (CONTROL IS NOT PASSED TO THE DISPATCHER). 00095000
* 00096000
*. 00097000
EJECT 00098000
DMTPST CSECT 00099000
SPACE 00100000
USING TASKE,R1 GET TASK ELEMENT ADDRESSABILITY 00101000
STC R0,0(R1) STORE POST CODE IN SYNLOCK TO BE POSTED 00102000
OI 0(R1),X'80' AND SET HIGH-ORDER BIT TO FORCE NON-ZERO 00103000
OC 1(3,R1),1(R1) IS THERE A TASK ELEMENT ADDRESS HERE? 00104000
BCR 8,R14 NOPE - MUST BE AN EARLY POST - ALL DONE 00105000
L R0,0(R1) REG 0 (SCRATCH REG) = ADDR OF SOME TASK ELEMENT 00106000
XC 1(3,R1),1(R1) CLEAR TASK ELEMENT ADDRESS FROM THE SYNLOC 00107000
XR R0,R1 THIS IS A TRICK TO SWAP THE CONTENTS OF TWO REGS, 00108000
XR R1,R0 WITHOUT USING ANY NON-REGISTER STORAGE 00109000
XR R0,R1 NEVER THOUGHT I'D NEED TO USE IT 00110000
NI TASKSTAT,X'FF'-WAITING SET TASK DISPATCHABLE 00111000
LR R1,R0 RESTORE ADDRESS OF THE SYNLOCK TO REG.1 00112000
BR R14 AND RETURN TO THE CALLER 00113000
EJECT 00114000
COPY TASKE 00115000
EJECT 00116000
COPY RSSEQU 00117000
END 00118000