PageRenderTime 22ms CodeModel.GetById 11ms app.highlight 8ms RepoModel.GetById 1ms app.codeStats 0ms

/arch/h8300/platform/h8s/entry.S

https://bitbucket.org/evzijst/gittest
Assembly | 331 lines | 302 code | 29 blank | 0 comment | 3 complexity | c885a824fc2fc76872c3ff0a7161c82b MD5 | raw file
  1/* -*- mode: asm -*-
  2 *
  3 *  linux/arch/h8300/platform/h8s/entry.S
  4 *
  5 *  Yoshinori Sato <ysato@users.sourceforge.jp>
  6 *
  7 *	fairly heavy changes to fix syscall args and signal processing
  8 *	by David McCullough <davidm@snapgear.com>
  9 */
 10
 11/*
 12 *  entry.S
 13 *  include exception/interrupt gateway
 14 *          system call entry
 15 */
 16
 17#include <linux/sys.h>
 18#include <linux/config.h>
 19#include <asm/unistd.h>
 20#include <asm/setup.h>
 21#include <asm/segment.h>
 22#include <asm/linkage.h>
 23#include <asm/asm-offsets.h>
 24#include <asm/thread_info.h>
 25#include <asm/errno.h>
 26
 27	.h8300s
 28
 29/* CPU context save/restore macros. */
 30	
 31	.macro	SAVE_ALL
 32	mov.l	er0,@-sp
 33
 34	stc	ccr,r0l				/* check kernel mode */
 35	orc	#0x10,ccr
 36	btst	#4,r0l
 37	bne	5f
 38
 39	mov.l	sp,@SYMBOL_NAME(sw_usp)		/* user mode */
 40	mov.l	@sp,er0
 41	mov.l	@SYMBOL_NAME(sw_ksp),sp
 42	sub.l	#(LRET-LORIG),sp		/* allocate LORIG - LRET */ 
 43	stm.l	er0-er3,@-sp
 44	mov.l	@SYMBOL_NAME(sw_usp),er0
 45	mov.l	@(10:16,er0),er1		/* copy the RET addr */
 46	mov.l	er1,@(LRET-LER3:16,sp)
 47	mov.w	@(8:16,er0),r1
 48	mov.w	r1,@(LEXR-LER3:16,sp)		/* copy EXR */
 49
 50	mov.w	e1,r1				/* e1 highbyte = ccr */
 51	and	#0xef,r1h			/* mask mode? flag */
 52	sub.w	r0,r0
 53	mov.b	r1h,r0l
 54	mov.w	r0,@(LCCR-LER3:16,sp)		/* copy ccr */
 55	mov.l	@(LORIG-LER3:16,sp),er0
 56	mov.l	er0,@(LER0-LER3:16,sp)		/* copy ER0 */
 57	bra	6f
 585:
 59	mov.l	@sp,er0				/* kernel mode */
 60	subs	#2,sp				/* dummy ccr */
 61	stm.l	er0-er3,@-sp
 62	mov.w	@(LRET-LER3:16,sp),r1		/* copy old ccr */
 63	mov.b	r1h,r1l
 64	mov.b	#0,r1h
 65	mov.w	r1,@(LCCR-LER3:16,sp)
 666:	
 67	mov.l	er6,@-sp			/* syscall arg #6 */
 68	mov.l	er5,@-sp			/* syscall arg #5 */
 69	mov.l	er4,@-sp			/* syscall arg #4 */
 70	.endm
 71
 72	.macro	RESTORE_ALL
 73	mov.l	@sp+,er4
 74	mov.l	@sp+,er5
 75	mov.l	@sp+,er6
 76	ldm.l	@sp+,er2-er3
 77	mov.w	@(LCCR-LER1:16,sp),r0		/* check kernel mode */
 78	btst	#4,r0l
 79	bne	7f
 80
 81	orc	#0x80,ccr
 82	mov.l	@SYMBOL_NAME(sw_usp),er0
 83	mov.l	@(LER0-LER1:16,sp),er1		/* restore ER0 */
 84	mov.l	er1,@er0
 85	mov.w	@(LEXR-LER1:16,sp),r1		/* restore EXR */
 86	mov.b	r1l,r1h
 87	mov.w	r1,@(8:16,er0)
 88	mov.w	@(LCCR-LER1:16,sp),r1		/* restore the RET addr */
 89	mov.b	r1l,r1h
 90	mov.b	@(LRET+1-LER1:16,sp),r1l
 91	mov.w	r1,e1
 92	mov.w	@(LRET+2-LER1:16,sp),r1
 93	mov.l	er1,@(10:16,er0)
 94
 95	mov.l	@sp+,er1
 96	add.l	#(LRET-LER1),sp			/* remove LORIG - LRET */ 
 97	mov.l	sp,@SYMBOL_NAME(sw_ksp)
 98	mov.l	er0,sp
 99	bra	8f
