plan 9 kernel history: overview | file list | diff list

1990/1226/ss/l.s (diff list | history)

1990/1223/sys/src/9/ss/l.s:1,811990/1226/sys/src/9/ss/l.s:1,399 (short | long | prev | next)
1990/1223    
#include "mem.h" 
 
1990/1226    
#define	SYSPSR	(PSREF|SPL(0xF)|PSRSUPER) 
 
1990/1223    
TEXT	start(SB), $-4 
 
	/* get virtual, fast */ 
	/* we are executing in segment 0, mapped to pmeg 0. stack is there too */ 
	/* get virtual by mapping segment(KZERO) to pmeg 0. */ 
	MOVW	$KZERO, R1 
	MOVB	R0, (R1, 3) 
1990/1226    
	MOVW	$KZERO, R7 
	MOVB	R0, (R7, 3) 
1990/1223    
	/* now mapped correctly.  jmpl to where we want to be */ 
	MOVW	$setR30(SB), R30 
	MOVW	$startvirt(SB), R1 
	JMPL	(R1) 
1990/1226    
	MOVW	$setSB(SB), R2 
	MOVW	$startvirt(SB), R7 
	JMPL	(R7) 
1990/1223    
	RETURN			/* can't get here */ 
 
TEXT	startvirt(SB), $-4 
 
	MOVW	$0x4000, R29 
1990/1226    
	MOVW	$BOOTSTACK, R1 
1990/1223    
	MOVW	$mach0(SB), R(MACH) 
1990/1226    
	MOVW	$0x8, R7 
	MOVW	R7, WIM 
1990/1223    
	JMPL	main(SB) 
	UNIMP 
	RETURN 
 
TEXT	pc(SB), $0 
	MOVW	R15, R1 
1990/1226    
TEXT	getpsr(SB), $0 
 
	MOVW	PSR, R7 
1990/1223    
	RETURN 
 
1990/1226    
TEXT	swap1_should_work(SB), $0 
 
	MOVW	keyaddr+0(FP), R8 
	MOVW	$1, R7 
	SWAP	(R8), R7 
	RETURN 
 
TEXT	swap1(SB), $0 
 
	MOVW	keyaddr+0(FP), R8 
	MOVW	PSR, R9 
	MOVW	R9, R10 
	AND	$~PSRET, R10		/* BUG: book says this is buggy */ 
	MOVW	R10, PSR 
	OR	R0, R0 
	OR	R0, R0 
	OR	R0, R0 
	MOVW	(R8), R7 
	CMP	R7, R0 
	BNE	was1 
	MOVW	$1, R10 
	MOVW	R10, (R8) 
was1: 
	MOVW	R9, PSR 
	RETURN 
 
TEXT	spllo(SB), $0 
 
	MOVW	PSR, R7 
	MOVW	R7, R10 
	OR	$PSRET, R10 
	MOVW	R10, PSR 
	OR	R0, R0 
	OR	R0, R0 
	OR	R0, R0 
	RETURN 
 
TEXT	splhi(SB), $0 
 
	MOVW	PSR, R7 
	MOVW	R7, R10 
	AND	$~PSRET, R10	/* BUG: book says this is buggy */ 
	MOVW	R10, PSR 
	OR	R0, R0 
	OR	R0, R0 
	OR	R0, R0 
	RETURN 
 
TEXT	splx(SB), $0 
 
	MOVW	psr+0(FP), R7 
	MOVW	R7, PSR		/* BUG: book says this is buggy */ 
	OR	R0, R0 
	OR	R0, R0 
	OR	R0, R0 
	RETURN 
 
TEXT	touser(SB), $-4 
 
	MOVW	$SYSPSR, R7	/* BUG SPL(0xF) for now */ 
	MOVW	R7, PSR 
 
	OR	R0, R0 
	OR	R0, R0 
	OR	R0, R0 
	MOVW	sp+0(FP), R1 
	SAVE	R0, R0			/* RETT is implicit RESTORE */ 
	MOVW	$(UTZERO+32), R7	/* PC; header appears in text */ 
	MOVW	$(UTZERO+32+4), R8	/* nPC */ 
	RETT	R7, R8 
 
TEXT	traplink(SB), $-4 
 
	/* R8 to R23 are free to play with */ 
	/* R17 contains PC, R18 contains nPC */ 
	/* R19 has PSR loaded from vector code */ 
	ANDCC	$PSRPSUPER, R19, R0 
	BE	usertrap 
 
