.ad 8
.bm 8
.fm 4
.bt $Copyright by SAP AG, 1994$$Page %$
.tm 12
.hm 6
.hs 3
.tt 1 $SQL$Project Distributed Database System$ven71a$
.tt 2 $$$
.tt 3 $$                                       $2001-04-18$
***********************************************************
.nf


    ========== licence begin LGPL
    Copyright (C) 2000 SAP AG

    This library is free software; you can redistribute it and/or
    modify it under the terms of the GNU Lesser General Public
    License as published by the Free Software Foundation; either
    version 2.1 of the License, or (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public
    License along with this library; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
    ========== licence end

.fo
.nf
.sp
Module  :       chgstack
=========
.sp
Purpose :       Change Stack
.CM *-END-* purpose -------------------------------------
.sp
.cp 3
Define  :
 
.CM *-END-* define --------------------------------------
.sp;.cp 3
Use     :
 
.CM *-END-* use -----------------------------------------
.sp;.cp 3
Synonym :
 
.CM *-END-* synonym -------------------------------------
.sp;.cp 3
Author  :
.sp
.cp 3
Created : 1990-03-12
.sp
.cp 3
Version : 1994-01-04
.sp
.cp 3
Release :  7.3    Date : 2001-04-18
.sp
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Specification:
 
.CM *-END-* specification -------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.fo
.oc _/1
Description:
 
.CM *-END-* description ---------------------------------
.sp 2
***********************************************************
.sp
.cp 10
.nf
.oc _/1
Structure:
 
.CM *-END-* structure -----------------------------------
.sp 2
**********************************************************
.sp
.cp 10
.nf
.oc _/1
.CM -lll-
Code    :
&if  $MACH = MIPS
/*PRETTY*/
	.verstamp	2 0 
	.text	
	.align	2
	.file	2 "chgstack.s"
	.globl	e71_chgstack  
	.globl	e71_getregs   
	.globl	e71_first_task
	.loc	2 5
 #   e71_chgstack saves all registers on current stack,  
 #   gets pointers to next stack, and returns         
 #                                
 #   e71_first_task  does an initial jump to a new stack
        .set    noreorder
	.ent	e71_chgstack   2
e71_chgstack:  
	.option	O1
 #   register 4 is address of new context
 #   register 5 is address of old context
	sw      $2, 4($5)
	sw      $3, 8($5)
	sw      $4, 12($5)
	sw      $5, 16($5)
	sw      $6, 20($5)
	sw      $7, 24($5)
	sw      $8, 28($5)
	sw      $9, 32($5)
	sw      $10, 40($5)
	sw      $11, 44($5)
	sw      $12, 48($5)
	sw      $13, 52($5)
	sw      $14, 56($5)
	sw      $15, 60($5)
	sw      $16, 64($5)
	sw      $17, 68($5)
	sw      $18, 72($5)
	sw      $19, 76($5)
	sw      $20, 80($5)
	sw      $21, 84($5)
	sw      $22, 88($5)
	sw      $23, 92($5)
	sw      $24, 96($5)
	sw      $25, 100($5)
	sw      $26, 104($5)
	sw      $27, 108($5)
	sw      $29, 116($5)
	sw      $30, 120($5)
	sw      $31, 124($5)
	lw      $2, 4($4)
	lw      $3, 8($4)
	lw      $5, 16($4)
	lw      $6, 20($4)
	lw      $7, 24($4)
	lw      $8, 28($4)
	lw      $9, 32($4)
	lw      $10, 40($4)
	lw      $11, 44($4)
	lw      $12, 48($4)
	lw      $13, 52($4)
	lw      $14, 56($4)
	lw      $15, 60($4)
	lw      $16, 64($4)
	lw      $17, 68($4)
	lw      $18, 72($4)
	lw      $19, 76($4)
	lw      $20, 80($4)
	lw      $21, 84($4)
	lw      $22, 88($4)
	lw      $23, 92($4)
	lw      $24, 96($4)
	lw      $25, 100($4)
	lw      $26, 104($4)
	lw      $27, 108($4)
	lw      $29, 116($4)
	lw      $30, 120($4)
	lw      $31, 124($4)
        nop
	j	$31
	.end	e71_chgstack  
	.ent	e71_getregs    2
e71_getregs:  
	.option	O1
 #   register 4 is address of  context
	sw      $2, 4($4)
	sw      $3, 8($4)
	sw      $5, 16($4)
	sw      $6, 20($4)
	sw      $7, 24($4)
	sw      $8, 28($4)
	sw      $9, 32($4)
	sw      $10, 40($4)
	sw      $11, 44($4)
	sw      $12, 48($4)
	sw      $13, 52($4)
	sw      $14, 56($4)
	sw      $15, 60($4)
	sw      $16, 64($4)
	sw      $17, 68($4)
	sw      $18, 72($4)
	sw      $19, 76($4)
	sw      $20, 80($4)
	sw      $21, 84($4)
	sw      $22, 88($4)
	sw      $23, 92($4)
	sw      $24, 96($4)
	sw      $25, 100($4)
	sw      $26, 104($4)
	sw      $27, 108($4)
	sw      $29, 116($4)
	sw      $30, 120($4)
	sw      $31, 124($4)
        nop
	j	$31
	.end	e71_getregs   
	.ent	e71_first_task 2
e71_first_task:
	.option	O1
 #   register 4 is address of context
	lw      $2, 4($4)
	lw      $3, 8($4)
	lw      $5, 16($4)
	lw      $6, 20($4)
	lw      $7, 24($4)
	lw      $8, 28($4)
	lw      $9, 32($4)
	lw      $10, 40($4)
	lw      $11, 44($4)
	lw      $12, 48($4)
	lw      $13, 52($4)
	lw      $14, 56($4)
	lw      $15, 60($4)
	lw      $16, 64($4)
	lw      $17, 68($4)
	lw      $18, 72($4)
	lw      $19, 76($4)
	lw      $20, 80($4)
	lw      $21, 84($4)
	lw      $22, 88($4)
	lw      $23, 92($4)
	lw      $24, 96($4)
	lw      $25, 100($4)
	lw      $26, 104($4)
	lw      $27, 108($4)
	lw      $29, 116($4)
	lw      $30, 120($4)
	lw      $31, 124($4)
        nop
	j	$31
	.end	e71_first_task
&endif

&if  $MACH = NMP
	.verstamp       9 0
	.text	
	.align	2
	.file	2 "chgstack.s"
	.globl	e71_chgstack  
	.globl	e71_getregs   
	.globl	e71_first_task
	.globl  e71_make_core
	.loc	2 5
 #   e71_chgstack saves all registers on current stack,  
 #   gets pointers to next stack, and returns         
 #                                
 #   e71_first_task  does an initial jump to a new stack
 #   e71_make_core  restores context from task to be cored
        .set    noreorder
	.ent	e71_chgstack   2
e71_chgstack:  
	.option	O1
 #   register 4 is address of new context
 #   register 5 is address of old context
	sw      $2, 4($5)
	sw      $3, 8($5)
	sw      $4, 12($5)
	sw      $5, 16($5)
	sw      $6, 20($5)
	sw      $7, 24($5)
	sw      $8, 28($5)
	sw      $9, 32($5)
	sw      $10, 40($5)
	sw      $11, 44($5)
	sw      $12, 48($5)
	sw      $13, 52($5)
	sw      $14, 56($5)
	sw      $15, 60($5)
	sw      $16, 64($5)
	sw      $17, 68($5)
	sw      $18, 72($5)
	sw      $19, 76($5)
	sw      $20, 80($5)
	sw      $21, 84($5)
	sw      $22, 88($5)
	sw      $23, 92($5)
	sw      $24, 96($5)
	sw      $25, 100($5)
	sw      $26, 104($5)
	sw      $27, 108($5)
	sw      $29, 116($5)
	sw      $30, 120($5)
	sw      $31, 124($5)
	sw      $28, 128($5)
	swc1    $f0, 132($5)
	swc1    $f1, 136($5)
	swc1    $f2, 140($5)
	swc1    $f3, 144($5)
	swc1    $f4, 148($5)
	swc1    $f5, 152($5)
	swc1    $f6, 156($5)
	swc1    $f7, 160($5)
	swc1    $f8, 164($5)
	swc1    $f9, 168($5)
	swc1    $f10, 172($5)
	swc1    $f11, 176($5)
	swc1    $f12, 180($5)
	swc1    $f13, 184($5)
	swc1    $f14, 188($5)
	swc1    $f15, 192($5)
	swc1    $f16, 196($5)
	swc1    $f17, 200($5)
	swc1    $f18, 204($5)
	swc1    $f19, 208($5)
	swc1    $f20, 212($5)
	swc1    $f21, 216($5)
	swc1    $f22, 220($5)
	swc1    $f23, 224($5)
	swc1    $f24, 228($5)
	swc1    $f25, 232($5)
	swc1    $f26, 236($5)
	swc1    $f27, 240($5)
	swc1    $f28, 244($5)
	swc1    $f29, 248($5)
	swc1    $f30, 252($5)
	swc1    $f31, 256($5)
	lw      $2, 4($4)
	lw      $3, 8($4)
	lw      $5, 16($4)
	lw      $6, 20($4)
	lw      $7, 24($4)
	lw      $8, 28($4)
	lw      $9, 32($4)
	lw      $10, 40($4)
	lw      $11, 44($4)
	lw      $12, 48($4)
	lw      $13, 52($4)
	lw      $14, 56($4)
	lw      $15, 60($4)
	lw      $16, 64($4)
	lw      $17, 68($4)
	lw      $18, 72($4)
	lw      $19, 76($4)
	lw      $20, 80($4)
	lw      $21, 84($4)
	lw      $22, 88($4)
	lw      $23, 92($4)
	lw      $24, 96($4)
	lw      $25, 100($4)
	lw      $26, 104($4)
	lw      $27, 108($4)
	lw      $29, 116($4)
	lw      $30, 120($4)
	lw      $31, 124($4)
	lw      $28, 128($4)
	lwc1    $f0, 132($4)
	lwc1    $f1, 136($4)
	lwc1    $f2, 140($4)
	lwc1    $f3, 144($4)
	lwc1    $f4, 148($4)
	lwc1    $f5, 152($4)
	lwc1    $f6, 156($4)
	lwc1    $f7, 160($4)
	lwc1    $f8, 164($4)
	lwc1    $f9, 168($4)
	lwc1    $f10, 172($4)
	lwc1    $f11, 176($4)
	lwc1    $f12, 180($4)
	lwc1    $f13, 184($4)
	lwc1    $f14, 188($4)
	lwc1    $f15, 192($4)
	lwc1    $f16, 196($4)
	lwc1    $f17, 200($4)
	lwc1    $f18, 204($4)
	lwc1    $f19, 208($4)
	lwc1    $f20, 212($4)
	lwc1    $f21, 216($4)
	lwc1    $f22, 220($4)
	lwc1    $f23, 224($4)
	lwc1    $f24, 228($4)
	lwc1    $f25, 232($4)
	lwc1    $f26, 236($4)
	lwc1    $f27, 240($4)
	lwc1    $f28, 244($4)
	lwc1    $f29, 248($4)
	lwc1    $f30, 252($4)
	lwc1    $f31, 256($4)
        nop
	j	$31
	.end	e71_chgstack  
	.ent	e71_getregs    2
e71_getregs:  
	.option	O1
 #   register 4 is address of  context
	sw      $2, 4($4)
	sw      $3, 8($4)
	sw      $5, 16($4)
	sw      $6, 20($4)
	sw      $7, 24($4)
	sw      $8, 28($4)
	sw      $9, 32($4)
	sw      $10, 40($4)
	sw      $11, 44($4)
	sw      $12, 48($4)
	sw      $13, 52($4)
	sw      $14, 56($4)
	sw      $15, 60($4)
	sw      $16, 64($4)
	sw      $17, 68($4)
	sw      $18, 72($4)
	sw      $19, 76($4)
	sw      $20, 80($4)
	sw      $21, 84($4)
	sw      $22, 88($4)
	sw      $23, 92($4)
	sw      $24, 96($4)
	sw      $25, 100($4)
	sw      $26, 104($4)
	sw      $27, 108($4)
	sw      $29, 116($4)
	sw      $30, 120($4)
	sw      $31, 124($4)
	sw      $28, 128($4)
	swc1    $f0, 132($4)
	swc1    $f1, 136($4)
	swc1    $f2, 140($4)
	swc1    $f3, 144($4)
	swc1    $f4, 148($4)
	swc1    $f5, 152($4)
	swc1    $f6, 156($4)
	swc1    $f7, 160($4)
	swc1    $f8, 164($4)
	swc1    $f9, 168($4)
	swc1    $f10, 172($4)
	swc1    $f11, 176($4)
	swc1    $f12, 180($4)
	swc1    $f13, 184($4)
	swc1    $f14, 188($4)
	swc1    $f15, 192($4)
	swc1    $f16, 196($4)
	swc1    $f17, 200($4)
	swc1    $f18, 204($4)
	swc1    $f19, 208($4)
	swc1    $f20, 212($4)
	swc1    $f21, 216($4)
	swc1    $f22, 220($4)
	swc1    $f23, 224($4)
	swc1    $f24, 228($4)
	swc1    $f25, 232($4)
	swc1    $f26, 236($4)
	swc1    $f27, 240($4)
	swc1    $f28, 244($4)
	swc1    $f29, 248($4)
	swc1    $f30, 252($4)
	swc1    $f31, 256($4)
        nop
	j	$31
	.end	e71_getregs   
	.ent	e71_first_task 2
e71_first_task:
	.option	O1
 #   register 4 is address of context
 #   register 5 is address of procedure to be called
	lw      $2, 4($4)
	lw      $3, 8($4)
	lw      $5, 16($4)
	lw      $6, 20($4)
	lw      $7, 24($4)
	lw      $8, 28($4)
	lw      $9, 32($4)
	lw      $10, 40($4)
	lw      $11, 44($4)
	lw      $12, 48($4)
	lw      $13, 52($4)
	lw      $14, 56($4)
	lw      $15, 60($4)
	lw      $16, 64($4)
	lw      $17, 68($4)
	lw      $18, 72($4)
	lw      $19, 76($4)
	lw      $20, 80($4)
	lw      $21, 84($4)
	lw      $22, 88($4)
	lw      $23, 92($4)
	lw      $24, 96($4)
	lw      $25, 100($4)
	lw      $26, 104($4)
	lw      $27, 108($4)
	lw      $29, 116($4)
	lw      $30, 120($4)
	lw      $31, 124($4)
	lw      $28, 128($4)
	lwc1    $f0, 132($4)
	lwc1    $f1, 136($4)
	lwc1    $f2, 140($4)
	lwc1    $f3, 144($4)
	lwc1    $f4, 148($4)
	lwc1    $f5, 152($4)
	lwc1    $f6, 156($4)
	lwc1    $f7, 160($4)
	lwc1    $f8, 164($4)
	lwc1    $f9, 168($4)
	lwc1    $f10, 172($4)
	lwc1    $f11, 176($4)
	lwc1    $f12, 180($4)
	lwc1    $f13, 184($4)
	lwc1    $f14, 188($4)
	lwc1    $f15, 192($4)
	lwc1    $f16, 196($4)
	lwc1    $f17, 200($4)
	lwc1    $f18, 204($4)
	lwc1    $f19, 208($4)
	lwc1    $f20, 212($4)
	lwc1    $f21, 216($4)
	lwc1    $f22, 220($4)
	lwc1    $f23, 224($4)
	lwc1    $f24, 228($4)
	lwc1    $f25, 232($4)
	lwc1    $f26, 236($4)
	lwc1    $f27, 240($4)
	lwc1    $f28, 244($4)
	lwc1    $f29, 248($4)
	lwc1    $f30, 252($4)
	lwc1    $f31, 256($4)
        nop
	j	$31
	.end	e71_first_task
	.ent    e71_make_core   2
e71_make_core:
	.option	O1
 #   register 4 is address of  context
	lw      $2, 4($4)
	lw      $3, 8($4)
	lw      $5, 16($4)
	lw      $6, 20($4)
	lw      $7, 24($4)
	lw      $8, 28($4)
	lw      $9, 32($4)
	lw      $10, 40($4)
	lw      $11, 44($4)
	lw      $12, 48($4)
	lw      $13, 52($4)
	lw      $14, 56($4)
	lw      $15, 60($4)
	lw      $16, 64($4)
	lw      $17, 68($4)
	lw      $18, 72($4)
	lw      $19, 76($4)
	lw      $20, 80($4)
	lw      $21, 84($4)
	lw      $22, 88($4)
	lw      $23, 92($4)
	lw      $24, 96($4)
	lw      $25, 100($4)
	lw      $26, 104($4)
	lw      $27, 108($4)
	lw      $29, 116($4)
	lw      $30, 120($4)
	lw      $31, 124($4)
	lw      $28, 128($4)
	lwc1    $f0, 132($4)
	lwc1    $f1, 136($4)
	lwc1    $f2, 140($4)
	lwc1    $f3, 144($4)
	lwc1    $f4, 148($4)
	lwc1    $f5, 152($4)
	lwc1    $f6, 156($4)
	lwc1    $f7, 160($4)
	lwc1    $f8, 164($4)
	lwc1    $f9, 168($4)
	lwc1    $f10, 172($4)
	lwc1    $f11, 176($4)
	lwc1    $f12, 180($4)
	lwc1    $f13, 184($4)
	lwc1    $f14, 188($4)
	lwc1    $f15, 192($4)
	lwc1    $f16, 196($4)
	lwc1    $f17, 200($4)
	lwc1    $f18, 204($4)
	lwc1    $f19, 208($4)
	lwc1    $f20, 212($4)
	lwc1    $f21, 216($4)
	lwc1    $f22, 220($4)
	lwc1    $f23, 224($4)
	lwc1    $f24, 228($4)
	lwc1    $f25, 232($4)
	lwc1    $f26, 236($4)
	lwc1    $f27, 240($4)
	lwc1    $f28, 244($4)
	lwc1    $f29, 248($4)
	lwc1    $f30, 252($4)
	lwc1    $f31, 256($4)
        nop
        nop
	sw      $0, 0($0)
	.end	e71_first_task

&endif

&if  $MACH = T35
	.text   0
e71_dummy:                      # just to have no empty symbol table
	ret
&endif

&if  $MACH = T35murks
	.text   0
	.globl  _chgstack
_chgstack:
	mtstw   pr1,pr1                # save current context ?
	bne     savctxt                # yes
	br      swictxt                # no
savctxt:
	rcsp    gr5                    # read CSP
	subw    $128,gr5               # CSP of caller is CSP-128
	movw    gr5,(pr1)              # save CSP
	movw    gr13,4(pr1)            # save CFP
	movw    gr14,8(pr1)            # save SP
	movw    pr15,12(pr1)           # save next stmt. to be executed
swictxt:
	movw    12(pr0),gr6            # get next stmt. to be executed
	movw    4(pr0),gr13            # get CFP
	movw    8(pr0),gr14            # get SP
	movw    (pr0),gr0              # get CSP
	srf                            # save regs from cache to memory
	wcsp    gr0                    # write new CSP
	jump    (gr6)                  # go to stmt. in new context
&endif

&if  $MACH = T31
	text	0
	global  init_task
	global	e71_first_task
	global  e71_chgstack
	global  e71_make_core

init_task:
	link.w  %fp,&F%1

	mov.l   ([8,%fp],0),%a0      #neue Stackobergrenze
	mov.l   ([8,%fp],4),%a1      #Ruecksprungadresse e88_calla91

	mov.l   %fp,-100(%a0)        #aktuellen Framepointer retten
	mov.l   %sp,-104(%a0)        #aktuellen Stackpointer retten

	mov.l   %a0,%sp              #neue Stackobergrenze belegen
	mov.l   %a0,%d1              #und merken

	sub     &64,%sp              #Platz fuer Register lassen

	mov.l   %sp,%fp              #Umsetzen Framepointer
	sub.l   &8,%fp

	sub.l   &4,%sp               #Stackpointer auf Ruecksprungadresse

	mov.l   %a1,(%sp)            #Ruecksprungadresse e88_calla91
				     #in 4(%fp)

	mov.l   %a1,%d0              #Ruecksprungadresse e88_calla91
				     #in %d0 (fuer e71_chgstack)

	mov.l   %a1,-(%a0)
	mov.l   %a2,-(%a0)
	mov.l   %a3,-(%a0)
	mov.l   %a4,-(%a0)
	mov.l   %a5,-(%a0)
	mov.l   %a6,-(%a0)
	mov.l   %a7,-(%a0)
	mov.l   %d0,-(%a0)
	mov.l   %d1,-(%a0)
	mov.l   %d2,-(%a0)

	mov.l   %d1,%a0
	mov.l   -100(%a0),%fp         #alten Framepoiter laden
	mov.l   -104(%a0),%sp         #alten Stackpoiter laden

	unlk    %fp

	rts                           #und zurueck

	set	F%1,-8
	data    0

	text    0

e71_first_task:
	link.w  %fp,&-8
	bra     L%chg

e71_chgstack:
	link.w  %fp,&-8
	mov.l   ([12,%fp],0),%a0           # Stackobergrenze  alt

	mov.l   4(%fp),%d0                 # Ruecksprungadresse

	mov.l   %a1,-(%a0)
	mov.l   %a2,-(%a0)
	mov.l   %a3,-(%a0)
	mov.l   %a4,-(%a0)
	mov.l   %a5,-(%a0)
	mov.l   %a6,-(%a0)
	mov.l   %a7,-(%a0)
	mov.l   %d0,-(%a0)
	mov.l   %d1,-(%a0)
	mov.l   %d2,-(%a0)
	mov.l   %d3,-(%a0)
	mov.l   %d4,-(%a0)
	mov.l   %d5,-(%a0)
	mov.l   %d6,-(%a0)
	mov.l   %d7,-(%a0)

L%chg:
	mov.l   ([8,%fp],0),%a0            # Stackobergrenze  neu

	mov.l   -(%a0),%a1
	mov.l   -(%a0),%a2
	mov.l   -(%a0),%a3
	mov.l   -(%a0),%a4
	mov.l   -(%a0),%a5
	mov.l   -(%a0),%a6
	mov.l   -(%a0),%a7
	mov.l   -(%a0),%d0
	mov.l   -(%a0),%d1
	mov.l   -(%a0),%d2
	mov.l   -(%a0),%d3
	mov.l   -(%a0),%d4
	mov.l   -(%a0),%d5
	mov.l   -(%a0),%d6
	mov.l   -(%a0),%d7

	mov.l   %d0,4(%fp)                  # Ruecksprungadresse auf Stack

	unlk    %fp

	rts

e71_make_core:
	link.w  %fp,&-8

	mov.l   ([8,%fp],0),%a0            # new stacktop (savearea)

	mov.l   -(%a0),%a1                 # load all registers from
	mov.l   -(%a0),%a2                 # savearea
	mov.l   -(%a0),%a3
	mov.l   -(%a0),%a4
	mov.l   -(%a0),%a5
	mov.l   -(%a0),%a6
	mov.l   -(%a0),%a7
	mov.l   -(%a0),%d0
	mov.l   -(%a0),%d1
	mov.l   -(%a0),%d2
	mov.l   -(%a0),%d3
	mov.l   -(%a0),%d4
	mov.l   -(%a0),%d5
	mov.l   -(%a0),%d6
	mov.l   -(%a0),%d7

	mov.l   &0,%a0                      # and
	mov.l   &1,(%a0)                    # krschbumm

#       this was the end, my friend

&endif



&if  $MACH IN [ I386 ]
	.file	"ven71a.s"
	.data
	.align	4
e71_last_context:
	.set	.,.+4
	.data

	.text

#-----------------------------------------------------------------------------
#	struct context
#	{
#		unsigned char *	sp ;
#		unsigned char *	top ;
#	};
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
#	void	e71_chgstack ( new , old )
#	struct context	* new ;
#	struct context	* old ;
#-----------------------------------------------------------------------------

	.globl	e71_chgstack
	.align  4
e71_chgstack:
	pushl	%ebp			#enter-sequence
	movl	%esp , %ebp

	pushfl				#save registers
	pushl	%esi
	pushl	%edi
	pushl	%edx
	pushl	%ecx
	pushl	%ebx
	pushl	%eax

	movl	12(%ebp) , %eax		#get second parameter (old)
	orl	%eax , %eax		#test for NULL
	je	.e71_chgstack_to	#if NULL jump
	movl	%esp , (%eax)		#save stack pointer into struct context

	#
	#  Check stack checking sequence of the OLD task.
	#

	movl	4(%eax), %ecx		#get stack top from struct context 
	cmpl	%ecx, %esp		#check, if %esp is below stack top
	jb	.L01_overflow		#jump, if below
	cmpl	$0xbb998811, (%ecx)	#check last word of stack area
	jne	.L01_overflow		#jump, if overwritten
	cmpl	$0xbb998811, 4(%ecx)	#check forelast word of stack area
	jne	.L01_overflow		#jump, if overwritten

.e71_chgstack_to:
	movl	8(%ebp) , %eax		#get first parameter (new)
	orl	%eax , %eax		#test for NULL
	je	.L02_chg		#if NULL jump
	movl	(%eax) , %esp 		#get stack pointer from struct context
	movl	%eax, e71_last_context	#save address of last loaded context

.L02_chg:
	popl	%eax			#restore registers
	popl	%ebx
	popl	%ecx
	popl	%edx
	popl	%edi
	popl	%esi
	popfl
	popl	%ebp			#imcomplete leave-sequence
	ret

#	leave	consists of:
#		movl	%ebp , %esp		#disabled, to break linkage
#		popl	%ebp			#remaining leave-sequence

.L01_overflow:
	pushl	%eax			#function argument: old context
	call	e88_stack_overflow	#print error messages
					#function never returns,
					#but just in case ...
	popl	%eax			#remove argument from stack
	leave				#execute complete leave-sequence
	ret				#return to caller

#-----------------------------------------------------------------------------
#	void	e71_initstack ( context , func )
#	struct context	* context ;
#	void		(* func) ();
#-----------------------------------------------------------------------------

	.globl	e71_initstack
e71_initstack:
	pushl	%ebp			#enter-sequence
	movl	%esp , %ebp

	movl	8(%ebp) , %edx		#get context address (context)
	movl	(%edx) , %esp		#change stack to task

	#
	#  Build pseudo stack frame to use by next chgstack.
	#

	pushl	12(%ebp)		#push "return" address (func)
	pushl	$0			#old %ebp: null-terminator
	pushfl				#%eflags
	pushl	$0xbbbbbbbb		#%esi
	pushl	$0xbbbbbbbb		#%edi
	pushl	$0xbbbbbbbb		#%edx
	pushl	$0xbbbbbbbb		#%ecx
	pushl	$0xbbbbbbbb		#%ebx
	pushl	$0xbbbbbbbb		#%eax

	movl	%esp , (%edx)		#save stack pointer into struct context

	#
	#  Generate stack checking sequence.
	#

	movl	4(%edx), %esp		#get stack top from struct context 
	addl	$8, %esp		#adjust %esp above forelast word
	pushl	$0xbb998811		#set forelast word of stack area
	pushl	$0xbb998811		#set last word of stack area

	leave				#leave-sequence
	ret

#-----------------------------------------------------------------------------
#	void	e71_make_core ( context )
#	struct context	* context ;
#-----------------------------------------------------------------------------

	.globl	e71_make_core
e71_make_core:
	pushl	%ebp			#enter-sequence
	movl	%esp , %ebp

	movl	8(%ebp) , %eax		#get first parameter (context)
	cmpl	%eax, e71_last_context	#check address of last loaded context
	je	.L01_mkcore		#if equal, do not load context

	movl	(%eax) , %esp 		#get stack pointer from struct context
	popl	%eax			#restore registers
	popl	%ebx
	popl	%ecx
	popl	%edx
	popl	%edi
	popl	%esi
	popfl
					#This uncovered the old %ebp
					#enter a call sequence from chgstack:
	movl	%esp, %ebp		#%ebp points to old %ebp
	pushl	$.e71_chgstack_to	#old %eip
	pushl	%ebp			#old %ebp
	movl	%esp, %ebp		#%ebp points to 'new' old %ebp

.L01_mkcore:
	movl	$0 , 0			#Memory Fault

					#The following code should never be
					#executed. But just in case ...
	leave				#leave-sequence
	ret
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
&endif



&if  $MACH = _IBMR2
		.globl		.e71_first_task[pr]
		.csect		.e71_first_task[pr]
.e71_first_task:
		l           1,0(3)
		l			0,8(1)
		mtlr		0
		brl
		.globl		.e71_chgstack[pr]
		.csect		.e71_chgstack[pr]
.e71_chgstack:
#		begin prolog
		mflr		0
		mfcr		12
		stm			13,-4*19-8*19(1)
		st			0,8(1) 
		st			12,4(1)
		st          2,20(1)
		stfd        0,-600(1)
		stfd        1,-608(1)
		stfd        2,-616(1)
		stfd        3,-624(1)
		stfd        4,-632(1)
		stfd        5,-640(1)
		stfd        6,-648(1)
		stfd        7,-656(1)
		stfd        8,-664(1)
		stfd        9,-672(1)
		stfd        10,-300(1)
		stfd        11,-308(1)
		stfd        12,-316(1)
		stfd        13,-324(1)
		stfd        14,-332(1)
		stfd        15,-340(1)
		stfd        16,-348(1)
		stfd        17,-356(1)
		stfd        18,-364(1)
		stfd        19,-372(1)
		stfd        20,-400(1)
		stfd        21,-408(1)
		stfd        22,-416(1)
		stfd        23,-424(1)
		stfd        24,-432(1)
		stfd        25,-440(1)
		stfd        26,-448(1)
		stfd        27,-456(1)
		stfd        28,-464(1)
		stfd        29,-472(1)
		stfd        30,-500(1)
		stfd        31,-508(1)
#		end of prolog
		st			1,0(4)			# store from->sp	
		l			1,0(3)			# load  to->sp
#       begin epilog
		lm			13,-4*19-8*19(1)
		l			0,8(1)
		l			12,4(1)
		l			2,20(1)
		lfd        0,-600(1)
		lfd        1,-608(1)
		lfd        2,-616(1)
		lfd        3,-624(1)
		lfd        4,-632(1)
		lfd        5,-640(1)
		lfd        6,-648(1)
		lfd        7,-656(1)
		lfd        8,-664(1)
		lfd        9,-672(1)
		lfd        10,-300(1)
		lfd        11,-308(1)
		lfd        12,-316(1)
		lfd        13,-324(1)
		lfd        14,-332(1)
		lfd        15,-340(1)
		lfd        16,-348(1)
		lfd        17,-356(1)
		lfd        18,-364(1)
		lfd        19,-372(1)
		lfd        20,-400(1)
		lfd        21,-408(1)
		lfd        22,-416(1)
		lfd        23,-424(1)
		lfd        24,-432(1)
		lfd        25,-440(1)
		lfd        26,-448(1)
		lfd        27,-456(1)
		lfd        28,-464(1)
		lfd        29,-472(1)
		lfd        30,-500(1)
		lfd        31,-508(1)
		mtlr		0
		mtcrf		0x38,12
		brl

		.globl		.e71a_own_frame[pr]
		.csect		.e71a_own_frame[pr]
# routine is extremely primitive: no stack frame etc.
.e71a_own_frame:
# first, clear register (GPR) 3 (to be sure)
		cal         3,0(0)
# now, add GPR1 (= the stack pointer) to this (empty) reg.
		a           3,1,3 
# finally, return (GPR 3 is the result register, see Assembler docu)
		br
&endif

&if $MACH = HP9
        .SPACE  $TEXT$
        .SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=44,CODE_ONLY
e71_chgstack
        .PROC
        .CALLINFO CALLER,FRAME=0
        STWS    30,0(0,25)       ;offset 0x4
	ADDI    4,25,25
        STWS    2,0(0,25)       ;offset 0x4
	ADDI    100,30,30       ; store local regs here
        STWS    3,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    4,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    5,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    6,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    7,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    8,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    9,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    10,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    11,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    12,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    13,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    14,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    15,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    16,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    17,0(0,30)       ; store reg on stack!
	ADDI    4,30,30
        STWS    18,0(0,30)       ; store reg on stack!

        LDWS    0(0,26),30       ;offset 0x4
	ADDI    100,30,30       ; store local regs here
        LDWS    0(0,30),3       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),4       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),5       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),6       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),7       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),8       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),9       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),10       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),11      ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),12      ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),13       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),14       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),15       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),16       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),17       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),18       ; load reg from stack
        LDWS    0(0,26),30       ;offset 0x4
	ADDI    4,26,26
        LDWS    0(0,26),2     ;offset 0x4
        BV      0(2)    ;offset 0x8
        NOP             ;offset 0xc
        .PROCEND ;in=26;out=28;


