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