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