linux/arch/avr32/include/asm/asm.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2004-2006 Atmel Corporation
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2 as
   6 * published by the Free Software Foundation.
   7 */
   8#ifndef __ASM_AVR32_ASM_H__
   9#define __ASM_AVR32_ASM_H__
  10
  11#include <asm/sysreg.h>
  12#include <asm/asm-offsets.h>
  13#include <asm/thread_info.h>
  14
  15#define mask_interrupts         ssrf    SYSREG_GM_OFFSET
  16#define mask_exceptions         ssrf    SYSREG_EM_OFFSET
  17#define unmask_interrupts       csrf    SYSREG_GM_OFFSET
  18#define unmask_exceptions       csrf    SYSREG_EM_OFFSET
  19
  20#ifdef CONFIG_FRAME_POINTER
  21        .macro  save_fp
  22        st.w    --sp, r7
  23        .endm
  24        .macro  restore_fp
  25        ld.w    r7, sp++
  26        .endm
  27        .macro  zero_fp
  28        mov     r7, 0
  29        .endm
  30#else
  31        .macro  save_fp
  32        .endm
  33        .macro  restore_fp
  34        .endm
  35        .macro  zero_fp
  36        .endm
  37#endif
  38        .macro  get_thread_info reg
  39        mov     \reg, sp
  40        andl    \reg, ~(THREAD_SIZE - 1) & 0xffff
  41        .endm
  42
  43        /* Save and restore registers */
  44        .macro  save_min sr, tmp=lr
  45        pushm   lr
  46        mfsr    \tmp, \sr
  47        zero_fp
  48        st.w    --sp, \tmp
  49        .endm
  50
  51        .macro  restore_min sr, tmp=lr
  52        ld.w    \tmp, sp++
  53        mtsr    \sr, \tmp
  54        popm    lr
  55        .endm
  56
  57        .macro  save_half sr, tmp=lr
  58        save_fp
  59        pushm   r8-r9,r10,r11,r12,lr
  60        zero_fp
  61        mfsr    \tmp, \sr
  62        st.w    --sp, \tmp
  63        .endm
  64
  65        .macro  restore_half sr, tmp=lr
  66        ld.w    \tmp, sp++
  67        mtsr    \sr, \tmp
  68        popm    r8-r9,r10,r11,r12,lr
  69        restore_fp
  70        .endm
  71
  72        .macro  save_full_user sr, tmp=lr
  73        stmts   --sp, r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,sp,lr
  74        st.w    --sp, lr
  75        zero_fp
  76        mfsr    \tmp, \sr
  77        st.w    --sp, \tmp
  78        .endm
  79
  80        .macro  restore_full_user sr, tmp=lr
  81        ld.w    \tmp, sp++
  82        mtsr    \sr, \tmp
  83        ld.w    lr, sp++
  84        ldmts   sp++, r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,sp,lr
  85        .endm
  86
  87        /* uaccess macros */
  88        .macro branch_if_kernel scratch, label
  89        get_thread_info \scratch
  90        ld.w    \scratch, \scratch[TI_flags]
  91        bld     \scratch, TIF_USERSPACE
  92        brcc    \label
  93        .endm
  94
  95        .macro ret_if_privileged scratch, addr, size, ret
  96        sub     \scratch, \size, 1
  97        add     \scratch, \addr
  98        retcs   \ret
  99        retmi   \ret
 100        .endm
 101
 102#endif /* __ASM_AVR32_ASM_H__ */
 103