1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* 3 * Copyright (C) 2013-2015 Synopsys, Inc. All rights reserved. 4 */ 5 6#include <linux/linkage.h> 7 8/* 9 * Note on the LD/ST addressing modes with address register write-back 10 * 11 * LD.a same as LD.aw 12 * 13 * LD.a reg1, [reg2, x] => Pre Incr 14 * Eff Addr for load = [reg2 + x] 15 * 16 * LD.ab reg1, [reg2, x] => Post Incr 17 * Eff Addr for load = [reg2] 18 */ 19 20.macro PUSH reg 21 st.a \reg, [%sp, -4] 22.endm 23 24.macro PUSHAX aux 25 lr %r9, [\aux] 26 PUSH %r9 27.endm 28 29.macro SAVE_R1_TO_R24 30 PUSH %r1 31 PUSH %r2 32 PUSH %r3 33 PUSH %r4 34 PUSH %r5 35 PUSH %r6 36 PUSH %r7 37 PUSH %r8 38 PUSH %r9 39 PUSH %r10 40 PUSH %r11 41 PUSH %r12 42 PUSH %r13 43 PUSH %r14 44 PUSH %r15 45 PUSH %r16 46 PUSH %r17 47 PUSH %r18 48 PUSH %r19 49 PUSH %r20 50 PUSH %r21 51 PUSH %r22 52 PUSH %r23 53 PUSH %r24 54.endm 55 56.macro SAVE_ALL_SYS 57 /* saving %r0 to reg->r0 in advance since we read %ecr into it */ 58 st %r0, [%sp, -8] 59 lr %r0, [%ecr] /* all stack addressing is manual so far */ 60 st %r0, [%sp] 61 st %sp, [%sp, -4] 62 /* now move %sp to reg->r0 position so we can do "push" automatically */ 63 sub %sp, %sp, 8 64 65 SAVE_R1_TO_R24 66 PUSH %r25 67 PUSH %gp 68 PUSH %fp 69 PUSH %blink 70 PUSHAX %eret 71 PUSHAX %erstatus 72 PUSH %lp_count 73 PUSHAX %lp_end 74 PUSHAX %lp_start 75 PUSHAX %erbta 76.endm 77 78.macro SAVE_EXCEPTION_SOURCE 79#ifdef CONFIG_MMU 80 /* If MMU exists exception faulting address is loaded in EFA reg */ 81 lr %r0, [%efa] 82#else 83 /* Otherwise in ERET (exception return) reg */ 84 lr %r0, [%eret] 85#endif 86.endm 87 88ENTRY(memory_error) 89 SAVE_ALL_SYS 90 SAVE_EXCEPTION_SOURCE 91 mov %r1, %sp 92 j do_memory_error 93ENDPROC(memory_error) 94 95ENTRY(instruction_error) 96 SAVE_ALL_SYS 97 SAVE_EXCEPTION_SOURCE 98 mov %r1, %sp 99 j do_instruction_error 100ENDPROC(instruction_error) 101 102ENTRY(interrupt_handler) 103 /* Todo - save and restore CPU context when interrupts will be in use */ 104 bl do_interrupt_handler 105 rtie 106ENDPROC(interrupt_handler) 107 108ENTRY(EV_MachineCheck) 109 SAVE_ALL_SYS 110 SAVE_EXCEPTION_SOURCE 111 mov %r1, %sp 112 j do_machine_check_fault 113ENDPROC(EV_MachineCheck) 114 115ENTRY(EV_TLBMissI) 116 SAVE_ALL_SYS 117 mov %r0, %sp 118 j do_itlb_miss 119ENDPROC(EV_TLBMissI) 120 121ENTRY(EV_TLBMissD) 122 SAVE_ALL_SYS 123 mov %r0, %sp 124 j do_dtlb_miss 125ENDPROC(EV_TLBMissD) 126 127ENTRY(EV_TLBProtV) 128 SAVE_ALL_SYS 129 SAVE_EXCEPTION_SOURCE 130 mov %r1, %sp 131 j do_tlb_prot_violation 132ENDPROC(EV_TLBProtV) 133 134ENTRY(EV_PrivilegeV) 135 SAVE_ALL_SYS 136 mov %r0, %sp 137 j do_privilege_violation 138ENDPROC(EV_PrivilegeV) 139 140ENTRY(EV_Trap) 141 SAVE_ALL_SYS 142 mov %r0, %sp 143 j do_trap 144ENDPROC(EV_Trap) 145 146ENTRY(EV_Extension) 147 SAVE_ALL_SYS 148 mov %r0, %sp 149 j do_extension 150ENDPROC(EV_Extension) 151 152#ifdef CONFIG_ISA_ARCV2 153ENTRY(EV_SWI) 154 SAVE_ALL_SYS 155 mov %r0, %sp 156 j do_swi 157ENDPROC(EV_SWI) 158 159ENTRY(EV_DivZero) 160 SAVE_ALL_SYS 161 SAVE_EXCEPTION_SOURCE 162 mov %r1, %sp 163 j do_divzero 164ENDPROC(EV_DivZero) 165 166ENTRY(EV_DCError) 167 SAVE_ALL_SYS 168 mov %r0, %sp 169 j do_dcerror 170ENDPROC(EV_DCError) 171 172ENTRY(EV_Maligned) 173 SAVE_ALL_SYS 174 SAVE_EXCEPTION_SOURCE 175 mov %r1, %sp 176 j do_maligned 177ENDPROC(EV_Maligned) 178#endif 179