kerneltrap: 
	/* 
	 * Interrupt or fault from kernel 
	 */ 
	MOVW	R1, (0-(4*(32+5))+(4*1))(R1)	/* save R1=SP */ 
	/* really clumsy: store these in Ureg so can be restored below */ 
	MOVW	R2, (0-(4*(32+5))+(4*2))(R1)	/* SB */ 
	MOVW	R5, (0-(4*(32+5))+(4*5))(R1)	/* USER */ 
	MOVW	R6, (0-(4*(32+5))+(4*6))(R1)	/* MACH */ 
trap1: 
	SUB	$(4*(32+5)), R1 
	MOVW	Y, R20 
	MOVW	R20, (4*(32+0))(R1)		/* Y */ 
	MOVW	TBR, R20 
	MOVW	R20, (4*(32+1))(R1)		/* TBR */ 
	AND	$~0x1F, R19			/* force CWP=0 */ 
	MOVW	R19, (4*(32+2))(R1)		/* PSR */ 
	MOVW	R18, (4*(32+3))(R1)		/* nPC */ 
	MOVW	R17, (4*(32+4))(R1)		/* PC */ 
	MOVW	R0, (4*0)(R1) 
	MOVW	R3, (4*3)(R1) 
	MOVW	R4, (4*4)(R1) 
	MOVW	R7, (4*7)(R1) 
	RESTORE	R0, R0 
	/* now our registers R8-R31 are same as before trap */ 
	MOVW	R8, (4*8)(R1) 
	MOVW	R9, (4*9)(R1) 
	MOVW	R10, (4*10)(R1) 
	MOVW	R11, (4*11)(R1) 
	MOVW	R12, (4*12)(R1) 
	MOVW	R13, (4*13)(R1) 
	MOVW	R14, (4*14)(R1) 
	MOVW	R15, (4*15)(R1) 
	MOVW	R16, (4*16)(R1) 
	MOVW	R17, (4*17)(R1) 
	MOVW	R18, (4*18)(R1) 
	MOVW	R19, (4*19)(R1) 
	MOVW	R20, (4*20)(R1) 
	MOVW	R21, (4*21)(R1) 
	MOVW	R22, (4*22)(R1) 
	MOVW	R23, (4*23)(R1) 
	MOVW	R24, (4*24)(R1) 
	MOVW	R25, (4*25)(R1) 
	MOVW	R26, (4*26)(R1) 
	MOVW	R27, (4*27)(R1) 
	MOVW	R28, (4*28)(R1) 
	MOVW	R29, (4*29)(R1) 
	MOVW	R30, (4*30)(R1) 
	MOVW	R31, (4*31)(R1) 
	/* SP and SB and u and m are already set; away we go */ 
	MOVW	R1, -4(R1)		/* pointer to Ureg */ 
	SUB	$8, R1 
	MOVW	$SYSPSR, R7 
	MOVW	R7, PSR 
	OR	R0, R0 
	OR	R0, R0 
	OR	R0, R0 
	JMPL	faultsparc(SB) 
 
	ADD	$8, R1 
	MOVW	(4*(32+2))(R1), R7		/* PSR */ 
	MOVW	R7, PSR 
	OR	R0, R0 
	OR	R0, R0 
	OR	R0, R0 
 
	MOVW	(4*31)(R1), R31 
	MOVW	(4*30)(R1), R30 
	MOVW	(4*29)(R1), R29 
	MOVW	(4*28)(R1), R28 
	MOVW	(4*27)(R1), R27 
	MOVW	(4*26)(R1), R26 
	MOVW	(4*25)(R1), R25 
	MOVW	(4*24)(R1), R24 
	MOVW	(4*23)(R1), R23 
	MOVW	(4*22)(R1), R22 
	MOVW	(4*21)(R1), R21 
	MOVW	(4*20)(R1), R20 
	MOVW	(4*19)(R1), R19 
	MOVW	(4*18)(R1), R18 
	MOVW	(4*17)(R1), R17 
	MOVW	(4*16)(R1), R16 
	MOVW	(4*15)(R1), R15 
	MOVW	(4*14)(R1), R14 
	MOVW	(4*13)(R1), R13 
	MOVW	(4*12)(R1), R12 
	MOVW	(4*11)(R1), R11 
	MOVW	(4*10)(R1), R10 
	MOVW	(4*9)(R1), R9 
	MOVW	(4*8)(R1), R8 
	SAVE	R0, R0 
	MOVW	(4*7)(R1), R7 
	MOVW	(4*6)(R1), R6 
	MOVW	(4*5)(R1), R5 
	MOVW	(4*4)(R1), R4 
	MOVW	(4*3)(R1), R3 
	MOVW	(4*2)(R1), R2 
	MOVW	(4*(32+0))(R1), R20		/* Y */ 
	MOVW	R20, Y 
	MOVW	(4*(32+4))(R1), R17		/* PC */ 
	MOVW	(4*(32+3))(R1), R18		/* nPC */ 
	MOVW	(4*1)(R1), R1	/* restore R1=SP */ 
	RETT	R17, R18 
	 
