Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.2.
  1#ifndef _ASM_M32R_ASSEMBLER_H
  2#define _ASM_M32R_ASSEMBLER_H
  3
  4/*
  5 * linux/asm-m32r/assembler.h
  6 *
  7 * Copyright (C) 2004  Hirokazu Takata <takata at linux-m32r.org>
  8 *
  9 * This file contains M32R architecture specific macro definitions.
 10 */
 11
 12#include <linux/stringify.h>
 13
 14#undef __STR
 15
 16#ifdef __ASSEMBLY__
 17#define __STR(x) x
 18#else
 19#define __STR(x) __stringify(x)
 20#endif
 21
 22#ifdef CONFIG_SMP
 23#define M32R_LOCK	__STR(lock)
 24#define M32R_UNLOCK	__STR(unlock)
 25#else
 26#define M32R_LOCK	__STR(ld)
 27#define M32R_UNLOCK	__STR(st)
 28#endif
 29
 30#ifdef __ASSEMBLY__
 31#undef ENTRY
 32#define ENTRY(name) ENTRY_M name
 33	.macro  ENTRY_M name
 34	.global \name
 35	ALIGN
 36\name:
 37	.endm
 38#endif
 39
 40
 41/**
 42 * LDIMM - load immediate value
 43 * STI - enable interruption
 44 * CLI - disable interruption
 45 */
 46
 47#ifdef __ASSEMBLY__
 48
 49#define LDIMM(reg,x) LDIMM reg x
 50	.macro LDIMM reg x
 51	seth	\reg, #high(\x)
 52	or3	\reg, \reg, #low(\x)
 53	.endm
 54
 55#if !(defined(CONFIG_CHIP_M32102) || defined(CONFIG_CHIP_M32104))
 56#define ENABLE_INTERRUPTS(reg) ENABLE_INTERRUPTS reg
 57	.macro ENABLE_INTERRUPTS reg
 58	setpsw  #0x40	    ->	nop
 59	; WORKAROUND: "-> nop" is a workaround for the M32700(TS1).
 60	.endm
 61
 62#define DISABLE_INTERRUPTS(reg) DISABLE_INTERRUPTS reg
 63	.macro DISABLE_INTERRUPTS reg
 64	clrpsw  #0x40	    ->	nop
 65	; WORKAROUND: "-> nop" is a workaround for the M32700(TS1).
 66	.endm
 67#else	/* CONFIG_CHIP_M32102 || CONFIG_CHIP_M32104 */
 68#define ENABLE_INTERRUPTS(reg) ENABLE_INTERRUPTS reg
 69	.macro ENABLE_INTERRUPTS reg
 70	mvfc	\reg, psw
 71	or3	\reg, \reg, #0x0040
 72	mvtc	\reg, psw
 73	.endm
 74
 75#define DISABLE_INTERRUPTS(reg) DISABLE_INTERRUPTS reg
 76	.macro DISABLE_INTERRUPTS reg
 77	mvfc	\reg, psw
 78	and3	\reg, \reg, #0xffbf
 79	mvtc	\reg, psw
 80	.endm
 81#endif	/* CONFIG_CHIP_M32102 */
 82
 83	.macro	SAVE_ALL
 84	push	r0		; orig_r0
 85	push	sp		; spi (r15)
 86	push	lr		; r14
 87	push	r13
 88	mvfc	r13, cr3	; spu
 89	push	r13
 90	mvfc	r13, bbpc
 91	push	r13
 92	mvfc	r13, bbpsw
 93	push	r13
 94	mvfc	r13, bpc
 95	push	r13
 96	mvfc	r13, psw
 97	push	r13
 98#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2)
 99	mvfaclo	r13, a1
100	push	r13
101	mvfachi r13, a1
102	push	r13
103	mvfaclo	r13, a0
104	push	r13
105	mvfachi	r13, a0
106	push	r13
107#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
108	mvfaclo	r13
109	push	r13
110	mvfachi	r13
111	push	r13
112	ldi	r13, #0
113	push	r13		; dummy push acc1h
114	push	r13		; dummy push acc1l
115#else
116#error unknown isa configuration
117#endif
118	ldi	r13, #-1
119	push	r13		; syscall_nr (default: -1)
120	push	r12
121	push	r11
122	push	r10
123	push	r9
124	push	r8
125	push	r7
126	push	r3
127	push	r2
128	push	r1
129	push	r0
130	addi	sp, #-4		; room for implicit pt_regs parameter
131	push	r6
132	push	r5
133	push	r4
134	.endm
135
136	.macro	RESTORE_ALL
137	pop	r4
138	pop	r5
139	pop	r6
140	addi	sp, #4
141	pop	r0
142	pop	r1
143	pop	r2
144	pop	r3
145	pop	r7
146	pop	r8
147	pop	r9
148	pop	r10
149	pop	r11
150	pop	r12
151	addi	r15, #4		; Skip syscall number
152#if defined(CONFIG_ISA_M32R2) && defined(CONFIG_ISA_DSP_LEVEL2)
153	pop	r13
154	mvtachi	r13, a0
155	pop	r13
156	mvtaclo	r13, a0
157	pop	r13
158	mvtachi	r13, a1
159	pop	r13
160	mvtaclo	r13, a1
161#elif defined(CONFIG_ISA_M32R2) || defined(CONFIG_ISA_M32R)
162	pop	r13		; dummy pop acc1h
163	pop	r13		; dummy pop acc1l
164	pop	r13
165	mvtachi	r13
166	pop	r13
167	mvtaclo	r13
168#else
169#error unknown isa configuration
170#endif
171	pop	r14
172	mvtc	r14, psw
173	pop	r14
174	mvtc	r14, bpc
175	addi	sp, #8		; Skip bbpsw, bbpc
176	pop	r14
177	mvtc	r14, cr3	; spu
178	pop	r13
179	pop	lr		; r14
180	pop	sp		; spi (r15)
181	addi	sp, #4		; Skip orig_r0
182	.fillinsn
1831:	rte
184	.section .fixup,"ax"
1852:	bl	do_exit
186	.previous
187	.section __ex_table,"a"
188	ALIGN
189	.long	1b, 2b
190	.previous
191	.endm
192
193#define GET_CURRENT(reg)  get_current reg
194	.macro get_current reg
195	ldi  \reg, #-8192
196	and  \reg, sp
197	.endm
198
199#if !(defined(CONFIG_CHIP_M32102) || defined(CONFIG_CHIP_M32104))
200	.macro	SWITCH_TO_KERNEL_STACK
201	; switch to kernel stack (spi)
202	clrpsw	#0x80	    ->	nop
203	.endm
204#else	/* CONFIG_CHIP_M32102 || CONFIG_CHIP_M32104 */
205	.macro	SWITCH_TO_KERNEL_STACK
206	push	r0		; save r0 for working
207	mvfc	r0, psw
208	and3	r0, r0, #0x00ff7f
209	mvtc	r0, psw
210	slli	r0, #16
211	bltz	r0, 1f		; check BSM-bit
212;
213	;; called from kernel context: previous stack = spi
214	pop	r0		; retrieve r0
215	bra	2f
216	.fillinsn
2171:
218	;; called from user context: previous stack = spu
219	mvfc	r0, cr3		; spu
220	addi	r0, #4
221	mvtc	r0, cr3		; spu
222	ld	r0, @(-4,r0)	; retrieve r0
223	.fillinsn
2242:
225	.endm
226#endif	/* CONFIG_CHIP_M32102 || CONFIG_CHIP_M32104 */
227
228#endif	/* __ASSEMBLY__ */
229
230#endif	/* _ASM_M32R_ASSEMBLER_H */