%25        .SPACE  $TEXT$
        .SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=44,CODE_ONLY
e71_make_core
        .PROC
        .CALLINFO CALLER,FRAME=0
;        STWS    30,0(0,25)       ;offset 0x4
;        ADDI    4,25,25
;        STWS    2,0(0,25)       ;offset 0x4
;        ADDI    100,30,30       ; store local regs here
;        STWS    3,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    4,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    5,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    6,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    7,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    8,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    9,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    10,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    11,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    12,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    13,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    14,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    15,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    16,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    17,0(0,30)       ; store reg on stack!
;        ADDI    4,30,30
;        STWS    18,0(0,30)       ; store reg on stack!
;
	LDWS    0(0,26),30       ; offset 0x4
	ADDI    100,30,30        ; store local regs here
	LDWS    0(0,30),3        ; load reg from stack
	ADDI    4,30,30
	LDWS    0(0,30),4        ; load reg from stack
	ADDI    4,30,30
	LDWS    0(0,30),5        ; load reg from stack
	ADDI    4,30,30
	LDWS    0(0,30),6        ; load reg from stack
	ADDI    4,30,30
	LDWS    0(0,30),7        ; load reg from stack
	ADDI    4,30,30
	LDWS    0(0,30),8        ; load reg from stack
	ADDI    4,30,30
	LDWS    0(0,30),9        ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),10       ; load reg from stack
	ADDI    4,30,30
	LDWS    0(0,30),11       ; load reg from stack
	ADDI    4,30,30
	LDWS    0(0,30),12       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),13       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),14       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),15       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),16       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),17       ; load reg from stack
	ADDI    4,30,30
        LDWS    0(0,30),18       ; load reg from stack
	LDWS    0(0,26),30
	ADDI    4,26,26
	LDWS    0(0,26),2
        ;LDI     1,%r2  		 ; JH make illegal instruction address
        STWS    18,0(0,30)       ; store reg on stack!
	NOP
	;LDI     1,%r25           ; make a core here !
	;STWS    %r25,0(0,%r25)    ; make a core here !
	NOP
	NOP
	BV      0(2)
	NOP
        .PROCEND ;in=26;out=28;


        .SPACE  $TEXT$
        .SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=44,CODE_ONLY
