Skip to content
Snippets Groups Projects
ints_low.S 2.47 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * Copyright (C) 2013-2015 Synopsys, Inc. All rights reserved.
     *
     * SPDX-License-Identifier:	GPL-2.0+
     */
    
    #include <linux/linkage.h>
    
    /*
     * Note on the LD/ST addressing modes with address register write-back
     *
     * LD.a same as LD.aw
     *
     * LD.a    reg1, [reg2, x]  => Pre Incr
     *      Eff Addr for load = [reg2 + x]
     *
     * LD.ab   reg1, [reg2, x]  => Post Incr
     *      Eff Addr for load = [reg2]
     */
    
    .macro PUSH reg
    	st.a	\reg, [%sp, -4]
    .endm
    
    .macro PUSHAX aux
    	lr	%r9, [\aux]
    	PUSH	%r9
    .endm
    
    .macro  SAVE_R1_TO_R24
    	PUSH	%r1
    	PUSH	%r2
    	PUSH	%r3
    	PUSH	%r4
    	PUSH	%r5
    	PUSH	%r6
    	PUSH	%r7
    	PUSH	%r8
    	PUSH	%r9
    	PUSH	%r10
    	PUSH	%r11
    	PUSH	%r12
    	PUSH	%r13
    	PUSH	%r14
    	PUSH	%r15
    	PUSH	%r16
    	PUSH	%r17
    	PUSH	%r18
    	PUSH	%r19
    	PUSH	%r20
    	PUSH	%r21
    	PUSH	%r22
    	PUSH	%r23
    	PUSH	%r24
    .endm
    
    .macro SAVE_ALL_SYS
    	/* saving %r0 to reg->r0 in advance since we read %ecr into it */
    	st	%r0, [%sp, -8]
    	lr	%r0, [%ecr]	/* all stack addressing is manual so far */
    	st	%r0, [%sp]
    	st	%sp, [%sp, -4]
    	/* now move %sp to reg->r0 position so we can do "push" automatically */
    	sub	%sp, %sp, 8
    
    	SAVE_R1_TO_R24
    	PUSH	%r25
    	PUSH	%gp
    	PUSH	%fp
    	PUSH	%blink
    	PUSHAX	%eret
    	PUSHAX	%erstatus
    	PUSH	%lp_count
    	PUSHAX	%lp_end
    	PUSHAX	%lp_start
    	PUSHAX	%erbta
    .endm
    
    .macro SAVE_EXCEPTION_SOURCE
    #ifdef CONFIG_MMU
    	/* If MMU exists exception faulting address is loaded in EFA reg */
    	lr	%r0, [%efa]
    #else
    	/* Otherwise in ERET (exception return) reg */
    	lr	%r0, [%eret]
    #endif
    .endm
    
    ENTRY(memory_error)
    	SAVE_ALL_SYS
    	SAVE_EXCEPTION_SOURCE
    	mov	%r1, %sp
    	j	do_memory_error
    ENDPROC(memory_error)
    
    ENTRY(instruction_error)
    	SAVE_ALL_SYS
    	SAVE_EXCEPTION_SOURCE
    	mov	%r1, %sp
    	j	do_instruction_error
    ENDPROC(instruction_error)
    
    ENTRY(interrupt_handler)
    	/* Todo - save and restore CPU context when interrupts will be in use */
    	bl	do_interrupt_handler
    	rtie
    ENDPROC(interrupt_handler)
    
    ENTRY(EV_MachineCheck)
    	SAVE_ALL_SYS
    	SAVE_EXCEPTION_SOURCE
    	mov	%r1, %sp
    	j	do_machine_check_fault
    ENDPROC(EV_MachineCheck)
    
    ENTRY(EV_TLBMissI)
    	SAVE_ALL_SYS
    	mov	%r0, %sp
    	j	do_itlb_miss
    ENDPROC(EV_TLBMissI)
    
    ENTRY(EV_TLBMissD)
    	SAVE_ALL_SYS
    	mov	%r0, %sp
    	j	do_dtlb_miss
    ENDPROC(EV_TLBMissD)
    
    ENTRY(EV_TLBProtV)
    	SAVE_ALL_SYS
    	SAVE_EXCEPTION_SOURCE
    	mov	%r1, %sp
    	j	do_tlb_prot_violation
    ENDPROC(EV_TLBProtV)
    
    ENTRY(EV_PrivilegeV)
    	SAVE_ALL_SYS
    	mov	%r0, %sp
    	j	do_privilege_violation
    ENDPROC(EV_PrivilegeV)
    
    ENTRY(EV_Trap)
    	SAVE_ALL_SYS
    	mov	%r0, %sp
    	j	do_trap
    ENDPROC(EV_Trap)
    
    ENTRY(EV_Extension)
    	SAVE_ALL_SYS
    	mov	%r0, %sp
    	j	do_extension
    ENDPROC(EV_Extension)