|
|
|
1993/0123/sys/src/9/ss/l.s:1,520 –
1993/0501/sys/src/9/ss/l.s:0
(short | long | prev)
|
Deleted.
rsc Mon Mar 7 10:33:15 2005
|
|
1990/1223
| |
#include "mem.h"
|
|
1992/0912
| |
#define SYSPSR (PSREF|PSRET|PSRSUPER|SPL(15))
|
|
1992/0728
| |
#define NOOP ORN R0, R0; ORN R0, R0; ORN R0, R0
|
|
1990/1226
| |
|
|
1990/1223
| |
TEXT start(SB), $-4
/* get virtual, fast */
/* we are executing in segment 0, mapped to pmeg 0. stack is there too */
|
|
1993/0123
| |
/* get virtual by mapping segment(KZERO) to pmeg 0, and next to 1, etc. */
|
|
1990/1226
| |
MOVW $KZERO, R7
MOVB R0, (R7, 3)
|
|
1993/0123
| |
ADD $(BY2SEGM), R7
|
|
1992/0806
| |
MOVW $1, R9
|
|
1993/0123
| |
MOVB R9, (R7, 3)
ADD $(BY2SEGM), R7
MOVW $2, R9
MOVB R9, (R7, 3)
ADD $(BY2SEGM), R7
MOVW $3, R9
|
|
1992/0806
| |
MOVB R9, (R7, 3)
|
|
1990/1223
| |
/* now mapped correctly. jmpl to where we want to be */
|
|
1990/1226
| |
MOVW $setSB(SB), R2
|
|
1992/0812
| |
|
|
1990/1226
| |
MOVW $startvirt(SB), R7
JMPL (R7)
|
|
1991/1113
| |
MOVW $_mul(SB), R0 /* touch _mul etc.; doesn't need to execute */
|
|
1990/1223
| |
RETURN /* can't get here */
TEXT startvirt(SB), $-4
|
|
1992/0808
| |
MOVW $rom(SB), R7
|
|
1992/0807
| |
MOVW R8, (R7) /* romvec passed in %i0==R8 */
|
|
1992/0812
| |
/* turn off the cache */
MOVW $ENAB, R7
MOVB (R7, 2), R8
ANDN $ENABCACHE, R8
MOVB R8, (R7, 2)
|
|
1990/1226
| |
MOVW $BOOTSTACK, R1
|
|
1991/01151
| |
MOVW $(SPL(0xF)|PSREF|PSRSUPER), R7
MOVW R7, PSR
|
|
1992/0803
| |
MOVW $(0x35<<22), R7 /* NVM OFM DZM NS */
|
|
1991/01151
| |
MOVW R7, fsr+0(SB)
|
|
1992/0904
| |
MOVW $fsr+0(SB), R8
MOVW (R8), FSR
|
|
1991/01151
| |
FMOVD $0.5, F26 /* 0.5 -> F26 */
FSUBD F26, F26, F24 /* 0.0 -> F24 */
FADDD F26, F26, F28 /* 1.0 -> F28 */
FADDD F28, F28, F30 /* 2.0 -> F30 */
FMOVD F24, F0
FMOVD F24, F2
FMOVD F24, F4
FMOVD F24, F6
FMOVD F24, F8
FMOVD F24, F10
FMOVD F24, F12
FMOVD F24, F14
FMOVD F24, F16
FMOVD F24, F18
FMOVD F24, F20
FMOVD F24, F22
|
|
1990/1223
| |
MOVW $mach0(SB), R(MACH)
|
|
1991/1113
| |
/* MOVW $0x8, R7 /**/
MOVW R0, WIM
|
|
1990/1223
| |
JMPL main(SB)
|
|
1991/0115
| |
MOVW (R0), R0
|
|
1990/1223
| |
RETURN
|
|
1992/0912
| |
TEXT oldtas(SB), $0
|
|
1991/0109
| |
|
|
1991/1105
| |
TAS (R7), R7 /* LDSTUB, thank you ken */
|
|
1991/0109
| |
RETURN
|
|
1992/0912
| |
TEXT tas(SB), $0 /* it seems we must be splhi */
|
|
1990/1226
| |
|
|
1992/0912
| |
MOVW PSR, R8
MOVW $SYSPSR, R9
|
|
1990/1226
| |
MOVW R9, PSR
|
|
1992/0912
| |
NOOP
TAS (R7), R7 /* LDSTUB, thank you ken */
MOVW R8, PSR
NOOP
|
|
1990/1226
| |
RETURN
|
|
1992/0913
| |
TEXT softtas(SB), $0 /* all software; avoid LDSTUB */
MOVW PSR, R8
MOVW $SYSPSR, R9
MOVW R9, PSR
NOOP
MOVB (R7), R10
CMP R10, R0
BE gotit
#ifdef asdf
ANDN $31, R7 /* flush cache line */
MOVW $0, (R7, 0xD)
#endif
MOVW $0xFF, R7
MOVW R8, PSR
NOOP
RETURN
gotit:
MOVW $0xFF, R10
MOVB R10, (R7)
#ifdef asdf
ANDN $31, R7 /* flush cache line */
MOVW $0, (R7, 0xD)
#endif
MOVW $0, R7
MOVW R8, PSR
NOOP
RETURN
|
|
1990/1226
| |
TEXT spllo(SB), $0
MOVW PSR, R7
MOVW R7, R10
|
|
1992/0811
| |
ANDN $SPL(15), R10
|
|
1990/1226
| |
MOVW R10, PSR
|
|
1991/1113
| |
NOOP
|
|
1990/1226
| |
RETURN
TEXT splhi(SB), $0
|
|
1991/1006
| |
MOVW R15, 4(R(MACH)) /* save PC in m->splpc */
|
|
1990/1226
| |
MOVW PSR, R7
MOVW R7, R10
|
|
1992/0811
| |
OR $SPL(15), R10
|
|
1990/1226
| |
MOVW R10, PSR
|
|
1991/1113
| |
NOOP
|
|
1990/1226
| |
RETURN
TEXT splx(SB), $0
|
|
1991/1006
| |
MOVW R15, 4(R(MACH)) /* save PC in m->splpc */
|
|
1990/1226
| |
MOVW R7, PSR /* BUG: book says this is buggy */
|
|
1991/1113
| |
NOOP
|
|
1991/1006
| |
RETURN
TEXT spldone(SB), $0
|
|
1990/1226
| |
RETURN
|
|
1991/1106
| |
TEXT touser(SB), $0
|
|
1992/0811
| |
MOVW $(SYSPSR&~(PSREF|PSRET|SPL(15))), R8
|
|
1991/1105
| |
MOVW R8, PSR
|
|
1991/1113
| |
NOOP
|
|
1991/0712
| |
|
|
1991/1105
| |
MOVW R7, R1
|
|
1990/1226
| |
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
|
|
1991/0112
| |
TEXT rfnote(SB), $0
|
|
1991/1105
| |
MOVW R7, R1 /* 1st arg is &uregpointer */
|
|
1991/0112
| |
ADD $4, R1 /* point at ureg */
JMP restore
|
|
1990/1226
| |
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 */
|
|
1991/1113
| |
|
|
1990/1226
| |
ANDCC $PSRPSUPER, R19, R0
BE usertrap
kerneltrap:
/*
* Interrupt or fault from kernel
*/
|
|
1991/0112
| |
ANDN $7, R1, R20 /* dbl aligned */
MOVW R1, (0-(4*(32+6))+(4*1))(R20) /* save R1=SP */
|
|
1990/1226
| |
/* really clumsy: store these in Ureg so can be restored below */
|
|
1991/0112
| |
MOVW R2, (0-(4*(32+6))+(4*2))(R20) /* SB */
MOVW R5, (0-(4*(32+6))+(4*5))(R20) /* USER */
MOVW R6, (0-(4*(32+6))+(4*6))(R20) /* MACH */
SUB $(4*(32+6)), R20, R1
|
|
1990/1226
| |
trap1:
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 */
|
|
1991/0112
| |
/* save registers two at a time */
MOVD R8, (4*8)(R1)
MOVD R10, (4*10)(R1)
MOVD R12, (4*12)(R1)
MOVD R14, (4*14)(R1)
MOVD R16, (4*16)(R1)
MOVD R18, (4*18)(R1)
MOVD R20, (4*20)(R1)
MOVD R22, (4*22)(R1)
MOVD R24, (4*24)(R1)
MOVD R26, (4*26)(R1)
MOVD R28, (4*28)(R1)
MOVD R30, (4*30)(R1)
|
|
1990/1226
| |
/* SP and SB and u and m are already set; away we go */
|
|
1991/1106
| |
MOVW R1, R7 /* pointer to Ureg */
|
|
1990/1226
| |
SUB $8, R1
|
|
1991/1106
| |
MOVW $SYSPSR, R8
MOVW R8, PSR
|
|
1991/1113
| |
NOOP
|
|
1991/01151
| |
JMPL trap(SB)
|
|
1990/1226
| |
ADD $8, R1
|
|
1991/0112
| |
restore:
MOVW (4*(32+2))(R1), R8 /* PSR */
MOVW R8, PSR
|
|
1991/1113
| |
NOOP
|
|
1990/1226
| |
|
|
1991/0112
| |
MOVD (4*30)(R1), R30
MOVD (4*28)(R1), R28
MOVD (4*26)(R1), R26
MOVD (4*24)(R1), R24
MOVD (4*22)(R1), R22
MOVD (4*20)(R1), R20
MOVD (4*18)(R1), R18
MOVD (4*16)(R1), R16
MOVD (4*14)(R1), R14
MOVD (4*12)(R1), R12
MOVD (4*10)(R1), R10
MOVD (4*8)(R1), R8
|
|
1990/1226
| |
SAVE R0, R0
|
|
1991/0112
| |
MOVD (4*6)(R1), R6
MOVD (4*4)(R1), R4
MOVD (4*2)(R1), R2
|
|
1990/1226
| |
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
|
|
1991/0112
| |
MOVW R8, (0-(4*(32+6))+(4*1))(R1) /* save R1=SP */
MOVW R9, (0-(4*(32+6))+(4*2))(R1) /* save R2=SB */
MOVW R5, (0-(4*(32+6))+(4*5))(R1) /* save R5=USER */
MOVW R6, (0-(4*(32+6))+(4*6))(R1) /* save R6=MACH */
|
|
1990/1226
| |
MOVW $USERADDR, R(USER)
MOVW $mach0(SB), R(MACH)
|
|
1991/0112
| |
SUB $(4*(32+6)), R1
|
|
1990/1226
| |
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 */
|
|
1991/1113
| |
|
|
1990/1226
| |
MOVW R1, R8
MOVW R2, R9
MOVW $setSB(SB), R2
MOVW $(USERADDR+BY2PG), R1
|
|
1991/0112
| |
MOVW R8, (0-(4*(32+6))+4)(R1) /* save R1=SP */
SUB $(4*(32+6)), R1
|
|
1990/1226
| |
MOVW R9, (4*2)(R1) /* save R2=SB */
MOVW R3, (4*3)(R1) /* global register */
|
|
1991/0112
| |
MOVD R4, (4*4)(R1) /* global register, R5=USER */
MOVD R6, (4*6)(R1) /* save R6=MACH, R7=syscall# */
|
|
1990/1226
| |
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 */
|
|
1991/1106
| |
MOVW R1, R7 /* pointer to Ureg */
|
|
1990/1226
| |
SUB $8, R1
|
|
1991/1106
| |
MOVW $SYSPSR, R8
MOVW R8, PSR
|
|
1990/1226
| |
JMPL syscall(SB)
/* R7 contains return value from syscall */
ADD $8, R1
MOVW (4*(32+2))(R1), R8 /* PSR */
MOVW R8, PSR
|
|
1991/1113
| |
NOOP
|
|
1990/1226
| |
MOVW (4*15)(R1), R15
SAVE R0, R0
MOVW (4*6)(R1), R6
|
|
1991/0112
| |
MOVD (4*4)(R1), R4
MOVD (4*2)(R1), R2
|
|
1990/1226
| |
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 R7, TBR
|
|
1991/1113
| |
NOOP
|
|
1990/1226
| |
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
|
|
1990/1226
| |
MOVW R1, (R7)
MOVW R15, 4(R7)
MOVW $0, R7
|
|
1990/1223
| |
RETURN
TEXT gotolabel(SB), $0
|
|
1990/1226
| |
|
|
1991/1105
| |
MOVW (R7), R1
MOVW 4(R7), R15
|
|
1990/1227
| |
MOVW $1, R7
|
|
1990/1223
| |
RETURN
|
|
1990/1226
| |
TEXT putcxsegm(SB), $0
|
|
1990/1223
| |
|
|
1991/1105
| |
MOVW R7, R8 /* context */
|
|
1990/1223
| |
MOVW 4(FP), R9 /* segment addr */
MOVW 8(FP), R10 /* segment value */
|
|
1992/0807
| |
MOVW $romputcxsegm(SB), R7
MOVW (R7), R7
|
|
1990/1226
| |
JMPL (R7)
|
|
1992/0807
| |
RETURN
TEXT putw4(SB), $0
MOVW 4(FP), R8
MOVW R8, (R7, 4)
|
|
1990/1223
| |
RETURN
|
|
1991/1113
| |
TEXT getpsr(SB), $0
MOVW PSR, R7
|
|
1990/1227
| |
RETURN
|
|
1992/0810
| |
TEXT setpsr(SB), $0
MOVW R7, PSR
NOOP
RETURN
|
|
1990/1227
| |
TEXT putsegm(SB), $0
MOVW 4(FP), R8
MOVW R8, (R7, 3)
|
|
1990/1223
| |
RETURN
|
|
1991/01151
| |
TEXT savefpregs(SB), $0
|
|
1992/0727
| |
MOVW FSR, 0(R7)
ADD $4, R7
|
|
1991/01151
| |
MOVD F0, (0*4)(R7)
MOVD F2, (2*4)(R7)
MOVD F4, (4*4)(R7)
MOVD F6, (6*4)(R7)
MOVD F8, (8*4)(R7)
MOVD F10, (10*4)(R7)
MOVD F12, (12*4)(R7)
MOVD F14, (14*4)(R7)
MOVD F16, (16*4)(R7)
MOVD F18, (18*4)(R7)
MOVD F20, (20*4)(R7)
MOVD F22, (22*4)(R7)
MOVD F24, (24*4)(R7)
MOVD F26, (26*4)(R7)
MOVD F28, (28*4)(R7)
MOVD F30, (30*4)(R7)
MOVW PSR, R8
ANDN $PSREF, R8
MOVW R8, PSR
RETURN
|
|
1992/0726
| |
TEXT enabfp(SB), $0
MOVW PSR, R8
OR $PSREF, R8
MOVW R8, PSR
RETURN
TEXT disabfp(SB), $0
MOVW PSR, R8
ANDN $PSREF, R8
MOVW R8, PSR
RETURN
|
|
1991/01151
| |
TEXT restfpregs(SB), $0
MOVW PSR, R8
OR $PSREF, R8
MOVW R8, PSR
|
|
1992/0727
| |
NOOP /* wait for PSR to quiesce */
|
|
1992/0804
| |
MOVW fsr+4(FP), FSR
|
|
1992/0727
| |
ADD $4, R7
|
|
1991/01151
| |
MOVD (0*4)(R7), F0
MOVD (2*4)(R7), F2
MOVD (4*4)(R7), F4
MOVD (6*4)(R7), F6
MOVD (8*4)(R7), F8
MOVD (10*4)(R7), F10
MOVD (12*4)(R7), F12
MOVD (14*4)(R7), F14
MOVD (16*4)(R7), F16
MOVD (18*4)(R7), F18
MOVD (20*4)(R7), F20
MOVD (22*4)(R7), F22
MOVD (24*4)(R7), F24
MOVD (26*4)(R7), F26
MOVD (28*4)(R7), F28
MOVD (30*4)(R7), F30
ANDN $PSREF, R8
MOVW R8, PSR
RETURN
|
|
1992/0726
| |
TEXT getfpq(SB), $0
|
|
1991/1105
| |
|
|
1992/0726
| |
MOVW R7, R8 /* must be D aligned */
|
|
1991/01151
| |
MOVW $fsr+0(SB), R9
|
|
1992/0726
| |
MOVW $0, R7
getfpq1:
|
|
1991/0115
| |
MOVW FSR, (R9)
|
|
1992/0726
| |
MOVW (R9), R10
ANDCC $(1<<13), R10 /* queue not empty? */
BE getfpq2
|
|
1992/0802
| |
MOVW (R8), R0 /* SS2 bug fix */
|
|
1992/0726
| |
MOVD FQ, (R8)
ADD $1, R7
ADD $8, R8
BA getfpq1
getfpq2:
|
|
1991/0115
| |
RETURN
TEXT getfsr(SB), $0
|
|
1991/01151
| |
MOVW $fsr+0(SB), R7
|
|
1991/0115
| |
MOVW FSR, (R7)
MOVW (R7), R7
RETURN
|
|
1992/0726
| |
TEXT clearftt(SB), $0
MOVW R7, fsr+0(SB)
MOVW $fsr+0(SB), R7
MOVW (R7), FSR
FMOVF F0, F0
|
|
1992/0912
| |
RETURN
TEXT _getcallerpc(SB), $0
MOVW 0(R1), R7
|
|
1992/0726
| |
RETURN
|
|
1990/1223
| |
GLOBL mach0+0(SB), $MACHSIZE
|
|
1991/01151
| |
GLOBL fsr+0(SB), $BY2WD
|
|
1992/0808
| |
/*
|
|
1992/0812
| |
* Interface to OPEN BOOT ROM. Must save and restore state because
* of different calling conventions. We don't use it, but it's here
* for reference..
|
|
1992/0808
| |
*/
TEXT call(SB), $16
MOVW R1, R14 /* save my SP in their SP */
MOVW R2, sb-4(SP)
MOVW R(MACH), mach-8(SP)
MOVW R(USER), user-12(SP)
MOVW param1+4(FP), R8
MOVW param2+8(FP), R9
MOVW param3+12(FP), R10
MOVW param4+16(FP), R11
JMPL (R7)
MOVW R14, R1 /* restore my SP */
MOVW user-12(SP), R(USER)
MOVW mach-8(SP), R(MACH)
MOVW sb-4(SP), R2
MOVW R8, R7 /* move their return value into mine */
RETURN
|