18ee28251SAlexey Brodkin/* 28ee28251SAlexey Brodkin * Copyright (C) 2013-2015 Synopsys, Inc. All rights reserved. 38ee28251SAlexey Brodkin * 48ee28251SAlexey Brodkin * SPDX-License-Identifier: GPL-2.0+ 58ee28251SAlexey Brodkin */ 68ee28251SAlexey Brodkin 78ee28251SAlexey Brodkin#include <linux/linkage.h> 88ee28251SAlexey Brodkin 98ee28251SAlexey Brodkin/* 108ee28251SAlexey Brodkin * Note on the LD/ST addressing modes with address register write-back 118ee28251SAlexey Brodkin * 128ee28251SAlexey Brodkin * LD.a same as LD.aw 138ee28251SAlexey Brodkin * 148ee28251SAlexey Brodkin * LD.a reg1, [reg2, x] => Pre Incr 158ee28251SAlexey Brodkin * Eff Addr for load = [reg2 + x] 168ee28251SAlexey Brodkin * 178ee28251SAlexey Brodkin * LD.ab reg1, [reg2, x] => Post Incr 188ee28251SAlexey Brodkin * Eff Addr for load = [reg2] 198ee28251SAlexey Brodkin */ 208ee28251SAlexey Brodkin 218ee28251SAlexey Brodkin.macro PUSH reg 228ee28251SAlexey Brodkin st.a \reg, [%sp, -4] 238ee28251SAlexey Brodkin.endm 248ee28251SAlexey Brodkin 258ee28251SAlexey Brodkin.macro PUSHAX aux 268ee28251SAlexey Brodkin lr %r9, [\aux] 278ee28251SAlexey Brodkin PUSH %r9 288ee28251SAlexey Brodkin.endm 298ee28251SAlexey Brodkin 308ee28251SAlexey Brodkin.macro SAVE_R1_TO_R24 318ee28251SAlexey Brodkin PUSH %r1 328ee28251SAlexey Brodkin PUSH %r2 338ee28251SAlexey Brodkin PUSH %r3 348ee28251SAlexey Brodkin PUSH %r4 358ee28251SAlexey Brodkin PUSH %r5 368ee28251SAlexey Brodkin PUSH %r6 378ee28251SAlexey Brodkin PUSH %r7 388ee28251SAlexey Brodkin PUSH %r8 398ee28251SAlexey Brodkin PUSH %r9 408ee28251SAlexey Brodkin PUSH %r10 418ee28251SAlexey Brodkin PUSH %r11 428ee28251SAlexey Brodkin PUSH %r12 438ee28251SAlexey Brodkin PUSH %r13 448ee28251SAlexey Brodkin PUSH %r14 458ee28251SAlexey Brodkin PUSH %r15 468ee28251SAlexey Brodkin PUSH %r16 478ee28251SAlexey Brodkin PUSH %r17 488ee28251SAlexey Brodkin PUSH %r18 498ee28251SAlexey Brodkin PUSH %r19 508ee28251SAlexey Brodkin PUSH %r20 518ee28251SAlexey Brodkin PUSH %r21 528ee28251SAlexey Brodkin PUSH %r22 538ee28251SAlexey Brodkin PUSH %r23 548ee28251SAlexey Brodkin PUSH %r24 558ee28251SAlexey Brodkin.endm 568ee28251SAlexey Brodkin 578ee28251SAlexey Brodkin.macro SAVE_ALL_SYS 588ee28251SAlexey Brodkin /* saving %r0 to reg->r0 in advance since we read %ecr into it */ 598ee28251SAlexey Brodkin st %r0, [%sp, -8] 608ee28251SAlexey Brodkin lr %r0, [%ecr] /* all stack addressing is manual so far */ 618ee28251SAlexey Brodkin st %r0, [%sp] 628ee28251SAlexey Brodkin st %sp, [%sp, -4] 638ee28251SAlexey Brodkin /* now move %sp to reg->r0 position so we can do "push" automatically */ 648ee28251SAlexey Brodkin sub %sp, %sp, 8 658ee28251SAlexey Brodkin 668ee28251SAlexey Brodkin SAVE_R1_TO_R24 678ee28251SAlexey Brodkin PUSH %r25 688ee28251SAlexey Brodkin PUSH %gp 698ee28251SAlexey Brodkin PUSH %fp 708ee28251SAlexey Brodkin PUSH %blink 718ee28251SAlexey Brodkin PUSHAX %eret 728ee28251SAlexey Brodkin PUSHAX %erstatus 738ee28251SAlexey Brodkin PUSH %lp_count 748ee28251SAlexey Brodkin PUSHAX %lp_end 758ee28251SAlexey Brodkin PUSHAX %lp_start 768ee28251SAlexey Brodkin PUSHAX %erbta 778ee28251SAlexey Brodkin.endm 788ee28251SAlexey Brodkin 798ee28251SAlexey Brodkin.macro SAVE_EXCEPTION_SOURCE 808ee28251SAlexey Brodkin#ifdef CONFIG_MMU 818ee28251SAlexey Brodkin /* If MMU exists exception faulting address is loaded in EFA reg */ 828ee28251SAlexey Brodkin lr %r0, [%efa] 838ee28251SAlexey Brodkin#else 848ee28251SAlexey Brodkin /* Otherwise in ERET (exception return) reg */ 858ee28251SAlexey Brodkin lr %r0, [%eret] 868ee28251SAlexey Brodkin#endif 878ee28251SAlexey Brodkin.endm 888ee28251SAlexey Brodkin 898ee28251SAlexey BrodkinENTRY(memory_error) 908ee28251SAlexey Brodkin SAVE_ALL_SYS 918ee28251SAlexey Brodkin SAVE_EXCEPTION_SOURCE 928ee28251SAlexey Brodkin mov %r1, %sp 938ee28251SAlexey Brodkin j do_memory_error 948ee28251SAlexey BrodkinENDPROC(memory_error) 958ee28251SAlexey Brodkin 968ee28251SAlexey BrodkinENTRY(instruction_error) 978ee28251SAlexey Brodkin SAVE_ALL_SYS 988ee28251SAlexey Brodkin SAVE_EXCEPTION_SOURCE 998ee28251SAlexey Brodkin mov %r1, %sp 1008ee28251SAlexey Brodkin j do_instruction_error 1018ee28251SAlexey BrodkinENDPROC(instruction_error) 1028ee28251SAlexey Brodkin 1038ee28251SAlexey BrodkinENTRY(interrupt_handler) 1048ee28251SAlexey Brodkin /* Todo - save and restore CPU context when interrupts will be in use */ 1058ee28251SAlexey Brodkin bl do_interrupt_handler 1068ee28251SAlexey Brodkin rtie 1078ee28251SAlexey BrodkinENDPROC(interrupt_handler) 1088ee28251SAlexey Brodkin 1098ee28251SAlexey BrodkinENTRY(EV_MachineCheck) 1108ee28251SAlexey Brodkin SAVE_ALL_SYS 1118ee28251SAlexey Brodkin SAVE_EXCEPTION_SOURCE 1128ee28251SAlexey Brodkin mov %r1, %sp 1138ee28251SAlexey Brodkin j do_machine_check_fault 1148ee28251SAlexey BrodkinENDPROC(EV_MachineCheck) 1158ee28251SAlexey Brodkin 1168ee28251SAlexey BrodkinENTRY(EV_TLBMissI) 1178ee28251SAlexey Brodkin SAVE_ALL_SYS 1188ee28251SAlexey Brodkin mov %r0, %sp 1198ee28251SAlexey Brodkin j do_itlb_miss 1208ee28251SAlexey BrodkinENDPROC(EV_TLBMissI) 1218ee28251SAlexey Brodkin 1228ee28251SAlexey BrodkinENTRY(EV_TLBMissD) 1238ee28251SAlexey Brodkin SAVE_ALL_SYS 1248ee28251SAlexey Brodkin mov %r0, %sp 1258ee28251SAlexey Brodkin j do_dtlb_miss 1268ee28251SAlexey BrodkinENDPROC(EV_TLBMissD) 1278ee28251SAlexey Brodkin 1288ee28251SAlexey BrodkinENTRY(EV_TLBProtV) 1298ee28251SAlexey Brodkin SAVE_ALL_SYS 1308ee28251SAlexey Brodkin SAVE_EXCEPTION_SOURCE 1318ee28251SAlexey Brodkin mov %r1, %sp 1328ee28251SAlexey Brodkin j do_tlb_prot_violation 1338ee28251SAlexey BrodkinENDPROC(EV_TLBProtV) 1348ee28251SAlexey Brodkin 1358ee28251SAlexey BrodkinENTRY(EV_PrivilegeV) 1368ee28251SAlexey Brodkin SAVE_ALL_SYS 1378ee28251SAlexey Brodkin mov %r0, %sp 1388ee28251SAlexey Brodkin j do_privilege_violation 1398ee28251SAlexey BrodkinENDPROC(EV_PrivilegeV) 1408ee28251SAlexey Brodkin 1418ee28251SAlexey BrodkinENTRY(EV_Trap) 1428ee28251SAlexey Brodkin SAVE_ALL_SYS 1438ee28251SAlexey Brodkin mov %r0, %sp 1448ee28251SAlexey Brodkin j do_trap 1458ee28251SAlexey BrodkinENDPROC(EV_Trap) 1468ee28251SAlexey Brodkin 1478ee28251SAlexey BrodkinENTRY(EV_Extension) 1488ee28251SAlexey Brodkin SAVE_ALL_SYS 1498ee28251SAlexey Brodkin mov %r0, %sp 1508ee28251SAlexey Brodkin j do_extension 1518ee28251SAlexey BrodkinENDPROC(EV_Extension) 152*699c4e59SAlexey Brodkin 153*699c4e59SAlexey Brodkin#ifdef CONFIG_ISA_ARCV2 154*699c4e59SAlexey BrodkinENTRY(EV_SWI) 155*699c4e59SAlexey Brodkin SAVE_ALL_SYS 156*699c4e59SAlexey Brodkin mov %r0, %sp 157*699c4e59SAlexey Brodkin j do_swi 158*699c4e59SAlexey BrodkinENDPROC(EV_SWI) 159*699c4e59SAlexey Brodkin 160*699c4e59SAlexey BrodkinENTRY(EV_DivZero) 161*699c4e59SAlexey Brodkin SAVE_ALL_SYS 162*699c4e59SAlexey Brodkin SAVE_EXCEPTION_SOURCE 163*699c4e59SAlexey Brodkin mov %r1, %sp 164*699c4e59SAlexey Brodkin j do_divzero 165*699c4e59SAlexey BrodkinENDPROC(EV_DivZero) 166*699c4e59SAlexey Brodkin 167*699c4e59SAlexey BrodkinENTRY(EV_DCError) 168*699c4e59SAlexey Brodkin SAVE_ALL_SYS 169*699c4e59SAlexey Brodkin mov %r0, %sp 170*699c4e59SAlexey Brodkin j do_dcerror 171*699c4e59SAlexey BrodkinENDPROC(EV_DCError) 172*699c4e59SAlexey Brodkin 173*699c4e59SAlexey BrodkinENTRY(EV_Maligned) 174*699c4e59SAlexey Brodkin SAVE_ALL_SYS 175*699c4e59SAlexey Brodkin SAVE_EXCEPTION_SOURCE 176*699c4e59SAlexey Brodkin mov %r1, %sp 177*699c4e59SAlexey Brodkin j do_maligned 178*699c4e59SAlexey BrodkinENDPROC(EV_Maligned) 179*699c4e59SAlexey Brodkin#endif 180