__INIT
__INITDATA
.text
__HEAD
.global start_kernel
.global __bss_start
.global _end
ENTRY(stext)
ENTRY(_stext)
LDIMM (r0, spi_stack_top)
LDIMM (r1, spu_stack_top)
mvtc r0, spi
mvtc r1, spu
ldi r0,
mvtc r0, psw
LDIMM (r0, stack_start)
ld r0, @r0
mvtc r0, spi
LDIMM (r2, __bss_start)
LDIMM (r3, _end)
sub r3, r2 ; BSS size in bytes
; R4 = BSS size in longwords (rounded down)
mv r4, r3 || ldi r1,
srli r4,
beqz r4, .Lendloop1
.Lloop1:
; Touch memory for the no-write-allocating cache.
ld r0, @(4,r2)
st r1, @+r2 || addi r4,
st r1, @+r2
st r1, @+r2
st r1, @+r2 || cmpeq r1, r4 ; R4 = 0?
bnc .Lloop1
.Lendloop1:
and3 r4, r3,
addi r2,
beqz r4, .Lendloop2
.Lloop2:
stb r1, @r2 || addi r4,
addi r2,
bnez r4, .Lloop2
.Lendloop2:
LDIMM (r2, __bss_start)
LDIMM (r3, _end)
sub r3, r2 ; BSS size in bytes
mv r4, r3
srli r4,
ldi r1,
addi r2,
beqz r4, .Lendloop1 ; any more to go?
.Lloop1:
st r1, @+r2 ; yep, zero out another longword
addi r4,
bnez r4, .Lloop1 ; go do some more
.Lendloop1:
and3 r4, r3,
addi r2,
beqz r4, .Lendloop2 ; any more to go?
.Lloop2:
stb r1, @r2 ; yep, zero out another byte
addi r2,
addi r4,
bnez r4, .Lloop2 ; go do some more
.Lendloop2:
.global ROM_D, TOP_DATA, END_DATA
LDIMM (r1, ROM_D)
LDIMM (r2, TOP_DATA)
LDIMM (r3, END_DATA)
addi r2,
addi r3,
loop1:
ld r0, @r1+
st r0, @+r2
cmp r2, r3
bc loop1
LDIMM (r2, start_kernel)
jl r2
.fillinsn
1:
bra 1b ; main should never return here, but
; just in case, we know what happens.
.global eit_vector
ENTRY(startup_AP)
;; setup EVB
LDIMM (r4, eit_vector)
mvtc r4, cr5
;; enable MMU
LDIMM (r2, init_tlb)
jl r2
seth r4,
or3 r4, r4,
ldi r5,
st r5, @r4 ; Set MATM Reg(T bit ON)
ld r6, @r4 ; MATM Check
LDIMM (r5, 1f)
jmp r5 ; enable MMU
nop
.fillinsn
1:
;; ISN check
ld r6, @r4 ; MATM Check
seth r4,
or3 r4, r4,
ld r5, @r4 ; Read ISTSi reg.
mv r6, r5
slli r5,
srli r5,
seth r4,
or3 r4, r4,
st r5, @r4 ; Write IMASKi reg.
slli r6,
srli r6,
seth r4,
or3 r4, r4,
bne r4, r6, 2f ; if (ISN != CPU_BOOT_IPI) goto sleep;
;; check cpu_bootout_map and set cpu_bootin_map
LDIMM (r4, cpu_bootout_map)
ld r4, @r4
seth r5,
or3 r5, r5,
ld r5, @r5
ldi r6,
sll r6, r5
and r4, r6
beqz r4, 2f
LDIMM (r4, cpu_bootin_map)
ld r5, @r4
or r5, r6
st r6, @r4
;; clear PSW
ldi r4,
mvtc r4, psw
;; setup SPI
LDIMM (r4, stack_start)
ld r4, @r4
mvtc r4, spi
;; setup BPC (start_secondary)
LDIMM (r4, start_secondary)
mvtc r4, bpc
rte ; goto startup_secondary
nop
nop
.fillinsn
2:
;; disable MMU
seth r4,
or3 r4, r4,
ldi r5,
st r5, @r4 ; Set MATM Reg(T bit OFF)
ld r6, @r4 ; MATM Check
LDIMM (r4, 3f)
seth r5,
or3 r5, r5,
not r5, r5
and r4, r5
jmp r4 ; disable MMU
nop
.fillinsn
3:
;; SLEEP and wait IPI
LDIMM (r4, AP_loop)
seth r5,
or3 r5, r5,
not r5, r5
and r4, r5
jmp r4
nop
nop
.text
ENTRY(stack_start)
.long init_thread_union+8192
.long __KERNEL_DS
.text
; to be needed to boot from initrd)
.section .empty_zero_page, "aw"
ENTRY(empty_zero_page)
.long MOUNT_ROOT_RDONLY
.long RAMDISK_FLAGS
.long ORIG_ROOT_DEV
.long LOADER_TYPE
.long 0
.long 0
.long 0
.long 0
.long 0
.balign 256,0
.asciz COMMAND_LINE
.byte 0
.balign 4096,0,4096
.section .init.data, "aw"
ALIGN
.global spi_stack_top
.zero 1024
spi_stack_top:
.section .init.data, "aw"
ALIGN
.global spu_stack_top
.zero 1024
spu_stack_top:
.end