e71_first_task
        .PROC
        .CALLINFO CALLER,FRAME=0

        LDWS    0(0,26),30       ;offset 0x4
	ADDI    4,26,26
        LDWS    0(0,26),2     ;offset 0x4
        BV      0(2)    ;offset 0x8
        NOP             ;offset 0xc
        .PROCEND ;in=26;out=28;



        .SPACE  $TEXT$
        .SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44
        .SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=44,CODE_ONLY
        .SUBSPA $UNWIND$,QUAD=0,ALIGN=8,ACCESS=44
        .SUBSPA $CODE$
        .SPACE  $PRIVATE$
        .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31
$THIS_DATA$

        .SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO
$THIS_BSS$

        .SPACE  $TEXT$
        .SUBSPA $CODE$
	.EXPORT e71_chgstack,PRIV_LEV=3,ARGW0=GR,RTNVAL=GR
	.EXPORT e71_make_core,PRIV_LEV=3,ARGW0=GR,RTNVAL=GR
	.EXPORT e71_first_task,PRIV_LEV=3,ARGW0=GR,RTNVAL=GR
        .END
&endif

&if $MACH in [ PA11 ]
	.LEVEL 1.1
save_area_size 	.EQU 48	

	.SPACE  $TEXT$
        .SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=44,CODE_ONLY
