| /* SPDX-License-Identifier: GPL-2.0+ */ | |
| /* | |
| * Copyright (C) 2013-2015 Synopsys, Inc. All rights reserved. | |
| */ | |
| #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 | |
| /* Otherwise in ERET (exception return) reg */ | |
| lr %r0, [%eret] | |
| .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) | |
| #ifdef CONFIG_ISA_ARCV2 | |
| ENTRY(EV_SWI) | |
| SAVE_ALL_SYS | |
| mov %r0, %sp | |
| j do_swi | |
| ENDPROC(EV_SWI) | |
| ENTRY(EV_DivZero) | |
| SAVE_ALL_SYS | |
| SAVE_EXCEPTION_SOURCE | |
| mov %r1, %sp | |
| j do_divzero | |
| ENDPROC(EV_DivZero) | |
| ENTRY(EV_DCError) | |
| SAVE_ALL_SYS | |
| mov %r0, %sp | |
| j do_dcerror | |
| ENDPROC(EV_DCError) | |
| ENTRY(EV_Maligned) | |
| SAVE_ALL_SYS | |
| SAVE_EXCEPTION_SOURCE | |
| mov %r1, %sp | |
| j do_maligned | |
| ENDPROC(EV_Maligned) | |
| #endif |