11f6ccfffSVineet Gupta/* 21f6ccfffSVineet Gupta * ARCv2 ISA based core Low Level Intr/Traps/Exceptions(non-TLB) Handling 31f6ccfffSVineet Gupta * 41f6ccfffSVineet Gupta * Copyright (C) 2013 Synopsys, Inc. (www.synopsys.com) 51f6ccfffSVineet Gupta * 61f6ccfffSVineet Gupta * This program is free software; you can redistribute it and/or modify 71f6ccfffSVineet Gupta * it under the terms of the GNU General Public License version 2 as 81f6ccfffSVineet Gupta * published by the Free Software Foundation. 91f6ccfffSVineet Gupta */ 101f6ccfffSVineet Gupta 111f6ccfffSVineet Gupta#include <linux/linkage.h> /* ARC_{EXTRY,EXIT} */ 121f6ccfffSVineet Gupta#include <asm/entry.h> /* SAVE_ALL_{INT1,INT2,TRAP...} */ 131f6ccfffSVineet Gupta#include <asm/errno.h> 141f6ccfffSVineet Gupta#include <asm/arcregs.h> 151f6ccfffSVineet Gupta#include <asm/irqflags.h> 161f6ccfffSVineet Gupta 171f6ccfffSVineet Gupta .cpu HS 181f6ccfffSVineet Gupta 191f6ccfffSVineet Gupta#define VECTOR .word 201f6ccfffSVineet Gupta 211f6ccfffSVineet Gupta;############################ Vector Table ################################# 221f6ccfffSVineet Gupta 231f6ccfffSVineet Gupta .section .vector,"a",@progbits 241f6ccfffSVineet Gupta .align 4 251f6ccfffSVineet Gupta 261f6ccfffSVineet Gupta# Initial 16 slots are Exception Vectors 273971cdc2SVineet GuptaVECTOR res_service ; Reset Vector 281f6ccfffSVineet GuptaVECTOR mem_service ; Mem exception 291f6ccfffSVineet GuptaVECTOR instr_service ; Instrn Error 301f6ccfffSVineet GuptaVECTOR EV_MachineCheck ; Fatal Machine check 311f6ccfffSVineet GuptaVECTOR EV_TLBMissI ; Intruction TLB miss 321f6ccfffSVineet GuptaVECTOR EV_TLBMissD ; Data TLB miss 331f6ccfffSVineet GuptaVECTOR EV_TLBProtV ; Protection Violation 341f6ccfffSVineet GuptaVECTOR EV_PrivilegeV ; Privilege Violation 351f6ccfffSVineet GuptaVECTOR EV_SWI ; Software Breakpoint 361f6ccfffSVineet GuptaVECTOR EV_Trap ; Trap exception 371f6ccfffSVineet GuptaVECTOR EV_Extension ; Extn Instruction Exception 381f6ccfffSVineet GuptaVECTOR EV_DivZero ; Divide by Zero 391f6ccfffSVineet GuptaVECTOR EV_DCError ; Data Cache Error 401f6ccfffSVineet GuptaVECTOR EV_Misaligned ; Misaligned Data Access 411f6ccfffSVineet GuptaVECTOR reserved ; Reserved slots 421f6ccfffSVineet GuptaVECTOR reserved ; Reserved slots 431f6ccfffSVineet Gupta 441f6ccfffSVineet Gupta# Begin Interrupt Vectors 451f6ccfffSVineet GuptaVECTOR handle_interrupt ; (16) Timer0 461f6ccfffSVineet GuptaVECTOR handle_interrupt ; unused (Timer1) 471f6ccfffSVineet GuptaVECTOR handle_interrupt ; unused (WDT) 48bb143f81SVineet GuptaVECTOR handle_interrupt ; (19) Inter core Interrupt (IPI) 49bb143f81SVineet GuptaVECTOR handle_interrupt ; (20) perf Interrupt 50bb143f81SVineet GuptaVECTOR handle_interrupt ; (21) Software Triggered Intr (Self IPI) 51bb143f81SVineet GuptaVECTOR handle_interrupt ; unused 52bb143f81SVineet GuptaVECTOR handle_interrupt ; (23) unused 53bb143f81SVineet Gupta# End of fixed IRQs 541f6ccfffSVineet Gupta 551f6ccfffSVineet Gupta.rept CONFIG_ARC_NUMBER_OF_INTERRUPTS - 8 561f6ccfffSVineet Gupta VECTOR handle_interrupt 571f6ccfffSVineet Gupta.endr 581f6ccfffSVineet Gupta 591f6ccfffSVineet Gupta .section .text, "ax",@progbits 601f6ccfffSVineet Gupta 613d592659SVineet Guptareserved: 623d592659SVineet Gupta flag 1 ; Unexpected event, halt 631f6ccfffSVineet Gupta 641f6ccfffSVineet Gupta;##################### Interrupt Handling ############################## 651f6ccfffSVineet Gupta 661f6ccfffSVineet GuptaENTRY(handle_interrupt) 671f6ccfffSVineet Gupta 681f6ccfffSVineet Gupta INTERRUPT_PROLOGUE irq 691f6ccfffSVineet Gupta 7078833e79SVineet Gupta # irq control APIs local_irq_save/restore/disable/enable fiddle with 7178833e79SVineet Gupta # global interrupt enable bits in STATUS32 (.IE for 1 prio, .E[] for 2 prio) 7278833e79SVineet Gupta # However a taken interrupt doesn't clear these bits. Thus irqs_disabled() 7378833e79SVineet Gupta # query in hard ISR path would return false (since .IE is set) which would 7478833e79SVineet Gupta # trips genirq interrupt handling asserts. 7578833e79SVineet Gupta # 7678833e79SVineet Gupta # So do a "soft" disable of interrutps here. 7778833e79SVineet Gupta # 7878833e79SVineet Gupta # Note this disable is only for consistent book-keeping as further interrupts 7978833e79SVineet Gupta # will be disabled anyways even w/o this. Hardware tracks active interrupts 8078833e79SVineet Gupta # seperately in AUX_IRQ_ACTIVE.active and will not take new interrupts 8178833e79SVineet Gupta # unless this one returns (or higher prio becomes pending in 2-prio scheme) 821f6ccfffSVineet Gupta 8378833e79SVineet Gupta IRQ_DISABLE 841f6ccfffSVineet Gupta 8578833e79SVineet Gupta ; icause is banked: one per priority level 8678833e79SVineet Gupta ; so a higher prio interrupt taken here won't clobber prev prio icause 87d9676fa1SEvgeny Voevodin lr r0, [ICAUSE] 881f6ccfffSVineet Gupta mov blink, ret_from_exception 891f6ccfffSVineet Gupta 901f6ccfffSVineet Gupta b.d arch_do_IRQ 911f6ccfffSVineet Gupta mov r1, sp 921f6ccfffSVineet Gupta 931f6ccfffSVineet GuptaEND(handle_interrupt) 941f6ccfffSVineet Gupta 951f6ccfffSVineet Gupta;################### Non TLB Exception Handling ############################# 961f6ccfffSVineet Gupta 971f6ccfffSVineet GuptaENTRY(EV_SWI) 981f6ccfffSVineet Gupta flag 1 991f6ccfffSVineet GuptaEND(EV_SWI) 1001f6ccfffSVineet Gupta 1011f6ccfffSVineet GuptaENTRY(EV_DivZero) 1021f6ccfffSVineet Gupta flag 1 1031f6ccfffSVineet GuptaEND(EV_DivZero) 1041f6ccfffSVineet Gupta 1051f6ccfffSVineet GuptaENTRY(EV_DCError) 1061f6ccfffSVineet Gupta flag 1 1071f6ccfffSVineet GuptaEND(EV_DCError) 1081f6ccfffSVineet Gupta 109541366daSVineet Gupta; --------------------------------------------- 110541366daSVineet Gupta; Memory Error Exception Handler 111541366daSVineet Gupta; - Unlike ARCompact, handles Bus errors for both User/Kernel mode, 112541366daSVineet Gupta; Instruction fetch or Data access, under a single Exception Vector 113541366daSVineet Gupta; --------------------------------------------- 114541366daSVineet Gupta 115541366daSVineet GuptaENTRY(mem_service) 116541366daSVineet Gupta 117541366daSVineet Gupta EXCEPTION_PROLOGUE 118541366daSVineet Gupta 119541366daSVineet Gupta lr r0, [efa] 120541366daSVineet Gupta mov r1, sp 121541366daSVineet Gupta 122541366daSVineet Gupta FAKE_RET_FROM_EXCPN 123541366daSVineet Gupta 124541366daSVineet Gupta bl do_memory_error 125541366daSVineet Gupta b ret_from_exception 126541366daSVineet GuptaEND(mem_service) 127541366daSVineet Gupta 1281f6ccfffSVineet GuptaENTRY(EV_Misaligned) 1291f6ccfffSVineet Gupta 1301f6ccfffSVineet Gupta EXCEPTION_PROLOGUE 1311f6ccfffSVineet Gupta 1321f6ccfffSVineet Gupta lr r0, [efa] ; Faulting Data address 1331f6ccfffSVineet Gupta mov r1, sp 1341f6ccfffSVineet Gupta 1351f6ccfffSVineet Gupta FAKE_RET_FROM_EXCPN 1361f6ccfffSVineet Gupta 1371f6ccfffSVineet Gupta SAVE_CALLEE_SAVED_USER 1381f6ccfffSVineet Gupta mov r2, sp ; callee_regs 1391f6ccfffSVineet Gupta 1401f6ccfffSVineet Gupta bl do_misaligned_access 1411f6ccfffSVineet Gupta 1421f6ccfffSVineet Gupta ; TBD: optimize - do this only if a callee reg was involved 1431f6ccfffSVineet Gupta ; either a dst of emulated LD/ST or src with address-writeback 1441f6ccfffSVineet Gupta RESTORE_CALLEE_SAVED_USER 1451f6ccfffSVineet Gupta 1461f6ccfffSVineet Gupta b ret_from_exception 1471f6ccfffSVineet GuptaEND(EV_Misaligned) 1481f6ccfffSVineet Gupta 1491f6ccfffSVineet Gupta; --------------------------------------------- 1501f6ccfffSVineet Gupta; Protection Violation Exception Handler 1511f6ccfffSVineet Gupta; --------------------------------------------- 1521f6ccfffSVineet Gupta 1531f6ccfffSVineet GuptaENTRY(EV_TLBProtV) 1541f6ccfffSVineet Gupta 1551f6ccfffSVineet Gupta EXCEPTION_PROLOGUE 1561f6ccfffSVineet Gupta 1571f6ccfffSVineet Gupta lr r0, [efa] ; Faulting Data address 1581f6ccfffSVineet Gupta mov r1, sp ; pt_regs 1591f6ccfffSVineet Gupta 1601f6ccfffSVineet Gupta FAKE_RET_FROM_EXCPN 1611f6ccfffSVineet Gupta 1621f6ccfffSVineet Gupta mov blink, ret_from_exception 1631f6ccfffSVineet Gupta b do_page_fault 1641f6ccfffSVineet Gupta 1651f6ccfffSVineet GuptaEND(EV_TLBProtV) 1661f6ccfffSVineet Gupta 1671f6ccfffSVineet Gupta; From Linux standpoint Slow Path I/D TLB Miss is same a ProtV as they 1681f6ccfffSVineet Gupta; need to call do_page_fault(). 1691f6ccfffSVineet Gupta; ECR in pt_regs provides whether access was R/W/X 1701f6ccfffSVineet Gupta 1711f6ccfffSVineet Gupta.global call_do_page_fault 1721f6ccfffSVineet Gupta.set call_do_page_fault, EV_TLBProtV 1731f6ccfffSVineet Gupta 1741f6ccfffSVineet Gupta;############# Common Handlers for ARCompact and ARCv2 ############## 1751f6ccfffSVineet Gupta 1761f6ccfffSVineet Gupta#include "entry.S" 1771f6ccfffSVineet Gupta 1781f6ccfffSVineet Gupta;############# Return from Intr/Excp/Trap (ARCv2 ISA Specifics) ############## 1791f6ccfffSVineet Gupta; 1801f6ccfffSVineet Gupta; Restore the saved sys context (common exit-path for EXCPN/IRQ/Trap) 1811f6ccfffSVineet Gupta; IRQ shd definitely not happen between now and rtie 1821f6ccfffSVineet Gupta; All 2 entry points to here already disable interrupts 1831f6ccfffSVineet Gupta 1841f6ccfffSVineet Gupta.Lrestore_regs: 18578833e79SVineet Guptarestore_regs: 1861f6ccfffSVineet Gupta 187d9676fa1SEvgeny Voevodin # Interrpts are actually disabled from this point on, but will get 188d9676fa1SEvgeny Voevodin # reenabled after we return from interrupt/exception. 189d9676fa1SEvgeny Voevodin # But irq tracer needs to be told now... 190d9676fa1SEvgeny Voevodin TRACE_ASM_IRQ_ENABLE 191d9676fa1SEvgeny Voevodin 1921f6ccfffSVineet Gupta ld r0, [sp, PT_status32] ; U/K mode at time of entry 1931f6ccfffSVineet Gupta lr r10, [AUX_IRQ_ACT] 1941f6ccfffSVineet Gupta 1951f6ccfffSVineet Gupta bmsk r11, r10, 15 ; AUX_IRQ_ACT.ACTIVE 1961f6ccfffSVineet Gupta breq r11, 0, .Lexcept_ret ; No intr active, ret from Exception 1971f6ccfffSVineet Gupta 1981f6ccfffSVineet Gupta;####### Return from Intr ####### 1991f6ccfffSVineet Gupta 2001f6ccfffSVineet Guptadebug_marker_l1: 2014255b07fSVineet Gupta bbit1.nt r0, STATUS_DE_BIT, .Lintr_ret_to_delay_slot 2024255b07fSVineet Gupta 2034255b07fSVineet Gupta.Lisr_ret_fast_path: 2041f6ccfffSVineet Gupta ; Handle special case #1: (Entry via Exception, Return via IRQ) 2051f6ccfffSVineet Gupta ; 2061f6ccfffSVineet Gupta ; Exception in U mode, preempted in kernel, Intr taken (K mode), orig 2071f6ccfffSVineet Gupta ; task now returning to U mode (riding the Intr) 2081f6ccfffSVineet Gupta ; AUX_IRQ_ACTIVE won't have U bit set (since intr in K mode), hence SP 2091f6ccfffSVineet Gupta ; won't be switched to correct U mode value (from AUX_SP) 2101f6ccfffSVineet Gupta ; So force AUX_IRQ_ACT.U for such a case 2111f6ccfffSVineet Gupta 2121f6ccfffSVineet Gupta btst r0, STATUS_U_BIT ; Z flag set if K (Z clear for U) 2131f6ccfffSVineet Gupta bset.nz r11, r11, AUX_IRQ_ACT_BIT_U ; NZ means U 2141f6ccfffSVineet Gupta sr r11, [AUX_IRQ_ACT] 2151f6ccfffSVineet Gupta 2161f6ccfffSVineet Gupta INTERRUPT_EPILOGUE irq 2171f6ccfffSVineet Gupta rtie 2181f6ccfffSVineet Gupta 2191f6ccfffSVineet Gupta;####### Return from Exception / pure kernel mode ####### 2201f6ccfffSVineet Gupta 2211f6ccfffSVineet Gupta.Lexcept_ret: ; Expects r0 has PT_status32 2221f6ccfffSVineet Gupta 2231f6ccfffSVineet Guptadebug_marker_syscall: 2241f6ccfffSVineet Gupta EXCEPTION_EPILOGUE 2251f6ccfffSVineet Gupta rtie 2261f6ccfffSVineet Gupta 2274255b07fSVineet Gupta;####### Return from Intr to insn in delay slot ####### 2284255b07fSVineet Gupta 2294255b07fSVineet Gupta; Handle special case #2: (Entry via Exception in Delay Slot, Return via IRQ) 2304255b07fSVineet Gupta; 2314255b07fSVineet Gupta; Intr returning to a Delay Slot (DS) insn 2324255b07fSVineet Gupta; (since IRQ NOT allowed in DS in ARCv2, this can only happen if orig 2334255b07fSVineet Gupta; entry was via Exception in DS which got preempted in kernel). 2344255b07fSVineet Gupta; 235cbfe74a7SVineet Gupta; IRQ RTIE won't reliably restore DE bit and/or BTA, needs workaround 236cbfe74a7SVineet Gupta; 237cbfe74a7SVineet Gupta; Solution is return from Intr w/o any delay slot quirks into a kernel trampoline 238cbfe74a7SVineet Gupta; and from pure kernel mode return to delay slot which handles DS bit/BTA correctly 239cbfe74a7SVineet Gupta 2404255b07fSVineet Gupta.Lintr_ret_to_delay_slot: 2414255b07fSVineet Guptadebug_marker_ds: 2424255b07fSVineet Gupta 2434255b07fSVineet Gupta ld r2, [@intr_to_DE_cnt] 2444255b07fSVineet Gupta add r2, r2, 1 2454255b07fSVineet Gupta st r2, [@intr_to_DE_cnt] 2464255b07fSVineet Gupta 2474255b07fSVineet Gupta ld r2, [sp, PT_ret] 2484255b07fSVineet Gupta ld r3, [sp, PT_status32] 2494255b07fSVineet Gupta 250cbfe74a7SVineet Gupta ; STAT32 for Int return created from scratch 251cbfe74a7SVineet Gupta ; (No delay dlot, disable Further intr in trampoline) 252cbfe74a7SVineet Gupta 2534255b07fSVineet Gupta bic r0, r3, STATUS_U_MASK|STATUS_DE_MASK|STATUS_IE_MASK|STATUS_L_MASK 2544255b07fSVineet Gupta st r0, [sp, PT_status32] 2554255b07fSVineet Gupta 2564255b07fSVineet Gupta mov r1, .Lintr_ret_to_delay_slot_2 2574255b07fSVineet Gupta st r1, [sp, PT_ret] 2584255b07fSVineet Gupta 259cbfe74a7SVineet Gupta ; Orig exception PC/STAT32 safekept @orig_r0 and @event stack slots 2604255b07fSVineet Gupta st r2, [sp, 0] 2614255b07fSVineet Gupta st r3, [sp, 4] 2624255b07fSVineet Gupta 2634255b07fSVineet Gupta b .Lisr_ret_fast_path 2644255b07fSVineet Gupta 2654255b07fSVineet Gupta.Lintr_ret_to_delay_slot_2: 266cbfe74a7SVineet Gupta ; Trampoline to restore orig exception PC/STAT32/BTA/AUX_USER_SP 2674255b07fSVineet Gupta sub sp, sp, SZ_PT_REGS 2684255b07fSVineet Gupta st r9, [sp, -4] 2694255b07fSVineet Gupta 2704255b07fSVineet Gupta ld r9, [sp, 0] 2714255b07fSVineet Gupta sr r9, [eret] 2724255b07fSVineet Gupta 2734255b07fSVineet Gupta ld r9, [sp, 4] 2744255b07fSVineet Gupta sr r9, [erstatus] 2754255b07fSVineet Gupta 276cbfe74a7SVineet Gupta ; restore AUX_USER_SP if returning to U mode 277cbfe74a7SVineet Gupta bbit0 r9, STATUS_U_BIT, 1f 278cbfe74a7SVineet Gupta ld r9, [sp, PT_sp] 279cbfe74a7SVineet Gupta sr r9, [AUX_USER_SP] 280cbfe74a7SVineet Gupta 281cbfe74a7SVineet Gupta1: 2824255b07fSVineet Gupta ld r9, [sp, 8] 2834255b07fSVineet Gupta sr r9, [erbta] 2844255b07fSVineet Gupta 2854255b07fSVineet Gupta ld r9, [sp, -4] 2864255b07fSVineet Gupta add sp, sp, SZ_PT_REGS 287cbfe74a7SVineet Gupta 288cbfe74a7SVineet Gupta ; return from pure kernel mode to delay slot 2894255b07fSVineet Gupta rtie 2904255b07fSVineet Gupta 2911f6ccfffSVineet GuptaEND(ret_from_exception) 292