18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/* arch/sparc/kernel/entry.S:  Sparc trap low-level entry points.
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Copyright (C) 1995, 2007 David S. Miller (davem@davemloft.net)
58c2ecf20Sopenharmony_ci * Copyright (C) 1996 Eddie C. Dost   (ecd@skynet.be)
68c2ecf20Sopenharmony_ci * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
78c2ecf20Sopenharmony_ci * Copyright (C) 1996-1999 Jakub Jelinek   (jj@sunsite.mff.cuni.cz)
88c2ecf20Sopenharmony_ci * Copyright (C) 1997 Anton Blanchard (anton@progsoc.uts.edu.au)
98c2ecf20Sopenharmony_ci */
108c2ecf20Sopenharmony_ci
118c2ecf20Sopenharmony_ci#include <linux/linkage.h>
128c2ecf20Sopenharmony_ci#include <linux/errno.h>
138c2ecf20Sopenharmony_ci#include <linux/pgtable.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#include <asm/head.h>
168c2ecf20Sopenharmony_ci#include <asm/asi.h>
178c2ecf20Sopenharmony_ci#include <asm/smp.h>
188c2ecf20Sopenharmony_ci#include <asm/contregs.h>
198c2ecf20Sopenharmony_ci#include <asm/ptrace.h>
208c2ecf20Sopenharmony_ci#include <asm/asm-offsets.h>
218c2ecf20Sopenharmony_ci#include <asm/psr.h>
228c2ecf20Sopenharmony_ci#include <asm/vaddrs.h>
238c2ecf20Sopenharmony_ci#include <asm/page.h>
248c2ecf20Sopenharmony_ci#include <asm/winmacro.h>
258c2ecf20Sopenharmony_ci#include <asm/signal.h>
268c2ecf20Sopenharmony_ci#include <asm/obio.h>
278c2ecf20Sopenharmony_ci#include <asm/mxcc.h>
288c2ecf20Sopenharmony_ci#include <asm/thread_info.h>
298c2ecf20Sopenharmony_ci#include <asm/param.h>
308c2ecf20Sopenharmony_ci#include <asm/unistd.h>
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci#include <asm/asmmacro.h>
338c2ecf20Sopenharmony_ci#include <asm/export.h>
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci#define curptr      g6
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci/* These are just handy. */
388c2ecf20Sopenharmony_ci#define _SV	save	%sp, -STACKFRAME_SZ, %sp
398c2ecf20Sopenharmony_ci#define _RS     restore
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci#define FLUSH_ALL_KERNEL_WINDOWS \
428c2ecf20Sopenharmony_ci	_SV; _SV; _SV; _SV; _SV; _SV; _SV; \
438c2ecf20Sopenharmony_ci	_RS; _RS; _RS; _RS; _RS; _RS; _RS;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	.text
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci#ifdef CONFIG_KGDB
488c2ecf20Sopenharmony_ci	.align	4
498c2ecf20Sopenharmony_ci	.globl		arch_kgdb_breakpoint
508c2ecf20Sopenharmony_ci	.type		arch_kgdb_breakpoint,#function
518c2ecf20Sopenharmony_ciarch_kgdb_breakpoint:
528c2ecf20Sopenharmony_ci	ta		0x7d
538c2ecf20Sopenharmony_ci	retl
548c2ecf20Sopenharmony_ci	 nop
558c2ecf20Sopenharmony_ci	.size		arch_kgdb_breakpoint,.-arch_kgdb_breakpoint
568c2ecf20Sopenharmony_ci#endif
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_ci#if defined(CONFIG_BLK_DEV_FD) || defined(CONFIG_BLK_DEV_FD_MODULE)
598c2ecf20Sopenharmony_ci	.align	4
608c2ecf20Sopenharmony_ci	.globl	floppy_hardint
618c2ecf20Sopenharmony_cifloppy_hardint:
628c2ecf20Sopenharmony_ci	/*
638c2ecf20Sopenharmony_ci	 * This code cannot touch registers %l0 %l1 and %l2
648c2ecf20Sopenharmony_ci	 * because SAVE_ALL depends on their values. It depends
658c2ecf20Sopenharmony_ci	 * on %l3 also, but we regenerate it before a call.
668c2ecf20Sopenharmony_ci	 * Other registers are:
678c2ecf20Sopenharmony_ci	 * %l3 -- base address of fdc registers
688c2ecf20Sopenharmony_ci	 * %l4 -- pdma_vaddr
698c2ecf20Sopenharmony_ci	 * %l5 -- scratch for ld/st address
708c2ecf20Sopenharmony_ci	 * %l6 -- pdma_size
718c2ecf20Sopenharmony_ci	 * %l7 -- scratch [floppy byte, ld/st address, aux. data]
728c2ecf20Sopenharmony_ci	 */
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_ci	/* Do we have work to do? */
758c2ecf20Sopenharmony_ci	sethi	%hi(doing_pdma), %l7
768c2ecf20Sopenharmony_ci	ld	[%l7 + %lo(doing_pdma)], %l7
778c2ecf20Sopenharmony_ci	cmp	%l7, 0
788c2ecf20Sopenharmony_ci	be	floppy_dosoftint
798c2ecf20Sopenharmony_ci	 nop
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci	/* Load fdc register base */
828c2ecf20Sopenharmony_ci	sethi	%hi(fdc_status), %l3
838c2ecf20Sopenharmony_ci	ld	[%l3 + %lo(fdc_status)], %l3
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci	/* Setup register addresses */
868c2ecf20Sopenharmony_ci	sethi	%hi(pdma_vaddr), %l5	! transfer buffer
878c2ecf20Sopenharmony_ci	ld	[%l5 + %lo(pdma_vaddr)], %l4
888c2ecf20Sopenharmony_ci	sethi	%hi(pdma_size), %l5	! bytes to go
898c2ecf20Sopenharmony_ci	ld	[%l5 + %lo(pdma_size)], %l6
908c2ecf20Sopenharmony_cinext_byte:
918c2ecf20Sopenharmony_ci  	ldub	[%l3], %l7
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	andcc	%l7, 0x80, %g0		! Does fifo still have data
948c2ecf20Sopenharmony_ci	bz	floppy_fifo_emptied	! fifo has been emptied...
958c2ecf20Sopenharmony_ci	 andcc	%l7, 0x20, %g0		! in non-dma mode still?
968c2ecf20Sopenharmony_ci	bz	floppy_overrun		! nope, overrun
978c2ecf20Sopenharmony_ci	 andcc	%l7, 0x40, %g0		! 0=write 1=read
988c2ecf20Sopenharmony_ci	bz	floppy_write
998c2ecf20Sopenharmony_ci	 sub	%l6, 0x1, %l6
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci	/* Ok, actually read this byte */
1028c2ecf20Sopenharmony_ci	ldub	[%l3 + 1], %l7
1038c2ecf20Sopenharmony_ci	orcc	%g0, %l6, %g0
1048c2ecf20Sopenharmony_ci	stb	%l7, [%l4]
1058c2ecf20Sopenharmony_ci	bne	next_byte
1068c2ecf20Sopenharmony_ci	 add	%l4, 0x1, %l4
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ci	b	floppy_tdone
1098c2ecf20Sopenharmony_ci	 nop
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_cifloppy_write:
1128c2ecf20Sopenharmony_ci	/* Ok, actually write this byte */
1138c2ecf20Sopenharmony_ci	ldub	[%l4], %l7
1148c2ecf20Sopenharmony_ci	orcc	%g0, %l6, %g0
1158c2ecf20Sopenharmony_ci	stb	%l7, [%l3 + 1]
1168c2ecf20Sopenharmony_ci	bne	next_byte
1178c2ecf20Sopenharmony_ci	 add	%l4, 0x1, %l4
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci	/* fall through... */
1208c2ecf20Sopenharmony_cifloppy_tdone:
1218c2ecf20Sopenharmony_ci	sethi	%hi(pdma_vaddr), %l5
1228c2ecf20Sopenharmony_ci	st	%l4, [%l5 + %lo(pdma_vaddr)]
1238c2ecf20Sopenharmony_ci	sethi	%hi(pdma_size), %l5
1248c2ecf20Sopenharmony_ci	st	%l6, [%l5 + %lo(pdma_size)]
1258c2ecf20Sopenharmony_ci	/* Flip terminal count pin */
1268c2ecf20Sopenharmony_ci	set	auxio_register, %l7
1278c2ecf20Sopenharmony_ci	ld	[%l7], %l7
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci	ldub	[%l7], %l5
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci	or	%l5, 0xc2, %l5
1328c2ecf20Sopenharmony_ci	stb	%l5, [%l7]
1338c2ecf20Sopenharmony_ci	andn    %l5, 0x02, %l5
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci2:
1368c2ecf20Sopenharmony_ci	/* Kill some time so the bits set */
1378c2ecf20Sopenharmony_ci	WRITE_PAUSE
1388c2ecf20Sopenharmony_ci	WRITE_PAUSE
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci	stb     %l5, [%l7]
1418c2ecf20Sopenharmony_ci
1428c2ecf20Sopenharmony_ci	/* Prevent recursion */
1438c2ecf20Sopenharmony_ci	sethi	%hi(doing_pdma), %l7
1448c2ecf20Sopenharmony_ci	b	floppy_dosoftint
1458c2ecf20Sopenharmony_ci	 st	%g0, [%l7 + %lo(doing_pdma)]
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci	/* We emptied the FIFO, but we haven't read everything
1488c2ecf20Sopenharmony_ci	 * as of yet.  Store the current transfer address and
1498c2ecf20Sopenharmony_ci	 * bytes left to read so we can continue when the next
1508c2ecf20Sopenharmony_ci	 * fast IRQ comes in.
1518c2ecf20Sopenharmony_ci	 */
1528c2ecf20Sopenharmony_cifloppy_fifo_emptied:
1538c2ecf20Sopenharmony_ci	sethi	%hi(pdma_vaddr), %l5
1548c2ecf20Sopenharmony_ci	st	%l4, [%l5 + %lo(pdma_vaddr)]
1558c2ecf20Sopenharmony_ci	sethi	%hi(pdma_size), %l7
1568c2ecf20Sopenharmony_ci	st	%l6, [%l7 + %lo(pdma_size)]
1578c2ecf20Sopenharmony_ci
1588c2ecf20Sopenharmony_ci	/* Restore condition codes */
1598c2ecf20Sopenharmony_ci	wr	%l0, 0x0, %psr
1608c2ecf20Sopenharmony_ci	WRITE_PAUSE
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci	jmp	%l1
1638c2ecf20Sopenharmony_ci	rett	%l2
1648c2ecf20Sopenharmony_ci
1658c2ecf20Sopenharmony_cifloppy_overrun:
1668c2ecf20Sopenharmony_ci	sethi	%hi(pdma_vaddr), %l5
1678c2ecf20Sopenharmony_ci	st	%l4, [%l5 + %lo(pdma_vaddr)]
1688c2ecf20Sopenharmony_ci	sethi	%hi(pdma_size), %l5
1698c2ecf20Sopenharmony_ci	st	%l6, [%l5 + %lo(pdma_size)]
1708c2ecf20Sopenharmony_ci	/* Prevent recursion */
1718c2ecf20Sopenharmony_ci	sethi	%hi(doing_pdma), %l7
1728c2ecf20Sopenharmony_ci	st	%g0, [%l7 + %lo(doing_pdma)]
1738c2ecf20Sopenharmony_ci
1748c2ecf20Sopenharmony_ci	/* fall through... */
1758c2ecf20Sopenharmony_cifloppy_dosoftint:
1768c2ecf20Sopenharmony_ci	rd	%wim, %l3
1778c2ecf20Sopenharmony_ci	SAVE_ALL
1788c2ecf20Sopenharmony_ci
1798c2ecf20Sopenharmony_ci	/* Set all IRQs off. */
1808c2ecf20Sopenharmony_ci	or	%l0, PSR_PIL, %l4
1818c2ecf20Sopenharmony_ci	wr	%l4, 0x0, %psr
1828c2ecf20Sopenharmony_ci	WRITE_PAUSE
1838c2ecf20Sopenharmony_ci	wr	%l4, PSR_ET, %psr
1848c2ecf20Sopenharmony_ci	WRITE_PAUSE
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci	mov	11, %o0			! floppy irq level (unused anyway)
1878c2ecf20Sopenharmony_ci	mov	%g0, %o1		! devid is not used in fast interrupts
1888c2ecf20Sopenharmony_ci	call	sparc_floppy_irq
1898c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o2	! struct pt_regs *regs
1908c2ecf20Sopenharmony_ci
1918c2ecf20Sopenharmony_ci	RESTORE_ALL
1928c2ecf20Sopenharmony_ci
1938c2ecf20Sopenharmony_ci#endif /* (CONFIG_BLK_DEV_FD) */
1948c2ecf20Sopenharmony_ci
1958c2ecf20Sopenharmony_ci	/* Bad trap handler */
1968c2ecf20Sopenharmony_ci	.globl	bad_trap_handler
1978c2ecf20Sopenharmony_cibad_trap_handler:
1988c2ecf20Sopenharmony_ci	SAVE_ALL
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr
2018c2ecf20Sopenharmony_ci	WRITE_PAUSE
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0	! pt_regs
2048c2ecf20Sopenharmony_ci	call	do_hw_interrupt
2058c2ecf20Sopenharmony_ci	 mov	%l7, %o1		! trap number
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci	RESTORE_ALL
2088c2ecf20Sopenharmony_ci
2098c2ecf20Sopenharmony_ci/* For now all IRQ's not registered get sent here. handler_irq() will
2108c2ecf20Sopenharmony_ci * see if a routine is registered to handle this interrupt and if not
2118c2ecf20Sopenharmony_ci * it will say so on the console.
2128c2ecf20Sopenharmony_ci */
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_ci	.align	4
2158c2ecf20Sopenharmony_ci	.globl	real_irq_entry, patch_handler_irq
2168c2ecf20Sopenharmony_cireal_irq_entry:
2178c2ecf20Sopenharmony_ci	SAVE_ALL
2188c2ecf20Sopenharmony_ci
2198c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP
2208c2ecf20Sopenharmony_ci	.globl	patchme_maybe_smp_msg
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_ci	cmp	%l7, 11
2238c2ecf20Sopenharmony_cipatchme_maybe_smp_msg:
2248c2ecf20Sopenharmony_ci	bgu	maybe_smp4m_msg
2258c2ecf20Sopenharmony_ci	 nop
2268c2ecf20Sopenharmony_ci#endif
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_cireal_irq_continue:
2298c2ecf20Sopenharmony_ci	or	%l0, PSR_PIL, %g2
2308c2ecf20Sopenharmony_ci	wr	%g2, 0x0, %psr
2318c2ecf20Sopenharmony_ci	WRITE_PAUSE
2328c2ecf20Sopenharmony_ci	wr	%g2, PSR_ET, %psr
2338c2ecf20Sopenharmony_ci	WRITE_PAUSE
2348c2ecf20Sopenharmony_ci	mov	%l7, %o0		! irq level
2358c2ecf20Sopenharmony_cipatch_handler_irq:
2368c2ecf20Sopenharmony_ci	call	handler_irq
2378c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o1	! pt_regs ptr
2388c2ecf20Sopenharmony_ci	or	%l0, PSR_PIL, %g2	! restore PIL after handler_irq
2398c2ecf20Sopenharmony_ci	wr	%g2, PSR_ET, %psr	! keep ET up
2408c2ecf20Sopenharmony_ci	WRITE_PAUSE
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_ci	RESTORE_ALL
2438c2ecf20Sopenharmony_ci
2448c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP
2458c2ecf20Sopenharmony_ci	/* SMP per-cpu ticker interrupts are handled specially. */
2468c2ecf20Sopenharmony_cismp4m_ticker:
2478c2ecf20Sopenharmony_ci	bne	real_irq_continue+4
2488c2ecf20Sopenharmony_ci	 or	%l0, PSR_PIL, %g2
2498c2ecf20Sopenharmony_ci	wr	%g2, 0x0, %psr
2508c2ecf20Sopenharmony_ci	WRITE_PAUSE
2518c2ecf20Sopenharmony_ci	wr	%g2, PSR_ET, %psr
2528c2ecf20Sopenharmony_ci	WRITE_PAUSE
2538c2ecf20Sopenharmony_ci	call	smp4m_percpu_timer_interrupt
2548c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o0
2558c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr
2568c2ecf20Sopenharmony_ci	WRITE_PAUSE
2578c2ecf20Sopenharmony_ci	RESTORE_ALL
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ci#define GET_PROCESSOR4M_ID(reg)	\
2608c2ecf20Sopenharmony_ci	rd	%tbr, %reg;	\
2618c2ecf20Sopenharmony_ci	srl	%reg, 12, %reg;	\
2628c2ecf20Sopenharmony_ci	and	%reg, 3, %reg;
2638c2ecf20Sopenharmony_ci
2648c2ecf20Sopenharmony_ci	/* Here is where we check for possible SMP IPI passed to us
2658c2ecf20Sopenharmony_ci	 * on some level other than 15 which is the NMI and only used
2668c2ecf20Sopenharmony_ci	 * for cross calls.  That has a separate entry point below.
2678c2ecf20Sopenharmony_ci	 *
2688c2ecf20Sopenharmony_ci	 * IPIs are sent on Level 12, 13 and 14. See IRQ_IPI_*.
2698c2ecf20Sopenharmony_ci	 */
2708c2ecf20Sopenharmony_cimaybe_smp4m_msg:
2718c2ecf20Sopenharmony_ci	GET_PROCESSOR4M_ID(o3)
2728c2ecf20Sopenharmony_ci	sethi	%hi(sun4m_irq_percpu), %l5
2738c2ecf20Sopenharmony_ci	sll	%o3, 2, %o3
2748c2ecf20Sopenharmony_ci	or	%l5, %lo(sun4m_irq_percpu), %o5
2758c2ecf20Sopenharmony_ci	sethi	%hi(0x70000000), %o2	! Check all soft-IRQs
2768c2ecf20Sopenharmony_ci	ld	[%o5 + %o3], %o1
2778c2ecf20Sopenharmony_ci	ld	[%o1 + 0x00], %o3	! sun4m_irq_percpu[cpu]->pending
2788c2ecf20Sopenharmony_ci	andcc	%o3, %o2, %g0
2798c2ecf20Sopenharmony_ci	be,a	smp4m_ticker
2808c2ecf20Sopenharmony_ci	 cmp	%l7, 14
2818c2ecf20Sopenharmony_ci	/* Soft-IRQ IPI */
2828c2ecf20Sopenharmony_ci	st	%o2, [%o1 + 0x04]	! sun4m_irq_percpu[cpu]->clear=0x70000000
2838c2ecf20Sopenharmony_ci	WRITE_PAUSE
2848c2ecf20Sopenharmony_ci	ld	[%o1 + 0x00], %g0	! sun4m_irq_percpu[cpu]->pending
2858c2ecf20Sopenharmony_ci	WRITE_PAUSE
2868c2ecf20Sopenharmony_ci	or	%l0, PSR_PIL, %l4
2878c2ecf20Sopenharmony_ci	wr	%l4, 0x0, %psr
2888c2ecf20Sopenharmony_ci	WRITE_PAUSE
2898c2ecf20Sopenharmony_ci	wr	%l4, PSR_ET, %psr
2908c2ecf20Sopenharmony_ci	WRITE_PAUSE
2918c2ecf20Sopenharmony_ci	srl	%o3, 28, %o2		! shift for simpler checks below
2928c2ecf20Sopenharmony_cimaybe_smp4m_msg_check_single:
2938c2ecf20Sopenharmony_ci	andcc	%o2, 0x1, %g0
2948c2ecf20Sopenharmony_ci	beq,a	maybe_smp4m_msg_check_mask
2958c2ecf20Sopenharmony_ci	 andcc	%o2, 0x2, %g0
2968c2ecf20Sopenharmony_ci	call	smp_call_function_single_interrupt
2978c2ecf20Sopenharmony_ci	 nop
2988c2ecf20Sopenharmony_ci	andcc	%o2, 0x2, %g0
2998c2ecf20Sopenharmony_cimaybe_smp4m_msg_check_mask:
3008c2ecf20Sopenharmony_ci	beq,a	maybe_smp4m_msg_check_resched
3018c2ecf20Sopenharmony_ci	 andcc	%o2, 0x4, %g0
3028c2ecf20Sopenharmony_ci	call	smp_call_function_interrupt
3038c2ecf20Sopenharmony_ci	 nop
3048c2ecf20Sopenharmony_ci	andcc	%o2, 0x4, %g0
3058c2ecf20Sopenharmony_cimaybe_smp4m_msg_check_resched:
3068c2ecf20Sopenharmony_ci	/* rescheduling is done in RESTORE_ALL regardless, but incr stats */
3078c2ecf20Sopenharmony_ci	beq,a	maybe_smp4m_msg_out
3088c2ecf20Sopenharmony_ci	 nop
3098c2ecf20Sopenharmony_ci	call	smp_resched_interrupt
3108c2ecf20Sopenharmony_ci	 nop
3118c2ecf20Sopenharmony_cimaybe_smp4m_msg_out:
3128c2ecf20Sopenharmony_ci	RESTORE_ALL
3138c2ecf20Sopenharmony_ci
3148c2ecf20Sopenharmony_ci	.align	4
3158c2ecf20Sopenharmony_ci	.globl	linux_trap_ipi15_sun4m
3168c2ecf20Sopenharmony_cilinux_trap_ipi15_sun4m:
3178c2ecf20Sopenharmony_ci	SAVE_ALL
3188c2ecf20Sopenharmony_ci	sethi	%hi(0x80000000), %o2
3198c2ecf20Sopenharmony_ci	GET_PROCESSOR4M_ID(o0)
3208c2ecf20Sopenharmony_ci	sethi	%hi(sun4m_irq_percpu), %l5
3218c2ecf20Sopenharmony_ci	or	%l5, %lo(sun4m_irq_percpu), %o5
3228c2ecf20Sopenharmony_ci	sll	%o0, 2, %o0
3238c2ecf20Sopenharmony_ci	ld	[%o5 + %o0], %o5
3248c2ecf20Sopenharmony_ci	ld	[%o5 + 0x00], %o3	! sun4m_irq_percpu[cpu]->pending
3258c2ecf20Sopenharmony_ci	andcc	%o3, %o2, %g0
3268c2ecf20Sopenharmony_ci	be	sun4m_nmi_error		! Must be an NMI async memory error
3278c2ecf20Sopenharmony_ci	 st	%o2, [%o5 + 0x04]	! sun4m_irq_percpu[cpu]->clear=0x80000000
3288c2ecf20Sopenharmony_ci	WRITE_PAUSE
3298c2ecf20Sopenharmony_ci	ld	[%o5 + 0x00], %g0	! sun4m_irq_percpu[cpu]->pending
3308c2ecf20Sopenharmony_ci	WRITE_PAUSE
3318c2ecf20Sopenharmony_ci	or	%l0, PSR_PIL, %l4
3328c2ecf20Sopenharmony_ci	wr	%l4, 0x0, %psr
3338c2ecf20Sopenharmony_ci	WRITE_PAUSE
3348c2ecf20Sopenharmony_ci	wr	%l4, PSR_ET, %psr
3358c2ecf20Sopenharmony_ci	WRITE_PAUSE
3368c2ecf20Sopenharmony_ci	call	smp4m_cross_call_irq
3378c2ecf20Sopenharmony_ci	 nop
3388c2ecf20Sopenharmony_ci	b	ret_trap_lockless_ipi
3398c2ecf20Sopenharmony_ci	 clr	%l6
3408c2ecf20Sopenharmony_ci
3418c2ecf20Sopenharmony_ci	.globl	smp4d_ticker
3428c2ecf20Sopenharmony_ci	/* SMP per-cpu ticker interrupts are handled specially. */
3438c2ecf20Sopenharmony_cismp4d_ticker:
3448c2ecf20Sopenharmony_ci	SAVE_ALL
3458c2ecf20Sopenharmony_ci	or	%l0, PSR_PIL, %g2
3468c2ecf20Sopenharmony_ci	sethi	%hi(CC_ICLR), %o0
3478c2ecf20Sopenharmony_ci	sethi	%hi(1 << 14), %o1
3488c2ecf20Sopenharmony_ci	or	%o0, %lo(CC_ICLR), %o0
3498c2ecf20Sopenharmony_ci	stha	%o1, [%o0] ASI_M_MXCC	/* Clear PIL 14 in MXCC's ICLR */
3508c2ecf20Sopenharmony_ci	wr	%g2, 0x0, %psr
3518c2ecf20Sopenharmony_ci	WRITE_PAUSE
3528c2ecf20Sopenharmony_ci	wr	%g2, PSR_ET, %psr
3538c2ecf20Sopenharmony_ci	WRITE_PAUSE
3548c2ecf20Sopenharmony_ci	call	smp4d_percpu_timer_interrupt
3558c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o0
3568c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr
3578c2ecf20Sopenharmony_ci	WRITE_PAUSE
3588c2ecf20Sopenharmony_ci	RESTORE_ALL
3598c2ecf20Sopenharmony_ci
3608c2ecf20Sopenharmony_ci	.align	4
3618c2ecf20Sopenharmony_ci	.globl	linux_trap_ipi15_sun4d
3628c2ecf20Sopenharmony_cilinux_trap_ipi15_sun4d:
3638c2ecf20Sopenharmony_ci	SAVE_ALL
3648c2ecf20Sopenharmony_ci	sethi	%hi(CC_BASE), %o4
3658c2ecf20Sopenharmony_ci	sethi	%hi(MXCC_ERR_ME|MXCC_ERR_PEW|MXCC_ERR_ASE|MXCC_ERR_PEE), %o2
3668c2ecf20Sopenharmony_ci	or	%o4, (CC_EREG - CC_BASE), %o0
3678c2ecf20Sopenharmony_ci	ldda	[%o0] ASI_M_MXCC, %o0
3688c2ecf20Sopenharmony_ci	andcc	%o0, %o2, %g0
3698c2ecf20Sopenharmony_ci	bne	1f
3708c2ecf20Sopenharmony_ci	 sethi	%hi(BB_STAT2), %o2
3718c2ecf20Sopenharmony_ci	lduba	[%o2] ASI_M_CTL, %o2
3728c2ecf20Sopenharmony_ci	andcc	%o2, BB_STAT2_MASK, %g0
3738c2ecf20Sopenharmony_ci	bne	2f
3748c2ecf20Sopenharmony_ci	 or	%o4, (CC_ICLR - CC_BASE), %o0
3758c2ecf20Sopenharmony_ci	sethi	%hi(1 << 15), %o1
3768c2ecf20Sopenharmony_ci	stha	%o1, [%o0] ASI_M_MXCC	/* Clear PIL 15 in MXCC's ICLR */
3778c2ecf20Sopenharmony_ci	or	%l0, PSR_PIL, %l4
3788c2ecf20Sopenharmony_ci	wr	%l4, 0x0, %psr
3798c2ecf20Sopenharmony_ci	WRITE_PAUSE
3808c2ecf20Sopenharmony_ci	wr	%l4, PSR_ET, %psr
3818c2ecf20Sopenharmony_ci	WRITE_PAUSE
3828c2ecf20Sopenharmony_ci	call	smp4d_cross_call_irq
3838c2ecf20Sopenharmony_ci	 nop
3848c2ecf20Sopenharmony_ci	b	ret_trap_lockless_ipi
3858c2ecf20Sopenharmony_ci	 clr	%l6
3868c2ecf20Sopenharmony_ci
3878c2ecf20Sopenharmony_ci1:	/* MXCC error */
3888c2ecf20Sopenharmony_ci2:	/* BB error */
3898c2ecf20Sopenharmony_ci	/* Disable PIL 15 */
3908c2ecf20Sopenharmony_ci	set	CC_IMSK, %l4
3918c2ecf20Sopenharmony_ci	lduha	[%l4] ASI_M_MXCC, %l5
3928c2ecf20Sopenharmony_ci	sethi	%hi(1 << 15), %l7
3938c2ecf20Sopenharmony_ci	or	%l5, %l7, %l5
3948c2ecf20Sopenharmony_ci	stha	%l5, [%l4] ASI_M_MXCC
3958c2ecf20Sopenharmony_ci	/* FIXME */
3968c2ecf20Sopenharmony_ci1:	b,a	1b
3978c2ecf20Sopenharmony_ci
3988c2ecf20Sopenharmony_ci	.globl	smpleon_ipi
3998c2ecf20Sopenharmony_ci	.extern leon_ipi_interrupt
4008c2ecf20Sopenharmony_ci	/* SMP per-cpu IPI interrupts are handled specially. */
4018c2ecf20Sopenharmony_cismpleon_ipi:
4028c2ecf20Sopenharmony_ci        SAVE_ALL
4038c2ecf20Sopenharmony_ci	or	%l0, PSR_PIL, %g2
4048c2ecf20Sopenharmony_ci	wr	%g2, 0x0, %psr
4058c2ecf20Sopenharmony_ci	WRITE_PAUSE
4068c2ecf20Sopenharmony_ci	wr	%g2, PSR_ET, %psr
4078c2ecf20Sopenharmony_ci	WRITE_PAUSE
4088c2ecf20Sopenharmony_ci	call	leonsmp_ipi_interrupt
4098c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o1 ! pt_regs
4108c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr
4118c2ecf20Sopenharmony_ci	WRITE_PAUSE
4128c2ecf20Sopenharmony_ci	RESTORE_ALL
4138c2ecf20Sopenharmony_ci
4148c2ecf20Sopenharmony_ci	.align	4
4158c2ecf20Sopenharmony_ci	.globl	linux_trap_ipi15_leon
4168c2ecf20Sopenharmony_cilinux_trap_ipi15_leon:
4178c2ecf20Sopenharmony_ci	SAVE_ALL
4188c2ecf20Sopenharmony_ci	or	%l0, PSR_PIL, %l4
4198c2ecf20Sopenharmony_ci	wr	%l4, 0x0, %psr
4208c2ecf20Sopenharmony_ci	WRITE_PAUSE
4218c2ecf20Sopenharmony_ci	wr	%l4, PSR_ET, %psr
4228c2ecf20Sopenharmony_ci	WRITE_PAUSE
4238c2ecf20Sopenharmony_ci	call	leon_cross_call_irq
4248c2ecf20Sopenharmony_ci	 nop
4258c2ecf20Sopenharmony_ci	b	ret_trap_lockless_ipi
4268c2ecf20Sopenharmony_ci	 clr	%l6
4278c2ecf20Sopenharmony_ci
4288c2ecf20Sopenharmony_ci#endif /* CONFIG_SMP */
4298c2ecf20Sopenharmony_ci
4308c2ecf20Sopenharmony_ci	/* This routine handles illegal instructions and privileged
4318c2ecf20Sopenharmony_ci	 * instruction attempts from user code.
4328c2ecf20Sopenharmony_ci	 */
4338c2ecf20Sopenharmony_ci	.align	4
4348c2ecf20Sopenharmony_ci	.globl	bad_instruction
4358c2ecf20Sopenharmony_cibad_instruction:
4368c2ecf20Sopenharmony_ci	sethi	%hi(0xc1f80000), %l4
4378c2ecf20Sopenharmony_ci	ld	[%l1], %l5
4388c2ecf20Sopenharmony_ci	sethi	%hi(0x81d80000), %l7
4398c2ecf20Sopenharmony_ci	and	%l5, %l4, %l5
4408c2ecf20Sopenharmony_ci	cmp	%l5, %l7
4418c2ecf20Sopenharmony_ci	be	1f
4428c2ecf20Sopenharmony_ci	SAVE_ALL
4438c2ecf20Sopenharmony_ci
4448c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr		! re-enable traps
4458c2ecf20Sopenharmony_ci	WRITE_PAUSE
4468c2ecf20Sopenharmony_ci
4478c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
4488c2ecf20Sopenharmony_ci	mov	%l1, %o1
4498c2ecf20Sopenharmony_ci	mov	%l2, %o2
4508c2ecf20Sopenharmony_ci	call	do_illegal_instruction
4518c2ecf20Sopenharmony_ci	 mov	%l0, %o3
4528c2ecf20Sopenharmony_ci
4538c2ecf20Sopenharmony_ci	RESTORE_ALL
4548c2ecf20Sopenharmony_ci
4558c2ecf20Sopenharmony_ci1:	/* unimplemented flush - just skip */
4568c2ecf20Sopenharmony_ci	jmpl	%l2, %g0
4578c2ecf20Sopenharmony_ci	 rett	%l2 + 4
4588c2ecf20Sopenharmony_ci
4598c2ecf20Sopenharmony_ci	.align	4
4608c2ecf20Sopenharmony_ci	.globl	priv_instruction
4618c2ecf20Sopenharmony_cipriv_instruction:
4628c2ecf20Sopenharmony_ci	SAVE_ALL
4638c2ecf20Sopenharmony_ci
4648c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr
4658c2ecf20Sopenharmony_ci	WRITE_PAUSE
4668c2ecf20Sopenharmony_ci
4678c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
4688c2ecf20Sopenharmony_ci	mov	%l1, %o1
4698c2ecf20Sopenharmony_ci	mov	%l2, %o2
4708c2ecf20Sopenharmony_ci	call	do_priv_instruction
4718c2ecf20Sopenharmony_ci	 mov	%l0, %o3
4728c2ecf20Sopenharmony_ci
4738c2ecf20Sopenharmony_ci	RESTORE_ALL
4748c2ecf20Sopenharmony_ci
4758c2ecf20Sopenharmony_ci	/* This routine handles unaligned data accesses. */
4768c2ecf20Sopenharmony_ci	.align	4
4778c2ecf20Sopenharmony_ci	.globl	mna_handler
4788c2ecf20Sopenharmony_cimna_handler:
4798c2ecf20Sopenharmony_ci	andcc	%l0, PSR_PS, %g0
4808c2ecf20Sopenharmony_ci	be	mna_fromuser
4818c2ecf20Sopenharmony_ci	 nop
4828c2ecf20Sopenharmony_ci
4838c2ecf20Sopenharmony_ci	SAVE_ALL
4848c2ecf20Sopenharmony_ci
4858c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr
4868c2ecf20Sopenharmony_ci	WRITE_PAUSE
4878c2ecf20Sopenharmony_ci
4888c2ecf20Sopenharmony_ci	ld	[%l1], %o1
4898c2ecf20Sopenharmony_ci	call	kernel_unaligned_trap
4908c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o0
4918c2ecf20Sopenharmony_ci
4928c2ecf20Sopenharmony_ci	RESTORE_ALL
4938c2ecf20Sopenharmony_ci
4948c2ecf20Sopenharmony_cimna_fromuser:
4958c2ecf20Sopenharmony_ci	SAVE_ALL
4968c2ecf20Sopenharmony_ci
4978c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr		! re-enable traps
4988c2ecf20Sopenharmony_ci	WRITE_PAUSE
4998c2ecf20Sopenharmony_ci
5008c2ecf20Sopenharmony_ci	ld	[%l1], %o1
5018c2ecf20Sopenharmony_ci	call	user_unaligned_trap
5028c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o0
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_ci	RESTORE_ALL
5058c2ecf20Sopenharmony_ci
5068c2ecf20Sopenharmony_ci	/* This routine handles floating point disabled traps. */
5078c2ecf20Sopenharmony_ci	.align	4
5088c2ecf20Sopenharmony_ci	.globl	fpd_trap_handler
5098c2ecf20Sopenharmony_cifpd_trap_handler:
5108c2ecf20Sopenharmony_ci	SAVE_ALL
5118c2ecf20Sopenharmony_ci
5128c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr		! re-enable traps
5138c2ecf20Sopenharmony_ci	WRITE_PAUSE
5148c2ecf20Sopenharmony_ci
5158c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
5168c2ecf20Sopenharmony_ci	mov	%l1, %o1
5178c2ecf20Sopenharmony_ci	mov	%l2, %o2
5188c2ecf20Sopenharmony_ci	call	do_fpd_trap
5198c2ecf20Sopenharmony_ci	 mov	%l0, %o3
5208c2ecf20Sopenharmony_ci
5218c2ecf20Sopenharmony_ci	RESTORE_ALL
5228c2ecf20Sopenharmony_ci
5238c2ecf20Sopenharmony_ci	/* This routine handles Floating Point Exceptions. */
5248c2ecf20Sopenharmony_ci	.align	4
5258c2ecf20Sopenharmony_ci	.globl	fpe_trap_handler
5268c2ecf20Sopenharmony_cifpe_trap_handler:
5278c2ecf20Sopenharmony_ci	set	fpsave_magic, %l5
5288c2ecf20Sopenharmony_ci	cmp	%l1, %l5
5298c2ecf20Sopenharmony_ci	be	1f
5308c2ecf20Sopenharmony_ci	 sethi	%hi(fpsave), %l5
5318c2ecf20Sopenharmony_ci	or	%l5, %lo(fpsave), %l5
5328c2ecf20Sopenharmony_ci	cmp	%l1, %l5
5338c2ecf20Sopenharmony_ci	bne	2f
5348c2ecf20Sopenharmony_ci	 sethi	%hi(fpsave_catch2), %l5
5358c2ecf20Sopenharmony_ci	or	%l5, %lo(fpsave_catch2), %l5
5368c2ecf20Sopenharmony_ci	wr	%l0, 0x0, %psr
5378c2ecf20Sopenharmony_ci	WRITE_PAUSE
5388c2ecf20Sopenharmony_ci	jmp	%l5
5398c2ecf20Sopenharmony_ci	 rett	%l5 + 4
5408c2ecf20Sopenharmony_ci1:
5418c2ecf20Sopenharmony_ci	sethi	%hi(fpsave_catch), %l5
5428c2ecf20Sopenharmony_ci	or	%l5, %lo(fpsave_catch), %l5
5438c2ecf20Sopenharmony_ci	wr	%l0, 0x0, %psr
5448c2ecf20Sopenharmony_ci	WRITE_PAUSE
5458c2ecf20Sopenharmony_ci	jmp	%l5
5468c2ecf20Sopenharmony_ci	 rett	%l5 + 4
5478c2ecf20Sopenharmony_ci
5488c2ecf20Sopenharmony_ci2:
5498c2ecf20Sopenharmony_ci	SAVE_ALL
5508c2ecf20Sopenharmony_ci
5518c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr		! re-enable traps
5528c2ecf20Sopenharmony_ci	WRITE_PAUSE
5538c2ecf20Sopenharmony_ci
5548c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
5558c2ecf20Sopenharmony_ci	mov	%l1, %o1
5568c2ecf20Sopenharmony_ci	mov	%l2, %o2
5578c2ecf20Sopenharmony_ci	call	do_fpe_trap
5588c2ecf20Sopenharmony_ci	 mov	%l0, %o3
5598c2ecf20Sopenharmony_ci
5608c2ecf20Sopenharmony_ci	RESTORE_ALL
5618c2ecf20Sopenharmony_ci
5628c2ecf20Sopenharmony_ci	/* This routine handles Tag Overflow Exceptions. */
5638c2ecf20Sopenharmony_ci	.align	4
5648c2ecf20Sopenharmony_ci	.globl	do_tag_overflow
5658c2ecf20Sopenharmony_cido_tag_overflow:
5668c2ecf20Sopenharmony_ci	SAVE_ALL
5678c2ecf20Sopenharmony_ci
5688c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr		! re-enable traps
5698c2ecf20Sopenharmony_ci	WRITE_PAUSE
5708c2ecf20Sopenharmony_ci
5718c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
5728c2ecf20Sopenharmony_ci	mov	%l1, %o1
5738c2ecf20Sopenharmony_ci	mov	%l2, %o2
5748c2ecf20Sopenharmony_ci	call	handle_tag_overflow
5758c2ecf20Sopenharmony_ci	 mov	%l0, %o3
5768c2ecf20Sopenharmony_ci
5778c2ecf20Sopenharmony_ci	RESTORE_ALL
5788c2ecf20Sopenharmony_ci
5798c2ecf20Sopenharmony_ci	/* This routine handles Watchpoint Exceptions. */
5808c2ecf20Sopenharmony_ci	.align	4
5818c2ecf20Sopenharmony_ci	.globl	do_watchpoint
5828c2ecf20Sopenharmony_cido_watchpoint:
5838c2ecf20Sopenharmony_ci	SAVE_ALL
5848c2ecf20Sopenharmony_ci
5858c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr		! re-enable traps
5868c2ecf20Sopenharmony_ci	WRITE_PAUSE
5878c2ecf20Sopenharmony_ci
5888c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
5898c2ecf20Sopenharmony_ci	mov	%l1, %o1
5908c2ecf20Sopenharmony_ci	mov	%l2, %o2
5918c2ecf20Sopenharmony_ci	call	handle_watchpoint
5928c2ecf20Sopenharmony_ci	 mov	%l0, %o3
5938c2ecf20Sopenharmony_ci
5948c2ecf20Sopenharmony_ci	RESTORE_ALL
5958c2ecf20Sopenharmony_ci
5968c2ecf20Sopenharmony_ci	/* This routine handles Register Access Exceptions. */
5978c2ecf20Sopenharmony_ci	.align	4
5988c2ecf20Sopenharmony_ci	.globl	do_reg_access
5998c2ecf20Sopenharmony_cido_reg_access:
6008c2ecf20Sopenharmony_ci	SAVE_ALL
6018c2ecf20Sopenharmony_ci
6028c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr		! re-enable traps
6038c2ecf20Sopenharmony_ci	WRITE_PAUSE
6048c2ecf20Sopenharmony_ci
6058c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
6068c2ecf20Sopenharmony_ci	mov	%l1, %o1
6078c2ecf20Sopenharmony_ci	mov	%l2, %o2
6088c2ecf20Sopenharmony_ci	call	handle_reg_access
6098c2ecf20Sopenharmony_ci	 mov	%l0, %o3
6108c2ecf20Sopenharmony_ci
6118c2ecf20Sopenharmony_ci	RESTORE_ALL
6128c2ecf20Sopenharmony_ci
6138c2ecf20Sopenharmony_ci	/* This routine handles Co-Processor Disabled Exceptions. */
6148c2ecf20Sopenharmony_ci	.align	4
6158c2ecf20Sopenharmony_ci	.globl	do_cp_disabled
6168c2ecf20Sopenharmony_cido_cp_disabled:
6178c2ecf20Sopenharmony_ci	SAVE_ALL
6188c2ecf20Sopenharmony_ci
6198c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr		! re-enable traps
6208c2ecf20Sopenharmony_ci	WRITE_PAUSE
6218c2ecf20Sopenharmony_ci
6228c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
6238c2ecf20Sopenharmony_ci	mov	%l1, %o1
6248c2ecf20Sopenharmony_ci	mov	%l2, %o2
6258c2ecf20Sopenharmony_ci	call	handle_cp_disabled
6268c2ecf20Sopenharmony_ci	 mov	%l0, %o3
6278c2ecf20Sopenharmony_ci
6288c2ecf20Sopenharmony_ci	RESTORE_ALL
6298c2ecf20Sopenharmony_ci
6308c2ecf20Sopenharmony_ci	/* This routine handles Co-Processor Exceptions. */
6318c2ecf20Sopenharmony_ci	.align	4
6328c2ecf20Sopenharmony_ci	.globl	do_cp_exception
6338c2ecf20Sopenharmony_cido_cp_exception:
6348c2ecf20Sopenharmony_ci	SAVE_ALL
6358c2ecf20Sopenharmony_ci
6368c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr		! re-enable traps
6378c2ecf20Sopenharmony_ci	WRITE_PAUSE
6388c2ecf20Sopenharmony_ci
6398c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
6408c2ecf20Sopenharmony_ci	mov	%l1, %o1
6418c2ecf20Sopenharmony_ci	mov	%l2, %o2
6428c2ecf20Sopenharmony_ci	call	handle_cp_exception
6438c2ecf20Sopenharmony_ci	 mov	%l0, %o3
6448c2ecf20Sopenharmony_ci
6458c2ecf20Sopenharmony_ci	RESTORE_ALL
6468c2ecf20Sopenharmony_ci
6478c2ecf20Sopenharmony_ci	/* This routine handles Hardware Divide By Zero Exceptions. */
6488c2ecf20Sopenharmony_ci	.align	4
6498c2ecf20Sopenharmony_ci	.globl	do_hw_divzero
6508c2ecf20Sopenharmony_cido_hw_divzero:
6518c2ecf20Sopenharmony_ci	SAVE_ALL
6528c2ecf20Sopenharmony_ci
6538c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr		! re-enable traps
6548c2ecf20Sopenharmony_ci	WRITE_PAUSE
6558c2ecf20Sopenharmony_ci
6568c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
6578c2ecf20Sopenharmony_ci	mov	%l1, %o1
6588c2ecf20Sopenharmony_ci	mov	%l2, %o2
6598c2ecf20Sopenharmony_ci	call	handle_hw_divzero
6608c2ecf20Sopenharmony_ci	 mov	%l0, %o3
6618c2ecf20Sopenharmony_ci
6628c2ecf20Sopenharmony_ci	RESTORE_ALL
6638c2ecf20Sopenharmony_ci
6648c2ecf20Sopenharmony_ci	.align	4
6658c2ecf20Sopenharmony_ci	.globl	do_flush_windows
6668c2ecf20Sopenharmony_cido_flush_windows:
6678c2ecf20Sopenharmony_ci	SAVE_ALL
6688c2ecf20Sopenharmony_ci
6698c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr
6708c2ecf20Sopenharmony_ci	WRITE_PAUSE
6718c2ecf20Sopenharmony_ci
6728c2ecf20Sopenharmony_ci	andcc	%l0, PSR_PS, %g0
6738c2ecf20Sopenharmony_ci	bne	dfw_kernel
6748c2ecf20Sopenharmony_ci	 nop
6758c2ecf20Sopenharmony_ci
6768c2ecf20Sopenharmony_ci	call	flush_user_windows
6778c2ecf20Sopenharmony_ci	 nop
6788c2ecf20Sopenharmony_ci
6798c2ecf20Sopenharmony_ci	/* Advance over the trap instruction. */
6808c2ecf20Sopenharmony_ci	ld	[%sp + STACKFRAME_SZ + PT_NPC], %l1
6818c2ecf20Sopenharmony_ci	add	%l1, 0x4, %l2
6828c2ecf20Sopenharmony_ci	st	%l1, [%sp + STACKFRAME_SZ + PT_PC]
6838c2ecf20Sopenharmony_ci	st	%l2, [%sp + STACKFRAME_SZ + PT_NPC]
6848c2ecf20Sopenharmony_ci
6858c2ecf20Sopenharmony_ci	RESTORE_ALL
6868c2ecf20Sopenharmony_ci
6878c2ecf20Sopenharmony_ci	.globl	flush_patch_one
6888c2ecf20Sopenharmony_ci
6898c2ecf20Sopenharmony_ci	/* We get these for debugging routines using __builtin_return_address() */
6908c2ecf20Sopenharmony_cidfw_kernel:
6918c2ecf20Sopenharmony_ciflush_patch_one:
6928c2ecf20Sopenharmony_ci	FLUSH_ALL_KERNEL_WINDOWS
6938c2ecf20Sopenharmony_ci
6948c2ecf20Sopenharmony_ci	/* Advance over the trap instruction. */
6958c2ecf20Sopenharmony_ci	ld	[%sp + STACKFRAME_SZ + PT_NPC], %l1
6968c2ecf20Sopenharmony_ci	add	%l1, 0x4, %l2
6978c2ecf20Sopenharmony_ci	st	%l1, [%sp + STACKFRAME_SZ + PT_PC]
6988c2ecf20Sopenharmony_ci	st	%l2, [%sp + STACKFRAME_SZ + PT_NPC]
6998c2ecf20Sopenharmony_ci
7008c2ecf20Sopenharmony_ci	RESTORE_ALL
7018c2ecf20Sopenharmony_ci
7028c2ecf20Sopenharmony_ci	/* The getcc software trap.  The user wants the condition codes from
7038c2ecf20Sopenharmony_ci	 * the %psr in register %g1.
7048c2ecf20Sopenharmony_ci	 */
7058c2ecf20Sopenharmony_ci
7068c2ecf20Sopenharmony_ci	.align	4
7078c2ecf20Sopenharmony_ci	.globl	getcc_trap_handler
7088c2ecf20Sopenharmony_cigetcc_trap_handler:
7098c2ecf20Sopenharmony_ci	srl	%l0, 20, %g1	! give user
7108c2ecf20Sopenharmony_ci	and	%g1, 0xf, %g1	! only ICC bits in %psr
7118c2ecf20Sopenharmony_ci	jmp	%l2		! advance over trap instruction
7128c2ecf20Sopenharmony_ci	rett	%l2 + 0x4	! like this...
7138c2ecf20Sopenharmony_ci
7148c2ecf20Sopenharmony_ci	/* The setcc software trap.  The user has condition codes in %g1
7158c2ecf20Sopenharmony_ci	 * that it would like placed in the %psr.  Be careful not to flip
7168c2ecf20Sopenharmony_ci	 * any unintentional bits!
7178c2ecf20Sopenharmony_ci	 */
7188c2ecf20Sopenharmony_ci
7198c2ecf20Sopenharmony_ci	.align	4
7208c2ecf20Sopenharmony_ci	.globl	setcc_trap_handler
7218c2ecf20Sopenharmony_cisetcc_trap_handler:
7228c2ecf20Sopenharmony_ci	sll	%g1, 0x14, %l4
7238c2ecf20Sopenharmony_ci	set	PSR_ICC, %l5
7248c2ecf20Sopenharmony_ci	andn	%l0, %l5, %l0	! clear ICC bits in %psr
7258c2ecf20Sopenharmony_ci	and	%l4, %l5, %l4	! clear non-ICC bits in user value
7268c2ecf20Sopenharmony_ci	or	%l4, %l0, %l4	! or them in... mix mix mix
7278c2ecf20Sopenharmony_ci
7288c2ecf20Sopenharmony_ci	wr	%l4, 0x0, %psr	! set new %psr
7298c2ecf20Sopenharmony_ci	WRITE_PAUSE		! TI scumbags...
7308c2ecf20Sopenharmony_ci
7318c2ecf20Sopenharmony_ci	jmp	%l2		! advance over trap instruction
7328c2ecf20Sopenharmony_ci	rett	%l2 + 0x4	! like this...
7338c2ecf20Sopenharmony_ci
7348c2ecf20Sopenharmony_cisun4m_nmi_error:
7358c2ecf20Sopenharmony_ci	/* NMI async memory error handling. */
7368c2ecf20Sopenharmony_ci	sethi	%hi(0x80000000), %l4
7378c2ecf20Sopenharmony_ci	sethi	%hi(sun4m_irq_global), %o5
7388c2ecf20Sopenharmony_ci	ld	[%o5 + %lo(sun4m_irq_global)], %l5
7398c2ecf20Sopenharmony_ci	st	%l4, [%l5 + 0x0c]	! sun4m_irq_global->mask_set=0x80000000
7408c2ecf20Sopenharmony_ci	WRITE_PAUSE
7418c2ecf20Sopenharmony_ci	ld	[%l5 + 0x00], %g0	! sun4m_irq_global->pending
7428c2ecf20Sopenharmony_ci	WRITE_PAUSE
7438c2ecf20Sopenharmony_ci	or	%l0, PSR_PIL, %l4
7448c2ecf20Sopenharmony_ci	wr	%l4, 0x0, %psr
7458c2ecf20Sopenharmony_ci	WRITE_PAUSE
7468c2ecf20Sopenharmony_ci	wr	%l4, PSR_ET, %psr
7478c2ecf20Sopenharmony_ci	WRITE_PAUSE
7488c2ecf20Sopenharmony_ci	call	sun4m_nmi
7498c2ecf20Sopenharmony_ci	 nop
7508c2ecf20Sopenharmony_ci	st	%l4, [%l5 + 0x08]	! sun4m_irq_global->mask_clear=0x80000000
7518c2ecf20Sopenharmony_ci	WRITE_PAUSE
7528c2ecf20Sopenharmony_ci	ld	[%l5 + 0x00], %g0	! sun4m_irq_global->pending
7538c2ecf20Sopenharmony_ci	WRITE_PAUSE
7548c2ecf20Sopenharmony_ci	RESTORE_ALL
7558c2ecf20Sopenharmony_ci
7568c2ecf20Sopenharmony_ci#ifndef CONFIG_SMP
7578c2ecf20Sopenharmony_ci	.align	4
7588c2ecf20Sopenharmony_ci	.globl	linux_trap_ipi15_sun4m
7598c2ecf20Sopenharmony_cilinux_trap_ipi15_sun4m:
7608c2ecf20Sopenharmony_ci	SAVE_ALL
7618c2ecf20Sopenharmony_ci
7628c2ecf20Sopenharmony_ci	ba	sun4m_nmi_error
7638c2ecf20Sopenharmony_ci	 nop
7648c2ecf20Sopenharmony_ci#endif /* CONFIG_SMP */
7658c2ecf20Sopenharmony_ci
7668c2ecf20Sopenharmony_ci	.align	4
7678c2ecf20Sopenharmony_ci	.globl	srmmu_fault
7688c2ecf20Sopenharmony_cisrmmu_fault:
7698c2ecf20Sopenharmony_ci	mov	0x400, %l5
7708c2ecf20Sopenharmony_ci	mov	0x300, %l4
7718c2ecf20Sopenharmony_ci
7728c2ecf20Sopenharmony_ciLEON_PI(lda	[%l5] ASI_LEON_MMUREGS, %l6)	! read sfar first
7738c2ecf20Sopenharmony_ciSUN_PI_(lda	[%l5] ASI_M_MMUREGS, %l6)	! read sfar first
7748c2ecf20Sopenharmony_ci
7758c2ecf20Sopenharmony_ciLEON_PI(lda	[%l4] ASI_LEON_MMUREGS, %l5)	! read sfsr last
7768c2ecf20Sopenharmony_ciSUN_PI_(lda	[%l4] ASI_M_MMUREGS, %l5)	! read sfsr last
7778c2ecf20Sopenharmony_ci
7788c2ecf20Sopenharmony_ci	andn	%l6, 0xfff, %l6
7798c2ecf20Sopenharmony_ci	srl	%l5, 6, %l5			! and encode all info into l7
7808c2ecf20Sopenharmony_ci
7818c2ecf20Sopenharmony_ci	and	%l5, 2, %l5
7828c2ecf20Sopenharmony_ci	or	%l5, %l6, %l6
7838c2ecf20Sopenharmony_ci
7848c2ecf20Sopenharmony_ci	or	%l6, %l7, %l7			! l7 = [addr,write,txtfault]
7858c2ecf20Sopenharmony_ci
7868c2ecf20Sopenharmony_ci	SAVE_ALL
7878c2ecf20Sopenharmony_ci
7888c2ecf20Sopenharmony_ci	mov	%l7, %o1
7898c2ecf20Sopenharmony_ci	mov	%l7, %o2
7908c2ecf20Sopenharmony_ci	and	%o1, 1, %o1		! arg2 = text_faultp
7918c2ecf20Sopenharmony_ci	mov	%l7, %o3
7928c2ecf20Sopenharmony_ci	and	%o2, 2, %o2		! arg3 = writep
7938c2ecf20Sopenharmony_ci	andn	%o3, 0xfff, %o3		! arg4 = faulting address
7948c2ecf20Sopenharmony_ci
7958c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr
7968c2ecf20Sopenharmony_ci	WRITE_PAUSE
7978c2ecf20Sopenharmony_ci
7988c2ecf20Sopenharmony_ci	call	do_sparc_fault
7998c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o0	! arg1 = pt_regs ptr
8008c2ecf20Sopenharmony_ci
8018c2ecf20Sopenharmony_ci	RESTORE_ALL
8028c2ecf20Sopenharmony_ci
8038c2ecf20Sopenharmony_ci	.align	4
8048c2ecf20Sopenharmony_cisunos_execv:
8058c2ecf20Sopenharmony_ci	.globl	sunos_execv
8068c2ecf20Sopenharmony_ci	b	sys_execve
8078c2ecf20Sopenharmony_ci	 clr	%i2
8088c2ecf20Sopenharmony_ci
8098c2ecf20Sopenharmony_ci	.align	4
8108c2ecf20Sopenharmony_ci	.globl	sys_sigstack
8118c2ecf20Sopenharmony_cisys_sigstack:
8128c2ecf20Sopenharmony_ci	mov	%o7, %l5
8138c2ecf20Sopenharmony_ci	mov	%fp, %o2
8148c2ecf20Sopenharmony_ci	call	do_sys_sigstack
8158c2ecf20Sopenharmony_ci	 mov	%l5, %o7
8168c2ecf20Sopenharmony_ci
8178c2ecf20Sopenharmony_ci	.align	4
8188c2ecf20Sopenharmony_ci	.globl	sys_sigreturn
8198c2ecf20Sopenharmony_cisys_sigreturn:
8208c2ecf20Sopenharmony_ci	call	do_sigreturn
8218c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o0
8228c2ecf20Sopenharmony_ci
8238c2ecf20Sopenharmony_ci	ld	[%curptr + TI_FLAGS], %l5
8248c2ecf20Sopenharmony_ci	andcc	%l5, _TIF_SYSCALL_TRACE, %g0
8258c2ecf20Sopenharmony_ci	be	1f
8268c2ecf20Sopenharmony_ci	 nop
8278c2ecf20Sopenharmony_ci
8288c2ecf20Sopenharmony_ci	call	syscall_trace
8298c2ecf20Sopenharmony_ci	 mov	1, %o1
8308c2ecf20Sopenharmony_ci
8318c2ecf20Sopenharmony_ci1:
8328c2ecf20Sopenharmony_ci	/* We don't want to muck with user registers like a
8338c2ecf20Sopenharmony_ci	 * normal syscall, just return.
8348c2ecf20Sopenharmony_ci	 */
8358c2ecf20Sopenharmony_ci	RESTORE_ALL
8368c2ecf20Sopenharmony_ci
8378c2ecf20Sopenharmony_ci	.align	4
8388c2ecf20Sopenharmony_ci	.globl	sys_rt_sigreturn
8398c2ecf20Sopenharmony_cisys_rt_sigreturn:
8408c2ecf20Sopenharmony_ci	call	do_rt_sigreturn
8418c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o0
8428c2ecf20Sopenharmony_ci
8438c2ecf20Sopenharmony_ci	ld	[%curptr + TI_FLAGS], %l5
8448c2ecf20Sopenharmony_ci	andcc	%l5, _TIF_SYSCALL_TRACE, %g0
8458c2ecf20Sopenharmony_ci	be	1f
8468c2ecf20Sopenharmony_ci	 nop
8478c2ecf20Sopenharmony_ci
8488c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
8498c2ecf20Sopenharmony_ci	call	syscall_trace
8508c2ecf20Sopenharmony_ci	 mov	1, %o1
8518c2ecf20Sopenharmony_ci
8528c2ecf20Sopenharmony_ci1:
8538c2ecf20Sopenharmony_ci	/* We are returning to a signal handler. */
8548c2ecf20Sopenharmony_ci	RESTORE_ALL
8558c2ecf20Sopenharmony_ci
8568c2ecf20Sopenharmony_ci	/* Now that we have a real sys_clone, sys_fork() is
8578c2ecf20Sopenharmony_ci	 * implemented in terms of it.  Our _real_ implementation
8588c2ecf20Sopenharmony_ci	 * of SunOS vfork() will use sys_vfork().
8598c2ecf20Sopenharmony_ci	 *
8608c2ecf20Sopenharmony_ci	 * XXX These three should be consolidated into mostly shared
8618c2ecf20Sopenharmony_ci	 * XXX code just like on sparc64... -DaveM
8628c2ecf20Sopenharmony_ci	 */
8638c2ecf20Sopenharmony_ci	.align	4
8648c2ecf20Sopenharmony_ci	.globl	sys_fork, flush_patch_two
8658c2ecf20Sopenharmony_cisys_fork:
8668c2ecf20Sopenharmony_ci	mov	%o7, %l5
8678c2ecf20Sopenharmony_ciflush_patch_two:
8688c2ecf20Sopenharmony_ci	FLUSH_ALL_KERNEL_WINDOWS;
8698c2ecf20Sopenharmony_ci	ld	[%curptr + TI_TASK], %o4
8708c2ecf20Sopenharmony_ci	rd	%psr, %g4
8718c2ecf20Sopenharmony_ci	WRITE_PAUSE
8728c2ecf20Sopenharmony_ci	rd	%wim, %g5
8738c2ecf20Sopenharmony_ci	WRITE_PAUSE
8748c2ecf20Sopenharmony_ci	std	%g4, [%o4 + AOFF_task_thread + AOFF_thread_fork_kpsr]
8758c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
8768c2ecf20Sopenharmony_ci	call	sparc_fork
8778c2ecf20Sopenharmony_ci	 mov	%l5, %o7
8788c2ecf20Sopenharmony_ci
8798c2ecf20Sopenharmony_ci	/* Whee, kernel threads! */
8808c2ecf20Sopenharmony_ci	.globl	sys_clone, flush_patch_three
8818c2ecf20Sopenharmony_cisys_clone:
8828c2ecf20Sopenharmony_ci	mov	%o7, %l5
8838c2ecf20Sopenharmony_ciflush_patch_three:
8848c2ecf20Sopenharmony_ci	FLUSH_ALL_KERNEL_WINDOWS;
8858c2ecf20Sopenharmony_ci	ld	[%curptr + TI_TASK], %o4
8868c2ecf20Sopenharmony_ci	rd	%psr, %g4
8878c2ecf20Sopenharmony_ci	WRITE_PAUSE
8888c2ecf20Sopenharmony_ci	rd	%wim, %g5
8898c2ecf20Sopenharmony_ci	WRITE_PAUSE
8908c2ecf20Sopenharmony_ci	std	%g4, [%o4 + AOFF_task_thread + AOFF_thread_fork_kpsr]
8918c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
8928c2ecf20Sopenharmony_ci	call	sparc_clone
8938c2ecf20Sopenharmony_ci	 mov	%l5, %o7
8948c2ecf20Sopenharmony_ci
8958c2ecf20Sopenharmony_ci	/* Whee, real vfork! */
8968c2ecf20Sopenharmony_ci	.globl	sys_vfork, flush_patch_four
8978c2ecf20Sopenharmony_cisys_vfork:
8988c2ecf20Sopenharmony_ciflush_patch_four:
8998c2ecf20Sopenharmony_ci	FLUSH_ALL_KERNEL_WINDOWS;
9008c2ecf20Sopenharmony_ci	ld	[%curptr + TI_TASK], %o4
9018c2ecf20Sopenharmony_ci	rd	%psr, %g4
9028c2ecf20Sopenharmony_ci	WRITE_PAUSE
9038c2ecf20Sopenharmony_ci	rd	%wim, %g5
9048c2ecf20Sopenharmony_ci	WRITE_PAUSE
9058c2ecf20Sopenharmony_ci	std	%g4, [%o4 + AOFF_task_thread + AOFF_thread_fork_kpsr]
9068c2ecf20Sopenharmony_ci	sethi	%hi(sparc_vfork), %l1
9078c2ecf20Sopenharmony_ci	jmpl	%l1 + %lo(sparc_vfork), %g0
9088c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o0
9098c2ecf20Sopenharmony_ci
9108c2ecf20Sopenharmony_ci        .align  4
9118c2ecf20Sopenharmony_cilinux_sparc_ni_syscall:
9128c2ecf20Sopenharmony_ci	sethi   %hi(sys_ni_syscall), %l7
9138c2ecf20Sopenharmony_ci	b       do_syscall
9148c2ecf20Sopenharmony_ci	 or     %l7, %lo(sys_ni_syscall), %l7
9158c2ecf20Sopenharmony_ci
9168c2ecf20Sopenharmony_cilinux_syscall_trace:
9178c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
9188c2ecf20Sopenharmony_ci	call	syscall_trace
9198c2ecf20Sopenharmony_ci	 mov	0, %o1
9208c2ecf20Sopenharmony_ci	cmp	%o0, 0
9218c2ecf20Sopenharmony_ci	bne	3f
9228c2ecf20Sopenharmony_ci	 mov	-ENOSYS, %o0
9238c2ecf20Sopenharmony_ci
9248c2ecf20Sopenharmony_ci	/* Syscall tracing can modify the registers.  */
9258c2ecf20Sopenharmony_ci	ld	[%sp + STACKFRAME_SZ + PT_G1], %g1
9268c2ecf20Sopenharmony_ci	sethi	%hi(sys_call_table), %l7
9278c2ecf20Sopenharmony_ci	ld	[%sp + STACKFRAME_SZ + PT_I0], %i0
9288c2ecf20Sopenharmony_ci	or	%l7, %lo(sys_call_table), %l7
9298c2ecf20Sopenharmony_ci	ld	[%sp + STACKFRAME_SZ + PT_I1], %i1
9308c2ecf20Sopenharmony_ci	ld	[%sp + STACKFRAME_SZ + PT_I2], %i2
9318c2ecf20Sopenharmony_ci	ld	[%sp + STACKFRAME_SZ + PT_I3], %i3
9328c2ecf20Sopenharmony_ci	ld	[%sp + STACKFRAME_SZ + PT_I4], %i4
9338c2ecf20Sopenharmony_ci	ld	[%sp + STACKFRAME_SZ + PT_I5], %i5
9348c2ecf20Sopenharmony_ci	cmp	%g1, NR_syscalls
9358c2ecf20Sopenharmony_ci	bgeu	3f
9368c2ecf20Sopenharmony_ci	 mov	-ENOSYS, %o0
9378c2ecf20Sopenharmony_ci
9388c2ecf20Sopenharmony_ci	sll	%g1, 2, %l4
9398c2ecf20Sopenharmony_ci	mov	%i0, %o0
9408c2ecf20Sopenharmony_ci	ld	[%l7 + %l4], %l7
9418c2ecf20Sopenharmony_ci	mov	%i1, %o1
9428c2ecf20Sopenharmony_ci	mov	%i2, %o2
9438c2ecf20Sopenharmony_ci	mov	%i3, %o3
9448c2ecf20Sopenharmony_ci	b	2f
9458c2ecf20Sopenharmony_ci	 mov	%i4, %o4
9468c2ecf20Sopenharmony_ci
9478c2ecf20Sopenharmony_ci	.globl	ret_from_fork
9488c2ecf20Sopenharmony_ciret_from_fork:
9498c2ecf20Sopenharmony_ci	call	schedule_tail
9508c2ecf20Sopenharmony_ci	 ld	[%g3 + TI_TASK], %o0
9518c2ecf20Sopenharmony_ci	b	ret_sys_call
9528c2ecf20Sopenharmony_ci	 ld	[%sp + STACKFRAME_SZ + PT_I0], %o0
9538c2ecf20Sopenharmony_ci
9548c2ecf20Sopenharmony_ci	.globl	ret_from_kernel_thread
9558c2ecf20Sopenharmony_ciret_from_kernel_thread:
9568c2ecf20Sopenharmony_ci	call	schedule_tail
9578c2ecf20Sopenharmony_ci	 ld	[%g3 + TI_TASK], %o0
9588c2ecf20Sopenharmony_ci	ld	[%sp + STACKFRAME_SZ + PT_G1], %l0
9598c2ecf20Sopenharmony_ci	call	%l0
9608c2ecf20Sopenharmony_ci	 ld	[%sp + STACKFRAME_SZ + PT_G2], %o0
9618c2ecf20Sopenharmony_ci	rd	%psr, %l1
9628c2ecf20Sopenharmony_ci	ld	[%sp + STACKFRAME_SZ + PT_PSR], %l0
9638c2ecf20Sopenharmony_ci	andn	%l0, PSR_CWP, %l0
9648c2ecf20Sopenharmony_ci	nop
9658c2ecf20Sopenharmony_ci	and	%l1, PSR_CWP, %l1
9668c2ecf20Sopenharmony_ci	or	%l0, %l1, %l0
9678c2ecf20Sopenharmony_ci	st	%l0, [%sp + STACKFRAME_SZ + PT_PSR]
9688c2ecf20Sopenharmony_ci	b	ret_sys_call
9698c2ecf20Sopenharmony_ci	 mov	0, %o0
9708c2ecf20Sopenharmony_ci
9718c2ecf20Sopenharmony_ci	/* Linux native system calls enter here... */
9728c2ecf20Sopenharmony_ci	.align	4
9738c2ecf20Sopenharmony_ci	.globl	linux_sparc_syscall
9748c2ecf20Sopenharmony_cilinux_sparc_syscall:
9758c2ecf20Sopenharmony_ci	sethi	%hi(PSR_SYSCALL), %l4
9768c2ecf20Sopenharmony_ci	or	%l0, %l4, %l0
9778c2ecf20Sopenharmony_ci	/* Direct access to user regs, must faster. */
9788c2ecf20Sopenharmony_ci	cmp	%g1, NR_syscalls
9798c2ecf20Sopenharmony_ci	bgeu	linux_sparc_ni_syscall
9808c2ecf20Sopenharmony_ci	 sll	%g1, 2, %l4
9818c2ecf20Sopenharmony_ci	ld	[%l7 + %l4], %l7
9828c2ecf20Sopenharmony_ci
9838c2ecf20Sopenharmony_cido_syscall:
9848c2ecf20Sopenharmony_ci	SAVE_ALL_HEAD
9858c2ecf20Sopenharmony_ci	 rd	%wim, %l3
9868c2ecf20Sopenharmony_ci
9878c2ecf20Sopenharmony_ci	wr	%l0, PSR_ET, %psr
9888c2ecf20Sopenharmony_ci	mov	%i0, %o0
9898c2ecf20Sopenharmony_ci	mov	%i1, %o1
9908c2ecf20Sopenharmony_ci	mov	%i2, %o2
9918c2ecf20Sopenharmony_ci
9928c2ecf20Sopenharmony_ci	ld	[%curptr + TI_FLAGS], %l5
9938c2ecf20Sopenharmony_ci	mov	%i3, %o3
9948c2ecf20Sopenharmony_ci	andcc	%l5, _TIF_SYSCALL_TRACE, %g0
9958c2ecf20Sopenharmony_ci	mov	%i4, %o4
9968c2ecf20Sopenharmony_ci	bne	linux_syscall_trace
9978c2ecf20Sopenharmony_ci	 mov	%i0, %l5
9988c2ecf20Sopenharmony_ci2:
9998c2ecf20Sopenharmony_ci	call	%l7
10008c2ecf20Sopenharmony_ci	 mov	%i5, %o5
10018c2ecf20Sopenharmony_ci
10028c2ecf20Sopenharmony_ci3:
10038c2ecf20Sopenharmony_ci	st	%o0, [%sp + STACKFRAME_SZ + PT_I0]
10048c2ecf20Sopenharmony_ci
10058c2ecf20Sopenharmony_ciret_sys_call:
10068c2ecf20Sopenharmony_ci	ld	[%curptr + TI_FLAGS], %l6
10078c2ecf20Sopenharmony_ci	cmp	%o0, -ERESTART_RESTARTBLOCK
10088c2ecf20Sopenharmony_ci	ld	[%sp + STACKFRAME_SZ + PT_PSR], %g3
10098c2ecf20Sopenharmony_ci	set	PSR_C, %g2
10108c2ecf20Sopenharmony_ci	bgeu	1f
10118c2ecf20Sopenharmony_ci	 andcc	%l6, _TIF_SYSCALL_TRACE, %g0
10128c2ecf20Sopenharmony_ci
10138c2ecf20Sopenharmony_ci	/* System call success, clear Carry condition code. */
10148c2ecf20Sopenharmony_ci	andn	%g3, %g2, %g3
10158c2ecf20Sopenharmony_ci	clr	%l6
10168c2ecf20Sopenharmony_ci	st	%g3, [%sp + STACKFRAME_SZ + PT_PSR]
10178c2ecf20Sopenharmony_ci	bne	linux_syscall_trace2
10188c2ecf20Sopenharmony_ci	 ld	[%sp + STACKFRAME_SZ + PT_NPC], %l1 /* pc = npc */
10198c2ecf20Sopenharmony_ci	add	%l1, 0x4, %l2			/* npc = npc+4 */
10208c2ecf20Sopenharmony_ci	st	%l1, [%sp + STACKFRAME_SZ + PT_PC]
10218c2ecf20Sopenharmony_ci	b	ret_trap_entry
10228c2ecf20Sopenharmony_ci	 st	%l2, [%sp + STACKFRAME_SZ + PT_NPC]
10238c2ecf20Sopenharmony_ci1:
10248c2ecf20Sopenharmony_ci	/* System call failure, set Carry condition code.
10258c2ecf20Sopenharmony_ci	 * Also, get abs(errno) to return to the process.
10268c2ecf20Sopenharmony_ci	 */
10278c2ecf20Sopenharmony_ci	sub	%g0, %o0, %o0
10288c2ecf20Sopenharmony_ci	or	%g3, %g2, %g3
10298c2ecf20Sopenharmony_ci	st	%o0, [%sp + STACKFRAME_SZ + PT_I0]
10308c2ecf20Sopenharmony_ci	mov	1, %l6
10318c2ecf20Sopenharmony_ci	st	%g3, [%sp + STACKFRAME_SZ + PT_PSR]
10328c2ecf20Sopenharmony_ci	bne	linux_syscall_trace2
10338c2ecf20Sopenharmony_ci	 ld	[%sp + STACKFRAME_SZ + PT_NPC], %l1 /* pc = npc */
10348c2ecf20Sopenharmony_ci	add	%l1, 0x4, %l2			/* npc = npc+4 */
10358c2ecf20Sopenharmony_ci	st	%l1, [%sp + STACKFRAME_SZ + PT_PC]
10368c2ecf20Sopenharmony_ci	b	ret_trap_entry
10378c2ecf20Sopenharmony_ci	 st	%l2, [%sp + STACKFRAME_SZ + PT_NPC]
10388c2ecf20Sopenharmony_ci
10398c2ecf20Sopenharmony_cilinux_syscall_trace2:
10408c2ecf20Sopenharmony_ci	add	%sp, STACKFRAME_SZ, %o0
10418c2ecf20Sopenharmony_ci	mov	1, %o1
10428c2ecf20Sopenharmony_ci	call	syscall_trace
10438c2ecf20Sopenharmony_ci	 add	%l1, 0x4, %l2			/* npc = npc+4 */
10448c2ecf20Sopenharmony_ci	st	%l1, [%sp + STACKFRAME_SZ + PT_PC]
10458c2ecf20Sopenharmony_ci	b	ret_trap_entry
10468c2ecf20Sopenharmony_ci	 st	%l2, [%sp + STACKFRAME_SZ + PT_NPC]
10478c2ecf20Sopenharmony_ci
10488c2ecf20Sopenharmony_ci
10498c2ecf20Sopenharmony_ci/* Saving and restoring the FPU state is best done from lowlevel code.
10508c2ecf20Sopenharmony_ci *
10518c2ecf20Sopenharmony_ci * void fpsave(unsigned long *fpregs, unsigned long *fsr,
10528c2ecf20Sopenharmony_ci *             void *fpqueue, unsigned long *fpqdepth)
10538c2ecf20Sopenharmony_ci */
10548c2ecf20Sopenharmony_ci
10558c2ecf20Sopenharmony_ci	.globl	fpsave
10568c2ecf20Sopenharmony_cifpsave:
10578c2ecf20Sopenharmony_ci	st	%fsr, [%o1]	! this can trap on us if fpu is in bogon state
10588c2ecf20Sopenharmony_ci	ld	[%o1], %g1
10598c2ecf20Sopenharmony_ci	set	0x2000, %g4
10608c2ecf20Sopenharmony_ci	andcc	%g1, %g4, %g0
10618c2ecf20Sopenharmony_ci	be	2f
10628c2ecf20Sopenharmony_ci	 mov	0, %g2
10638c2ecf20Sopenharmony_ci
10648c2ecf20Sopenharmony_ci	/* We have an fpqueue to save. */
10658c2ecf20Sopenharmony_ci1:
10668c2ecf20Sopenharmony_ci	std	%fq, [%o2]
10678c2ecf20Sopenharmony_cifpsave_magic:
10688c2ecf20Sopenharmony_ci	st	%fsr, [%o1]
10698c2ecf20Sopenharmony_ci	ld	[%o1], %g3
10708c2ecf20Sopenharmony_ci	andcc	%g3, %g4, %g0
10718c2ecf20Sopenharmony_ci	add	%g2, 1, %g2
10728c2ecf20Sopenharmony_ci	bne	1b
10738c2ecf20Sopenharmony_ci	 add	%o2, 8, %o2
10748c2ecf20Sopenharmony_ci
10758c2ecf20Sopenharmony_ci2:
10768c2ecf20Sopenharmony_ci	st	%g2, [%o3]
10778c2ecf20Sopenharmony_ci
10788c2ecf20Sopenharmony_ci	std	%f0, [%o0 + 0x00]
10798c2ecf20Sopenharmony_ci	std	%f2, [%o0 + 0x08]
10808c2ecf20Sopenharmony_ci	std	%f4, [%o0 + 0x10]
10818c2ecf20Sopenharmony_ci	std	%f6, [%o0 + 0x18]
10828c2ecf20Sopenharmony_ci	std	%f8, [%o0 + 0x20]
10838c2ecf20Sopenharmony_ci	std	%f10, [%o0 + 0x28]
10848c2ecf20Sopenharmony_ci	std	%f12, [%o0 + 0x30]
10858c2ecf20Sopenharmony_ci	std	%f14, [%o0 + 0x38]
10868c2ecf20Sopenharmony_ci	std	%f16, [%o0 + 0x40]
10878c2ecf20Sopenharmony_ci	std	%f18, [%o0 + 0x48]
10888c2ecf20Sopenharmony_ci	std	%f20, [%o0 + 0x50]
10898c2ecf20Sopenharmony_ci	std	%f22, [%o0 + 0x58]
10908c2ecf20Sopenharmony_ci	std	%f24, [%o0 + 0x60]
10918c2ecf20Sopenharmony_ci	std	%f26, [%o0 + 0x68]
10928c2ecf20Sopenharmony_ci	std	%f28, [%o0 + 0x70]
10938c2ecf20Sopenharmony_ci	retl
10948c2ecf20Sopenharmony_ci	 std	%f30, [%o0 + 0x78]
10958c2ecf20Sopenharmony_ci
10968c2ecf20Sopenharmony_ci	/* Thanks for Theo Deraadt and the authors of the Sprite/netbsd/openbsd
10978c2ecf20Sopenharmony_ci	 * code for pointing out this possible deadlock, while we save state
10988c2ecf20Sopenharmony_ci	 * above we could trap on the fsr store so our low level fpu trap
10998c2ecf20Sopenharmony_ci	 * code has to know how to deal with this.
11008c2ecf20Sopenharmony_ci	 */
11018c2ecf20Sopenharmony_cifpsave_catch:
11028c2ecf20Sopenharmony_ci	b	fpsave_magic + 4
11038c2ecf20Sopenharmony_ci	 st	%fsr, [%o1]
11048c2ecf20Sopenharmony_ci
11058c2ecf20Sopenharmony_cifpsave_catch2:
11068c2ecf20Sopenharmony_ci	b	fpsave + 4
11078c2ecf20Sopenharmony_ci	 st	%fsr, [%o1]
11088c2ecf20Sopenharmony_ci
11098c2ecf20Sopenharmony_ci	/* void fpload(unsigned long *fpregs, unsigned long *fsr); */
11108c2ecf20Sopenharmony_ci
11118c2ecf20Sopenharmony_ci	.globl	fpload
11128c2ecf20Sopenharmony_cifpload:
11138c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x00], %f0
11148c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x08], %f2
11158c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x10], %f4
11168c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x18], %f6
11178c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x20], %f8
11188c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x28], %f10
11198c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x30], %f12
11208c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x38], %f14
11218c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x40], %f16
11228c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x48], %f18
11238c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x50], %f20
11248c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x58], %f22
11258c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x60], %f24
11268c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x68], %f26
11278c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x70], %f28
11288c2ecf20Sopenharmony_ci	ldd	[%o0 + 0x78], %f30
11298c2ecf20Sopenharmony_ci	ld	[%o1], %fsr
11308c2ecf20Sopenharmony_ci	retl
11318c2ecf20Sopenharmony_ci	 nop
11328c2ecf20Sopenharmony_ci
11338c2ecf20Sopenharmony_ci	/* __ndelay and __udelay take two arguments:
11348c2ecf20Sopenharmony_ci	 * 0 - nsecs or usecs to delay
11358c2ecf20Sopenharmony_ci	 * 1 - per_cpu udelay_val (loops per jiffy)
11368c2ecf20Sopenharmony_ci	 *
11378c2ecf20Sopenharmony_ci	 * Note that ndelay gives HZ times higher resolution but has a 10ms
11388c2ecf20Sopenharmony_ci	 * limit.  udelay can handle up to 1s.
11398c2ecf20Sopenharmony_ci	 */
11408c2ecf20Sopenharmony_ci	.globl	__ndelay
11418c2ecf20Sopenharmony_ci__ndelay:
11428c2ecf20Sopenharmony_ci	save	%sp, -STACKFRAME_SZ, %sp
11438c2ecf20Sopenharmony_ci	mov	%i0, %o0		! round multiplier up so large ns ok
11448c2ecf20Sopenharmony_ci	mov	0x1ae, %o1		! 2**32 / (1 000 000 000 / HZ)
11458c2ecf20Sopenharmony_ci	umul	%o0, %o1, %o0
11468c2ecf20Sopenharmony_ci	rd	%y, %o1
11478c2ecf20Sopenharmony_ci	mov	%i1, %o1		! udelay_val
11488c2ecf20Sopenharmony_ci	umul	%o0, %o1, %o0
11498c2ecf20Sopenharmony_ci	rd	%y, %o1
11508c2ecf20Sopenharmony_ci	ba	delay_continue
11518c2ecf20Sopenharmony_ci	 mov	%o1, %o0		! >>32 later for better resolution
11528c2ecf20Sopenharmony_ci
11538c2ecf20Sopenharmony_ci	.globl	__udelay
11548c2ecf20Sopenharmony_ci__udelay:
11558c2ecf20Sopenharmony_ci	save	%sp, -STACKFRAME_SZ, %sp
11568c2ecf20Sopenharmony_ci	mov	%i0, %o0
11578c2ecf20Sopenharmony_ci	sethi	%hi(0x10c7), %o1	! round multiplier up so large us ok
11588c2ecf20Sopenharmony_ci	or	%o1, %lo(0x10c7), %o1	! 2**32 / 1 000 000
11598c2ecf20Sopenharmony_ci	umul	%o0, %o1, %o0
11608c2ecf20Sopenharmony_ci	rd	%y, %o1
11618c2ecf20Sopenharmony_ci	mov	%i1, %o1		! udelay_val
11628c2ecf20Sopenharmony_ci	umul	%o0, %o1, %o0
11638c2ecf20Sopenharmony_ci	rd	%y, %o1
11648c2ecf20Sopenharmony_ci	sethi	%hi(0x028f4b62), %l0	! Add in rounding constant * 2**32,
11658c2ecf20Sopenharmony_ci	or	%g0, %lo(0x028f4b62), %l0
11668c2ecf20Sopenharmony_ci	addcc	%o0, %l0, %o0		! 2**32 * 0.009 999
11678c2ecf20Sopenharmony_ci	bcs,a	3f
11688c2ecf20Sopenharmony_ci	 add	%o1, 0x01, %o1
11698c2ecf20Sopenharmony_ci3:
11708c2ecf20Sopenharmony_ci	mov	HZ, %o0			! >>32 earlier for wider range
11718c2ecf20Sopenharmony_ci	umul	%o0, %o1, %o0
11728c2ecf20Sopenharmony_ci	rd	%y, %o1
11738c2ecf20Sopenharmony_ci
11748c2ecf20Sopenharmony_cidelay_continue:
11758c2ecf20Sopenharmony_ci	cmp	%o0, 0x0
11768c2ecf20Sopenharmony_ci1:
11778c2ecf20Sopenharmony_ci	bne	1b
11788c2ecf20Sopenharmony_ci	 subcc	%o0, 1, %o0
11798c2ecf20Sopenharmony_ci
11808c2ecf20Sopenharmony_ci	ret
11818c2ecf20Sopenharmony_ci	restore
11828c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__udelay)
11838c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__ndelay)
11848c2ecf20Sopenharmony_ci
11858c2ecf20Sopenharmony_ci	/* Handle a software breakpoint */
11868c2ecf20Sopenharmony_ci	/* We have to inform parent that child has stopped */
11878c2ecf20Sopenharmony_ci	.align 4
11888c2ecf20Sopenharmony_ci	.globl breakpoint_trap
11898c2ecf20Sopenharmony_cibreakpoint_trap:
11908c2ecf20Sopenharmony_ci	rd	%wim,%l3
11918c2ecf20Sopenharmony_ci	SAVE_ALL
11928c2ecf20Sopenharmony_ci	wr 	%l0, PSR_ET, %psr
11938c2ecf20Sopenharmony_ci	WRITE_PAUSE
11948c2ecf20Sopenharmony_ci
11958c2ecf20Sopenharmony_ci	st	%i0, [%sp + STACKFRAME_SZ + PT_G0] ! for restarting syscalls
11968c2ecf20Sopenharmony_ci	call	sparc_breakpoint
11978c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o0
11988c2ecf20Sopenharmony_ci
11998c2ecf20Sopenharmony_ci	RESTORE_ALL
12008c2ecf20Sopenharmony_ci
12018c2ecf20Sopenharmony_ci#ifdef CONFIG_KGDB
12028c2ecf20Sopenharmony_ci	ENTRY(kgdb_trap_low)
12038c2ecf20Sopenharmony_ci	rd	%wim,%l3
12048c2ecf20Sopenharmony_ci	SAVE_ALL
12058c2ecf20Sopenharmony_ci	wr 	%l0, PSR_ET, %psr
12068c2ecf20Sopenharmony_ci	WRITE_PAUSE
12078c2ecf20Sopenharmony_ci
12088c2ecf20Sopenharmony_ci	mov	%l7, %o0		! trap_level
12098c2ecf20Sopenharmony_ci	call	kgdb_trap
12108c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o1	! struct pt_regs *regs
12118c2ecf20Sopenharmony_ci
12128c2ecf20Sopenharmony_ci	RESTORE_ALL
12138c2ecf20Sopenharmony_ci	ENDPROC(kgdb_trap_low)
12148c2ecf20Sopenharmony_ci#endif
12158c2ecf20Sopenharmony_ci
12168c2ecf20Sopenharmony_ci	.align	4
12178c2ecf20Sopenharmony_ci	.globl	flush_patch_exception
12188c2ecf20Sopenharmony_ciflush_patch_exception:
12198c2ecf20Sopenharmony_ci	FLUSH_ALL_KERNEL_WINDOWS;
12208c2ecf20Sopenharmony_ci	ldd	[%o0], %o6
12218c2ecf20Sopenharmony_ci	jmpl	%o7 + 0xc, %g0			! see asm-sparc/processor.h
12228c2ecf20Sopenharmony_ci	 mov	1, %g1				! signal EFAULT condition
12238c2ecf20Sopenharmony_ci
12248c2ecf20Sopenharmony_ci	.align	4
12258c2ecf20Sopenharmony_ci	.globl	kill_user_windows, kuw_patch1_7win
12268c2ecf20Sopenharmony_ci	.globl	kuw_patch1
12278c2ecf20Sopenharmony_cikuw_patch1_7win:	sll	%o3, 6, %o3
12288c2ecf20Sopenharmony_ci
12298c2ecf20Sopenharmony_ci	/* No matter how much overhead this routine has in the worst
12308c2ecf20Sopenharmony_ci	 * case scenario, it is several times better than taking the
12318c2ecf20Sopenharmony_ci	 * traps with the old method of just doing flush_user_windows().
12328c2ecf20Sopenharmony_ci	 */
12338c2ecf20Sopenharmony_cikill_user_windows:
12348c2ecf20Sopenharmony_ci	ld	[%g6 + TI_UWINMASK], %o0	! get current umask
12358c2ecf20Sopenharmony_ci	orcc	%g0, %o0, %g0			! if no bits set, we are done
12368c2ecf20Sopenharmony_ci	be	3f				! nothing to do
12378c2ecf20Sopenharmony_ci	 rd	%psr, %o5			! must clear interrupts
12388c2ecf20Sopenharmony_ci	or	%o5, PSR_PIL, %o4		! or else that could change
12398c2ecf20Sopenharmony_ci	wr	%o4, 0x0, %psr			! the uwinmask state
12408c2ecf20Sopenharmony_ci	WRITE_PAUSE				! burn them cycles
12418c2ecf20Sopenharmony_ci1:
12428c2ecf20Sopenharmony_ci	ld	[%g6 + TI_UWINMASK], %o0	! get consistent state
12438c2ecf20Sopenharmony_ci	orcc	%g0, %o0, %g0			! did an interrupt come in?
12448c2ecf20Sopenharmony_ci	be	4f				! yep, we are done
12458c2ecf20Sopenharmony_ci	 rd	%wim, %o3			! get current wim
12468c2ecf20Sopenharmony_ci	srl	%o3, 1, %o4			! simulate a save
12478c2ecf20Sopenharmony_cikuw_patch1:
12488c2ecf20Sopenharmony_ci	sll	%o3, 7, %o3			! compute next wim
12498c2ecf20Sopenharmony_ci	or	%o4, %o3, %o3			! result
12508c2ecf20Sopenharmony_ci	andncc	%o0, %o3, %o0			! clean this bit in umask
12518c2ecf20Sopenharmony_ci	bne	kuw_patch1			! not done yet
12528c2ecf20Sopenharmony_ci	 srl	%o3, 1, %o4			! begin another save simulation
12538c2ecf20Sopenharmony_ci	wr	%o3, 0x0, %wim			! set the new wim
12548c2ecf20Sopenharmony_ci	st	%g0, [%g6 + TI_UWINMASK]	! clear uwinmask
12558c2ecf20Sopenharmony_ci4:
12568c2ecf20Sopenharmony_ci	wr	%o5, 0x0, %psr			! re-enable interrupts
12578c2ecf20Sopenharmony_ci	WRITE_PAUSE				! burn baby burn
12588c2ecf20Sopenharmony_ci3:
12598c2ecf20Sopenharmony_ci	retl					! return
12608c2ecf20Sopenharmony_ci	 st	%g0, [%g6 + TI_W_SAVED]		! no windows saved
12618c2ecf20Sopenharmony_ci
12628c2ecf20Sopenharmony_ci	.align	4
12638c2ecf20Sopenharmony_ci	.globl	restore_current
12648c2ecf20Sopenharmony_cirestore_current:
12658c2ecf20Sopenharmony_ci	LOAD_CURRENT(g6, o0)
12668c2ecf20Sopenharmony_ci	retl
12678c2ecf20Sopenharmony_ci	 nop
12688c2ecf20Sopenharmony_ci
12698c2ecf20Sopenharmony_ci#ifdef CONFIG_PCIC_PCI
12708c2ecf20Sopenharmony_ci#include <asm/pcic.h>
12718c2ecf20Sopenharmony_ci
12728c2ecf20Sopenharmony_ci	.align	4
12738c2ecf20Sopenharmony_ci	.globl	linux_trap_ipi15_pcic
12748c2ecf20Sopenharmony_cilinux_trap_ipi15_pcic:
12758c2ecf20Sopenharmony_ci	rd	%wim, %l3
12768c2ecf20Sopenharmony_ci	SAVE_ALL
12778c2ecf20Sopenharmony_ci
12788c2ecf20Sopenharmony_ci	/*
12798c2ecf20Sopenharmony_ci	 * First deactivate NMI
12808c2ecf20Sopenharmony_ci	 * or we cannot drop ET, cannot get window spill traps.
12818c2ecf20Sopenharmony_ci	 * The busy loop is necessary because the PIO error
12828c2ecf20Sopenharmony_ci	 * sometimes does not go away quickly and we trap again.
12838c2ecf20Sopenharmony_ci	 */
12848c2ecf20Sopenharmony_ci	sethi	%hi(pcic_regs), %o1
12858c2ecf20Sopenharmony_ci	ld	[%o1 + %lo(pcic_regs)], %o2
12868c2ecf20Sopenharmony_ci
12878c2ecf20Sopenharmony_ci	! Get pending status for printouts later.
12888c2ecf20Sopenharmony_ci	ld	[%o2 + PCI_SYS_INT_PENDING], %o0
12898c2ecf20Sopenharmony_ci
12908c2ecf20Sopenharmony_ci	mov	PCI_SYS_INT_PENDING_CLEAR_ALL, %o1
12918c2ecf20Sopenharmony_ci	stb	%o1, [%o2 + PCI_SYS_INT_PENDING_CLEAR]
12928c2ecf20Sopenharmony_ci1:
12938c2ecf20Sopenharmony_ci	ld	[%o2 + PCI_SYS_INT_PENDING], %o1
12948c2ecf20Sopenharmony_ci	andcc	%o1, ((PCI_SYS_INT_PENDING_PIO|PCI_SYS_INT_PENDING_PCI)>>24), %g0
12958c2ecf20Sopenharmony_ci	bne	1b
12968c2ecf20Sopenharmony_ci	 nop
12978c2ecf20Sopenharmony_ci
12988c2ecf20Sopenharmony_ci	or	%l0, PSR_PIL, %l4
12998c2ecf20Sopenharmony_ci	wr	%l4, 0x0, %psr
13008c2ecf20Sopenharmony_ci	WRITE_PAUSE
13018c2ecf20Sopenharmony_ci	wr	%l4, PSR_ET, %psr
13028c2ecf20Sopenharmony_ci	WRITE_PAUSE
13038c2ecf20Sopenharmony_ci
13048c2ecf20Sopenharmony_ci	call	pcic_nmi
13058c2ecf20Sopenharmony_ci	 add	%sp, STACKFRAME_SZ, %o1	! struct pt_regs *regs
13068c2ecf20Sopenharmony_ci	RESTORE_ALL
13078c2ecf20Sopenharmony_ci
13088c2ecf20Sopenharmony_ci	.globl	pcic_nmi_trap_patch
13098c2ecf20Sopenharmony_cipcic_nmi_trap_patch:
13108c2ecf20Sopenharmony_ci	sethi	%hi(linux_trap_ipi15_pcic), %l3
13118c2ecf20Sopenharmony_ci	jmpl	%l3 + %lo(linux_trap_ipi15_pcic), %g0
13128c2ecf20Sopenharmony_ci	 rd	%psr, %l0
13138c2ecf20Sopenharmony_ci	.word	0
13148c2ecf20Sopenharmony_ci
13158c2ecf20Sopenharmony_ci#endif /* CONFIG_PCIC_PCI */
13168c2ecf20Sopenharmony_ci
13178c2ecf20Sopenharmony_ci	.globl	flushw_all
13188c2ecf20Sopenharmony_ciflushw_all:
13198c2ecf20Sopenharmony_ci	save	%sp, -0x40, %sp
13208c2ecf20Sopenharmony_ci	save	%sp, -0x40, %sp
13218c2ecf20Sopenharmony_ci	save	%sp, -0x40, %sp
13228c2ecf20Sopenharmony_ci	save	%sp, -0x40, %sp
13238c2ecf20Sopenharmony_ci	save	%sp, -0x40, %sp
13248c2ecf20Sopenharmony_ci	save	%sp, -0x40, %sp
13258c2ecf20Sopenharmony_ci	save	%sp, -0x40, %sp
13268c2ecf20Sopenharmony_ci	restore
13278c2ecf20Sopenharmony_ci	restore
13288c2ecf20Sopenharmony_ci	restore
13298c2ecf20Sopenharmony_ci	restore
13308c2ecf20Sopenharmony_ci	restore
13318c2ecf20Sopenharmony_ci	restore
13328c2ecf20Sopenharmony_ci	ret
13338c2ecf20Sopenharmony_ci	 restore
13348c2ecf20Sopenharmony_ci
13358c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP
13368c2ecf20Sopenharmony_ciENTRY(hard_smp_processor_id)
13378c2ecf20Sopenharmony_ci661:	rd		%tbr, %g1
13388c2ecf20Sopenharmony_ci	srl		%g1, 12, %o0
13398c2ecf20Sopenharmony_ci	and		%o0, 3, %o0
13408c2ecf20Sopenharmony_ci	.section	.cpuid_patch, "ax"
13418c2ecf20Sopenharmony_ci	/* Instruction location. */
13428c2ecf20Sopenharmony_ci	.word		661b
13438c2ecf20Sopenharmony_ci	/* SUN4D implementation. */
13448c2ecf20Sopenharmony_ci	lda		[%g0] ASI_M_VIKING_TMP1, %o0
13458c2ecf20Sopenharmony_ci	nop
13468c2ecf20Sopenharmony_ci	nop
13478c2ecf20Sopenharmony_ci	/* LEON implementation. */
13488c2ecf20Sopenharmony_ci	rd		%asr17, %o0
13498c2ecf20Sopenharmony_ci	srl		%o0, 0x1c, %o0
13508c2ecf20Sopenharmony_ci	nop
13518c2ecf20Sopenharmony_ci	.previous
13528c2ecf20Sopenharmony_ci	retl
13538c2ecf20Sopenharmony_ci	 nop
13548c2ecf20Sopenharmony_ciENDPROC(hard_smp_processor_id)
13558c2ecf20Sopenharmony_ci#endif
13568c2ecf20Sopenharmony_ci
13578c2ecf20Sopenharmony_ci/* End of entry.S */
1358