#include "assym.h"
#include <arm/asm.h>
#include <arm/locore.h>
.Lsheeva_cache_line_size:
.word _C_LABEL(arm_pcache) + DCACHE_LINE_SIZE
.Lsheeva_asm_page_mask:
.word _C_LABEL(PAGE_MASK)
ENTRY(sheeva_dcache_wbinv_range)
push {r4,r5}
mrs r4, cpsr
orr r5, r4, #I32_bit | F32_bit
ldr ip, .Lsheeva_cache_line_size
ldr r3, [ip]
sub r3, r3, #1
and r2, r0, r3
add r1, r1, r2
add r1, r1, r3
bic r1, r1, r3
bic r0, r0, r3
ldr ip, .Lsheeva_asm_page_mask
and r2, r0, ip
rsb r2, r2, #PAGE_SIZE
cmp r1, r2
movcc ip, r1
movcs ip, r2
sub r2, r0, #1
1:
add r2, r2, ip
msr cpsr_c, r5
mcr p15, 5, r0, c15, c15, 0
mcr p15, 5, r2, c15, c15, 1
msr cpsr_c, r4
add r0, r0, ip
sub r1, r1, ip
cmp r1, #PAGE_SIZE
movcc ip, r1
movcs ip, #PAGE_SIZE
cmp r1, #0
bne 1b
mov r0, #0
mcr p15, 0, r0, c7, c10, 4
pop {r4, r5}
RET
END(sheeva_dcache_wbinv_range)
ENTRY(sheeva_dcache_inv_range)
push {r4,r5}
mrs r4, cpsr
orr r5, r4, #I32_bit | F32_bit
ldr ip, .Lsheeva_cache_line_size
ldr r3, [ip]
sub r3, r3, #1
and r2, r0, r3
add r1, r1, r2
add r1, r1, r3
bic r1, r1, r3
bic r0, r0, r3
ldr ip, .Lsheeva_asm_page_mask
and r2, r0, ip
rsb r2, r2, #PAGE_SIZE
cmp r1, r2
movcc ip, r1
movcs ip, r2
sub r2, r0, #1
1:
add r2, r2, ip
msr cpsr_c, r5
mcr p15, 5, r0, c15, c14, 0
mcr p15, 5, r2, c15, c14, 1
msr cpsr_c, r4
add r0, r0, ip
sub r1, r1, ip
cmp r1, #PAGE_SIZE
movcc ip, r1
movcs ip, #PAGE_SIZE
cmp r1, #0
bne 1b
mov r0, #0
mcr p15, 0, r0, c7, c10, 4
pop {r4, r5}
RET
END(sheeva_dcache_inv_range)
ENTRY(sheeva_dcache_wb_range)
push {r4,r5}
mrs r4, cpsr
orr r5, r4, #I32_bit | F32_bit
ldr ip, .Lsheeva_cache_line_size
ldr r3, [ip]
sub r3, r3, #1
and r2, r0, r3
add r1, r1, r2
add r1, r1, r3
bic r1, r1, r3
bic r0, r0, r3
ldr ip, .Lsheeva_asm_page_mask
and r2, r0, ip
rsb r2, r2, #PAGE_SIZE
cmp r1, r2
movcc ip, r1
movcs ip, r2
sub r2, r0, #1
1:
add r2, r2, ip
msr cpsr_c, r5
mcr p15, 5, r0, c15, c13, 0
mcr p15, 5, r2, c15, c13, 1
msr cpsr_c, r4
add r0, r0, ip
sub r1, r1, ip
cmp r1, #PAGE_SIZE
movcc ip, r1
movcs ip, #PAGE_SIZE
cmp r1, #0
bne 1b
mov r0, #0
mcr p15, 0, r0, c7, c10, 4
pop {r4, r5}
RET
END(sheeva_dcache_wb_range)
ENTRY(sheeva_idcache_wbinv_range)
push {r4,r5}
mrs r4, cpsr
orr r5, r4, #I32_bit | F32_bit
ldr ip, .Lsheeva_cache_line_size
ldr r3, [ip]
sub r3, r3, #1
and r2, r0, r3
add r1, r1, r2
add r1, r1, r3
bic r1, r1, r3
bic r0, r0, r3
ldr ip, .Lsheeva_asm_page_mask
and r2, r0, ip
rsb r2, r2, #PAGE_SIZE
cmp r1, r2
movcc ip, r1
movcs ip, r2
sub r2, r0, #1
1:
add r2, r2, ip
msr cpsr_c, r5
mcr p15, 5, r0, c15, c15, 0
mcr p15, 5, r2, c15, c15, 1
msr cpsr_c, r4
2:
mcr p15, 0, r0, c7, c5, 1
add r0, r0, r3
cmp r2, r0
bhi 2b
add r0, r0, ip
sub r1, r1, ip
cmp r1, #PAGE_SIZE
movcc ip, r1
movcs ip, #PAGE_SIZE
cmp r1, #0
bne 1b
mov r0, #0
mcr p15, 0, r0, c7, c10, 4
pop {r4, r5}
RET
END(sheeva_idcache_wbinv_range)
ENTRY(sheeva_sdcache_wbinv_range)
push {r4,r5}
mrs r4, cpsr
orr r5, r4, #I32_bit | F32_bit
mov r1, r2
ldr ip, .Lsheeva_cache_line_size
ldr ip, [ip]
sub ip, ip, #1
and r2, r0, ip
add r1, r1, r2
add r1, r1, ip
bic r1, r1, ip
bic r0, r0, ip
ldr ip, .Lsheeva_asm_page_mask
and r2, r0, ip
rsb r2, r2, #PAGE_SIZE
cmp r1, r2
movcc ip, r1
movcs ip, r2
sub r2, r0, #1
1:
add r2, r2, ip
msr cpsr_c, r5
mcr p15, 1, r0, c15, c9, 4
mcr p15, 1, r2, c15, c9, 5
mcr p15, 1, r0, c15, c11, 4
mcr p15, 1, r2, c15, c11, 5
msr cpsr_c, r4
add r0, r0, ip
sub r1, r1, ip
cmp r1, #PAGE_SIZE
movcc ip, r1
movcs ip, #PAGE_SIZE
cmp r1, #0
bne 1b
mov r0, #0
mcr p15, 0, r0, c7, c10, 4
pop {r4, r5}
RET
END(sheeva_sdcache_wbinv_range)
ENTRY(sheeva_sdcache_inv_range)
push {r4,r5}
mrs r4, cpsr
orr r5, r4, #I32_bit | F32_bit
mov r1, r2
ldr ip, .Lsheeva_cache_line_size
ldr r3, [ip]
sub r3, r3, #1
and r2, r0, r3
add r1, r1, r2
add r1, r1, r3
bic r1, r1, r3
bic r0, r0, r3
ldr ip, .Lsheeva_asm_page_mask
and r2, r0, ip
rsb r2, r2, #PAGE_SIZE
cmp r1, r2
movcc ip, r1
movcs ip, r2
sub r2, r2, #1
1:
add r2, r2, ip
msr cpsr_c, r5
mcr p15, 1, r0, c15, c11, 4
mcr p15, 1, r2, c15, c11, 5
msr cpsr_c, r4
add r0, r0, ip
sub r1, r1, ip
cmp r1, #PAGE_SIZE
movcc ip, r1
movcs ip, #PAGE_SIZE
cmp r1, #0
bne 1b
mov r0, #0
mcr p15, 0, r0, c7, c10, 4
pop {r4, r5}
RET
END(sheeva_sdcache_inv_range)
ENTRY(sheeva_sdcache_wb_range)
push {r4,r5}
mrs r4, cpsr
orr r5, r4, #I32_bit | F32_bit
mov r1, r2
ldr ip, .Lsheeva_cache_line_size
ldr r3, [ip]
sub r3, r3, #1
and r2, r0, r3
add r1, r1, r2
add r1, r1, r3
bic r1, r1, r3
bic r0, r0, r3
ldr ip, .Lsheeva_asm_page_mask
and r2, r0, ip
rsb r2, r2, #PAGE_SIZE
cmp r1, r2
movcc ip, r1
movcs ip, r2
sub r2, r0, #1
1:
add r2, r2, ip
msr cpsr_c, r5
mcr p15, 1, r0, c15, c9, 4
mcr p15, 1, r2, c15, c9, 5
msr cpsr_c, r4
add r0, r0, ip
sub r1, r1, ip
cmp r1, #PAGE_SIZE
movcc ip, r1
movcs ip, #PAGE_SIZE
cmp r1, #0
bne 1b
mov r0, #0
mcr p15, 0, r0, c7, c10, 4
pop {r4, r5}
RET
END(sheeva_sdcache_wb_range)
ENTRY(sheeva_sdcache_wbinv_all)
mov r0, #0
mcr p15, 1, r0, c15, c9, 0
mcr p15, 1, r0, c15, c11, 0
mcr p15, 0, r0, c7, c10, 4
RET
END(sheeva_sdcache_wbinv_all)
ENTRY_NP(sheeva_cpu_sleep)
mov r0, #0
mcr p15, 0, r0, c7, c0, 4
RET
END(sheeva_cpu_sleep)