OpenCores
URL https://opencores.org/ocsvn/ao68000/ao68000/trunk

Subversion Repositories ao68000

[/] [ao68000/] [trunk/] [tests/] [soc_for_linux_on_terasic_de2_70/] [software/] [linux-2.6.33.1-ao68000/] [arch/] [m68knommu/] [platform/] [ao68000/] [entry.S] - Blame information for rev 12

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 alfik
/*
2
 *  linux/arch/m68knommu/platform/68328/entry.S
3
 *
4
 *  Copyright (C) 1991, 1992  Linus Torvalds
5
 *
6
 * This file is subject to the terms and conditions of the GNU General Public
7
 * License.  See the file README.legal in the main directory of this archive
8
 * for more details.
9
 *
10
 * Linux/m68k support by Hamish Macdonald
11
 */
12
 
13
#include 
14
#include 
15
#include 
16
#include 
17
#include 
18
#include 
19
#include 
20
#include 
21
#include 
22
#include 
23
 
24
.text
25
 
26
.globl system_call
27
.globl resume
28
.globl ret_from_exception
29
.globl ret_from_signal
30
.globl sys_call_table
31
.globl ret_from_interrupt
32
.globl bad_interrupt
33
.globl inthandler1
34
.globl inthandler2
35
.globl inthandler3
36
.globl inthandler4
37
.globl inthandler5
38
.globl inthandler6
39
.globl inthandler7
40
 
41
.globl trap3
42
.globl trap4
43
.globl trap5
44
.globl trap6
45
.globl trap7
46
.globl trap8
47
.globl trap9
48
.globl trap10
49
 
50
trap3:
51
        move.b #0x33, (0xE0000000)
52
        jmp trap
53
trap4:
54
        move.b #0x34, (0xE0000000)
55
        jmp trap
56
trap5:
57
        move.b #0x35, (0xE0000000)
58
        jmp trap
59
trap6:
60
        move.b #0x36, (0xE0000000)
61
        jmp trap
62
trap7:
63
        move.b #0x37, (0xE0000000)
64
        jmp trap
65
trap8:
66
        move.b #0x38, (0xE0000000)
67
        jmp trap
68
trap9:
69
        move.b #0x39, (0xE0000000)
70
        jmp trap
71
trap10:
72
        move.b #0x3A, (0xE0000000)
73
        jmp trap
74
 
75
badsys:
76
        movel   #-ENOSYS,%sp@(PT_OFF_D0)
77
        jra     ret_from_exception
78
 
79
do_trace:
80
        movel   #-ENOSYS,%sp@(PT_OFF_D0)        /* needed for strace*/
81
        subql   #4,%sp
82
        SAVE_SWITCH_STACK
83
        jbsr    syscall_trace
84
        RESTORE_SWITCH_STACK
85
        addql   #4,%sp
86
        movel   %sp@(PT_OFF_ORIG_D0),%d1
87
        movel   #-ENOSYS,%d0
88
        cmpl    #NR_syscalls,%d1
89
        jcc     1f
90
        lsl     #2,%d1
91
        lea     sys_call_table, %a0
92
        jbsr    %a0@(%d1)
93
 
94
1:      movel   %d0,%sp@(PT_OFF_D0)             /* save the return value */
95
        subql   #4,%sp                  /* dummy return address */
96
        SAVE_SWITCH_STACK
97
        jbsr    syscall_trace
98
 
99
ret_from_signal:
100
        RESTORE_SWITCH_STACK
101
        addql   #4,%sp
102
        jra     ret_from_exception
103
 
104
ENTRY(system_call)
105
        SAVE_ALL
106
 
107
        /* save top of frame*/
108
        pea     %sp@
109
        jbsr    set_esp0
110
        addql   #4,%sp
111
 
112
        movel   %sp@(PT_OFF_ORIG_D0),%d0
113
 
114
        movel   %sp,%d1                 /* get thread_info pointer */