1007:
101	mov.l	@sp+,er1
102	adds	#4,sp
103	adds	#2,sp
1048:
105	mov.l	@sp+,er0
106	adds	#4,sp				/* remove the sw created LVEC */
107	rte
108	.endm
109	
110.globl SYMBOL_NAME(system_call)
111.globl SYMBOL_NAME(ret_from_exception)
112.globl SYMBOL_NAME(ret_from_fork)
113.globl SYMBOL_NAME(ret_from_interrupt)
114.globl SYMBOL_NAME(interrupt_redirect_table)
115.globl SYMBOL_NAME(sw_ksp),SYMBOL_NAME(sw_usp)
116.globl SYMBOL_NAME(resume)
117.globl SYMBOL_NAME(trace_break)
118.globl SYMBOL_NAME(interrupt_entry)
119		
120INTERRUPTS = 128
121#if defined(CONFIG_ROMKERNEL)
122	.section .int_redirect,"ax"
123SYMBOL_NAME_LABEL(interrupt_redirect_table)
124	.rept	7
125	.long	0
126	.endr
127	jsr	@SYMBOL_NAME(interrupt_entry)	/* NMI */
128	jmp	@SYMBOL_NAME(system_call)	/* TRAPA #0 (System call) */
129	.long	0
130	.long	0
131	jmp	@SYMBOL_NAME(trace_break)	/* TRAPA #3 (breakpoint) */
132	.rept	INTERRUPTS-12
133	jsr	@SYMBOL_NAME(interrupt_entry)
134	.endr
135#endif
136#if defined(CONFIG_RAMKERNEL)
137.globl SYMBOL_NAME(interrupt_redirect_table)
138	.section .bss
139SYMBOL_NAME_LABEL(interrupt_redirect_table)
140	.space	4
141#endif
142	
143	.section .text
144	.align	2
145SYMBOL_NAME_LABEL(interrupt_entry)
146	SAVE_ALL
147	mov.w	@(LCCR,sp),r0
148	btst	#4,r0l
149	bne	1f
150	mov.l	@SYMBOL_NAME(sw_usp),er0
151	mov.l	@(4:16,er0),er0
152	bra	2f
1531:
154	mov.l	@(LVEC:16,sp),er0
1552:
156#if defined(CONFIG_ROMKERNEL)
157	sub.l	#SYMBOL_NAME(interrupt_redirect_table),er0
158#endif
159#if defined(CONFIG_RAMKERNEL)
160	mov.l	@SYMBOL_NAME(interrupt_redirect_table),er1
161	sub.l	er1,er0
162#endif
163	shlr.l	#2,er0
164	dec.l	#1,er0
165	mov.l	sp,er1
166	subs	#4,er1				/* adjust ret_pc */
167	jsr	@SYMBOL_NAME(process_int)
168	mov.l	@SYMBOL_NAME(irq_stat)+CPUSTAT_SOFTIRQ_PENDING,er0
169	beq	1f
170	jsr	@SYMBOL_NAME(do_softirq)
1711:
172	jmp	@SYMBOL_NAME(ret_from_exception)
173
174SYMBOL_NAME_LABEL(system_call)
175	subs	#4,sp				/* dummy LVEC */
176	SAVE_ALL
177	mov.w	@(LCCR:16,sp),r1
178	bset	#4,r1l
179	ldc	r1l,ccr				/* restore ccr */
180	mov.l	er0,er4
181	mov.l	#-ENOSYS,er0
182	mov.l	er0,@(LER0:16,sp)
183
184	/* save top of frame */
185	mov.l	sp,er0
186	jsr	@SYMBOL_NAME(set_esp0)
187	cmp.l	#NR_syscalls,er4
188	bcc	SYMBOL_NAME(ret_from_exception):16
189	shll.l	#2,er4
190	mov.l	#SYMBOL_NAME(sys_call_table),er0
191	add.l	er4,er0
192	mov.l	@er0,er0
193	mov.l	er0,er4
194	beq	SYMBOL_NAME(ret_from_exception):16	
195	mov.l	sp,er2
196	and.w	#0xe000,r2
197	mov.b	@((TASK_FLAGS+3-(TIF_SYSCALL_TRACE >> 3)):16,er2),r2l
198	btst	#(TIF_SYSCALL_TRACE & 7),r2l
199	mov.l	@(LER1:16,sp),er0
200	mov.l	@(LER2:16,sp),er1
201	mov.l	@(LER3:16,sp),er2
202	jsr	@er4
203	mov.l	er0,@(LER0:16,sp)			/* save the return value */
204#if defined(CONFIG_SYSCALL_PRINT)
205	jsr	@SYMBOL_NAME(syscall_print)
206#endif
207	bra	SYMBOL_NAME(ret_from_exception):8
2081:
209	jsr	SYMBOL_NAME(syscall_trace)
210	mov.l	@(LER1:16,sp),er0
211	mov.l	@(LER2:16,sp),er1
212	mov.l	@(LER3:16,sp),er2
213	jsr	@er4
214	mov.l	er0,@(LER0:16,sp)		/* save the return value */
215	jsr	@SYMBOL_NAME(syscall_trace)
216	bra	SYMBOL_NAME(ret_from_exception):8
217
218SYMBOL_NAME_LABEL(ret_from_fork)
219	mov.l	er2,er0
220	jsr	@SYMBOL_NAME(schedule_tail)
221	bra	SYMBOL_NAME(ret_from_exception):8
222
223SYMBOL_NAME_LABEL(reschedule)
224	/* save top of frame */
225	mov.l	sp,er0
226	jsr	@SYMBOL_NAME(set_esp0)
227	jsr	@SYMBOL_NAME(schedule)
228
229SYMBOL_NAME_LABEL(ret_from_exception)
230#if defined(CONFIG_PREEMPT)
231	orc	#0x80,ccr
232#endif
233SYMBOL_NAME_LABEL(ret_from_interrupt)
234	mov.b	@(LCCR+1:16,sp),r0l
235	btst	#4,r0l			/* check if returning to kernel */
236	bne	done:8			/* if so, skip resched, signals */
237	andc	#0x7f,ccr
238	mov.l	sp,er4
239	and.w	#0xe000,r4
240	mov.l	@(TI_FLAGS:16,er4),er1
241	and.l	#_TIF_WORK_MASK,er1
242	beq	done:8
2431:
244	mov.l	@(TI_FLAGS:16,er4),er1
245	btst	#TIF_NEED_RESCHED,r1l
246	bne	SYMBOL_NAME(reschedule):16
247	mov.l	sp,er0
248	subs	#4,er0			/* adjust retpc */
249	mov.l	er2,er1
250	jsr	@SYMBOL_NAME(do_signal)
251#if defined(CONFIG_PREEMPT)
252	bra	done:8			/* userspace thoru */
2533:
254	btst	#4,r0l
255	beq	done:8			/* userspace thoru */
2564:
257	mov.l	@(TI_PRE_COUNT:16,er4),er1
258	bne	done:8
259	mov.l	@(TI_FLAGS:16,er4),er1
260	btst	#TIF_NEED_RESCHED,r1l
261	beq	done:8
262	mov.b	r0l,r0l
263	bpl	done:8			/* interrupt off (exception path?) */
264	mov.l	#PREEMPT_ACTIVE,er1
265	mov.l	er1,@(TI_PRE_COUNT:16,er4)
266	andc	#0x7f,ccr
267	jsr	@SYMBOL_NAME(schedule)
268	sub.l	er1,er1
269	mov.l	er1,@(TI_PRE_COUNT:16,er4)
270	orc	#0x80,ccr
271	bra	4b:8
272#endif
273done:
274	RESTORE_ALL			/* Does RTE */
275
276SYMBOL_NAME_LABEL(resume)
277	/*
278	 *	er0 = prev
279	 *	er1 = next
280	 *	return last in er2
281	 */
282
283	/* save sr */
284	sub.w	r3,r3
285	stc	ccr,r3l
286	stc	exr,r3h
287	mov.w	r3,@(THREAD_CCR+2:16,er0)
288
289	/* disable interrupts */
290	orc	#0x80,ccr
291	mov.l	@SYMBOL_NAME(sw_usp),er3
292	mov.l	er3,@(THREAD_USP:16,er0)
293	mov.l	sp,@(THREAD_KSP:16,er0)
294	
295	/* Skip address space switching if they are the same. */
296	/* FIXME: what did we hack out of here, this does nothing! */
297
298	mov.l	@(THREAD_USP:16,er1),er0
299	mov.l	er0,@SYMBOL_NAME(sw_usp)
300	mov.l	@(THREAD_KSP:16,er1),sp
301			
302	/* restore status register */
303	mov.w	@(THREAD_CCR+2:16,er1),r3
304
305	ldc	r3l,ccr
306	ldc	r3h,exr
307
308	rts
309
310SYMBOL_NAME_LABEL(trace_break)
311	subs	#4,sp			/* dummy LVEC */
312	SAVE_ALL
313	sub.l	er1,er1
314	dec.l	#1,er1
315	mov.l	er1,@(LORIG,sp)	
316	mov.l	sp,er0
317	jsr	@SYMBOL_NAME(set_esp0)
318	mov.l	@SYMBOL_NAME(sw_usp),er0
319	mov.l	@er0,er1
320	subs	#2,er1
321	mov.l	er1,@er0	
322	and.w	#0xff,e1
323	mov.l	er1,er0
324	jsr	@SYMBOL_NAME(trace_trap)
325	jmp	@SYMBOL_NAME(ret_from_exception)	
326
327	.section	.bss
328SYMBOL_NAME_LABEL(sw_ksp)
329	.space	4	
330SYMBOL_NAME_LABEL(sw_usp)
331	.space	4