127d22413SLey Foon Tan /* 227d22413SLey Foon Tan * Copyright (C) 2010 Tobias Klauser <tklauser@distanz.ch> 327d22413SLey Foon Tan * Copyright (C) 2004 Microtronix Datacom Ltd. 427d22413SLey Foon Tan * 527d22413SLey Foon Tan * This file is subject to the terms and conditions of the GNU General Public 627d22413SLey Foon Tan * License. See the file "COPYING" in the main directory of this archive 727d22413SLey Foon Tan * for more details. 827d22413SLey Foon Tan */ 927d22413SLey Foon Tan 1027d22413SLey Foon Tan #ifndef _ASM_NIOS2_ENTRY_H 1127d22413SLey Foon Tan #define _ASM_NIOS2_ENTRY_H 1227d22413SLey Foon Tan 1327d22413SLey Foon Tan #ifdef __ASSEMBLY__ 1427d22413SLey Foon Tan 1527d22413SLey Foon Tan #include <asm/processor.h> 1627d22413SLey Foon Tan #include <asm/registers.h> 1727d22413SLey Foon Tan #include <asm/asm-offsets.h> 1827d22413SLey Foon Tan 1927d22413SLey Foon Tan /* 2027d22413SLey Foon Tan * Standard Nios2 interrupt entry and exit macros. 2127d22413SLey Foon Tan * Must be called with interrupts disabled. 2227d22413SLey Foon Tan */ 2327d22413SLey Foon Tan .macro SAVE_ALL 2427d22413SLey Foon Tan rdctl r24, estatus 2527d22413SLey Foon Tan andi r24, r24, ESTATUS_EU 2627d22413SLey Foon Tan beq r24, r0, 1f /* In supervisor mode, already on kernel stack */ 2727d22413SLey Foon Tan 2827d22413SLey Foon Tan movia r24, _current_thread /* Switch to current kernel stack */ 2927d22413SLey Foon Tan ldw r24, 0(r24) /* using the thread_info */ 3027d22413SLey Foon Tan addi r24, r24, THREAD_SIZE-PT_REGS_SIZE 3127d22413SLey Foon Tan stw sp, PT_SP(r24) /* Save user stack before changing */ 3227d22413SLey Foon Tan mov sp, r24 3327d22413SLey Foon Tan br 2f 3427d22413SLey Foon Tan 3527d22413SLey Foon Tan 1 : mov r24, sp 3627d22413SLey Foon Tan addi sp, sp, -PT_REGS_SIZE /* Backup the kernel stack pointer */ 3727d22413SLey Foon Tan stw r24, PT_SP(sp) 3827d22413SLey Foon Tan 2 : stw r1, PT_R1(sp) 3927d22413SLey Foon Tan stw r2, PT_R2(sp) 4027d22413SLey Foon Tan stw r3, PT_R3(sp) 4127d22413SLey Foon Tan stw r4, PT_R4(sp) 4227d22413SLey Foon Tan stw r5, PT_R5(sp) 4327d22413SLey Foon Tan stw r6, PT_R6(sp) 4427d22413SLey Foon Tan stw r7, PT_R7(sp) 4527d22413SLey Foon Tan stw r8, PT_R8(sp) 4627d22413SLey Foon Tan stw r9, PT_R9(sp) 4727d22413SLey Foon Tan stw r10, PT_R10(sp) 4827d22413SLey Foon Tan stw r11, PT_R11(sp) 4927d22413SLey Foon Tan stw r12, PT_R12(sp) 5027d22413SLey Foon Tan stw r13, PT_R13(sp) 5127d22413SLey Foon Tan stw r14, PT_R14(sp) 5227d22413SLey Foon Tan stw r15, PT_R15(sp) 5335d5fd70SAl Viro movi r24, -1 5435d5fd70SAl Viro stw r24, PT_ORIG_R2(sp) 5527d22413SLey Foon Tan stw r7, PT_ORIG_R7(sp) 5627d22413SLey Foon Tan 5727d22413SLey Foon Tan stw ra, PT_RA(sp) 5827d22413SLey Foon Tan stw fp, PT_FP(sp) 5927d22413SLey Foon Tan stw gp, PT_GP(sp) 6027d22413SLey Foon Tan rdctl r24, estatus 6127d22413SLey Foon Tan stw r24, PT_ESTATUS(sp) 6227d22413SLey Foon Tan stw ea, PT_EA(sp) 6327d22413SLey Foon Tan .endm 6427d22413SLey Foon Tan 6527d22413SLey Foon Tan .macro RESTORE_ALL 6627d22413SLey Foon Tan ldw r1, PT_R1(sp) /* Restore registers */ 6727d22413SLey Foon Tan ldw r2, PT_R2(sp) 6827d22413SLey Foon Tan ldw r3, PT_R3(sp) 6927d22413SLey Foon Tan ldw r4, PT_R4(sp) 7027d22413SLey Foon Tan ldw r5, PT_R5(sp) 7127d22413SLey Foon Tan ldw r6, PT_R6(sp) 7227d22413SLey Foon Tan ldw r7, PT_R7(sp) 7327d22413SLey Foon Tan ldw r8, PT_R8(sp) 7427d22413SLey Foon Tan ldw r9, PT_R9(sp) 7527d22413SLey Foon Tan ldw r10, PT_R10(sp) 7627d22413SLey Foon Tan ldw r11, PT_R11(sp) 7727d22413SLey Foon Tan ldw r12, PT_R12(sp) 7827d22413SLey Foon Tan ldw r13, PT_R13(sp) 7927d22413SLey Foon Tan ldw r14, PT_R14(sp) 8027d22413SLey Foon Tan ldw r15, PT_R15(sp) 8127d22413SLey Foon Tan ldw ra, PT_RA(sp) 8227d22413SLey Foon Tan ldw fp, PT_FP(sp) 8327d22413SLey Foon Tan ldw gp, PT_GP(sp) 8427d22413SLey Foon Tan ldw r24, PT_ESTATUS(sp) 8527d22413SLey Foon Tan wrctl estatus, r24 8627d22413SLey Foon Tan ldw ea, PT_EA(sp) 8727d22413SLey Foon Tan ldw sp, PT_SP(sp) /* Restore sp last */ 8827d22413SLey Foon Tan .endm 8927d22413SLey Foon Tan 9027d22413SLey Foon Tan .macro SAVE_SWITCH_STACK 9127d22413SLey Foon Tan addi sp, sp, -SWITCH_STACK_SIZE 9227d22413SLey Foon Tan stw r16, SW_R16(sp) 9327d22413SLey Foon Tan stw r17, SW_R17(sp) 9427d22413SLey Foon Tan stw r18, SW_R18(sp) 9527d22413SLey Foon Tan stw r19, SW_R19(sp) 9627d22413SLey Foon Tan stw r20, SW_R20(sp) 9727d22413SLey Foon Tan stw r21, SW_R21(sp) 9827d22413SLey Foon Tan stw r22, SW_R22(sp) 9927d22413SLey Foon Tan stw r23, SW_R23(sp) 10027d22413SLey Foon Tan stw fp, SW_FP(sp) 10127d22413SLey Foon Tan stw gp, SW_GP(sp) 10227d22413SLey Foon Tan stw ra, SW_RA(sp) 10327d22413SLey Foon Tan .endm 10427d22413SLey Foon Tan 10527d22413SLey Foon Tan .macro RESTORE_SWITCH_STACK 10627d22413SLey Foon Tan ldw r16, SW_R16(sp) 10727d22413SLey Foon Tan ldw r17, SW_R17(sp) 10827d22413SLey Foon Tan ldw r18, SW_R18(sp) 10927d22413SLey Foon Tan ldw r19, SW_R19(sp) 11027d22413SLey Foon Tan ldw r20, SW_R20(sp) 11127d22413SLey Foon Tan ldw r21, SW_R21(sp) 11227d22413SLey Foon Tan ldw r22, SW_R22(sp) 11327d22413SLey Foon Tan ldw r23, SW_R23(sp) 11427d22413SLey Foon Tan ldw fp, SW_FP(sp) 11527d22413SLey Foon Tan ldw gp, SW_GP(sp) 11627d22413SLey Foon Tan ldw ra, SW_RA(sp) 11727d22413SLey Foon Tan addi sp, sp, SWITCH_STACK_SIZE 11827d22413SLey Foon Tan .endm 11927d22413SLey Foon Tan 12027d22413SLey Foon Tan #endif /* __ASSEMBLY__ */ 12127d22413SLey Foon Tan #endif /* _ASM_NIOS2_ENTRY_H */ 122