# Copyright (C) 1989, Digital Equipment Corporation # All rights reserved. # See the file COPYRIGHT for a full description. # # Last modified on Fri Mar 16 10:47:02 1990 by muller .globl __ThreadF__Shell .data _current_context: .long 0 .globl __ThreadSup__handlers __ThreadSup__handlers: .long 0 .globl __ThreadSup__stackLimit __ThreadSup__stackLimit: .long 0 # A context is layout: # Name Offset function .set context_self, 0 .set context_top, 4 # the stack limit .set context_bottom, 8 # start of stack area for new process .set context_handlers, 12 # handler list for the thread .set context_errno, 16 .set context_pc, 20 .set context_sp, 24 .set context_fp, 28 .set context_ap, 32 .set context_psw, 36 # context psl .set context_r11, 40 .set context_r10, 44 .set context_r9, 48 .set context_r8, 52 .set context_r7, 56 .set context_r6, 60 .set context_r5, 64 .set context_r4, 68 .set context_r3, 72 .set context_r2, 76 .set context_end, 80 .data .globl _contextSize _contextSize: .long context_end .comm _errno, 4 .globl _errno .text .globl _InitTopContext _InitTopContext: # 4(ap): thread # 8(ap): context .word 0 movl 8(ap), r0 movl 4(ap), context_self (r0) movl $0, context_top (r0) moval 20(fp), context_bottom (r0) movl r0, _current_context ret .text .globl _InitContext _InitContext: # 4(ap): thread # 8(ap): context # 12(ap): stack # 16(ap): size .word 0 movl 8(ap), r0 movl 4(ap), context_self (r0) movl 12(ap), context_top (r0) movl 12(ap), r1 addl2 16(ap), r1 subl2 $4, r1 movl r1, context_bottom (r0) movl $0, context_handlers (r0) movl $0, context_errno (r0) movpsl context_psw (r0) clrl context_errno (r0) clrl context_r2 (r0) clrl context_r3 (r0) clrl context_r4 (r0) clrl context_r5 (r0) clrl context_r6 (r0) clrl context_r7 (r0) clrl context_r8 (r0) clrl context_r9 (r0) clrl context_r10 (r0) clrl context_r11 (r0) # push a fake Frame on the stack movl sp, r1 movl context_bottom(r0), sp pushl $0 # of arguments movl sp, context_ap (r0) pushl $0 # pc pushl $0 # fp pushl $0 # ap pushl $0 # mask + psw pushl $0 # handler movl sp, context_fp (r0) movl sp, context_sp (r0) movl r1, sp moval __ThreadF__Shell, r1 addl2 $2, r1 # get over proc header word movl r1, context_pc (r0) ret .globl _Transfer _Transfer: .word 0 # 4(ap): context to go to movl _current_context, r0 movl __ThreadSup__handlers, context_handlers (r0) movl _errno, context_errno (r0) movl r2, context_r2 (r0) movl r3, context_r3 (r0) movl r4, context_r4 (r0) movl r5, context_r5 (r0) movl r6, context_r6 (r0) movl r7, context_r7 (r0) movl r8, context_r8 (r0) movl r9, context_r9 (r0) movl r10, context_r10 (r0) movl r11, context_r11 (r0) moval 20(fp), context_sp (r0) movl 16(fp), context_pc (r0) movl 12(fp), context_fp (r0) movl 8(fp), context_ap (r0) movpsl context_psw(r0) movl 4(ap), r0 movl r0, _current_context movl context_self (r0), __ThreadSup__self movl context_top (r0), __ThreadSup__stackLimit movl context_handlers (r0), __ThreadSup__handlers movl context_errno (r0), _errno movl context_r2 (r0), r2 movl context_r3 (r0), r3 movl context_r4 (r0), r4 movl context_r5 (r0), r5 movl context_r6 (r0), r6 movl context_r7 (r0), r7 movl context_r8 (r0), r8 movl context_r9 (r0), r9 movl context_r10 (r0), r10 movl context_r11 (r0), r11 movl context_ap (r0), ap movl context_fp (r0), fp movl context_sp (r0), sp pushl context_psw (r0) pushl context_pc (r0) rei .globl _Tos _Tos: .word 0 # 4(ap): context # 8(ap): * start # 12(ap): * stop movl 4(ap), r0 movl 12(ap), r1 movl context_bottom (r0), (r1) movl 8(ap), r1 movl context_sp (r0), (r1) ret .text .globl _SelfTos _SelfTos: # 4(ap): * start # 8(ap): * stop .word 0 movl _current_context, r0 movl 8(ap), r1 movl context_bottom (r0), (r1) movl 4(ap), r1 moval 20(fp), (r1) ret