diff options
Diffstat (limited to 'arch/sparc/kernel/entry.S')
-rw-r--r-- | arch/sparc/kernel/entry.S | 53 |
1 files changed, 37 insertions, 16 deletions
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S index 1504df8ddf70..f445e98463e6 100644 --- a/arch/sparc/kernel/entry.S +++ b/arch/sparc/kernel/entry.S | |||
@@ -229,7 +229,7 @@ real_irq_entry: | |||
229 | #ifdef CONFIG_SMP | 229 | #ifdef CONFIG_SMP |
230 | .globl patchme_maybe_smp_msg | 230 | .globl patchme_maybe_smp_msg |
231 | 231 | ||
232 | cmp %l7, 12 | 232 | cmp %l7, 11 |
233 | patchme_maybe_smp_msg: | 233 | patchme_maybe_smp_msg: |
234 | bgu maybe_smp4m_msg | 234 | bgu maybe_smp4m_msg |
235 | nop | 235 | nop |
@@ -269,19 +269,22 @@ smp4m_ticker: | |||
269 | /* Here is where we check for possible SMP IPI passed to us | 269 | /* Here is where we check for possible SMP IPI passed to us |
270 | * on some level other than 15 which is the NMI and only used | 270 | * on some level other than 15 which is the NMI and only used |
271 | * for cross calls. That has a separate entry point below. | 271 | * for cross calls. That has a separate entry point below. |
272 | * | ||
273 | * IPIs are sent on Level 12, 13 and 14. See IRQ_IPI_*. | ||
272 | */ | 274 | */ |
273 | maybe_smp4m_msg: | 275 | maybe_smp4m_msg: |
274 | GET_PROCESSOR4M_ID(o3) | 276 | GET_PROCESSOR4M_ID(o3) |
275 | sethi %hi(sun4m_irq_percpu), %l5 | 277 | sethi %hi(sun4m_irq_percpu), %l5 |
276 | sll %o3, 2, %o3 | 278 | sll %o3, 2, %o3 |
277 | or %l5, %lo(sun4m_irq_percpu), %o5 | 279 | or %l5, %lo(sun4m_irq_percpu), %o5 |
278 | sethi %hi(0x40000000), %o2 | 280 | sethi %hi(0x70000000), %o2 ! Check all soft-IRQs |
279 | ld [%o5 + %o3], %o1 | 281 | ld [%o5 + %o3], %o1 |
280 | ld [%o1 + 0x00], %o3 ! sun4m_irq_percpu[cpu]->pending | 282 | ld [%o1 + 0x00], %o3 ! sun4m_irq_percpu[cpu]->pending |
281 | andcc %o3, %o2, %g0 | 283 | andcc %o3, %o2, %g0 |
282 | be,a smp4m_ticker | 284 | be,a smp4m_ticker |
283 | cmp %l7, 14 | 285 | cmp %l7, 14 |
284 | st %o2, [%o1 + 0x04] ! sun4m_irq_percpu[cpu]->clear=0x40000000 | 286 | /* Soft-IRQ IPI */ |
287 | st %o2, [%o1 + 0x04] ! sun4m_irq_percpu[cpu]->clear=0x70000000 | ||
285 | WRITE_PAUSE | 288 | WRITE_PAUSE |
286 | ld [%o1 + 0x00], %g0 ! sun4m_irq_percpu[cpu]->pending | 289 | ld [%o1 + 0x00], %g0 ! sun4m_irq_percpu[cpu]->pending |
287 | WRITE_PAUSE | 290 | WRITE_PAUSE |
@@ -290,9 +293,27 @@ maybe_smp4m_msg: | |||
290 | WRITE_PAUSE | 293 | WRITE_PAUSE |
291 | wr %l4, PSR_ET, %psr | 294 | wr %l4, PSR_ET, %psr |
292 | WRITE_PAUSE | 295 | WRITE_PAUSE |
293 | call smp_reschedule_irq | 296 | srl %o3, 28, %o2 ! shift for simpler checks below |
297 | maybe_smp4m_msg_check_single: | ||
298 | andcc %o2, 0x1, %g0 | ||
299 | beq,a maybe_smp4m_msg_check_mask | ||
300 | andcc %o2, 0x2, %g0 | ||
301 | call smp_call_function_single_interrupt | ||
294 | nop | 302 | nop |
295 | 303 | andcc %o2, 0x2, %g0 | |
304 | maybe_smp4m_msg_check_mask: | ||
305 | beq,a maybe_smp4m_msg_check_resched | ||
306 | andcc %o2, 0x4, %g0 | ||
307 | call smp_call_function_interrupt | ||
308 | nop | ||
309 | andcc %o2, 0x4, %g0 | ||
310 | maybe_smp4m_msg_check_resched: | ||
311 | /* rescheduling is done in RESTORE_ALL regardless, but incr stats */ | ||
312 | beq,a maybe_smp4m_msg_out | ||
313 | nop | ||
314 | call smp_resched_interrupt | ||
315 | nop | ||
316 | maybe_smp4m_msg_out: | ||
296 | RESTORE_ALL | 317 | RESTORE_ALL |
297 | 318 | ||
298 | .align 4 | 319 | .align 4 |
@@ -401,18 +422,18 @@ linux_trap_ipi15_sun4d: | |||
401 | 1: b,a 1b | 422 | 1: b,a 1b |
402 | 423 | ||
403 | #ifdef CONFIG_SPARC_LEON | 424 | #ifdef CONFIG_SPARC_LEON |
404 | 425 | .globl smpleon_ipi | |
405 | .globl smpleon_ticker | 426 | .extern leon_ipi_interrupt |
406 | /* SMP per-cpu ticker interrupts are handled specially. */ | 427 | /* SMP per-cpu IPI interrupts are handled specially. */ |
407 | smpleon_ticker: | 428 | smpleon_ipi: |
408 | SAVE_ALL | 429 | SAVE_ALL |
409 | or %l0, PSR_PIL, %g2 | 430 | or %l0, PSR_PIL, %g2 |
410 | wr %g2, 0x0, %psr | 431 | wr %g2, 0x0, %psr |
411 | WRITE_PAUSE | 432 | WRITE_PAUSE |
412 | wr %g2, PSR_ET, %psr | 433 | wr %g2, PSR_ET, %psr |
413 | WRITE_PAUSE | 434 | WRITE_PAUSE |
414 | call leon_percpu_timer_interrupt | 435 | call leonsmp_ipi_interrupt |
415 | add %sp, STACKFRAME_SZ, %o0 | 436 | add %sp, STACKFRAME_SZ, %o1 ! pt_regs |
416 | wr %l0, PSR_ET, %psr | 437 | wr %l0, PSR_ET, %psr |
417 | WRITE_PAUSE | 438 | WRITE_PAUSE |
418 | RESTORE_ALL | 439 | RESTORE_ALL |
@@ -801,7 +822,7 @@ vac_linesize_patch_32: subcc %l7, 32, %l7 | |||
801 | .globl vac_hwflush_patch1_on, vac_hwflush_patch2_on | 822 | .globl vac_hwflush_patch1_on, vac_hwflush_patch2_on |
802 | 823 | ||
803 | /* | 824 | /* |
804 | * Ugly, but we cant use hardware flushing on the sun4 and we'd require | 825 | * Ugly, but we can't use hardware flushing on the sun4 and we'd require |
805 | * two instructions (Anton) | 826 | * two instructions (Anton) |
806 | */ | 827 | */ |
807 | vac_hwflush_patch1_on: addcc %l7, -PAGE_SIZE, %l7 | 828 | vac_hwflush_patch1_on: addcc %l7, -PAGE_SIZE, %l7 |
@@ -851,7 +872,7 @@ sun4c_fault: | |||
851 | sethi %hi(~((1 << SUN4C_REAL_PGDIR_SHIFT) - 1)), %l4 | 872 | sethi %hi(~((1 << SUN4C_REAL_PGDIR_SHIFT) - 1)), %l4 |
852 | 873 | ||
853 | /* If the kernel references a bum kernel pointer, or a pte which | 874 | /* If the kernel references a bum kernel pointer, or a pte which |
854 | * points to a non existant page in ram, we will run this code | 875 | * points to a non existent page in ram, we will run this code |
855 | * _forever_ and lock up the machine!!!!! So we must check for | 876 | * _forever_ and lock up the machine!!!!! So we must check for |
856 | * this condition, the AC_SYNC_ERR bits are what we must examine. | 877 | * this condition, the AC_SYNC_ERR bits are what we must examine. |
857 | * Also a parity error would make this happen as well. So we just | 878 | * Also a parity error would make this happen as well. So we just |
@@ -1283,7 +1304,7 @@ linux_syscall_trace: | |||
1283 | .globl ret_from_fork | 1304 | .globl ret_from_fork |
1284 | ret_from_fork: | 1305 | ret_from_fork: |
1285 | call schedule_tail | 1306 | call schedule_tail |
1286 | mov %g3, %o0 | 1307 | ld [%g3 + TI_TASK], %o0 |
1287 | b ret_sys_call | 1308 | b ret_sys_call |
1288 | ld [%sp + STACKFRAME_SZ + PT_I0], %o0 | 1309 | ld [%sp + STACKFRAME_SZ + PT_I0], %o0 |
1289 | 1310 | ||
@@ -1583,7 +1604,7 @@ restore_current: | |||
1583 | retl | 1604 | retl |
1584 | nop | 1605 | nop |
1585 | 1606 | ||
1586 | #ifdef CONFIG_PCI | 1607 | #ifdef CONFIG_PCIC_PCI |
1587 | #include <asm/pcic.h> | 1608 | #include <asm/pcic.h> |
1588 | 1609 | ||
1589 | .align 4 | 1610 | .align 4 |
@@ -1629,7 +1650,7 @@ pcic_nmi_trap_patch: | |||
1629 | rd %psr, %l0 | 1650 | rd %psr, %l0 |
1630 | .word 0 | 1651 | .word 0 |
1631 | 1652 | ||
1632 | #endif /* CONFIG_PCI */ | 1653 | #endif /* CONFIG_PCIC_PCI */ |
1633 | 1654 | ||
1634 | .globl flushw_all | 1655 | .globl flushw_all |
1635 | flushw_all: | 1656 | flushw_all: |