| /* |
| * Copyright (C) 2004-2006 Atmel Corporation |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| */ |
| #ifndef __ASM_AVR32_ASM_H__ |
| #define __ASM_AVR32_ASM_H__ |
| |
| #include <asm/sysreg.h> |
| #include <asm/asm-offsets.h> |
| #include <asm/thread_info.h> |
| |
| #define mask_interrupts ssrf SR_GM_BIT |
| #define mask_exceptions ssrf SR_EM_BIT |
| #define unmask_interrupts csrf SR_GM_BIT |
| #define unmask_exceptions csrf SR_EM_BIT |
| |
| #ifdef CONFIG_FRAME_POINTER |
| .macro save_fp |
| st.w --sp, r7 |
| .endm |
| .macro restore_fp |
| ld.w r7, sp++ |
| .endm |
| .macro zero_fp |
| mov r7, 0 |
| .endm |
| #else |
| .macro save_fp |
| .endm |
| .macro restore_fp |
| .endm |
| .macro zero_fp |
| .endm |
| #endif |
| .macro get_thread_info reg |
| mov \reg, sp |
| andl \reg, ~(THREAD_SIZE - 1) & 0xffff |
| .endm |
| |
| /* Save and restore registers */ |
| .macro save_min sr, tmp=lr |
| pushm lr |
| mfsr \tmp, \sr |
| zero_fp |
| st.w --sp, \tmp |
| .endm |
| |
| .macro restore_min sr, tmp=lr |
| ld.w \tmp, sp++ |
| mtsr \sr, \tmp |
| popm lr |
| .endm |
| |
| .macro save_half sr, tmp=lr |
| save_fp |
| pushm r8-r9,r10,r11,r12,lr |
| zero_fp |
| mfsr \tmp, \sr |
| st.w --sp, \tmp |
| .endm |
| |
| .macro restore_half sr, tmp=lr |
| ld.w \tmp, sp++ |
| mtsr \sr, \tmp |
| popm r8-r9,r10,r11,r12,lr |
| restore_fp |
| .endm |
| |
| .macro save_full_user sr, tmp=lr |
| stmts --sp, r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,sp,lr |
| st.w --sp, lr |
| zero_fp |
| mfsr \tmp, \sr |
| st.w --sp, \tmp |
| .endm |
| |
| .macro restore_full_user sr, tmp=lr |
| ld.w \tmp, sp++ |
| mtsr \sr, \tmp |
| ld.w lr, sp++ |
| ldmts sp++, r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,sp,lr |
| .endm |
| |
| /* uaccess macros */ |
| .macro branch_if_kernel scratch, label |
| get_thread_info \scratch |
| ld.w \scratch, \scratch[TI_flags] |
| bld \scratch, TIF_USERSPACE |
| brcc \label |
| .endm |
| |
| .macro ret_if_privileged scratch, addr, size, ret |
| sub \scratch, \size, 1 |
| add \scratch, \addr |
| retcs \ret |
| retmi \ret |
| .endm |
| |
| #endif /* __ASM_AVR32_ASM_H__ */ |