• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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