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