#include "assym.h"
#include <sys/syscall.h>
#include <machine/asm.h>
#include <machine/param.h>
#include <machine/pmap.h>
#include <machine/psl.h>
#include <machine/trap.h>
#define GET_CPUINFO(r) mfsprg r,0
#define INTSTK (8*1024)
#define SPILLSTK (1*1024)
#define DDBSTK (7*1024)
.text
#ifdef MULTIPROCESSOR
_ENTRY(cpu_spinup_trampoline)
lis %r3,cpu_hatch_stack@ha
lwz %r1,cpu_hatch_stack@l(%r3)
b cpu_hatch
#endif
_ENTRY(cpu_switchto_asm)
mflr %r0
stw %r0,4(%r1)
stwu %r1,(-SFRAMELEN - 16)(%r1)
stw %r31,(SFRAMELEN + 12)(%r1)
stw %r30,(SFRAMELEN + 8)(%r1)
GET_CPUINFO(%r5)
li %r31,SONPROC
stb %r31,P_STAT(%r4)
or. %r3,%r3,%r3
beq switch_exited
mfsr %r10,PPC_USER_SR
mfcr %r11
mr %r12,%r2
stmw %r10,8(%r1)
lwz %r31,P_ADDR(%r3)
stw %r1,PCB_SP(%r31)
switch_exited:
mfmsr %r30
andi. %r30,%r30,~PSL_EE@l
mtmsr %r30
isync
stw %r4,CI_CURPROC(%r5)
#ifdef MULTIPROCESSOR
stw %r5,P_CPU(%r4)
#endif
lwz %r31,P_ADDR(%r4)
stw %r31,CI_CURPCB(%r5)
lwz %r6,PCB_PMR(%r31)
stwu %r6,CI_CURPM(%r5)
stwcx. %r6,%r0,%r5
addic. %r6,%r6,64
li %r5,0
lwz %r1,PCB_SP(%r31)
lwz %r0,(SFRAMELEN + 16 + 4)(%r1)
RETGUARD_SETUP_LATE(cpu_switchto_asm, %r9, %r0)
ori %r30,%r30,PSL_EE
mtmsr %r30
lmw %r10,8(%r1)
mr %r2,%r12
mtcr %r11
isync
mtsr PPC_USER_SR,%r10
isync
lwz %r31,(SFRAMELEN + 12)(%r1)
lwz %r30,(SFRAMELEN + 8)(%r1)
addi %r1,%r1,SFRAMELEN + 16
mtlr %r0
RETGUARD_CHECK(cpu_switchto_asm, %r9, %r0)
blr
_ENTRY(cpu_idle_enter)
RETGUARD_SETUP(cpu_idle_enter, %r11, %r12)
lis %r4, ppc_cpuidle@ha
lwz %r4, ppc_cpuidle@l(%r4)
cmpwi %r4, 0
beq 1f
mfmsr %r3
andi. %r3,%r3,~PSL_EE@l
mtmsr %r3
isync
1:
RETGUARD_CHECK(cpu_idle_enter, %r11, %r12)
blr
_ENTRY(cpu_idle_cycle)
RETGUARD_SETUP(cpu_idle_cycle, %r11, %r12)
lis %r4, ppc_cpuidle@ha
lwz %r4, ppc_cpuidle@l(%r4)
cmpwi %r4, 0
beq idledone
GET_CPUINFO(%r4)
lwz %r6,CI_FLAGS(%r4)
ori %r6,%r6,CI_FLAGS_SLEEPING@l
stw %r6,CI_FLAGS(%r4)
mfmsr %r3
ori %r5,%r3,PSL_EE@l
mtmsr %r5
oris %r5, %r5, PSL_POW@h
sync
mtmsr %r5
sync
isync
mtmsr %r3
isync
andi. %r6,%r6,~CI_FLAGS_SLEEPING@l
stw %r6,CI_FLAGS(%r4)
idledone:
RETGUARD_CHECK(cpu_idle_cycle, %r11, %r12)
blr
_ENTRY(cpu_idle_leave)
RETGUARD_SETUP(cpu_idle_leave, %r11, %r12)
lis %r4, ppc_cpuidle@ha
lwz %r4, ppc_cpuidle@l(%r4)
cmpwi %r4, 0
beq 1f
mfmsr %r3
ori %r3,%r3,PSL_EE@l
mtmsr %r3
1:
RETGUARD_CHECK(cpu_idle_leave, %r11, %r12)
blr
.text
.globl trapcode,trapsize
.type trapcode,@function
.type trapsize,@object
trapcode:
mtsprg 1,%r1
nop32_1s:
mfmsr %r1
clrldi %r1,%r1,1
mtmsrd %r1
nop32_1e:
GET_CPUINFO(%r1)
stmw %r28,CI_TEMPSAVE(%r1)
mflr %r28
mfcr %r29
mfsprg %r1,1
mfsrr1 %r31
mtcr %r31
bc 4,17,1f
GET_CPUINFO(%r1)
lwz %r1,CI_CURPCB(%r1)
addi %r1,%r1,USPACE
1:
bla s_trap
trapsize = .-trapcode
.globl alitrap,alisize
alitrap:
mtsprg 1,%r1
nop32_2s:
mfmsr %r1
clrldi %r1,%r1,1
mtmsrd %r1
nop32_2e:
GET_CPUINFO(%r1)
stmw %r28,CI_TEMPSAVE(%r1)
mfdar %r30
mfdsisr %r31
stmw %r30,CI_TEMPSAVE+16(%r1)
mflr %r28
mfcr %r29
mfsprg %r1,1
mfsrr1 %r31
mtcr %r31
bc 4,17,1f
GET_CPUINFO(%r1)
lwz %r1,CI_CURPCB(%r1)
addi %r1,%r1,USPACE
1:
bla s_trap
alisize = .-alitrap
.globl dsitrap,dsisize
.type dsitrap,@function
.type dsisize,@object
dsitrap:
mtsprg 1,%r1
GET_CPUINFO(%r1)
stmw %r28,CI_DISISAVE(%r1)
nop32_3s:
mfmsr %r28
clrldi %r28,%r28,1
mtmsrd %r28
nop32_3e:
mfsprg %r1,1
mfcr %r29
mfxer %r30
mtsprg 2,%r30
mfsrr1 %r31
nopbat_1s:
mtcr %r31
bc 12,17,1f
mfdar %r31
rlwinm %r31,%r31,7,25,28
addis %r31,%r31,battable@ha
lwz %r30,battable@l(%r31)
mtcr %r30
bc 4,30,1f
lwz %r31,battable+4@l(%r31)
mftb %r28
andi. %r28,%r28,1
bne 2f
mtdbatu 2,%r30
mtdbatl 2,%r31
b 3f
2:
mtdbatu 3,%r30
mtdbatl 3,%r31
3:
mfsprg %r30,2
mtxer %r30
mtcr %r29
mtsprg 1,%r1
GET_CPUINFO(%r1)
lmw %r28,CI_DISISAVE(%r1)
mfsprg 1,%r1
rfi
1:
nopbat_1e:
mflr %r28
bla s_dsitrap
dsisize = .-dsitrap
.globl isitrap,isisize
.type isitrap,@function
.type isisize,@object
isitrap:
mtsprg 1,%r1
nop32_4s:
mfmsr %r1
clrldi %r1,%r1,1
mtmsrd %r1
nop32_4e:
GET_CPUINFO(%r1)
stmw %r28,CI_DISISAVE(%r1)
mflr %r28
mfcr %r29
mfsrr1 %r31
mfsprg %r1,1
bla s_isitrap
isisize = .-isitrap
.globl extint,extsize
.type extint,@function
.type extsize,@object
extint:
mtsprg 1,%r1
nop32_5s:
mfmsr %r1
clrldi %r1,%r1,1
mtmsrd %r1
nop32_5e:
GET_CPUINFO(%r1)
stmw %r28,CI_TEMPSAVE(%r1)
mflr %r28
mfcr %r29
mfxer %r30
lwz %r31,CI_IDEPTH(%r1)
cmpwi %r31,0
addi %r31,%r31,1
stw %r31,CI_IDEPTH(%r1)
lwz %r1,CI_INTSTK(%r1)
beq 1f
mfsprg %r1,1
1:
ba extintr
extsize = .-extint
.globl decrint,decrsize
.type decrint,@function
.type decrsize,@object
decrint:
mtsprg 1,%r1
nop32_6s:
mfmsr %r1
clrldi %r1,%r1,1
mtmsrd %r1
nop32_6e:
GET_CPUINFO(%r1)
stmw %r28,CI_TEMPSAVE(%r1)
mflr %r28
mfcr %r29
mfxer %r30
lwz %r31,CI_IDEPTH(%r1)
cmpwi %r31,0
addi %r31,%r31,1
stw %r31,CI_IDEPTH(%r1)
lwz %r1,CI_INTSTK(%r1)
beq 1f
mfsprg %r1,1
1:
ba decrintr
decrsize = .-decrint
#define DMISS 976
#define DCMP 977
#define HASH1 978
#define HASH2 979
#define IMISS 980
#define ICMP 981
#define RPA 982
#define bdneq bdnzf 2,
#define tlbli .long 0x7c0007e4+0x800*
#define tlbld .long 0x7c0007a4+0x800*
.globl tlbimiss,tlbimsize
.type tlbimiss,@function
.type tlbimsize,@object
tlbimiss:
mfspr %r2,HASH1
li %r1,8
mfctr %r0
mfspr %r3,ICMP
addi %r2,%r2,-8
1:
mtctr %r1
2:
lwzu %r1,8(%r2)
cmplw 0,%r1,%r3
bdneq 2b
bne 3f
lwz %r1,4(%r2)
andi. %r3,%r1,8
bne 4f
mtctr %r0
mfspr %r0,IMISS
mfsrr1 %r3
mtcrf 0x80,%r3
ori %r1,%r1,0x100
mtspr RPA,%r1
srwi %r1,%r1,8
tlbli 0
stb %r1,6(%r2)
rfi
3:
andi. %r1,%r3,0x40
bne 5f
mfspr %r2,HASH2
ori %r3,%r3,0x40
li %r1,8
addi %r2,%r2,-8
b 1b
4:
mfsrr1 %r3
andi. %r2,%r3,0xffff
addis %r2,%r2,0x800
b 6f
5:
mfsrr1 %r3
andi. %r2,%r3,0xffff
addis %r2,%r2,0x4000
6:
mtctr %r0
mtsrr1 %r2
mfmsr %r0
xoris %r0,%r0,2
mtcrf 0x80,%r3
mtmsr %r0
isync
ba EXC_ISI
tlbimsize = .-tlbimiss
.globl tlbdlmiss,tlbdlmsize
.type tlbdlmiss,@function
.type tlbdlmsize,@object
tlbdlmiss:
mfspr %r2,HASH1
li %r1,8
mfctr %r0
mfspr %r3,DCMP
addi %r2,%r2,-8
1:
mtctr %r1
2:
lwzu %r1,8(%r2)
cmplw 0,%r1,%r3
bdneq 2b
bne 3f
lwz %r1,4(%r2)
mtctr %r0
mfspr %r0,DMISS
mfsrr1 %r3
mtcrf 0x80,%r3
ori %r1,%r1,0x100
mtspr RPA,%r1
srwi %r1,%r1,8
tlbld 0
stb %r1,6(%r2)
rfi
3:
andi. %r1,%r3,0x40
bne 5f
mfspr %r2,HASH2
ori %r3,%r3,0x40
li %r1,8
addi %r2,%r2,-8
b 1b
5:
mfsrr1 %r3
lis %r1,0x4000
mtctr %r0
andi. %r2,%r3,0xffff
mtsrr1 %r2
mtdsisr %r1
mfspr %r1,DMISS
mtdar %r1
mfmsr %r0
xoris %r0,%r0,2
mtcrf 0x80,%r3
mtmsr %r0
isync
ba EXC_DSI
tlbdlmsize = .-tlbdlmiss
.globl tlbdsmiss,tlbdsmsize
.type tlbdsmiss,@function
.type tlbdsmsize,@object
tlbdsmiss:
mfspr %r2,HASH1
li %r1,8
mfctr %r0
mfspr %r3,DCMP
addi %r2,%r2,-8
1:
mtctr %r1
2:
lwzu %r1,8(%r2)
cmplw 0,%r1,%r3
bdneq 2b
bne 3f
lwz %r1,4(%r2)
andi. %r3,%r1,0x80
beq 4f
5:
mtctr %r0
mfspr %r0,DMISS
mfsrr1 %r3
mtcrf 0x80,%r3
mtspr RPA,%r1
tlbld 0
rfi
3:
andi. %r1,%r3,0x40
bne 5f
mfspr %r2,HASH2
ori %r3,%r3,0x40
li %r1,8
addi %r2,%r2,-8
b 1b
4:
rlwinm. %r3,%r1,30,0,1
bge- 7f
andi. %r3,%r1,1
beq+ 8f
9:
mfsrr1 %r3
lis %r1,0xa00
b 1f
7:
mfspr %r3,DMISS
mfsrin %r1,%r3
mfsrr1 %r3
rlwinm %r3,%r3,18,31,31
rlwnm. %r1,%r1,%r3,1,1
bne- 9b
8:
lwz %r1,4(%r2)
ori %r1,%r1,0x180
sth %r1,6(%r2)
b 5b
5:
mfsrr1 %r3
lis %r1,0x4200
1:
mtctr %r0
andi. %r2,%r3,0xffff
mtsrr1 %r2
mtdsisr %r1
mfspr %r1,DMISS
mtdar %r1
mfmsr %r0
xoris %r0,%r0,2
mtcrf 0x80,%r3
mtmsr %r0
isync
ba EXC_DSI
tlbdsmsize = .-tlbdsmiss
#ifdef DDB
.globl ddblow,ddbsize
ddblow:
mtsprg 1,%r1
nop32_7s:
mfmsr %r1
clrldi %r1,%r1,1
mtmsrd %r1
nop32_7e:
GET_CPUINFO(%r1)
stmw %r28,CI_DDBSAVE(%r1)
mflr %r28
mfcr %r29
GET_CPUINFO(%r30)
lwz %r30,CI_INTSTK(%r30)
addi %r1,%r30,(SPILLSTK+DDBSTK)
bla ddbtrap
ddbsize = .-ddblow
#endif
#define CPU_IDLE_CHECK(sr1,sr2,sr3,rSRR0,flag) \
GET_CPUINFO(sr1); \
lwz sr2,CI_FLAGS(sr1); \
andi. sr3,sr2,flag@l; \
beq 1f; \
andi. sr2,sr2,~flag@l; \
stw sr2,CI_FLAGS(sr1); \
lis rSRR0,idledone@ha; \
addi rSRR0,rSRR0,idledone@l; \
1:
#define FRAME_SETUP(savearea) FRAME_SETUP_FLAG(savearea, CI_FLAGS_SLEEPING)
#define FRAME_SETUP_FLAG(savearea, flag) \
\
GET_CPUINFO(%r31); \
mfsrr0 %r30; \
stw %r30,savearea+24(%r31); \
mfsrr1 %r30; \
stw %r30,savearea+28(%r31); \
\
lis %r31,kernel_pmap_@ha; \
addi %r31,%r31,kernel_pmap_@l; \
lwz %r30,0(%r31); mtsr 0,%r30; \
lwz %r30,4(%r31); mtsr 1,%r30; \
lwz %r30,8(%r31); mtsr 2,%r30; \
lwz %r30,12(%r31); mtsr 3,%r30; \
lwz %r30,16(%r31); mtsr 4,%r30; \
lwz %r30,20(%r31); mtsr 5,%r30; \
lwz %r30,24(%r31); mtsr 6,%r30; \
lwz %r30,28(%r31); mtsr 7,%r30; \
lwz %r30,32(%r31); mtsr 8,%r30; \
lwz %r30,36(%r31); mtsr 9,%r30; \
lwz %r30,40(%r31); mtsr 10,%r30; \
lwz %r30,44(%r31); mtsr 11,%r30; \
lwz %r30,48(%r31); mtsr 12,%r30; \
\
lwz %r30,56(%r31); mtsr 14,%r30; \
lwz %r30,60(%r31); mtsr 15,%r30; \
mfmsr %r30; \
ori %r30,%r30,(PSL_DR|PSL_IR); \
mtmsr %r30; \
isync; \
mfsprg %r31,1; \
stwu %r31,-FRAMELEN(%r1); \
stw %r0,FRAME_0+8(%r1); \
stw %r31,FRAME_1+8(%r1); \
stw %r2,FRAME_2+8(%r1); \
stw %r28,FRAME_LR+8(%r1); \
stw %r29,FRAME_CR+8(%r1); \
GET_CPUINFO(%r2); \
lmw %r28,savearea(%r2); \
stmw %r3,FRAME_3+8(%r1); \
lmw %r28,savearea+16(%r2); \
mfxer %r3; \
mfctr %r4; \
mflr %r5; \
andi. %r5,%r5,0xff00; \
stw %r3,FRAME_XER+8(%r1); \
stw %r4,FRAME_CTR+8(%r1); \
stw %r5,FRAME_EXC+8(%r1); \
stw %r28,FRAME_DAR+8(%r1); \
stw %r29,FRAME_DSISR+8(%r1); \
CPU_IDLE_CHECK(%r5,%r6,%r0,%r30,flag) \
stw %r30,FRAME_SRR0+8(%r1); \
stw %r31,FRAME_SRR1+8(%r1)
#define FRAME_LEAVE(savearea) \
\
lwz %r2,FRAME_SRR0+8(%r1); \
lwz %r3,FRAME_SRR1+8(%r1); \
lwz %r4,FRAME_CTR+8(%r1); \
lwz %r5,FRAME_XER+8(%r1); \
lwz %r6,FRAME_LR+8(%r1); \
GET_CPUINFO(%r7); \
stw %r2,savearea(%r7); \
stw %r3,savearea+4(%r7); \
lwz %r7,FRAME_CR+8(%r1); \
mtctr %r4; \
mtxer %r5; \
mtlr %r6; \
mtsprg 1,%r7; \
lmw %r2,FRAME_2+8(%r1); \
lwz %r0,FRAME_0+8(%r1); \
lwz %r1,FRAME_1+8(%r1); \
mtsprg 2,%r2; \
mtsprg 3,%r3; \
\
mfmsr %r2; \
lis %r3,(PSL_DR|PSL_IR|PSL_ME|PSL_RI)@ha; \
addi %r3,%r3,(PSL_DR|PSL_IR|PSL_ME|PSL_RI)@l; \
andc %r2,%r2,%r3; \
mtmsr %r2; \
isync; \
\
GET_CPUINFO(%r2); \
lwz %r3,savearea+4(%r2); \
mtcr %r3; \
bc 4,17,1f; \
\
lwz %r2,CI_CURPM(%r2); \
lwz %r3,0(%r2); mtsr 0,%r3; \
lwz %r3,4(%r2); mtsr 1,%r3; \
lwz %r3,8(%r2); mtsr 2,%r3; \
lwz %r3,12(%r2); mtsr 3,%r3; \
lwz %r3,16(%r2); mtsr 4,%r3; \
lwz %r3,20(%r2); mtsr 5,%r3; \
lwz %r3,24(%r2); mtsr 6,%r3; \
lwz %r3,28(%r2); mtsr 7,%r3; \
lwz %r3,32(%r2); mtsr 8,%r3; \
lwz %r3,36(%r2); mtsr 9,%r3; \
lwz %r3,40(%r2); mtsr 10,%r3; \
lwz %r3,44(%r2); mtsr 11,%r3; \
lwz %r3,48(%r2); mtsr 12,%r3; \
lwz %r3,52(%r2); mtsr 13,%r3; \
lwz %r3,56(%r2); mtsr 14,%r3; \
lwz %r3,60(%r2); mtsr 15,%r3; \
1: mfsprg %r2,1; \
mtcr %r2; \
GET_CPUINFO(%r2); \
lwz %r3,savearea(%r2); \
mtsrr0 %r3; \
lwz %r3,savearea+4(%r2); \
mtsrr1 %r3; \
mfsprg %r2,2; \
mfsprg %r3,3
disitrap:
GET_CPUINFO(%r1)
lmw %r30,CI_DISISAVE(%r1)
stmw %r30,CI_TEMPSAVE(%r1)
lmw %r30,CI_DISISAVE+8(%r1)
stmw %r30,CI_TEMPSAVE+8(%r1)
mfdar %r30
mfdsisr %r31
stmw %r30,CI_TEMPSAVE+16(%r1)
realtrap:
mfsrr1 %r1
mtcr %r1
mfsprg %r1,1
bc 4,17,s_trap
GET_CPUINFO(%r1)
lwz %r1,CI_CURPCB(%r1)
addi %r1,%r1,USPACE
.globl s_trap
s_trap:
FRAME_SETUP(CI_TEMPSAVE)
mfmsr %r7
mfsrr1 %r31
andi. %r31,%r31,PSL_EE
or %r7,%r7,%r31
ori %r7,%r7,(PSL_ME|PSL_RI)
mtmsr %r7
isync
trapagain:
addi %r3,%r1,8
bl trap
.globl trapexit
trapexit:
mfmsr %r3
andi. %r3,%r3,~PSL_EE@l
mtmsr %r3
isync
lwz %r5,FRAME_SRR1+8(%r1)
mtcr %r5
bc 4,17,1f
GET_CPUINFO(%r3)
lwz %r4,CI_CURPROC(%r3)
lwz %r4,P_MD_ASTPENDING(%r4)
andi. %r4,%r4,1
beq 1f
li %r6,EXC_AST
stw %r6,FRAME_EXC+8(%r1)
b trapagain
1:
FRAME_LEAVE(CI_TEMPSAVE)
rfi1: rfi
.globl proc_trampoline
.type proc_trampoline,@function
proc_trampoline:
bl proc_trampoline_mi
mtlr %r31
mr %r3,%r30
blrl
b trapexit
s_dsitrap:
mfdsisr %r31
mtcr %r31
mtsprg 1,%r1
bc 4,1,disitrap
GET_CPUINFO(%r30)
lwz %r30,CI_INTSTK(%r30)
addi %r1,%r30,SPILLSTK
stwu %r1,-52(%r1)
stw %r0,48(%r1)
stw %r3,44(%r1)
stw %r4,40(%r1)
stw %r5,36(%r1)
stw %r6,32(%r1)
stw %r7,28(%r1)
stw %r8,24(%r1)
stw %r9,20(%r1)
stw %r10,16(%r1)
stw %r11,12(%r1)
stw %r12,8(%r1)
mfxer %r30
mtsprg 2,%r30
mflr %r30
mfctr %r31
mfdar %r7
mfsrr1 %r4
mfdsisr %r5
li %r6, 0
s_pte_spill:
andi. %r0,%r4,PSL_PR
li %r3,0
bne 1f
mr %r3,%r7
bl pte_spill_r
1:
cmpwi 0,%r3,0
mtctr %r31
mtlr %r30
mfsprg %r31,2
mtxer %r31
lwz %r12,8(%r1)
lwz %r11,12(%r1)
lwz %r10,16(%r1)
lwz %r9,20(%r1)
lwz %r8,24(%r1)
lwz %r7,28(%r1)
lwz %r6,32(%r1)
lwz %r5,36(%r1)
lwz %r4,40(%r1)
lwz %r3,44(%r1)
lwz %r0,48(%r1)
beq disitrap
mtcr %r29
mtlr %r28
GET_CPUINFO(%r1)
lmw %r28,CI_DISISAVE(%r1)
mfsprg %r1,1
rfi2: rfi
s_isitrap:
mfsrr1 %r31
mtcr %r31
mtsprg 1,%r1
bc 4,1,disitrap
GET_CPUINFO(%r30)
lwz %r30,CI_INTSTK(%r30)
addi %r1,%r30,SPILLSTK
stwu %r1,-52(%r1)
stw %r0,48(%r1)
stw %r3,44(%r1)
stw %r4,40(%r1)
stw %r5,36(%r1)
stw %r6,32(%r1)
stw %r7,28(%r1)
stw %r8,24(%r1)
stw %r9,20(%r1)
stw %r10,16(%r1)
stw %r11,12(%r1)
stw %r12,8(%r1)
mfxer %r30
mtsprg 2,%r30
mflr %r30
mfctr %r31
mfsrr0 %r7
mfsrr1 %r4
li %r5, 0
li %r6, 1
b s_pte_spill
#define INTRENTER \
\
stwu %r1,-88(%r1); \
stw %r0,84(%r1); \
mfsprg %r0,1; \
stw %r0,0(%r1); \
stw %r3,80(%r1); \
stw %r4,76(%r1); \
stw %r5,72(%r1); \
stw %r6,68(%r1); \
stw %r7,64(%r1); \
stw %r8,60(%r1); \
stw %r9,56(%r1); \
stw %r10,52(%r1); \
stw %r11,48(%r1); \
stw %r12,44(%r1); \
stw %r28,40(%r1); \
stw %r29,36(%r1); \
stw %r30,32(%r1); \
GET_CPUINFO(%r4); \
lmw %r28,CI_TEMPSAVE(%r4); \
mfctr %r6; \
lwz %r5,CI_IDEPTH(%r4); \
mfsrr0 %r4; \
mfsrr1 %r3; \
stw %r6,28(%r1); \
stw %r5,20(%r1); \
stw %r4,12(%r1); \
stw %r3,8(%r1); \
\
lis 3,kernel_pmap_@ha; \
addi 3,3,kernel_pmap_@l; \
lwz %r5,0(%r3); mtsr 0,%r5; \
lwz %r5,4(%r3); mtsr 1,%r5; \
lwz %r5,8(%r3); mtsr 2,%r5; \
lwz %r5,12(%r3); mtsr 3,%r5; \
lwz %r5,16(%r3); mtsr 4,%r5; \
lwz %r5,20(%r3); mtsr 5,%r5; \
lwz %r5,24(%r3); mtsr 6,%r5; \
lwz %r5,28(%r3); mtsr 7,%r5; \
lwz %r5,32(%r3); mtsr 8,%r5; \
lwz %r5,36(%r3); mtsr 9,%r5; \
lwz %r5,40(%r3); mtsr 10,%r5; \
lwz %r5,44(%r3); mtsr 11,%r5; \
lwz %r5,48(%r3); mtsr 12,%r5; \
\
lwz %r5,56(%r3); mtsr 14,%r5; \
lwz %r5,60(%r3); mtsr 15,%r5; \
\
mfmsr %r5; \
ori %r5,%r5,(PSL_IR|PSL_DR|PSL_RI); \
mtmsr %r5; \
isync
.globl extint_call
.type extint_call,@function
extintr:
INTRENTER
extint_call:
bl extint_call
intr_exit:
mfmsr %r3
andi. %r3,%r3,~(PSL_EE|PSL_ME|PSL_RI|PSL_DR|PSL_IR)@l
mtmsr %r3
isync
lwz %r12,44(%r1)
lwz %r11,48(%r1)
lwz %r10,52(%r1)
lwz %r9,56(%r1)
lwz %r8,60(%r1)
lwz %r7,64(%r1)
lwz %r6,8(%r1)
lwz %r5,12(%r1)
lwz %r4,28(%r1)
lwz %r3,32(%r1)
mtsrr1 %r6
mtsrr0 %r5
mtctr %r4
mtxer %r3
GET_CPUINFO(%r5)
lwz %r4,CI_IDEPTH(%r5)
addi %r4,%r4,-1
stw %r4,CI_IDEPTH(%r5)
mtcr %r6
bc 4,17,1f
lwz %r3,CI_CURPM(%r5)
lwz %r4,0(3); mtsr 0,%r4;
lwz %r4,4(3); mtsr 1,%r4;
lwz %r4,8(3); mtsr 2,%r4;
lwz %r4,12(3); mtsr 3,%r4;
lwz %r4,16(3); mtsr 4,%r4;
lwz %r4,20(3); mtsr 5,%r4;
lwz %r4,24(3); mtsr 6,%r4;
lwz %r4,28(3); mtsr 7,%r4;
lwz %r4,32(3); mtsr 8,%r4;
lwz %r4,36(3); mtsr 9,%r4;
lwz %r4,40(3); mtsr 10,%r4;
lwz %r4,44(3); mtsr 11,%r4;
lwz %r4,48(3); mtsr 12,%r4;
lwz %r4,52(3); mtsr 13,%r4;
lwz %r4,56(3); mtsr 14,%r4;
lwz %r4,60(3); mtsr 15,%r4;
lwz %r4,CI_CURPROC(%r5)
lwz %r4,P_MD_ASTPENDING(%r4)
andi. %r4,%r4,1
beq 1f
lwz %r3,0(%r1)
mtsprg 1,%r3
li %r6,EXC_AST
stmw %r28,CI_TEMPSAVE(%r5)
mtlr %r6
lwz %r28,40(%r1)
lwz %r29,36(%r1)
lwz %r6,68(%r1)
lwz %r5,72(%r1)
lwz %r4,76(%r1)
lwz %r3,80(%r1)
lwz %r0,84(%r1)
b realtrap
1:
lwz %r5,36(%r1)
lwz %r6,40(%r1)
mtcr %r5
mtlr %r6
lwz %r6,68(%r1)
lwz %r5,72(%r1)
lwz %r4,76(%r1)
lwz %r3,80(%r1)
lwz %r0,84(%r1)
lwz %r1,0(%r1)
rfi3: rfi
.globl decrintr
decrintr:
INTRENTER
addi %r3,%r1,8
bl decr_intr
b intr_exit
.globl setfault
.type setfault,@function
setfault:
mflr %r0
RETGUARD_SETUP_LATE(setfault, %r11, %r0)
mfcr %r12
GET_CPUINFO(%r4)
lwz %r4,CI_CURPCB(%r4)
stw %r3,PCB_FAULT(%r4)
stw %r0,0(%r3)
stw %r1,4(%r3)
stmw %r12,8(%r3)
li %r3,0
RETGUARD_CHECK(setfault, %r11, %r0)
blr
.section .rodata
.globl sigcode,esigcode
.type sigcode,@function
.type esigcode,@function
sigcode:
addi %r1,%r1,-((16+FPSIG_SIZEOF+15)& ~0xf)
addi %r6,%r1,8
stfd %f0,0(%r6)
stfd %f1,8(%r6)
stfd %f2,16(%r6)
stfd %f3,24(%r6)
stfd %f4,32(%r6)
stfd %f5,40(%r6)
stfd %f6,48(%r6)
stfd %f7,56(%r6)
stfd %f8,64(%r6)
stfd %f9,72(%r6)
stfd %f10,80(%r6)
stfd %f11,88(%r6)
stfd %f12,96(%r6)
stfd %f13,104(%r6)
mffs %f0
stfd %f0,112(%r6)
lfd %f0,0(%r6)
blrl
addi %r6,%r1,8
lfd %f0,112(%r6)
mtfsf 0xff,%f0
lfd %f0,0(%r6)
lfd %f1,8(%r6)
lfd %f2,16(%r6)
lfd %f3,24(%r6)
lfd %f4,32(%r6)
lfd %f5,40(%r6)
lfd %f6,48(%r6)
lfd %f7,56(%r6)
lfd %f8,64(%r6)
lfd %f9,72(%r6)
lfd %f10,80(%r6)
lfd %f11,88(%r6)
lfd %f12,96(%r6)
lfd %f13,104(%r6)
addi %r3,%r1,((16+FPSIG_SIZEOF+15)&~0xf)+SF_SC
li %r0,SYS_sigreturn
.globl sigcodecall
sigcodecall:
sc
.globl sigcoderet
sigcoderet:
esigcode:
.globl sigfill
sigfill:
.long 0 # illegal
esigfill:
.align 4
.globl sigfillsiz
sigfillsiz:
.long esigfill - sigfill
.text
#ifdef DDB
.globl ddb_trap
ddb_trap:
mtsprg 1,%r1
mfmsr %r3
mtsrr1 %r3
andi. %r3,%r3,~(PSL_EE|PSL_ME)@l
mtmsr %r3
isync
GET_CPUINFO(%r3)
stmw %r28,CI_DDBSAVE(%r3)
mflr %r28
li %r29,EXC_BPT
mtlr %r29
mfcr %r29
mtsrr0 %r28
ddbtrap:
FRAME_SETUP_FLAG(CI_DDBSAVE, 0)
addi %r3,%r1,8
bl db_trap_glue
or. %r3,%r3,%r3
bne ddbleave
lwz %r3,FRAME_EXC+8(%r1)
GET_CPUINFO(%r4)
stw %r3,CI_DDBSAVE+8(%r4)
FRAME_LEAVE(CI_DDBSAVE)
mtsprg 1,%r1
GET_CPUINFO(%r1)
stmw %r28,CI_TEMPSAVE(%r1)
mflr %r28
mfcr %r29
lwz %r31,CI_DDBSAVE+8(%r1)
mtlr %r31
b realtrap
ddbleave:
FRAME_LEAVE(CI_DDBSAVE)
rfi4: rfi
#endif
.globl rfi_inst
rfi_inst:
rfi
.globl rfid_inst
rfid_inst:
rfid
.globl nop_inst
nop_inst:
nop
.globl rfi_start
rfi_start:
.long rfi1, rfi1 + 4
.long rfi2, rfi2 + 4
.long rfi3, rfi3 + 4
#ifdef DDB
.long rfi4, rfi4 + 4
#endif
.long 0, 0
.globl nopbat_start
nopbat_start:
.long nopbat_1s, nopbat_1e
.long 0, 0
.globl nop32_start
nop32_start:
.long nop32_1s, nop32_1e
.long nop32_2s, nop32_2e
.long nop32_3s, nop32_3e
.long nop32_4s, nop32_4e
.long nop32_5s, nop32_5e
.long nop32_6s, nop32_6e
#ifdef DDB
.long nop32_7s, nop32_7e
#endif
.long 0, 0