usertrap: 
	/* 
	 * Interrupt or fault from user 
	 */ 
	MOVW	R1, R8 
	MOVW	R2, R9 
	MOVW	$setSB(SB), R2 
	MOVW	$(USERADDR+BY2PG), R1 
	MOVW	R8, (0-(4*(32+5))+(4*1))(R1)	/* save R1=SP */ 
	MOVW	R9, (0-(4*(32+5))+(4*2))(R1)	/* save R2=SB */ 
	MOVW	R5, (0-(4*(32+5))+(4*5))(R1)	/* save R5=USER */ 
	MOVW	R6, (0-(4*(32+5))+(4*6))(R1)	/* save R6=MACH */ 
	MOVW	$USERADDR, R(USER) 
	MOVW	$mach0(SB), R(MACH) 
	JMP	trap1 
 
TEXT	syslink(SB), $-4 
 
	/* R8 to R23 are free to play with */ 
	/* R17 contains PC, R18 contains nPC */ 
	/* R19 has PSR loaded from vector code */ 
	/* assume user did it; syscall checks */ 
	MOVW	R1, R8 
	MOVW	R2, R9 
	MOVW	$setSB(SB), R2 
	MOVW	$(USERADDR+BY2PG), R1 
	MOVW	R8, (0-(4*(32+5))+4)(R1)	/* save R1=SP */ 
	SUB	$(4*(32+5)), R1 
	MOVW	R9, (4*2)(R1)			/* save R2=SB */ 
	MOVW	R3, (4*3)(R1)			/* global register */ 
	MOVW	R4, (4*4)(R1)			/* global register */ 
	MOVW	R5, (4*5)(R1)			/* save R5=USER */ 
	MOVW	R6, (4*6)(R1)			/* save R6=MACH */ 
	MOVW	R7, (4*7)(R1)			/* system call number */ 
	MOVW	$USERADDR, R(USER) 
	MOVW	$mach0(SB), R(MACH) 
	MOVW	TBR, R20 
	MOVW	R20, (4*(32+1))(R1)		/* TBR */ 
	AND	$~0x1F, R19 
	MOVW	R19, (4*(32+2))(R1)		/* PSR */ 
	MOVW	R18, (4*(32+3))(R1)		/* nPC */ 
	MOVW	R17, (4*(32+4))(R1)		/* PC */ 
	RESTORE	R0, R0 
	/* now our registers R8-R31 are same as before trap */ 
	MOVW	R15, (4*15)(R1) 
	/* SP and SB and u and m are already set; away we go */ 
	MOVW	R1, -4(R1)		/* pointer to Ureg */ 
	SUB	$8, R1 
	MOVW	$SYSPSR, R7 
	MOVW	R7, PSR 
	JMPL	syscall(SB) 
	/* R7 contains return value from syscall */ 
 
	ADD	$8, R1 
	MOVW	(4*(32+2))(R1), R8		/* PSR */ 
	MOVW	R8, PSR 
	OR	R0, R0 
	OR	R0, R0 
	OR	R0, R0 
 
	MOVW	(4*15)(R1), R15 
	SAVE	R0, R0 
	MOVW	(4*6)(R1), R6 
	MOVW	(4*5)(R1), R5 
	MOVW	(4*4)(R1), R4 
	MOVW	(4*3)(R1), R3 
	MOVW	(4*2)(R1), R2 
	MOVW	(4*(32+4))(R1), R17		/* PC */ 
	MOVW	(4*(32+3))(R1), R18		/* nPC */ 
	MOVW	(4*1)(R1), R1	/* restore R1=SP */ 
	RETT	R17, R18 
 
