root/arch/nios2/include/asm/entry.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /*
   2  * Copyright (C) 2010 Tobias Klauser <tklauser@distanz.ch>
   3  * Copyright (C) 2004 Microtronix Datacom Ltd.
   4  *
   5  * This file is subject to the terms and conditions of the GNU General Public
   6  * License. See the file "COPYING" in the main directory of this archive
   7  * for more details.
   8  */
   9 
  10 #ifndef _ASM_NIOS2_ENTRY_H
  11 #define _ASM_NIOS2_ENTRY_H
  12 
  13 #ifdef __ASSEMBLY__
  14 
  15 #include <asm/processor.h>
  16 #include <asm/registers.h>
  17 #include <asm/asm-offsets.h>
  18 
  19 /*
  20  * Standard Nios2 interrupt entry and exit macros.
  21  * Must be called with interrupts disabled.
  22  */
  23 .macro SAVE_ALL
  24         rdctl   r24, estatus
  25         andi    r24, r24, ESTATUS_EU
  26         beq     r24, r0, 1f /* In supervisor mode, already on kernel stack */
  27 
  28         movia   r24, _current_thread    /* Switch to current kernel stack */
  29         ldw     r24, 0(r24)             /* using the thread_info */
  30         addi    r24, r24, THREAD_SIZE-PT_REGS_SIZE
  31         stw     sp, PT_SP(r24)          /* Save user stack before changing */
  32         mov     sp, r24
  33         br      2f
  34 
  35 1 :     mov     r24, sp
  36         addi    sp, sp, -PT_REGS_SIZE   /* Backup the kernel stack pointer */
  37         stw     r24, PT_SP(sp)
  38 2 :     stw     r1, PT_R1(sp)
  39         stw     r2, PT_R2(sp)
  40         stw     r3, PT_R3(sp)
  41         stw     r4, PT_R4(sp)
  42         stw     r5, PT_R5(sp)
  43         stw     r6, PT_R6(sp)
  44         stw     r7, PT_R7(sp)
  45         stw     r8, PT_R8(sp)
  46         stw     r9, PT_R9(sp)
  47         stw     r10, PT_R10(sp)
  48         stw     r11, PT_R11(sp)
  49         stw     r12, PT_R12(sp)
  50         stw     r13, PT_R13(sp)
  51         stw     r14, PT_R14(sp)
  52         stw     r15, PT_R15(sp)
  53         stw     r2, PT_ORIG_R2(sp)
  54         stw     r7, PT_ORIG_R7(sp)
  55 
  56         stw     ra, PT_RA(sp)
  57         stw     fp, PT_FP(sp)
  58         stw     gp, PT_GP(sp)
  59         rdctl   r24, estatus
  60         stw     r24, PT_ESTATUS(sp)
  61         stw     ea, PT_EA(sp)
  62 .endm
  63 
  64 .macro RESTORE_ALL
  65         ldw     r1, PT_R1(sp)           /* Restore registers */
  66         ldw     r2, PT_R2(sp)
  67         ldw     r3, PT_R3(sp)
  68         ldw     r4, PT_R4(sp)
  69         ldw     r5, PT_R5(sp)
  70         ldw     r6, PT_R6(sp)
  71         ldw     r7, PT_R7(sp)
  72         ldw     r8, PT_R8(sp)
  73         ldw     r9, PT_R9(sp)
  74         ldw     r10, PT_R10(sp)
  75         ldw     r11, PT_R11(sp)
  76         ldw     r12, PT_R12(sp)
  77         ldw     r13, PT_R13(sp)
  78         ldw     r14, PT_R14(sp)
  79         ldw     r15, PT_R15(sp)
  80         ldw     ra, PT_RA(sp)
  81         ldw     fp, PT_FP(sp)
  82         ldw     gp, PT_GP(sp)
  83         ldw     r24, PT_ESTATUS(sp)
  84         wrctl   estatus, r24
  85         ldw     ea, PT_EA(sp)
  86         ldw     sp, PT_SP(sp)           /* Restore sp last */
  87 .endm
  88 
  89 .macro  SAVE_SWITCH_STACK
  90         addi    sp, sp, -SWITCH_STACK_SIZE
  91         stw     r16, SW_R16(sp)
  92         stw     r17, SW_R17(sp)
  93         stw     r18, SW_R18(sp)
  94         stw     r19, SW_R19(sp)
  95         stw     r20, SW_R20(sp)
  96         stw     r21, SW_R21(sp)
  97         stw     r22, SW_R22(sp)
  98         stw     r23, SW_R23(sp)
  99         stw     fp, SW_FP(sp)
 100         stw     gp, SW_GP(sp)
 101         stw     ra, SW_RA(sp)
 102 .endm
 103 
 104 .macro  RESTORE_SWITCH_STACK
 105         ldw     r16, SW_R16(sp)
 106         ldw     r17, SW_R17(sp)
 107         ldw     r18, SW_R18(sp)
 108         ldw     r19, SW_R19(sp)
 109         ldw     r20, SW_R20(sp)
 110         ldw     r21, SW_R21(sp)
 111         ldw     r22, SW_R22(sp)
 112         ldw     r23, SW_R23(sp)
 113         ldw     fp, SW_FP(sp)
 114         ldw     gp, SW_GP(sp)
 115         ldw     ra, SW_RA(sp)
 116         addi    sp, sp, SWITCH_STACK_SIZE
 117 .endm
 118 
 119 #endif /* __ASSEMBLY__ */
 120 #endif /* _ASM_NIOS2_ENTRY_H */

/* [<][>][^][v][top][bottom][index][help] */