e71_chgstack
        .PROC
        .CALLINFO CALLER,FRAME=0
        STW,MA 	%r30,4(%r25)		 ; arg1[0] = sp 
        STW    	%r2,0(%r25) 		 ; arg1[1] = rp
	ADDI    save_area_size,%r30,%r30 ; space for frame-marker and args
        STW,MA 	%r3,4(%r30)   	
        STW,MA  %r4,4(%r30)  
        STW,MA  %r5,4(%r30) 
        STW,MA  %r6,4(%r30)
        STW,MA  %r7,4(%r30)
        STW,MA  %r8,4(%r30)
        STW,MA  %r9,4(%r30)
        STW,MA  %r10,4(%r30)
        STW,MA  %r11,4(%r30)
        STW,MA  %r12,4(%r30)
        STW,MA  %r13,4(%r30)
        STW,MA  %r14,4(%r30) 
        STW,MA  %r15,4(%r30)
        STW,MA  %r16,4(%r30) 
        STW,MA  %r17,4(%r30)
        STW,MA  %r18,4(%r30)
	FSTD,MA %fr12,8(%r30)
	FSTD,MA %fr13,8(%r30)
	FSTD,MA %fr14,8(%r30)
	FSTD,MA %fr15,8(%r30)
	FSTD,MA %fr16,8(%r30)
	FSTD,MA %fr17,8(%r30)
	FSTD,MA %fr18,8(%r30)
	FSTD,MA %fr19,8(%r30)
	FSTD,MA %fr20,8(%r30)
	FSTD,MA %fr21,8(%r30)

        LDW     0(%r26),%r30		 ; sp = arg0[0]
	ADDI    save_area_size,%r30,%r30 ; space for frame marker and args
        LDW,MA  4(%r30),%r3 
        LDW,MA  4(%r30),%r4 
        LDW,MA  4(%r30),%r5 
        LDW,MA  4(%r30),%r6 
        LDW,MA  4(%r30),%r7 
        LDW,MA  4(%r30),%r8 
        LDW,MA  4(%r30),%r9 
        LDW,MA  4(%r30),%r10
        LDW,MA  4(%r30),%r11  
        LDW,MA  4(%r30),%r12  
        LDW,MA  4(%r30),%r13 
        LDW,MA  4(%r30),%r14
        LDW,MA  4(%r30),%r15 
        LDW,MA  4(%r30),%r16 
        LDW,MA  4(%r30),%r17 
        LDW,MA	4(%r30),%r18 
	FLDD,MA 8(%r30),%fr12
	FLDD,MA 8(%r30),%fr13
	FLDD,MA 8(%r30),%fr14
	FLDD,MA 8(%r30),%fr15
	FLDD,MA 8(%r30),%fr16
	FLDD,MA 8(%r30),%fr17
	FLDD,MA 8(%r30),%fr18
	FLDD,MA 8(%r30),%fr19
	FLDD,MA 8(%r30),%fr20
	FLDD,MA 8(%r30),%fr21
        LDW,MA  4(%r26),%r30 
        LDW     0(%r26),%r2  
        BV,N    0(%r2)   
        .PROCEND 


        .SPACE  $TEXT$
        .SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=44,CODE_ONLY