TEXT	puttbr(SB), $0 
 
	MOVW	tbr+0(FP), R7 
	MOVW	R7, TBR 
	OR	R0, R0 
	OR	R0, R0 
	OR	R0, R0 
	RETURN 
 
TEXT	gettbr(SB), $0 
 
	MOVW	TBR, R7 
	RETURN 
 
TEXT	r1(SB), $0 
 
	MOVW	R1, R7 
	RETURN 
 
TEXT	getwim(SB), $0 
 
	MOVW	WIM, R7 
	RETURN 
 
1990/1223    
TEXT	setlabel(SB), $0 
	MOVW	b+0(FP), R2 
	MOVW	R29, (R2) 
	MOVW	R15, 4(R2) 
	MOVW	$0, R1 
1990/1226    
 
	MOVW	b+0(FP), R7 
	MOVW	R1, (R7) 
	MOVW	R15, 4(R7) 
	MOVW	$0, R7 
1990/1223    
	RETURN 
 
TEXT	gotolabel(SB), $0 
	MOVW	r+4(FP), R1 
	MOVW	b+0(FP), R2 
	MOVW	(R2), R29 
	MOVW	4(R2), R15 
	MOVW	R15, 0(R29) 
1990/1226    
 
	MOVW	r+4(FP), R7 
	MOVW	b+0(FP), R8 
	MOVW	(R8), R1 
	MOVW	4(R8), R15 
	MOVW	R15, 0(R1) 
1990/1223    
	RETURN 
 
TEXT	crash(SB), $0 
1990/1226    
TEXT	putcxsegm(SB), $0 
1990/1223    
 
	MOVW	0(FP), R8		/* context */ 
	MOVW	4(FP), R9		/* segment addr */ 
	MOVW	8(FP), R10		/* segment value */ 
	MOVW	$0xFFE80118, R1 
	JMPL	(R1) 
1990/1226    
	MOVW	$0xFFE80118, R7 
	JMPL	(R7) 
1990/1223    
	RETURN 
 
1990/1226    
TEXT	putcontext(SB), $0 
 
	MOVW	$CONTEXT, R7 
	MOVW	0(FP), R8 
	MOVB	R8, (R7, 2) 
	RETURN 
 
1990/1223    
TEXT	putb2(SB), $0 
 
	MOVW	0(FP), R1 
	MOVW	4(FP), R2 
	MOVB	R2, (R1, 2) 
1990/1226    
	MOVW	0(FP), R7 
	MOVW	4(FP), R8 
	MOVB	R8, (R7, 2) 
1990/1223    
	RETURN 
 
TEXT	putw3(SB), $0 
1990/1226    
TEXT	getb2(SB), $0 
1990/1223    
 
	MOVW	0(FP), R1 
	MOVW	4(FP), R2 
	MOVW	R2, (R1, 3) 
1990/1226    
	MOVW	0(FP), R7 
	MOVB	(R7, 2), R7 
1990/1223    
	RETURN 
 
1990/1226    
TEXT	getw2(SB), $0 
 
	MOVW	0(FP), R7 
	MOVW	(R7, 2), R7 
	RETURN 
 
TEXT	putw2(SB), $0 
 
	MOVW	0(FP), R7 
	MOVW	4(FP), R8 
	MOVW	R8, (R7, 2) 
	RETURN 
 
TEXT	putwE(SB), $0 
 
	MOVW	0(FP), R7 
	MOVW	4(FP), R8 
	MOVW	R8, (R7, 0xE) 
	RETURN 
 
TEXT	putsegm(SB), $0 
 
	MOVW	0(FP), R7 
	MOVW	4(FP), R8 
	MOVW	R8, (R7, 3) 
	RETURN 
 
1990/1223    
TEXT	putpmeg(SB), $0 
 
	MOVW	0(FP), R1 
	MOVW	4(FP), R2 
	MOVW	R2, (R1, 4) 
1990/1226    
	MOVW	0(FP), R7 
	MOVW	4(FP), R8 
	MOVW	R8, (R7, 4) 
1990/1223    
	RETURN 
 
TEXT	putwd(SB), $0 
 
	MOVW	0(FP), R1 
	MOVW	4(FP), R2 
	MOVW	R2, (R1, 0xD) 
1990/1226    
	MOVW	0(FP), R7 
	MOVW	4(FP), R8 
	MOVW	R8, (R7, 0xD) 
1990/1223    
	RETURN 
                 
 
GLOBL	mach0+0(SB), $MACHSIZE 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)