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