Files
beaglefw/cortexa8_asm.s
2013-07-14 15:59:16 +02:00

178 lines
3.2 KiB
ArmAsm

.global cortexa8_ena_int
cortexa8_ena_int:
cpsie i
bx lr
.global cortexa8_dis_int
cortexa8_dis_int:
cpsid i
bx lr
.global cortexa8_get_int
cortexa8_get_int:
mrs r0, cpsr
ands r0, r0, #0x80
moveq r0, #1
movne r0, #0
bx lr
.global cortexa8_set_abt_sp
cortexa8_set_abt_sp:
/* Read and save CPSR */
mrs r1, cpsr
/* Set mode to ABT */
cps #0x17
/* Set SP in ABT mode */
mov sp, r0
/* Restore original CPSR */
msr cpsr, r1
/* Return */
bx lr
.global cortexa8_set_und_sp
cortexa8_set_und_sp:
/* Read and save CPSR */
mrs r1, cpsr
/* Set mode to UND */
cps #0x1b
/* Set SP in UND mode */
mov sp, r0
/* Restore original CPSR */
msr cpsr, r1
/* Return */
bx lr
.global cortexa8_set_irq_sp
cortexa8_set_irq_sp:
/* Read and save CPSR */
mrs r1, cpsr
/* Set mode to IRQ */
cps #0x12
/* Set SP in IRQ mode */
mov sp, r0
/* Restore original CPSR */
msr cpsr, r1
/* Return */
bx lr
.global cortexa8_set_fiq_sp
cortexa8_set_fiq_sp:
/* Read and save CPSR */
mrs r1, cpsr
/* Set mode to FIQ */
cps #0x11
/* Set SP in FIQ mode */
mov sp, r0
/* Restore original CPSR */
msr cpsr, r1
/* Return */
bx lr
.global cortexa8_get_spsr
cortexa8_get_spsr:
mrs r0, spsr
bx lr
.global cortexa8_get_cpsr
cortexa8_get_cpsr:
mrs r0, cpsr
bx lr
/*
The irq sp (r13) register is loaded with a pointer to the current thread control block.
All registers are saved there, the sp is loaded with __stack_int and the
interrupt handler is called.
The (possibly changed) current thread control block is used to restore context and return.
*/
.global _cortexa8_int
_cortexa8_int:
/* If we are not interrupting user or system mode, jump to _cortexa8_inner_int (no context switch) */
mrs r13, spsr
and r13, r13, #0x1f
teq r13, #0x1f
teqne r13, #0x10
bne _cortexa8_inner_int
ldr r13, = _current_thread_cb
ldr r13, [r13]
stm r13, {r0-r14}^
add lr, lr, #-4
str lr, [r13, #60]
mrs r0, spsr
str r0, [r13, #64]
ldr r13, = __stack_int
bl _omap35x_intc_handler
ldr r13, = _current_thread_cb
ldr r13, [r13]
ldr r1, [r13, #64]
msr spsr, r1
ldr lr, [r13, #60]
ldm r13, {r0-r14}^
movs pc,lr
_cortexa8_inner_int:
ldr r13, = __stack_int
push {lr}
add r13, r13, #-60
stm r13, {r0-r14}
mrs r0, spsr
push {r0}
bl _omap35x_intc_handler
pop {r0}
msr spsr, r0
ldm r13, {r0-r15}^
.global _cortexa8_syscall
_cortexa8_syscall:
ldr r13, = _current_thread_cb
ldr r13, [r13]
stm r13, {r0-r14}^
str lr, [r13, #60]
mrs r0, spsr
str r0, [r13, #64]
ldr r13, = __stack_syscall
/* Determine if the calling thread was executing ARM or Thumb code */
tst r0, #0x20
/* For Thumb, read syscall no. from LR-2, for ARM from LR-4 */
ldreq r0, [lr, #-4]
biceq r0, #0xff000000
ldrneh r0, [lr, #-2]
andne r0, #0x000000ff
bl syscall_handler
ldr r13, = _current_thread_cb
ldr r13, [r13]
ldr r1, [r13, #64]
msr spsr, r1
ldr lr, [r13, #60]
ldm r13, {r0-r14}^
movs pc,lr
.global _vect_table
.align 5
_vect_table:
/* Reset / unused */
nop
/* Undefined instruction */
b _cortexa8_excp_undef
/* Supervisor call */
b _cortexa8_syscall
/* Prefetch abort */
b _cortexa8_excp_pf_abt
/* Data abort */
b _cortexa8_excp_data_abt
/* Unused */
nop
/* IRQ */
b _cortexa8_int
/* FIQ */
b _cortexa8_unhandled_fiq