115
        andl    #-THREAD_SIZE,%d1
116
        movel   %d1,%a2
117
        btst    #TIF_SYSCALL_TRACE,%a2@(TI_FLAGS)
118
        jne     do_trace
119
        cmpl    #NR_syscalls,%d0
120
        jcc     badsys
121
        lsl     #2,%d0
122
        lea     sys_call_table,%a0
123
        movel   %a0@(%d0), %a0
124
        jbsr    %a0@
125
        movel   %d0,%sp@(PT_OFF_D0)             /* save the return value*/
126
 
127
ret_from_exception:
128
        btst    #5,%sp@(PT_OFF_SR)              /* check if returning to kernel*/
129
        jeq     Luser_return            /* if so, skip resched, signals*/
130
 
131
Lkernel_return:
132
        RESTORE_ALL
133
 
134
Luser_return:
135
        /* only allow interrupts when we are really the last one on the*/
136
        /* kernel stack, otherwise stack overflow can occur during*/
137
        /* heavy interrupt load*/
138
        andw    #ALLOWINT,%sr
139
 
140
        movel   %sp,%d1                 /* get thread_info pointer */
141
        andl    #-THREAD_SIZE,%d1
142
        movel   %d1,%a2
143
        move    %a2@(TI_FLAGS),%d1      /* thread_info->flags */
144
        andl    #_TIF_WORK_MASK,%d1
145
        jne     Lwork_to_do
146
        RESTORE_ALL
147
 
148
Lwork_to_do:
149
        movel   %a2@(TI_FLAGS),%d1      /* thread_info->flags */
150
        btst    #TIF_NEED_RESCHED,%d1
151
        jne     reschedule
152
 
153
Lsignal_return:
154
        subql   #4,%sp                  /* dummy return address*/
155
        SAVE_SWITCH_STACK
156
        pea     %sp@(SWITCH_STACK_SIZE)
157
        clrl    %sp@-
158
        bsrw    do_signal
159
        addql   #8,%sp
160
        RESTORE_SWITCH_STACK
161
        addql   #4,%sp
162
Lreturn:
163
        RESTORE_ALL
164
 
165
/*
166
 * This is the main interrupt handler, responsible for calling process_int()
167
 */
168
inthandler1:
169
        SAVE_ALL
170
        movew   %sp@(PT_OFF_VECTOR), %d0
171
        and     #0x3ff, %d0
172
 
173
        movel   %sp,%sp@-
174
        movel   #1,%sp@-                /*  put vector # on stack*/
175
        jbsr    process_int             /*  process the IRQ*/
176
3:      addql   #8,%sp                  /*  pop parameters off stack*/
177
        bra     ret_from_interrupt
178
 
179
inthandler2:
180
        SAVE_ALL
181
        movew   %sp@(PT_OFF_VECTOR), %d0
182
        and     #0x3ff, %d0
183
 
184
        movel   %sp,%sp@-
185
        movel   #2,%sp@-                /*  put vector # on stack*/
186
        jbsr    process_int             /*  process the IRQ*/
187
3:      addql   #8,%sp                  /*  pop parameters off stack*/
188
        bra     ret_from_interrupt
189
 
190
inthandler3:
191
        SAVE_ALL
192
        movew   %sp@(PT_OFF_VECTOR), %d0
193
        and     #0x3ff, %d0
194
 
195
        movel   %sp,%sp@-
196
        movel   #3,%sp@-                /*  put vector # on stack*/
197
        jbsr    process_int             /*  process the IRQ*/
198
3:      addql   #8,%sp                  /*  pop parameters off stack*/
199
        bra     ret_from_interrupt
200
 
201
inthandler4:
202
        SAVE_ALL
203
        movew   %sp@(PT_OFF_VECTOR), %d0
204
        and     #0x3ff, %d0
205
 
206
        movel   %sp,%sp@-
207
        movel   #4,%sp@-                /*  put vector # on stack*/
208
        jbsr    process_int             /*  process the IRQ*/
