Following is a function requested by pjs%chico@jpl-vlsi.arpa for process watching. After going through arpanet it may need some editing, specifically the up-arrows (carets) before the masks in .ENTRY statements and the up-arrows (carets) between the G and entry names in JSB or CALLS or CALLG statements. The global variables G(caret)SCH$... may also loose their caret. (And they need them). --------- Cut here -------------------------- ;******************************************************************* ; ; Program name: CHECKPRC ; ; Function: Look at the state and PC of a process ; ; Privileges required: CMKRNL ;****************************************************************** .TITLE CHECKPRC ; $PCBDEF $PHDDEF $STATEDEF $IPLDEF ; pid=4 ret_sp=8 ret_state=12 ret_psl=16 proc_pc_off=4 proc_state_off=8 proc_sp_off=12 proc_psl_off=16 ; ; CUR_PC = CHECKPRC(PID,CUR_SP,CUR_STATE,CUR_PSL) ; PID is input ; SP,STATE, PSL are output ; .PSECT scratch pic,noexe,wrt proc_id: .blkl 1 krnl_args: .long 4 .address proc_pc .address proc_state .address proc_sp .address proc_psl proc_pc: .blkl 1 proc_state: .blkl 1 proc_sp: .blkl 1 proc_psl: .blkl 1 .psect .entry checkprc,^m<> movl @pid(ap),proc_id $cmkrnl_s routin=take_care_of_pcb,arglst=krnl_args cmpl r0,#ss$_nonexpr bneq okeydokey mnegl #1,r0 brb exit okeydokey: movl proc_sp,@ret_sp(ap) movl proc_state,@ret_state(ap) movl proc_psl,@ret_psl(ap) movl proc_pc,r0 exit: ret ; ; kernel mode code ; .entry take_care_of_pcb,^m .enable lsb movl proc_pc_off(ap),r3 ;where to store the answer movl proc_state_off(ap),r2 ;where to store the answer movl proc_sp_off(ap),r5 ;where to store the answer movl proc_psl_off(ap),r7 ;where to store the answer MOVZWL PROC_ID,R0 ;get vector index from PID setipl #ipl$_synch ;synchronize JSB G^EXE$EPID_TO_PCB BEQL NON_EXISTANT_PROCESS ; cmpw r4,g^sch$gl_maxpix ;PID too large? ; bgeq non_existant_process ; movl g^sch$gl_pcbvec,r1 ;get base of PCB vector ; movl (r1)[r4],r4 ;get PCB address CMPL R0,G^SCH$GL_NULLPCB ;don't do this to NULL beql non_existant_process CMPL R0,G^SCH$GL_SWPPCB ;or SWAPPER beql non_existant_process movzwl pcb$w_state(r0),(r2) ;return argument movl pcb$l_phd(r0),r6 movl phd$l_pc(r6),(r3) ;return argument movl phd$l_psl(r6),(r7) ;return argument movl phd$l_usp(r6),(r5) ;return argument movl #ss$_normal,r0 10$: setipl #0 ret non_existant_process: movl #ss$_nonexpr,r0 brb 10$ .end