e71_make_core
        .PROC
        .CALLINFO CALLER,FRAME=0

        LDW     0(%r26),%r30
        ADDI    save_area_size,%r30,%r30    
        LDW,MA  4(%r30),%r3 
        LDW,MA  4(%r30),%r4 
        LDW,MA  4(%r30),%r5 
        LDW,MA  4(%r30),%r6 
        LDW,MA  4(%r30),%r7 
        LDW,MA  4(%r30),%r8 
        LDW,MA  4(%r30),%r9 
        LDW,MA  4(%r30),%r10 
        LDW,MA  4(%r30),%r11 
        LDW,MA  4(%r30),%r12 
        LDW,MA  4(%r30),%r13 
        LDW,MA  4(%r30),%r14 
        LDW,MA  4(%r30),%r15 
        LDW,MA  4(%r30),%r16 
        LDW,MA  4(%r30),%r17 
        LDW,MA  4(%r30),%r18 
	FLDD,MA 8(%r30),%fr12
	FLDD,MA 8(%r30),%fr13
	FLDD,MA 8(%r30),%fr14
	FLDD,MA 8(%r30),%fr15
	FLDD,MA 8(%r30),%fr16
	FLDD,MA 8(%r30),%fr17
	FLDD,MA 8(%r30),%fr18
	FLDD,MA 8(%r30),%fr19
	FLDD,MA 8(%r30),%fr20
	FLDD,MA 8(%r30),%fr21
        LDW,MA  4(%r26),%r30
        LDW     0(%r26),%r2
        BV,N    0(%r2)
        .PROCEND 


        .SPACE  $TEXT$
        .SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=44,CODE_ONLY
e71_first_task
        .PROC
        .CALLINFO CALLER,FRAME=0
	.ENTER
        LDW,MA  4(%r26), %r30       ; sp = %arg0[0]
        LDW     0(%r26), %r2        ; pc = %arg0[1]	 
        BV,N    0(%r2)              ; call (pc) 
        .PROCEND 



        .SPACE  $TEXT$
        .SUBSPA $LIT$,QUAD=0,ALIGN=8,ACCESS=44
        .SUBSPA $CODE$,QUAD=0,ALIGN=4,ACCESS=44,CODE_ONLY
        .SUBSPA $UNWIND$,QUAD=0,ALIGN=8,ACCESS=44
        .SUBSPA $CODE$
        .SPACE  $PRIVATE$
        .SUBSPA $DATA$,QUAD=1,ALIGN=8,ACCESS=31
$THIS_DATA$

        .SUBSPA $BSS$,QUAD=1,ALIGN=8,ACCESS=31,ZERO
$THIS_BSS$

        .SPACE  $TEXT$
        .SUBSPA $CODE$
	.EXPORT e71_chgstack,PRIV_LEV=3,ARGW0=GR,RTNVAL=GR
	.EXPORT e71_make_core,PRIV_LEV=3,ARGW0=GR,RTNVAL=GR
	.EXPORT e71_first_task,PRIV_LEV=3,ARGW0=GR,RTNVAL=GR
        .END
&endif

&if $MACH = PA20W
	.LEVEL	2.0W

	.SPACE	$TEXT$,SORT=8
	.SUBSPA	$CODE$,QUAD=0,ALIGN=8,ACCESS=0x2c,CODE_ONLY,SORT=24
e71_init_task
$PIC$0
	.PROC
	.CALLINFO CALLER,FRAME=320,SAVE_RP
        .ENTRY
; store frame marker, setup new sp
        STD     %r2,-16(%r30)   ;save rp
        STD,MA  %r3,400(%r30)   ;move sp to new frame
        STD     %r27,-384(%r30) ;save gp in stack frame

;fill in func address of task local variable area
        LDD     8(%r26),%r1     ;r1 = arg0[1]
        LDD     16(%r1),%r3     ;r3 = addr((void(*)())arg0[1])
        STD     %r3,-368(%r30)  ;reg_set.rp = addr((void(*)())arg0[1])

;fill in sp of task in local variable area, leave space for frame marker 
        LDD     0(%r26),%r1     ;r1 = arg0[0]
	ADDI	16, %r1, %r1	;r1 = arg0[0] + sizeof (frame_marker)
        STD     %r1,-360(%r30)  ;reg_set.sp = arg0[0] + sizeof (frame_marker)

;copy frame marker to task stack
	STD	%r30, -8(%r1)  ; save real sp in task stacks frame marker
	STD	%r2, -16(%r1)  ; save real rp in task stacks frame marker

;write back new task context
	STD	%r1, 0(%r26)	; task stacks sp
        STD     %r3, 8(%r26)  	; task stacks rp 

;copy addr + sp to task stack
	ADDI	400, %r1, %r1
	LDD	-368(%r30), %r3 ;rp
	STD	%r3, -368(%r1)
	LDD	-360(%r30), %r3 ;sp
	STD	%r3, -360(%r1)
        LDD     -384(%r30), %r3	;gp
        STD     %r3,-384(%r1) 

;return
	LDD	-384(%r30),%r27	;restore gp
        LDD     -416(%r30),%r2  ;restore rp
        BVE     (%r2)         	;return
        .EXIT
        LDD,MB  -400(%r30),%r3  ;restore old sp
	.PROCEND

	.SPACE	$TEXT$
	.SUBSPA	$CODE$,QUAD=0,ALIGN=8,ACCESS=0x2c,CODE_ONLY,SORT=24
e71_first_task
$PIC$1
	.PROC
	.CALLINFO NO_CALLS,FRAME=320,SAVE_RP
        .ENTRY
; change to task stack
        LDD     0(%r26),%r30    ;sp = arg0[0]
; setup task addr
	LDD	8(%r26), %r2	;rp = arg0[1]
        BVE     (%r2)         	;return
        .EXIT
	NOP
