Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * etrap.S: Preparing for entry into the kernel on Sparc V9.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (C) 1996, 1997 David S. Miller (davem@caip.rutgers.edu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Copyright (C) 1997, 1998, 1999 Jakub Jelinek (jj@ultra.linux.cz)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <asm/asi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <asm/pstate.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <asm/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <asm/spitfire.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <asm/head.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <asm/processor.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <asm/mmu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #define		TASK_REGOFF		(THREAD_SIZE-TRACEREG_SZ-STACKFRAME_SZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #define		ETRAP_PSTATE1		(PSTATE_TSO | PSTATE_PRIV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #define		ETRAP_PSTATE2		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 		(PSTATE_TSO | PSTATE_PEF | PSTATE_PRIV | PSTATE_IE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  * On entry, %g7 is return address - 0x4.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  * %g4 and %g5 will be preserved %l4 and %l5 respectively.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 		.text		
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 		.align	64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 		.globl	etrap_syscall, etrap, etrap_irq, etraptl1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) etrap:		rdpr	%pil, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) etrap_irq:	clr	%g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) etrap_syscall:	TRAP_LOAD_THREAD_REG(%g6, %g1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 		rdpr	%tstate, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 		or	%g1, %g3, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 		sllx	%g2, 20, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 		andcc	%g1, TSTATE_PRIV, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 		or	%g1, %g3, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 		bne,pn	%xcc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 		 sub	%sp, STACKFRAME_SZ+TRACEREG_SZ-STACK_BIAS, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 661:		wrpr	%g0, 7, %cleanwin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 		.section .fast_win_ctrl_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 		.word	661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 		.word	0x85880000	! allclean
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 		.previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 		sethi	%hi(TASK_REGOFF), %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 		sethi	%hi(TSTATE_PEF), %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 		or	%g2, %lo(TASK_REGOFF), %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 		and	%g1, %g3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 		brnz,pn	%g3, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 		 add	%g6, %g2, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 		wr	%g0, 0, %fprs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 1:		rdpr	%tpc, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 		stx	%g1, [%g2 + STACKFRAME_SZ + PT_V9_TSTATE]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 		rdpr	%tnpc, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 		stx	%g3, [%g2 + STACKFRAME_SZ + PT_V9_TPC]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 		rd	%y, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 		stx	%g1, [%g2 + STACKFRAME_SZ + PT_V9_TNPC]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 		rdpr	%tt, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 		st	%g3, [%g2 + STACKFRAME_SZ + PT_V9_Y]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 		sethi	%hi(PT_REGS_MAGIC), %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 		or	%g3, %g1, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 		st	%g1, [%g2 + STACKFRAME_SZ + PT_V9_MAGIC]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 		rdpr	%cansave, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 		brnz,pt %g1, etrap_save
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		 nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 		rdpr	%cwp, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 		add	%g1, 2, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 		wrpr	%g1, %cwp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		be,pt	%xcc, etrap_user_spill
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 		 mov	ASI_AIUP, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 		rdpr	%otherwin, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 		brz	%g3, etrap_kernel_spill
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 		 mov	ASI_AIUS, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) etrap_user_spill:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 		wr	%g3, 0x0, %asi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 		ldx	[%g6 + TI_FLAGS], %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 		and	%g3, _TIF_32BIT, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 		brnz,pt	%g3, etrap_user_spill_32bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 		 nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 		ba,a,pt	%xcc, etrap_user_spill_64bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) etrap_save:	save	%g2, -STACK_BIAS, %sp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 		mov	%g6, %l6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 		bne,pn	%xcc, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 		 mov	PRIMARY_CONTEXT, %l4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 661:		rdpr	%canrestore, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 		.section .fast_win_ctrl_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 		.word	661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 		nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 		.previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 		rdpr	%wstate, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 661:		wrpr	%g0, 0, %canrestore
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 		.section .fast_win_ctrl_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 		.word	661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 		nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 		.previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 		sll	%g2, 3, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 		/* Set TI_SYS_FPDEPTH to 1 and clear TI_SYS_NOERROR.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 		mov	1, %l5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 		sth	%l5, [%l6 + TI_SYS_NOERROR]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 661:		wrpr	%g3, 0, %otherwin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 		.section .fast_win_ctrl_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 		.word	661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 		.word	0x87880000	! otherw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 		.previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 		wrpr	%g2, 0, %wstate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 		sethi	%hi(sparc64_kern_pri_context), %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 		ldx	[%g2 + %lo(sparc64_kern_pri_context)], %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 661:		stxa	%g3, [%l4] ASI_DMMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 		.section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 		.word	661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 		stxa	%g3, [%l4] ASI_MMU
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 		.previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 		sethi	%hi(KERNBASE), %l4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 		flush	%l4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 		mov	ASI_AIUS, %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 2:		mov	%g4, %l4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 		mov	%g5, %l5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 		add	%g7, 4, %l2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 		/* Go to trap time globals so we can save them.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 661:		wrpr	%g0, ETRAP_PSTATE1, %pstate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 		.section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 		.word	661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 		SET_GL(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 		.previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 		stx	%g1, [%sp + PTREGS_OFF + PT_V9_G1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 		stx	%g2, [%sp + PTREGS_OFF + PT_V9_G2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		sllx	%l7, 24, %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 		stx	%g3, [%sp + PTREGS_OFF + PT_V9_G3]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 		rdpr	%cwp, %l0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 		stx	%g4, [%sp + PTREGS_OFF + PT_V9_G4]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 		stx	%g5, [%sp + PTREGS_OFF + PT_V9_G5]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 		stx	%g6, [%sp + PTREGS_OFF + PT_V9_G6]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 		stx	%g7, [%sp + PTREGS_OFF + PT_V9_G7]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 		or	%l7, %l0, %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 661:		sethi	%hi(TSTATE_TSO | TSTATE_PEF), %l0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 		/* If userspace is using ADI, it could potentially pass
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 		 * a pointer with version tag embedded in it. To maintain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 		 * the ADI security, we must enable PSTATE.mcde. Userspace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 		 * would have already set TTE.mcd in an earlier call to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 		 * kernel and set the version tag for the address being
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 		 * dereferenced. Setting PSTATE.mcde would ensure any
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 		 * access to userspace data through a system call honors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 		 * ADI and does not allow a rogue app to bypass ADI by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 		 * using system calls. Setting PSTATE.mcde only affects
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 		 * accesses to virtual addresses that have TTE.mcd set.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 		 * Set PMCDPER to ensure any exceptions caused by ADI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 		 * version tag mismatch are exposed before system call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 		 * returns to userspace. Setting PMCDPER affects only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 		 * writes to virtual addresses that have TTE.mcd set and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 		 * have a version tag set as well.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 		.section .sun_m7_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 		.word	661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 		sethi	%hi(TSTATE_TSO | TSTATE_PEF | TSTATE_MCDE), %l0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 		.previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 661:		nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 		.section .sun_m7_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		.word	661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 		.word 0xaf902001	/* wrpr %g0, 1, %pmcdper */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 		.previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 		or	%l7, %l0, %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 		wrpr	%l2, %tnpc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 		wrpr	%l7, (TSTATE_PRIV | TSTATE_IE), %tstate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 		stx	%i0, [%sp + PTREGS_OFF + PT_V9_I0]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 		stx	%i1, [%sp + PTREGS_OFF + PT_V9_I1]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		stx	%i2, [%sp + PTREGS_OFF + PT_V9_I2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 		stx	%i3, [%sp + PTREGS_OFF + PT_V9_I3]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		stx	%i4, [%sp + PTREGS_OFF + PT_V9_I4]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 		stx	%i5, [%sp + PTREGS_OFF + PT_V9_I5]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 		stx	%i6, [%sp + PTREGS_OFF + PT_V9_I6]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 		mov	%l6, %g6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 		stx	%i7, [%sp + PTREGS_OFF + PT_V9_I7]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 		LOAD_PER_CPU_BASE(%g5, %g6, %g4, %g3, %l1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 		ldx	[%g6 + TI_TASK], %g4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 		done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 3:		mov	ASI_P, %l7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 		ldub	[%l6 + TI_FPDEPTH], %l5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 		add	%l6, TI_FPSAVED + 1, %l4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 		srl	%l5, 1, %l3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 		add	%l5, 2, %l5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 		/* Set TI_SYS_FPDEPTH to %l5 and clear TI_SYS_NOERROR.  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 		sth	%l5, [%l6 + TI_SYS_NOERROR]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 		ba,pt	%xcc, 2b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 		 stb	%g0, [%l4 + %l3]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 		nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) etraptl1:	/* Save tstate/tpc/tnpc of TL 1-->4 and the tl register itself.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 		 * We place this right after pt_regs on the trap stack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 		 * The layout is:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 		 *	0x00	TL1's TSTATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 		 *	0x08	TL1's TPC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 		 *	0x10	TL1's TNPC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 		 *	0x18	TL1's TT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 		 *	 ...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 		 *	0x58	TL4's TT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 		 *	0x60	TL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 		 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 		TRAP_LOAD_THREAD_REG(%g6, %g1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 		sub	%sp, ((4 * 8) * 4) + 8, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 		rdpr	%tl, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 		wrpr	%g0, 1, %tl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		rdpr	%tstate, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 		stx	%g3, [%g2 + STACK_BIAS + 0x00]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 		rdpr	%tpc, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 		stx	%g3, [%g2 + STACK_BIAS + 0x08]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 		rdpr	%tnpc, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 		stx	%g3, [%g2 + STACK_BIAS + 0x10]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 		rdpr	%tt, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 		stx	%g3, [%g2 + STACK_BIAS + 0x18]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 		wrpr	%g0, 2, %tl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 		rdpr	%tstate, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 		stx	%g3, [%g2 + STACK_BIAS + 0x20]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 		rdpr	%tpc, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 		stx	%g3, [%g2 + STACK_BIAS + 0x28]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 		rdpr	%tnpc, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 		stx	%g3, [%g2 + STACK_BIAS + 0x30]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 		rdpr	%tt, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 		stx	%g3, [%g2 + STACK_BIAS + 0x38]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 		sethi	%hi(is_sun4v), %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 		lduw	[%g3 + %lo(is_sun4v)], %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 		brnz,pn	%g3, finish_tl1_capture
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 		 nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 		wrpr	%g0, 3, %tl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 		rdpr	%tstate, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 		stx	%g3, [%g2 + STACK_BIAS + 0x40]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 		rdpr	%tpc, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 		stx	%g3, [%g2 + STACK_BIAS + 0x48]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 		rdpr	%tnpc, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 		stx	%g3, [%g2 + STACK_BIAS + 0x50]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 		rdpr	%tt, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 		stx	%g3, [%g2 + STACK_BIAS + 0x58]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 		wrpr	%g0, 4, %tl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 		rdpr	%tstate, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 		stx	%g3, [%g2 + STACK_BIAS + 0x60]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 		rdpr	%tpc, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 		stx	%g3, [%g2 + STACK_BIAS + 0x68]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 		rdpr	%tnpc, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 		stx	%g3, [%g2 + STACK_BIAS + 0x70]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 		rdpr	%tt, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 		stx	%g3, [%g2 + STACK_BIAS + 0x78]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 		stx	%g1, [%g2 + STACK_BIAS + 0x80]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) finish_tl1_capture:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 		wrpr	%g0, 1, %tl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 661:		nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 		.section .sun4v_1insn_patch, "ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 		.word	661b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 		SET_GL(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 		.previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 		rdpr	%tstate, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 		sub	%g2, STACKFRAME_SZ + TRACEREG_SZ - STACK_BIAS, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 		ba,pt	%xcc, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 		 andcc	%g1, TSTATE_PRIV, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) #undef TASK_REGOFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) #undef ETRAP_PSTATE1