#include <machine/asm.h>
#include <machine/bootinfo.h>
#include <arm/armreg.h>
#include "assym.h"
.text
.global _C_LABEL(epoc32_start)
_C_LABEL(epoc32_start):
adr r1, bootinfo
mov r2, #BTINFO_MAX_SIZE
sub r2, r2, #4
0:
ldr r3, [r0, r2]
str r3, [r1, r2]
subs r2, r2, #4
bge 0b
adr r0, mmu_init_table
b 2f
1:
str r3, [r2]
add r2, r2, #4
add r3, r3, #L1_S_SIZE
adds r1, r1, #-1
bhi 1b
2:
ldmia r0!, {r1, r2}
ldr r3, startup_pagetable
add r2, r2, r3
ldr r3, [r0], #4
cmp r1, #0
bne 1b
adr r0, bootinfo
next_btinfo:
ldmia r0, {r1, r2}
cmp r2, #BTINFO_NONE
beq 99f
cmp r2, #BTINFO_MEMORY
beq btinfo_memory
add r0, r0, r1
b next_btinfo
btinfo_memory_index:
.space 4
btinfo_memory:
mov r3, #0
str r3, btinfo_memory_index
ldr r3, [r0, #12]
cmp r3, #L1_S_SIZE
blt map_l1c
map_l1s:
ldr r3, [r0, #8]
ldr r2, btinfo_memory_index
add r3, r2, r3
ldr r2, startup_pagetable_l1s_attr
orr r2, r2, r3
ldr r1, startup_pagetable
ldr r3, startup_space
add r3, r3, #KERNEL_BASE
mov r3, r3, lsr #(L1_S_SHIFT - 2)
add r1, r3, r1
str r2, [r1]
ldr r2, btinfo_memory_index
add r2, r2, #L1_S_SIZE
str r2, btinfo_memory_index
ldr r1, startup_space
add r1, r1, #L1_S_SIZE
str r1, startup_space
cmp r1, #0x00400000
bge 99f
ldr r1, [r0, #12]
cmp r1, r2
bgt map_l1s
ldr r1, [r0]
add r0, r0, r1
b next_btinfo
map_l1c:
mov r1, #1
mov r2, r1, lsl #L1_S_SHIFT
sub r2, r2, #1
ldr r3, startup_space
ands r2, r3, r2
bne map_l2s
ldr r2, startup_pagetable
add r2, r2, #L1_TABLE_SIZE
mov r3, r3, lsr #(12 - 2)
add r2, r2, r3
ldr r3, startup_pagetable_l1c_attr
orr r2, r2, r3
ldr r1, startup_pagetable
ldr r3, startup_space
add r3, r3, #KERNEL_BASE
mov r3, r3, lsr #(20 - 2)
add r1, r1, r3
str r2, [r1]
map_l2s:
ldr r1, [r0, #8]
ldr r2, btinfo_memory_index
add r1, r1, r2
ldr r2, startup_pagetable_l2s_attr
orr r2, r1, r2
ldr r1, startup_space
mov r1, r1, lsr #(L2_S_SHIFT - 2)
ldr r3, startup_pagetable
add r3, r3, #L1_TABLE_SIZE
add r1, r3, r1
str r2, [r1]
ldr r2, btinfo_memory_index
add r2, r2, #L2_S_SIZE
str r2, btinfo_memory_index
ldr r1, startup_space
add r1, r1, #L2_S_SIZE
str r1, startup_space
cmp r1, #0x00400000
bge 99f
ldr r1, [r0, #12]
cmp r1, r2
bgt map_l2s
ldr r1, [r0]
add r0, r0, r1
b next_btinfo
99:
#define KERNEL_DOMAIN(x) ((x) << (PMAP_DOMAIN_KERNEL << 1))
mov r0, #(KERNEL_DOMAIN(DOMAIN_CLIENT) | DOMAIN_CLIENT)
mcr p15, 0, r0, c3, c0, 0
ldr r0, startup_pagetable
mcr p15, 0, r0, c2, c0, 0
mcr p15, 0, r1, c0, c0, 0
and r2, r1, #CPU_ID_IMPLEMENTOR_MASK
cmp r2, #CPU_ID_DEC
beq cpu_id_dec
ands r2, r1, #CPU_ID_7ARCH_MASK
bne cpu_id_7arch_v4t
cpu_id_7arch_v3:
mcr p15, 0, r0, c5, c0, 0
b enable_mmu
cpu_id_7arch_v4t:
cpu_id_dec:
mov r0, #0
mcr p15, 0, r0, c8, c7, 0
nop
enable_mmu:
ldr r0, startup_control
mcr p15, 0, r0, c1, c0, 0
nop
nop
adr r0, Lstart
ldr pc, [r0]
Lstart:
.word start
.globl _C_LABEL(startup_pagetable)
startup_pagetable:
#define STARTUP_PAGETABLE_ADDR 0xc0000000
.word STARTUP_PAGETABLE_ADDR
startup_pagetable_l1s_attr:
.word L1_S_PROTO_generic | L1_S_C | L1_S_AP_KRW
startup_pagetable_l1c_attr:
.word L1_C_PROTO_generic
startup_pagetable_l2s_attr:
.word L2_S_PROTO_generic | L2_C | L2_AP_KRW
startup_space:
.word 0x00000000
startup_control:
.word CPU_CONTROL_MMU_ENABLE | \
CPU_CONTROL_DC_ENABLE | \
CPU_CONTROL_WBUF_ENABLE | \
CPU_CONTROL_32BP_ENABLE | \
CPU_CONTROL_32BD_ENABLE | \
CPU_CONTROL_IC_ENABLE
.globl _C_LABEL(bootinfo)
bootinfo:
.space BTINFO_MAX_SIZE
#define MMU_INIT(va, pa, n_sec, attr) \
.word n_sec ; \
.word (va) >> (L1_S_SHIFT - 2); \
.word (pa) | (attr) ;
mmu_init_table:
MMU_INIT(0x00000000, 0x00000000,
1 << (32 - L1_S_SHIFT), L1_S_PROTO | L1_S_AP_KRW)
MMU_INIT(0, 0, 0, 0)