;	ADDI 400,%r30,%r30
	.PROCEND


	.SPACE	$TEXT$
	.SUBSPA	$CODE$,QUAD=0,ALIGN=8,ACCESS=0x2c,CODE_ONLY,SORT=24
e71_chgstack
$PIC$2
	.PROC
	.CALLINFO NO_CALLS,FRAME=320,SAVE_RP
        .ENTRY
	STD %r2,8(%r25) 	;arg1[1] = rp
	STD %r30,0(%r25)	;arg1[0] = sp
	ADDI 400,%r30,%r30
	STD %r3, -352(%r30)
	STD %r4, -344(%r30)
	STD %r5, -336(%r30)
	STD %r6, -328(%r30)
	STD %r7, -320(%r30)
	STD %r8, -312(%r30)
	STD %r9, -304(%r30)
	STD %r10, -296(%r30)
	STD %r11, -288(%r30)
	STD %r12, -280(%r30)
	STD %r13, -272(%r30)
	STD %r14, -264(%r30)
	STD %r15, -256(%r30)
	STD %r16, -248(%r30)
	STD %r17, -240(%r30)
	STD %r18, -232(%r30)
	FSTD %fr12, -224(%r30)
	FSTD %fr13, -216(%r30)
	FSTD %fr14, -208(%r30)
	FSTD %fr15, -200(%r30)
	FSTD %fr16, -192(%r30)
	FSTD %fr17, -184(%r30)
	FSTD %fr18, -176(%r30)
	FSTD %fr19, -168(%r30)
	FSTD %fr20, -160(%r30)
	FSTD %fr21, -152(%r30)
	
	LDD    0(%r26),%r30 ; sp = arg0[0]
	ADDI 400,%r30,%r30
	LDD -352(%r30), %r3
	LDD -344(%r30), %r4
	LDD -336(%r30), %r5
	LDD -328(%r30), %r6
	LDD -320(%r30), %r7
	LDD -312(%r30), %r8
	LDD -304(%r30), %r9
	LDD -296(%r30), %r10
	LDD -288(%r30), %r11
	LDD -280(%r30), %r12
	LDD -272(%r30), %r13
	LDD -264(%r30), %r14
	LDD -256(%r30), %r15
	LDD -248(%r30), %r16
	LDD -240(%r30), %r17
	LDD -232(%r30), %r18
	FLDD -224(%r30), %fr12
	FLDD -216(%r30), %fr13
	FLDD -208(%r30), %fr14
	FLDD -200(%r30), %fr15
	FLDD -192(%r30), %fr16
	FLDD -184(%r30), %fr17
	FLDD -176(%r30), %fr18
	FLDD -168(%r30), %fr19
	FLDD -160(%r30), %fr20
	FLDD -152(%r30), %fr21
	LDD	8(%r26), %r2	;rp = arg0[1]
        BVE     (%r2)         	;return
        .EXIT
	ADDI -400,%r30, %r30
	.PROCEND	;

	.SPACE	$TEXT$
	.SUBSPA	$CODE$,QUAD=0,ALIGN=8,ACCESS=0x2c,CODE_ONLY,SORT=24
e71_make_core
$PIC$3
	.PROC
	.CALLINFO NO_CALLS,FRAME=320,SAVE_RP
        .ENTRY

	LDD    0(%r26),%r30 ; sp = arg0[0]
	ADDI 400,%r30,%r30
	LDD -352(%r30), %r3
	LDD -344(%r30), %r4
	LDD -336(%r30), %r5
	LDD -328(%r30), %r6
	LDD -320(%r30), %r7
	LDD -312(%r30), %r8
	LDD -304(%r30), %r9
	LDD -296(%r30), %r10
	LDD -288(%r30), %r11
	LDD -280(%r30), %r12
	LDD -272(%r30), %r13
	LDD -264(%r30), %r14
	LDD -256(%r30), %r15
	LDD -248(%r30), %r16
	LDD -240(%r30), %r17
	LDD -232(%r30), %r18
	FLDD -224(%r30), %fr12
	FLDD -216(%r30), %fr13
	FLDD -208(%r30), %fr14
	FLDD -200(%r30), %fr15
	FLDD -192(%r30), %fr16
	FLDD -184(%r30), %fr17
	FLDD -176(%r30), %fr18
	FLDD -168(%r30), %fr19
	FLDD -160(%r30), %fr20
	FLDD -152(%r30), %fr21
	LDD	8(%r26), %r2	;rp = arg0[1]
        STDA	%r26, 0(%r0)	; NULL-pointer assignment
	BVE     (%r2)         	;return
	.EXIT
	ADDI -400,%r30, %r30
	.PROCEND

;	.SPACE	$PRIVATE$,SORT=16
;	.SUBSPA	$DATA$,QUAD=1,ALIGN=64,ACCESS=0x1f,SORT=16
	.SPACE	$TEXT$
	.SUBSPA	$CODE$
	.EXPORT	e71_init_task,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN
	.EXPORT	e71_first_task,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN
	.EXPORT	e71_chgstack,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN
	.EXPORT	e71_make_core,ENTRY,PRIV_LEV=3,NO_RELOCATION,LONG_RETURN
	.END
&endif

&if $MACH = SUN
	.seg	"text"
	.proc	04
	.global	_e71_initstack
	.global	_e88_call_a91mainprogram
	.align	04
_e71_initstack:
	st	%i0,[%o0]		!# 0
	st	%i1,[%o0+4]		!# 1
	st	%i2,[%o0+8]		!# 2
	st	%i3,[%o0+12]		!# 3
	st	%i4,[%o0+16]		!# 4
	st	%i5,[%o0+20]		!# 5
	st	%i6,[%o0+24] !# fp	   6
	st	%i7,[%o0+28] !# ret	   7
	st	%g1,[%o0+32]		!# 8
	st	%g2,[%o0+36]		!# 9
	st	%g3,[%o0+40]		!# 10
	st	%g4,[%o0+44]		!# 11
	st	%g5,[%o0+48]		!# 12
	st	%g6,[%o0+52]		!# 13
	st	%g7,[%o0+56]		!# 14
	st	%o0,[%o0+60]		!# 15
	st	%o1,[%o0+64]		!# 16
	st	%o2,[%o0+68]		!# 17
	st	%o3,[%o0+72]		!# 18
	st	%o4,[%o0+76]		!# 19
	st	%o5,[%o0+80]		!# 20
	st	%o6,[%o0+84] !# sp	   21
	st	%o7,[%o0+88]		!# 22
	st	%l0,[%o0+92]		!# 23 locals
	st	%l1,[%o0+96]		!# 24 locals
	st	%l2,[%o0+100]		!# 25 locals
	st	%l3,[%o0+104]		!# 26 locals
	st	%l4,[%o0+108]		!# 27 locals
	st	%l5,[%o0+112]		!# 28 locals
	st	%l6,[%o0+116]		!# 29 locals
	st	%l7,[%o0+120]		!# 30 locals

!#	set	_e88_call_a91mainprogram,%g1
!#	mov	%o1,%g1
!#	inc	4,%g1
!#	st	%g1,[%o0+88]
!#	ld	[%o0+32],%g1
	retl
	nop
	
	.proc	04
	.global	_e71_chgstack
	.align	04
_e71_chgstack:
	st	%i0,[%o1]		!# 0
	st	%i1,[%o1+4]		!# 1
	st	%i2,[%o1+8]		!# 2
	st	%i3,[%o1+12]		!# 3
	st	%i4,[%o1+16]		!# 4
	st	%i5,[%o1+20]		!# 5
	st	%i6,[%o1+24] !# fp	   6
	st	%i7,[%o1+28] !# ret	   7
	st	%g1,[%o1+32]		!# 8
	st	%g2,[%o1+36]		!# 9
	st	%g3,[%o1+40]		!# 10
	st	%g4,[%o1+44]		!# 11
	st	%g5,[%o1+48]		!# 12
	st	%g6,[%o1+52]		!# 13
	st	%g7,[%o1+56]		!# 14
	st	%o0,[%o1+60]		!# 15
	st	%o1,[%o1+64]		!# 16
	st	%o2,[%o1+68]		!# 17
	st	%o3,[%o1+72]		!# 18
	st	%o4,[%o1+76]		!# 19
	st	%o5,[%o1+80]		!# 20
	st	%o6,[%o1+84] !# sp	   21
	st	%o7,[%o1+88]		!# 22
	st	%l0,[%o1+92]		!# 23 locals
	st	%l1,[%o1+96]		!# 24 locals
	st	%l2,[%o1+100]		!# 25 locals
	st	%l3,[%o1+104]		!# 26 locals
	st	%l4,[%o1+108]		!# 27 locals
	st	%l5,[%o1+112]		!# 28 locals
	st	%l6,[%o1+116]		!# 29 locals
	st	%l7,[%o1+120]		!# 30 locals

	ld	[%o0],%i0		!# 0
	ld	[%o0+4],%i1		!# 1
	ld	[%o0+8],%i2		!# 2
	ld	[%o0+12],%i3		!# 3
	ld	[%o0+16],%i4		!# 4
	ld	[%o0+20],%i5		!# 5
	ld	[%o0+28],%i7 !# ret	   7
	ld	[%o0+32],%g1		!# 8
	ld	[%o0+36],%g2		!# 9
	ld	[%o0+40],%g3		!# 10
	ld	[%o0+44],%g4		!# 11
	ld	[%o0+48],%g5		!# 12
	ld	[%o0+52],%g6		!# 13
	ld	[%o0+56],%g7		!# 14
	ld	[%o0+68],%o2		!# 17
	ld	[%o0+72],%o3		!# 18
	ld	[%o0+76],%o4		!# 19
	ld	[%o0+80],%o5		!# 20
	ld	[%o0+88],%o7		!# 22
	ld	[%o0+92],%l0		!# 23 locals
	ld	[%o0+96],%l1		!# 24 locals
	ld	[%o0+100],%l2		!# 25 locals
	ld	[%o0+104],%l3		!# 26 locals
	ld	[%o0+108],%l4		!# 27 locals
	ld	[%o0+112],%l5		!# 28 locals
	ld	[%o0+116],%l6		!# 39 locals
	ld	[%o0+120],%l7		!# 30 locals
	
	ld	[%o0+84],%o6 !# sp	   21
	ld	[%o0+24],%i6 !# fp	   6
	
	ld	[%o0+64],%o1		!# 16
	ld	[%o0+60],%o0		!# 15
	retl
	nop
	
	.proc	04
	.global	_e71_make_core
	.align	04
