linux/arch/nios2/include/asm/entry.h
<<
>>
Prefs
   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
  351 :     mov     r24, sp
  36        addi    sp, sp, -PT_REGS_SIZE   /* Backup the kernel stack pointer */
  37        stw     r24, PT_SP(sp)
  382 :     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 */
 121