mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-30 08:31:03 +00:00
8ee28251d9
This separation makes maintenance of code easier because those low-level interrupt- or exception handling routines are pretty static and usually require not much care while start-up code is a subject of modifications and enhancements. Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
151 lines
2.5 KiB
ArmAsm
151 lines
2.5 KiB
ArmAsm
/*
|
|
* Copyright (C) 2013-2015 Synopsys, Inc. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#include <linux/linkage.h>
|
|
|
|
/*
|
|
* Note on the LD/ST addressing modes with address register write-back
|
|
*
|
|
* LD.a same as LD.aw
|
|
*
|
|
* LD.a reg1, [reg2, x] => Pre Incr
|
|
* Eff Addr for load = [reg2 + x]
|
|
*
|
|
* LD.ab reg1, [reg2, x] => Post Incr
|
|
* Eff Addr for load = [reg2]
|
|
*/
|
|
|
|
.macro PUSH reg
|
|
st.a \reg, [%sp, -4]
|
|
.endm
|
|
|
|
.macro PUSHAX aux
|
|
lr %r9, [\aux]
|
|
PUSH %r9
|
|
.endm
|
|
|
|
.macro SAVE_R1_TO_R24
|
|
PUSH %r1
|
|
PUSH %r2
|
|
PUSH %r3
|
|
PUSH %r4
|
|
PUSH %r5
|
|
PUSH %r6
|
|
PUSH %r7
|
|
PUSH %r8
|
|
PUSH %r9
|
|
PUSH %r10
|
|
PUSH %r11
|
|
PUSH %r12
|
|
PUSH %r13
|
|
PUSH %r14
|
|
PUSH %r15
|
|
PUSH %r16
|
|
PUSH %r17
|
|
PUSH %r18
|
|
PUSH %r19
|
|
PUSH %r20
|
|
PUSH %r21
|
|
PUSH %r22
|
|
PUSH %r23
|
|
PUSH %r24
|
|
.endm
|
|
|
|
.macro SAVE_ALL_SYS
|
|
/* saving %r0 to reg->r0 in advance since we read %ecr into it */
|
|
st %r0, [%sp, -8]
|
|
lr %r0, [%ecr] /* all stack addressing is manual so far */
|
|
st %r0, [%sp]
|
|
st %sp, [%sp, -4]
|
|
/* now move %sp to reg->r0 position so we can do "push" automatically */
|
|
sub %sp, %sp, 8
|
|
|
|
SAVE_R1_TO_R24
|
|
PUSH %r25
|
|
PUSH %gp
|
|
PUSH %fp
|
|
PUSH %blink
|
|
PUSHAX %eret
|
|
PUSHAX %erstatus
|
|
PUSH %lp_count
|
|
PUSHAX %lp_end
|
|
PUSHAX %lp_start
|
|
PUSHAX %erbta
|
|
.endm
|
|
|
|
.macro SAVE_EXCEPTION_SOURCE
|
|
#ifdef CONFIG_MMU
|
|
/* If MMU exists exception faulting address is loaded in EFA reg */
|
|
lr %r0, [%efa]
|
|
#else
|
|
/* Otherwise in ERET (exception return) reg */
|
|
lr %r0, [%eret]
|
|
#endif
|
|
.endm
|
|
|
|
ENTRY(memory_error)
|
|
SAVE_ALL_SYS
|
|
SAVE_EXCEPTION_SOURCE
|
|
mov %r1, %sp
|
|
j do_memory_error
|
|
ENDPROC(memory_error)
|
|
|
|
ENTRY(instruction_error)
|
|
SAVE_ALL_SYS
|
|
SAVE_EXCEPTION_SOURCE
|
|
mov %r1, %sp
|
|
j do_instruction_error
|
|
ENDPROC(instruction_error)
|
|
|
|
ENTRY(interrupt_handler)
|
|
/* Todo - save and restore CPU context when interrupts will be in use */
|
|
bl do_interrupt_handler
|
|
rtie
|
|
ENDPROC(interrupt_handler)
|
|
|
|
ENTRY(EV_MachineCheck)
|
|
SAVE_ALL_SYS
|
|
SAVE_EXCEPTION_SOURCE
|
|
mov %r1, %sp
|
|
j do_machine_check_fault
|
|
ENDPROC(EV_MachineCheck)
|
|
|
|
ENTRY(EV_TLBMissI)
|
|
SAVE_ALL_SYS
|
|
mov %r0, %sp
|
|
j do_itlb_miss
|
|
ENDPROC(EV_TLBMissI)
|
|
|
|
ENTRY(EV_TLBMissD)
|
|
SAVE_ALL_SYS
|
|
mov %r0, %sp
|
|
j do_dtlb_miss
|
|
ENDPROC(EV_TLBMissD)
|
|
|
|
ENTRY(EV_TLBProtV)
|
|
SAVE_ALL_SYS
|
|
SAVE_EXCEPTION_SOURCE
|
|
mov %r1, %sp
|
|
j do_tlb_prot_violation
|
|
ENDPROC(EV_TLBProtV)
|
|
|
|
ENTRY(EV_PrivilegeV)
|
|
SAVE_ALL_SYS
|
|
mov %r0, %sp
|
|
j do_privilege_violation
|
|
ENDPROC(EV_PrivilegeV)
|
|
|
|
ENTRY(EV_Trap)
|
|
SAVE_ALL_SYS
|
|
mov %r0, %sp
|
|
j do_trap
|
|
ENDPROC(EV_Trap)
|
|
|
|
ENTRY(EV_Extension)
|
|
SAVE_ALL_SYS
|
|
mov %r0, %sp
|
|
j do_extension
|
|
ENDPROC(EV_Extension)
|