209
3:      addql   #8,%sp                  /*  pop parameters off stack*/
210
        bra     ret_from_interrupt
211
 
212
inthandler5:
213
        SAVE_ALL
214
        movew   %sp@(PT_OFF_VECTOR), %d0
215
        and     #0x3ff, %d0
216
 
217
        movel   %sp,%sp@-
218
        movel   #5,%sp@-                /*  put vector # on stack*/
219
        jbsr    process_int             /*  process the IRQ*/
220
3:      addql   #8,%sp                  /*  pop parameters off stack*/
221
        bra     ret_from_interrupt
222
 
223
inthandler6:
224
        SAVE_ALL
225
        movew   %sp@(PT_OFF_VECTOR), %d0
226
        and     #0x3ff, %d0
227
 
228
        movel   %sp,%sp@-
229
        movel   #6,%sp@-                /*  put vector # on stack*/
230
        jbsr    process_int             /*  process the IRQ*/
231
3:      addql   #8,%sp                  /*  pop parameters off stack*/
232
        bra     ret_from_interrupt
233
 
234
inthandler7:
235
        SAVE_ALL
236
        movew   %sp@(PT_OFF_VECTOR), %d0
237
        and     #0x3ff, %d0
238
 
239
        movel   %sp,%sp@-
240
        movel   #7,%sp@-                /*  put vector # on stack*/
241
        jbsr    process_int             /*  process the IRQ*/
242
3:      addql   #8,%sp                  /*  pop parameters off stack*/
243
        bra     ret_from_interrupt
244
 
245
inthandler:
246
        SAVE_ALL
247
        movew   %sp@(PT_OFF_VECTOR), %d0
248
        and     #0x3ff, %d0
249
 
250
        movel   %sp,%sp@-
251
        movel   %d0,%sp@-               /*  put vector # on stack*/
252
        jbsr    process_int             /*  process the IRQ*/
253
3:      addql   #8,%sp                  /*  pop parameters off stack*/
254
        bra     ret_from_interrupt
255
 
256
ret_from_interrupt:
257
        /*jeq   1f*/
258
2:
259
        RESTORE_ALL
260
 
261
        /*ALIGN*/
262
1:
263
        moveb   %sp@(PT_OFF_SR), %d0
264
        and     #7, %d0
265
        jhi     2b
266
 
267
        /* check if we need to do software interrupts */
268
        /*tst.l irq_stat+CPUSTAT_SOFTIRQ_PENDING*/
269
        jeq     ret_from_exception
270
 
271
        pea     ret_from_exception
272
        jra     do_softirq
273
 
274
 
275
/*
276
 * Handler for uninitialized and spurious interrupts.
277
 */
278
ENTRY(bad_interrupt)
279
        addql   #1,num_spurious
280
        rte
281
 
282
/*
283
 * Beware - when entering resume, prev (the current task) is
284
 * in a0, next (the new task) is in a1,so don't change these
285
 * registers until their contents are no longer needed.
286
 */
287
ENTRY(resume)
288
        movel   %a0,%d1                         /* save prev thread in d1 */
289
        movew   %sr,%a0@(TASK_THREAD+THREAD_SR) /* save sr */
290
        movel   %usp,%a2                        /* save usp */
291
        movel   %a2,%a0@(TASK_THREAD+THREAD_USP)
292
 
293
        SAVE_SWITCH_STACK
294
        movel   %sp,%a0@(TASK_THREAD+THREAD_KSP) /* save kernel stack */
295
        movel   %a1@(TASK_THREAD+THREAD_KSP),%sp /* restore new thread stack */
296
        RESTORE_SWITCH_STACK
297
 
298
        movel   %a1@(TASK_THREAD+THREAD_USP),%a0 /* restore user stack */
299
        movel   %a0,%usp
300
        movew   %a1@(TASK_THREAD+THREAD_SR),%sr /* restore thread status reg */
301
        rts
302
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.