#include "opt_kloader.h"
#include <mips/asm.h>
#include <mips/cache_r5900.h>
#include <mips/cpuregs.h>
#define D_STAT_REG 0xb000e010
#define I_MASK_REG 0xb000f010
.set noreorder
.text
.align 6
LEAF_NOPROFILE(md_imask_update)
lw a0, _C_LABEL(__intc_enabled_channel)
li a1, I_MASK_REG
lw a3, _C_LABEL(__dmac_enabled_channel)
li a2, D_STAT_REG
lw t1, 0(a2)
lui t2, 0xffff
lw t0, 0(a1)
sll a3, a3, 16
and t1, t1, t2
lw t3, _C_LABEL(md_imask)
nor t2, zero, t2
and t0, t0, t2
or t0, t0, t1
nor ta0, zero, t3
xor ta0, ta0, t0
and t3, t3, t0
or t0, t3, ta0
and t3, t0, a0
and ta0, t0, a3
sw t3, 0(a1)
sw ta0, 0(a2)
sync.p
j ra
nop
END(md_imask_update)
NESTED_NOPROFILE(spllowersofthigh, CALLFRAME_SIZ, ra)
.mask 0x80000000, -4
subu sp, sp, CALLFRAME_SIZ
sw ra, CALLFRAME_RA(sp)
la a0, _C_LABEL(__icu_mask)
lw a0, 16(a0)
sw a0, _C_LABEL(md_imask)
jal md_imask_update
nop
lw ra, CALLFRAME_RA(sp)
li t0, (MIPS_INT_MASK | MIPS_SR_INT_IE)
mtc0 t0, MIPS_COP_0_STATUS
sync.p
j ra
addu sp, sp, CALLFRAME_SIZ
END(spllowersofthigh)
#ifdef KLOADER
LEAF_NOPROFILE(kloader_playstation2_boot)
lui t0, 0x1040 # Cu0 | BEV
mtc0 t0, $12
sync.p
move t6, a1 # p
1: beqz t6, 3f
move t7, t6
lw t6, 0(t7) # p = next
lw t0, 4(t7) # src
lw ta0, 8(t7) # dst
lw t2, 12(t7) # sz
addu t5, ta0, t2 # dst + sz
2: lw t3, 0(t0) # copy
sw t3, 0(ta0)
addiu ta0, ta0, 4
addiu t0, t0, 4
bltu ta0, t5, 2b
nop
b 1b
nop
3: nop
li t2, CACHE_R5900_SIZE_D
li t0, MIPS_KSEG0_START
srl t2, 1 # Two way set assoc
addu t1, t0, t2 # End address
sync.l
sync.p
1:
cache CACHEOP_R5900_IWBINV_D, 0(t0);sync.l;sync.p # way 0
cache CACHEOP_R5900_IWBINV_D, 1(t0);sync.l;sync.p # way 1
cache CACHEOP_R5900_IWBINV_D, 64(t0);sync.l;sync.p # way 0
cache CACHEOP_R5900_IWBINV_D, 65(t0);sync.l;sync.p # way 1
cache CACHEOP_R5900_IWBINV_D,128(t0);sync.l;sync.p # way 0
cache CACHEOP_R5900_IWBINV_D,129(t0);sync.l;sync.p # way 1
cache CACHEOP_R5900_IWBINV_D,192(t0);sync.l;sync.p # way 0
cache CACHEOP_R5900_IWBINV_D,193(t0);sync.l;sync.p # way 1
addu t0, t0, 256
bne t0, t1, 1b
nop
li t1, CACHE_R5900_SIZE_I
li t0, MIPS_KSEG0_START
srl t1, 1 # Two way set assoc
addu t1, t0, t1 # End address
sync.l
sync.p
1:
# [12:6] ... line
# [0] ... way
cache CACHEOP_R5900_IINV_I, 0(t0);sync.l;sync.p # way 0
cache CACHEOP_R5900_IINV_I, 1(t0);sync.l;sync.p # way 1
cache CACHEOP_R5900_IINV_I, 64(t0);sync.l;sync.p # way 0
cache CACHEOP_R5900_IINV_I, 65(t0);sync.l;sync.p # way 1
cache CACHEOP_R5900_IINV_I,128(t0);sync.l;sync.p # way 0
cache CACHEOP_R5900_IINV_I,129(t0);sync.l;sync.p # way 1
cache CACHEOP_R5900_IINV_I,192(t0);sync.l;sync.p # way 0
cache CACHEOP_R5900_IINV_I,193(t0);sync.l;sync.p # way 1
addu t0, t0, 256
bne t0, t1, 1b
nop
lw a0, 0(a0)
1: jr a0
move sp, a0
nop
nop
nop
b 1b
nop
END(kloader_playstation2_boot)
#endif