diff options
Diffstat (limited to 'arch/m68k/kernel')
-rw-r--r-- | arch/m68k/kernel/entry.S | 84 | ||||
-rw-r--r-- | arch/m68k/kernel/ints.c | 21 | ||||
-rw-r--r-- | arch/m68k/kernel/traps.c | 55 |
3 files changed, 58 insertions, 102 deletions
diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S index 522079f8c2ba..1fb88f3311de 100644 --- a/arch/m68k/kernel/entry.S +++ b/arch/m68k/kernel/entry.S | |||
@@ -45,7 +45,7 @@ | |||
45 | #include <asm/asm-offsets.h> | 45 | #include <asm/asm-offsets.h> |
46 | 46 | ||
47 | .globl system_call, buserr, trap, resume | 47 | .globl system_call, buserr, trap, resume |
48 | .globl inthandler, sys_call_table | 48 | .globl sys_call_table |
49 | .globl sys_fork, sys_clone, sys_vfork | 49 | .globl sys_fork, sys_clone, sys_vfork |
50 | .globl ret_from_interrupt, bad_interrupt | 50 | .globl ret_from_interrupt, bad_interrupt |
51 | 51 | ||
@@ -191,44 +191,15 @@ do_delayed_trace: | |||
191 | jbra resume_userspace | 191 | jbra resume_userspace |
192 | 192 | ||
193 | 193 | ||
194 | #if 0 | 194 | /* This is the main interrupt handler for autovector interrupts */ |
195 | #ifdef CONFIG_AMIGA | ||
196 | ami_inthandler: | ||
197 | addql #1,irq_stat+CPUSTAT_LOCAL_IRQ_COUNT | ||
198 | SAVE_ALL_INT | ||
199 | GET_CURRENT(%d0) | ||
200 | |||
201 | bfextu %sp@(PT_VECTOR){#4,#12},%d0 | ||
202 | movel %d0,%a0 | ||
203 | addql #1,%a0@(kstat+STAT_IRQ-VECOFF(VEC_SPUR)) | ||
204 | movel %a0@(autoirq_list-VECOFF(VEC_SPUR)),%a0 | ||
205 | |||
206 | | amiga vector int handler get the req mask instead of irq vector | ||
207 | lea CUSTOMBASE,%a1 | ||
208 | movew %a1@(C_INTREQR),%d0 | ||
209 | andw %a1@(C_INTENAR),%d0 | ||
210 | |||
211 | | prepare stack (push frame pointer, dev_id & req mask) | ||
212 | pea %sp@ | ||
213 | movel %a0@(IRQ_DEVID),%sp@- | ||
214 | movel %d0,%sp@- | ||
215 | pea %pc@(ret_from_interrupt:w) | ||
216 | jbra @(IRQ_HANDLER,%a0)@(0) | ||
217 | |||
218 | ENTRY(nmi_handler) | ||
219 | rte | ||
220 | #endif | ||
221 | #endif | ||
222 | 195 | ||
223 | /* | 196 | ENTRY(auto_inthandler) |
224 | ** This is the main interrupt handler, responsible for calling process_int() | ||
225 | */ | ||
226 | inthandler: | ||
227 | SAVE_ALL_INT | 197 | SAVE_ALL_INT |
228 | GET_CURRENT(%d0) | 198 | GET_CURRENT(%d0) |
229 | addqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1) | 199 | addqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1) |
230 | | put exception # in d0 | 200 | | put exception # in d0 |
231 | bfextu %sp@(PT_VECTOR){#4,#10},%d0 | 201 | bfextu %sp@(PT_VECTOR){#4,#10},%d0 |
202 | subw #VEC_SPUR,%d0 | ||
232 | 203 | ||
233 | movel %sp,%sp@- | 204 | movel %sp,%sp@- |
234 | movel %d0,%sp@- | put vector # on stack | 205 | movel %d0,%sp@- | put vector # on stack |
@@ -241,15 +212,16 @@ inthandler: | |||
241 | jbra 3f | 212 | jbra 3f |
242 | 1: | 213 | 1: |
243 | #endif | 214 | #endif |
244 | jbsr process_int | process the IRQ | 215 | jsr m68k_handle_int | process the IRQ |
245 | 3: addql #8,%sp | pop parameters off stack | 216 | 3: addql #8,%sp | pop parameters off stack |
246 | 217 | ||
247 | ret_from_interrupt: | 218 | ret_from_interrupt: |
248 | subqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1) | 219 | subqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1) |
249 | jeq 1f | 220 | jeq ret_from_last_interrupt |
250 | 2: | 221 | 2: RESTORE_ALL |
251 | RESTORE_ALL | 222 | |
252 | 1: | 223 | ALIGN |
224 | ret_from_last_interrupt: | ||
253 | moveq #(~ALLOWINT>>8)&0xff,%d0 | 225 | moveq #(~ALLOWINT>>8)&0xff,%d0 |
254 | andb %sp@(PT_SR),%d0 | 226 | andb %sp@(PT_SR),%d0 |
255 | jne 2b | 227 | jne 2b |
@@ -260,12 +232,40 @@ ret_from_interrupt: | |||
260 | pea ret_from_exception | 232 | pea ret_from_exception |
261 | jra do_softirq | 233 | jra do_softirq |
262 | 234 | ||
235 | /* Handler for user defined interrupt vectors */ | ||
236 | |||
237 | ENTRY(mach_inthandler) | ||
238 | SAVE_ALL_INT | ||
239 | GET_CURRENT(%d0) | ||
240 | addqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1) | ||
241 | | put exception # in d0 | ||
242 | bfextu %sp@(PT_VECTOR){#4,#10},%d0 | ||
243 | |||
244 | movel %sp,%sp@- | ||
245 | movel %d0,%sp@- | put vector # on stack | ||
246 | movel mach_process_int,%a0 | ||
247 | jsr %a0@ | process the IRQ | ||
248 | addql #8,%sp | pop parameters off stack | ||
249 | |||
250 | subqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1) | ||
251 | jeq ret_from_last_interrupt | ||
252 | RESTORE_ALL | ||
263 | 253 | ||
264 | /* Handler for uninitialized and spurious interrupts */ | 254 | /* Handler for uninitialized and spurious interrupts */ |
265 | 255 | ||
266 | bad_interrupt: | 256 | ENTRY(bad_inthandler) |
267 | addql #1,num_spurious | 257 | SAVE_ALL_INT |
268 | rte | 258 | GET_CURRENT(%d0) |
259 | addqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1) | ||
260 | |||
261 | movel %sp,%sp@- | ||
262 | jsr handle_badint | ||
263 | addql #4,%sp | ||
264 | |||
265 | subqb #1,%curptr@(TASK_INFO+TINFO_PREEMPT+1) | ||
266 | jeq ret_from_last_interrupt | ||
267 | RESTORE_ALL | ||
268 | |||
269 | 269 | ||
270 | ENTRY(sys_fork) | 270 | ENTRY(sys_fork) |
271 | SAVE_SWITCH_STACK | 271 | SAVE_SWITCH_STACK |
diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c index 4b85514792e7..895a56d69eba 100644 --- a/arch/m68k/kernel/ints.c +++ b/arch/m68k/kernel/ints.c | |||
@@ -248,19 +248,16 @@ static void dummy_free_irq(unsigned int irq, void *dev_id) | |||
248 | printk("calling uninitialized disable_irq()\n"); | 248 | printk("calling uninitialized disable_irq()\n"); |
249 | } | 249 | } |
250 | 250 | ||
251 | asmlinkage void process_int(unsigned long vec, struct pt_regs *fp) | 251 | asmlinkage void m68k_handle_int(unsigned int irq, struct pt_regs *regs) |
252 | { | 252 | { |
253 | if (vec >= VEC_INT1 && vec <= VEC_INT7 && !MACH_IS_BVME6000) { | 253 | kstat_cpu(0).irqs[irq]++; |
254 | vec -= VEC_SPUR; | 254 | irq_list[irq].handler(irq, irq_list[irq].dev_id, regs); |
255 | kstat_cpu(0).irqs[vec]++; | 255 | } |
256 | irq_list[vec].handler(vec, irq_list[vec].dev_id, fp); | 256 | |
257 | } else { | 257 | asmlinkage void handle_badint(struct pt_regs *regs) |
258 | if (mach_process_int) | 258 | { |
259 | mach_process_int(vec, fp); | 259 | kstat_cpu(0).irqs[0]++; |
260 | else | 260 | printk("unexpected interrupt from %u\n", regs->vector); |
261 | panic("Can't process interrupt vector %ld\n", vec); | ||
262 | return; | ||
263 | } | ||
264 | } | 261 | } |
265 | 262 | ||
266 | int show_interrupts(struct seq_file *p, void *v) | 263 | int show_interrupts(struct seq_file *p, void *v) |
diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c index 9adf378f8f1e..b19b951fd3e7 100644 --- a/arch/m68k/kernel/traps.c +++ b/arch/m68k/kernel/traps.c | |||
@@ -45,7 +45,6 @@ | |||
45 | asmlinkage void system_call(void); | 45 | asmlinkage void system_call(void); |
46 | asmlinkage void buserr(void); | 46 | asmlinkage void buserr(void); |
47 | asmlinkage void trap(void); | 47 | asmlinkage void trap(void); |
48 | asmlinkage void inthandler(void); | ||
49 | asmlinkage void nmihandler(void); | 48 | asmlinkage void nmihandler(void); |
50 | #ifdef CONFIG_M68KFPU_EMU | 49 | #ifdef CONFIG_M68KFPU_EMU |
51 | asmlinkage void fpu_emu(void); | 50 | asmlinkage void fpu_emu(void); |
@@ -53,51 +52,7 @@ asmlinkage void fpu_emu(void); | |||
53 | 52 | ||
54 | e_vector vectors[256] = { | 53 | e_vector vectors[256] = { |
55 | [VEC_BUSERR] = buserr, | 54 | [VEC_BUSERR] = buserr, |
56 | [VEC_ADDRERR] = trap, | ||
57 | [VEC_ILLEGAL] = trap, | ||
58 | [VEC_ZERODIV] = trap, | ||
59 | [VEC_CHK] = trap, | ||
60 | [VEC_TRAP] = trap, | ||
61 | [VEC_PRIV] = trap, | ||
62 | [VEC_TRACE] = trap, | ||
63 | [VEC_LINE10] = trap, | ||
64 | [VEC_LINE11] = trap, | ||
65 | [VEC_RESV12] = trap, | ||
66 | [VEC_COPROC] = trap, | ||
67 | [VEC_FORMAT] = trap, | ||
68 | [VEC_UNINT] = trap, | ||
69 | [VEC_RESV16] = trap, | ||
70 | [VEC_RESV17] = trap, | ||
71 | [VEC_RESV18] = trap, | ||
72 | [VEC_RESV19] = trap, | ||
73 | [VEC_RESV20] = trap, | ||
74 | [VEC_RESV21] = trap, | ||
75 | [VEC_RESV22] = trap, | ||
76 | [VEC_RESV23] = trap, | ||
77 | [VEC_SPUR] = inthandler, | ||
78 | [VEC_INT1] = inthandler, | ||
79 | [VEC_INT2] = inthandler, | ||
80 | [VEC_INT3] = inthandler, | ||
81 | [VEC_INT4] = inthandler, | ||
82 | [VEC_INT5] = inthandler, | ||
83 | [VEC_INT6] = inthandler, | ||
84 | [VEC_INT7] = inthandler, | ||
85 | [VEC_SYS] = system_call, | 55 | [VEC_SYS] = system_call, |
86 | [VEC_TRAP1] = trap, | ||
87 | [VEC_TRAP2] = trap, | ||
88 | [VEC_TRAP3] = trap, | ||
89 | [VEC_TRAP4] = trap, | ||
90 | [VEC_TRAP5] = trap, | ||
91 | [VEC_TRAP6] = trap, | ||
92 | [VEC_TRAP7] = trap, | ||
93 | [VEC_TRAP8] = trap, | ||
94 | [VEC_TRAP9] = trap, | ||
95 | [VEC_TRAP10] = trap, | ||
96 | [VEC_TRAP11] = trap, | ||
97 | [VEC_TRAP12] = trap, | ||
98 | [VEC_TRAP13] = trap, | ||
99 | [VEC_TRAP14] = trap, | ||
100 | [VEC_TRAP15] = trap, | ||
101 | }; | 56 | }; |
102 | 57 | ||
103 | /* nmi handler for the Amiga */ | 58 | /* nmi handler for the Amiga */ |
@@ -132,12 +87,16 @@ void __init trap_init (void) | |||
132 | { | 87 | { |
133 | int i; | 88 | int i; |
134 | 89 | ||
135 | for (i = 48; i < 64; i++) | 90 | vectors[VEC_SPUR] = bad_inthandler; |
91 | for (i = VEC_INT1; i <= VEC_INT7; i++) | ||
92 | vectors[i] = auto_inthandler; | ||
93 | |||
94 | for (i = 0; i < VEC_USER; i++) | ||
136 | if (!vectors[i]) | 95 | if (!vectors[i]) |
137 | vectors[i] = trap; | 96 | vectors[i] = trap; |
138 | 97 | ||
139 | for (i = 64; i < 256; i++) | 98 | for (i = VEC_USER; i < 256; i++) |
140 | vectors[i] = inthandler; | 99 | vectors[i] = mach_inthandler; |
141 | 100 | ||
142 | #ifdef CONFIG_M68KFPU_EMU | 101 | #ifdef CONFIG_M68KFPU_EMU |
143 | if (FPU_IS_EMU) | 102 | if (FPU_IS_EMU) |