_e71_make_core:
	ld	[%o0],%i0		!# 0
	ld	[%o0+4],%i1		!# 1
	ld	[%o0+8],%i2		!# 2
	ld	[%o0+12],%i3		!# 3
	ld	[%o0+16],%i4		!# 4
	ld	[%o0+20],%i5		!# 5
	ld	[%o0+28],%i7 !# ret	   7
	ld	[%o0+32],%g1		!# 8
	ld	[%o0+36],%g2		!# 9
	ld	[%o0+40],%g3		!# 10
	ld	[%o0+44],%g4		!# 11
	ld	[%o0+48],%g5		!# 12
	ld	[%o0+52],%g6		!# 13
	ld	[%o0+56],%g7		!# 14
	ld	[%o0+64],%o1		!# 16
	ld	[%o0+68],%o2		!# 17
	ld	[%o0+72],%o3		!# 18
	ld	[%o0+76],%o4		!# 19
	ld	[%o0+80],%o5		!# 20
	ld	[%o0+88],%o7		!# 22
	ld	[%o0+92],%l0		!# 23 locals
	ld	[%o0+96],%l1		!# 24 locals
	ld	[%o0+100],%l2		!# 25 locals
	ld	[%o0+104],%l3		!# 26 locals
	ld	[%o0+108],%l4		!# 27 locals
	ld	[%o0+112],%l5		!# 28 locals
	ld	[%o0+116],%l6		!# 39 locals
	ld	[%o0+120],%l7		!# 30 locals
	
	ld	[%o0+84],%o6 !# sp	   21
	ld	[%o0+24],%i6 !# fp	   6
	
	ld	[%o0+60],%o0		!# 15

	sethi	%hi(0x0),%o0
	add	%o0,0x0,%o0
	st	%o0,[%o0]		!# writing at address 0x0

	retl
	nop
	
	
	.proc	04
	.global	_e71_get_stackpointer
	.align	04
_e71_get_stackpointer:
	st	%sp,[%o0]
	retl
	nop
&endif

&if  $MACH = ALPHA
&ifdef  BIT64
	.file	2 "ven71a.s"
	.text
	.align	4
/*
 * struct context	
 * {
 * 	unsigned char * sp ;
 * 	unsigned char * top ;
 * }
 *
 * Each task control block (tcb) has a struct context.
 * When we alloc a stack for a task 
 * 	context->sp  = task stack begin
 * 	context->top = task stack begin + size
 * The 1st time we change to a task stack, we will return not to the caller,
 *	but to the start of task_proc().
 *
 * Initialize: call e71_initstack(context, task_proc) once per task stack
 * 	push task_proc()'s start addr onto task stack
 * 	push regs that should be saved onto task stack
 *	put task stack ptr into context->sp
 *	to prepare for stack check, mark end of task stack
 *	return to caller
 * When all stacks initialized, change to 1st stack: e71_firststack(context)
 *	context = 1st task's context
 *	change stack ptr to context->sp (the task's stack)
 *	pop regs that were saved in e71_inittask() 
 *	pop task_proc()'s start addr, which was saved in e71_inittask()
 *	return to start of task_proc(), not caller
 * Note that stack ptr is at begin of 1st task stack.
 * To change to the next task, call e71_chgstack(new_context, old_context)
 *	new_context = 2nd task's context
 *	old_context = 1st task's context
 *	push regs onto 1st task stack (current stack ptr)
 *	push caller's return addr onto 1st task's stack
 *	update old_context->sp with stack ptr
 *	change stack ptr to new_context->sp (the 2nd task's stack)
 *	pop regs that were saved in e71_inittask() 
 *	pop task_proc()'s start addr, which was saved in e71_inittask()
 *	update new_context->sp with stack ptr
 *	return to start of task_proc(), not caller
 * Suppose we have 2 tasks.
 * To change back to the 1st task, call e71_chgstack(new_context, old_context)
 *	new_context = 1st task's context
 *	old_context = 2nd task's context
 *	push regs onto 2nd task stack (current stack ptr)
 *	push caller's return addr onto 2nd task's stack
 *	update old_context->sp with stack ptr
 *	change stack ptr to new_context->sp (the 1st task's stack)
 *	pop regs that were saved in e71_chgstack() 
 *	pop return addr that was saved in e71_chgstack()
 *	update new_context->sp with stack ptr
 *	return to 1st task's caller
 * From now on, changing tasks follows the pattern in the last example: we
 *	resume the new task's identity and return to its caller.
 */

/* 
 * void	e71_FirstChangeStack ( new, old )
 * struct context	* new ;
 * struct context	* old ;
 *
 * This routine was added to setup a final return stack (old)
 */
	.globl	e71_FirstChangeStack
	.ent	e71_FirstChangeStack
e71_FirstChangeStack:
	ldgp	$gp, 0($27)	/* glob ptr reg gets addr of this proc */
	lda	$sp, -288($sp)	/* grow old task stack: ret addr & 9 regs */

	/* Save regs and return addr for old task */
	stq	$9, 0($sp)	/* 9 */
	stq	$10, 16($sp)	/* 10 */
	stq	$11, 32($sp)	/* 11 */
	stq	$12, 48($sp)	/* 12 */
	stq	$13, 64($sp)	/* 13 */
	stq	$14, 80($sp)	/* 14 */
	stq	$15, 96($sp)	/* 15 */
	stt	$f0, 112($sp)	/* save floating-point regs 0-1 */
	stt	$f1, 128($sp)	/* 1 */
	stt	$f2, 144($sp)	/* 2 */
	stt	$f3, 160($sp)	/* 3 */
	stt	$f4, 176($sp)	/* 4 */
	stt	$f5, 192($sp)	/* 5 */
	stt	$f6, 208($sp)	/* 6 */
	stt	$f7, 224($sp)	/* 7 */
	stt	$f8, 240($sp)	/* 8 */
	stt	$f9, 256($sp)	/* 9 */
	stq	$26, 272($sp)	/* return addr for old task */

	/* Finished with old task stack */
	stq	$sp, 0($17)     /* 2nd arg: sp into old->sp */

	/* Change to new task stack, restore regs and return addr */
	ldq	$sp, 0($16)	/* new->sp into sp */
	ldq	$9, 0($sp)	/* restore integer regs 9-15 for new task */
	ldq	$10, 16($sp)	/* 10 */
	ldq	$11, 32($sp)	/* 11 */
	ldq	$12, 48($sp)	/* 12 */
	ldq	$13, 64($sp)	/* 13 */
	ldq	$14, 80($sp)	/* 14 */
	ldq	$15, 96($sp)	/* 15 */
	ldt	$f0, 112($sp)	/* restore floating-point regs 0-1 */
	ldt	$f1, 128($sp)	/* 1 */
	ldt	$f2, 144($sp)	/* 2 */
	ldt	$f3, 160($sp)	/* 3 */
	ldt	$f4, 176($sp)	/* 4 */
	ldt	$f5, 192($sp)	/* 5 */
	ldt	$f6, 208($sp)	/* 6 */
	ldt	$f7, 224($sp)	/* 7 */
	ldt	$f8, 240($sp)	/* 8 */
	ldt	$f9, 256($sp)	/* 9 */
	ldq	$26, 272($sp)	/* will return to new task's caller */
	ldq	$27, 272($sp)	/* will return to new task's caller */

	/* Restore new task's stack WITHOUT updating context->sp */
	lda	$sp, 288($sp)
	ret	$31, ($26), 1	/* return */
	.end	e71_FirstChangeStack

/* 
 * void	e71_initstack ( context , func )
 * struct context	* context ;
 * void			(* func) ();
 */
	.globl	e71_initstack
	.ent	e71_initstack
