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