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 /* Otherwise in ERET (exception return) reg */ 80 lr %r0, [%eret] 81.endm 82 83ENTRY(memory_error) 84 SAVE_ALL_SYS 85 SAVE_EXCEPTION_SOURCE 86 mov %r1, %sp 87 j do_memory_error 88ENDPROC(memory_error) 89 90ENTRY(instruction_error) 91 SAVE_ALL_SYS 92 SAVE_EXCEPTION_SOURCE 93 mov %r1, %sp 94 j do_instruction_error 95ENDPROC(instruction_error) 96 97ENTRY(interrupt_handler) 98 /* Todo - save and restore CPU context when interrupts will be in use */ 99 bl do_interrupt_handler 100 rtie 101ENDPROC(interrupt_handler) 102 103ENTRY(EV_MachineCheck) 104 SAVE_ALL_SYS 105 SAVE_EXCEPTION_SOURCE 106 mov %r1, %sp 107 j do_machine_check_fault 108ENDPROC(EV_MachineCheck) 109 110ENTRY(EV_TLBMissI) 111 SAVE_ALL_SYS 112 mov %r0, %sp 113 j do_itlb_miss 114ENDPROC(EV_TLBMissI) 115 116ENTRY(EV_TLBMissD) 117 SAVE_ALL_SYS 118 mov %r0, %sp 119 j do_dtlb_miss 120ENDPROC(EV_TLBMissD) 121 122ENTRY(EV_TLBProtV) 123 SAVE_ALL_SYS 124 SAVE_EXCEPTION_SOURCE 125 mov %r1, %sp 126 j do_tlb_prot_violation 127ENDPROC(EV_TLBProtV) 128 129ENTRY(EV_PrivilegeV) 130 SAVE_ALL_SYS 131 mov %r0, %sp 132 j do_privilege_violation 133ENDPROC(EV_PrivilegeV) 134 135ENTRY(EV_Trap) 136 SAVE_ALL_SYS 137 mov %r0, %sp 138 j do_trap 139ENDPROC(EV_Trap) 140 141ENTRY(EV_Extension) 142 SAVE_ALL_SYS 143 mov %r0, %sp 144 j do_extension 145ENDPROC(EV_Extension) 146 147#ifdef CONFIG_ISA_ARCV2 148ENTRY(EV_SWI) 149 SAVE_ALL_SYS 150 mov %r0, %sp 151 j do_swi 152ENDPROC(EV_SWI) 153 154ENTRY(EV_DivZero) 155 SAVE_ALL_SYS 156 SAVE_EXCEPTION_SOURCE 157 mov %r1, %sp 158 j do_divzero 159ENDPROC(EV_DivZero) 160 161ENTRY(EV_DCError) 162 SAVE_ALL_SYS 163 mov %r0, %sp 164 j do_dcerror 165ENDPROC(EV_DCError) 166 167ENTRY(EV_Maligned) 168 SAVE_ALL_SYS 169 SAVE_EXCEPTION_SOURCE 170 mov %r1, %sp 171 j do_maligned 172ENDPROC(EV_Maligned) 173#endif 174