e71_initstack:
	ldgp	$gp, 0($27)	/* glob ptr reg gets addr of this proc */

	ldq	$1, 0($16)	/* 1st arg: context->sp is task stack ptr */

	lda	$1, -288($1)	/* space on task stack for ret addr & 9 regs */
	stq	$1, 0($16)	/* update context->sp with task sp */

	stq	$9, 0($1)	/* save integer regs 9-15 */
	stq	$10, 16($1)	/* 10 */
	stq	$11, 32($1)	/* 11 */
	stq	$12, 48($1)	/* 12 */
	stq	$13, 64($1)	/* 13 */
	stq	$14, 80($1)	/* 14 */
	stq	$15, 96($1)	/* 15 */
	stt	$f0, 112($1)	/* save floating-point regs 0-1 */
	stt	$f1, 128($1)	/* 1 */
	stt	$f2, 144($1)	/* 2 */
	stt	$f3, 160($1)	/* 3 */
	stt	$f4, 176($1)	/* 4 */
	stt	$f5, 192($1)	/* 5 */
	stt	$f6, 208($1)	/* 6 */
	stt	$f7, 224($1)	/* 7 */
	stt	$f8, 240($1)	/* 8 */
	stt	$f9, 256($1)	/* 9 */
	
	stq	$17, 272($1)	/* 2nd arg: func for future return addr */

	ldq	$1, 8($16)	/* 1st arg: context->top is stack's last word */
	ldiq	$2, 0xfffa5a5afffa5a5a
	stq	$2, 0($1)	/* as float, causes floating point trap */
	stq	$2, 8($1)	/* as ptr, causes addr or seg violation */

	ret	$31, ($26), 1	/* return to caller */
	.end	e71_initstack
/* 
 * void	e71_firststack ( context )
 * struct context	* context ;
 */
	.globl	e71_firststack
	.ent	e71_firststack
e71_firststack:
	ldgp	$gp, 0($27)	/* glob ptr reg gets addr of this proc */
	ldq	$sp, 0($16)	/* change to task stack: context->sp into sp */

	ldq	$9, 0($sp)	/* get phony vals for integer regs 9-15 */
	ldq	$10, 16($sp)	/* 10 */
	ldq	$11, 32($sp)	/* 11 */
	ldq	$12, 48($sp)	/* 12 */
	ldq	$13, 64($sp)	/* 13 */
	ldq	$14, 80($sp)	/* 14 */
	ldq	$15, 96($sp)	/* 15 */
	ldt	$f0, 112($sp)	/* get phony vals for floating-point regs 0-1 */
	ldt	$f1, 128($sp)	/* 1 */
	ldt	$f2, 144($sp)	/* 2 */
	ldt	$f3, 160($sp)	/* 3 */
	ldt	$f4, 176($sp)	/* 4 */
	ldt	$f5, 192($sp)	/* 5 */
	ldt	$f6, 208($sp)	/* 6 */
	ldt	$f7, 224($sp)	/* 7 */
	ldt	$f8, 240($sp)	/* 8 */
	ldt	$f9, 256($sp)	/* 9 */
	ldq	$26, 272($sp)	/* return to func, not caller */
	ldq	$27, 272($sp)	/* return to func, not caller */

	/* Restore task's stack WITHOUT updating context->sp */
	lda	$sp, 288($sp)	
	ret	$31, ($26), 1	/* return */
	.end	e71_firststack

/* 
 * void	e71_chgstack ( new , old )
 * struct context	* new ;
 * struct context	* old ;
 */
	.globl	e71_chgstack
	.ent	e71_chgstack
e71_chgstack:
	ldgp	$gp, 0($27)	/* glob ptr reg gets addr of this proc */
	lda	$sp, -288($sp)	/* grow old task stack: ret addr & 9 regs */

	/* Save regs and return addr for old task */
	stq	$9, 0($sp)	/* 9 */
	stq	$10, 16($sp)	/* 10 */
	stq	$11, 32($sp)	/* 11 */
	stq	$12, 48($sp)	/* 12 */
	stq	$13, 64($sp)	/* 13 */
	stq	$14, 80($sp)	/* 14 */
	stq	$15, 96($sp)	/* 15 */
	stt	$f0, 112($sp)	/* save floating-point regs 0-1 */
	stt	$f1, 128($sp)	/* 1 */
	stt	$f2, 144($sp)	/* 2 */
	stt	$f3, 160($sp)	/* 3 */
	stt	$f4, 176($sp)	/* 4 */
	stt	$f5, 192($sp)	/* 5 */
	stt	$f6, 208($sp)	/* 6 */
	stt	$f7, 224($sp)	/* 7 */
	stt	$f8, 240($sp)	/* 8 */
	stt	$f9, 256($sp)	/* 9 */
	stq	$26, 272($sp)	/* return addr for old task */

	/* Make sure stack hasn't grown too much */
	ldq	$1, 8($17)	/* 2nd arg: old->top should be <= sp */
	cmpule	$1, $sp, $2	/* if old->top <= sp then $2 = 1 else $2 = 0 */
	beq	$2, e71_chg_err	/* stack has grown too big */

	/* Make sure end of stack hasn't been overwritten */
	ldq	$1, 8($17)	/* 2nd arg: old->top */
	ldq	$2, 0($1)	/* get last word in stack */
	subq	$2, 0xfffa5a5afffa5a5a, $3
	bne	$3, e71_chg_err	/* subtraction result is in this reg */
	ldq	$2, 8($1)	/* get next-to-last word in stack */
	subq	$2, 0xfffa5a5afffa5a5a, $3
	bne	$3, e71_chg_err	/* subtraction result is in this reg */

	/* Finished with old task stack */
	stq	$sp, 0($17)     /* 2nd arg: sp into old->sp */

	/* Change to new task stack, restore regs and return addr */
	ldq	$sp, 0($16)	/* new->sp into sp */
	ldq	$9, 0($sp)	/* restore integer regs 9-15 for new task */
	ldq	$10, 16($sp)	/* 10 */
	ldq	$11, 32($sp)	/* 11 */
	ldq	$12, 48($sp)	/* 12 */
	ldq	$13, 64($sp)	/* 13 */
	ldq	$14, 80($sp)	/* 14 */
	ldq	$15, 96($sp)	/* 15 */
	ldt	$f0, 112($sp)	/* restore floating-point regs 0-1 */
	ldt	$f1, 128($sp)	/* 1 */
	ldt	$f2, 144($sp)	/* 2 */
	ldt	$f3, 160($sp)	/* 3 */
	ldt	$f4, 176($sp)	/* 4 */
	ldt	$f5, 192($sp)	/* 5 */
	ldt	$f6, 208($sp)	/* 6 */
	ldt	$f7, 224($sp)	/* 7 */
	ldt	$f8, 240($sp)	/* 8 */
	ldt	$f9, 256($sp)	/* 9 */
	ldq	$26, 272($sp)	/* will return to new task's caller */
	ldq	$27, 272($sp)	/* will return to new task's caller */

	/* Restore new task's stack WITHOUT updating context->sp */
	lda	$sp, 288($sp)
	ret	$31, ($26), 1	/* return */

e71_chg_err:
	mov	$17, $16		/* send 1 arg: "old" context */
	jsr	$26, e88_stack_overflow	/* never returns */
	.end	e71_chgstack
/*
 * void	e71_make_core ( context )
 * struct context	* context ;
 */
	.globl	e71_make_core
	.ent	e71_make_core
e71_make_core:
	ldgp	$gp, 0($27)	/* glob ptr reg gets addr of this proc */
	ldq	$sp, 0($16)	/* change to task stack: context->sp into sp */

	ldq	$9,  0($sp)	    /* get phony vals for integer regs 9-15 */
	ldq	$10, 16($sp)	/* 10 */
	ldq	$11, 32($sp)	/* 11 */
	ldq	$12, 48($sp)	/* 12 */
	ldq	$13, 64($sp)	/* 13 */
	ldq	$14, 80($sp)	/* 14 */
	ldq	$15, 96($sp)	/* 15 */
	ldt	$f0, 112($sp)	/* get phony vals for floating-point regs 0-1 */
	ldt	$f1, 128($sp)	/* 1 */
	ldt	$f2, 144($sp)	/* 2 */
	ldt	$f3, 160($sp)	/* 3 */
	ldt	$f4, 176($sp)	/* 4 */
	ldt	$f5, 192($sp)	/* 5 */
	ldt	$f6, 208($sp)	/* 6 */
	ldt	$f7, 224($sp)	/* 7 */
	ldt	$f8, 240($sp)	/* 8 */
	ldt	$f9, 256($sp)	/* 9 */
/*	ldq	$26, 272($sp)	*//* return to func, not caller */
/*	ldq	$27, 272($sp)	*//* return to func, not caller */
    ldq $26, en81Abort($gp)
    ldq $27, en81Abort($gp)

	/* Restore task's stack WITHOUT updating context->sp */
	lda	$sp, 288($sp)
	ret	$31, ($26), 1	/* return */
	.end e71_make_core
&endif
&endif

.CM *-END-* code ----------------------------------------
.sp 2 
***********************************************************
*-PRETTY-*  statements    :
*-PRETTY-*  lines of code :
*-PRETTY-*  lines in file :
.pa 
