xref: /openbmc/linux/arch/sparc/kernel/sun4v_tlb_miss.S (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
2a88b5ba8SSam Ravnborg/* sun4v_tlb_miss.S: Sun4v TLB miss handlers.
3a88b5ba8SSam Ravnborg *
4a88b5ba8SSam Ravnborg * Copyright (C) 2006 <davem@davemloft.net>
5a88b5ba8SSam Ravnborg */
6a88b5ba8SSam Ravnborg
7a88b5ba8SSam Ravnborg	.text
8a88b5ba8SSam Ravnborg	.align	32
9a88b5ba8SSam Ravnborg
10a88b5ba8SSam Ravnborg	/* Load ITLB fault information into VADDR and CTX, using BASE.  */
11a88b5ba8SSam Ravnborg#define LOAD_ITLB_INFO(BASE, VADDR, CTX) \
12a88b5ba8SSam Ravnborg	ldx	[BASE + HV_FAULT_I_ADDR_OFFSET], VADDR; \
13a88b5ba8SSam Ravnborg	ldx	[BASE + HV_FAULT_I_CTX_OFFSET], CTX;
14a88b5ba8SSam Ravnborg
15a88b5ba8SSam Ravnborg	/* Load DTLB fault information into VADDR and CTX, using BASE.  */
16a88b5ba8SSam Ravnborg#define LOAD_DTLB_INFO(BASE, VADDR, CTX) \
17a88b5ba8SSam Ravnborg	ldx	[BASE + HV_FAULT_D_ADDR_OFFSET], VADDR; \
18a88b5ba8SSam Ravnborg	ldx	[BASE + HV_FAULT_D_CTX_OFFSET], CTX;
19a88b5ba8SSam Ravnborg
20a88b5ba8SSam Ravnborg	/* DEST = (VADDR >> 22)
21a88b5ba8SSam Ravnborg	 *
22a88b5ba8SSam Ravnborg	 * Branch to ZERO_CTX_LABEL if context is zero.
23a88b5ba8SSam Ravnborg	 */
24a88b5ba8SSam Ravnborg#define	COMPUTE_TAG_TARGET(DEST, VADDR, CTX, ZERO_CTX_LABEL) \
25a88b5ba8SSam Ravnborg	srlx	VADDR, 22, DEST; \
26a88b5ba8SSam Ravnborg	brz,pn	CTX, ZERO_CTX_LABEL; \
27a88b5ba8SSam Ravnborg	 nop;
28a88b5ba8SSam Ravnborg
29a88b5ba8SSam Ravnborg	/* Create TSB pointer.  This is something like:
30a88b5ba8SSam Ravnborg	 *
31a88b5ba8SSam Ravnborg	 * index_mask = (512 << (tsb_reg & 0x7UL)) - 1UL;
32a88b5ba8SSam Ravnborg	 * tsb_base = tsb_reg & ~0x7UL;
33a88b5ba8SSam Ravnborg	 * tsb_index = ((vaddr >> HASH_SHIFT) & tsb_mask);
34a88b5ba8SSam Ravnborg	 * tsb_ptr = tsb_base + (tsb_index * 16);
35a88b5ba8SSam Ravnborg	 */
36a88b5ba8SSam Ravnborg#define COMPUTE_TSB_PTR(TSB_PTR, VADDR, HASH_SHIFT, TMP1, TMP2) \
37a88b5ba8SSam Ravnborg	and	TSB_PTR, 0x7, TMP1;			\
38a88b5ba8SSam Ravnborg	mov	512, TMP2;				\
39a88b5ba8SSam Ravnborg	andn	TSB_PTR, 0x7, TSB_PTR;			\
40a88b5ba8SSam Ravnborg	sllx	TMP2, TMP1, TMP2;			\
41a88b5ba8SSam Ravnborg	srlx	VADDR, HASH_SHIFT, TMP1;		\
42a88b5ba8SSam Ravnborg	sub	TMP2, 1, TMP2;				\
43a88b5ba8SSam Ravnborg	and	TMP1, TMP2, TMP1;			\
44a88b5ba8SSam Ravnborg	sllx	TMP1, 4, TMP1;				\
45a88b5ba8SSam Ravnborg	add	TSB_PTR, TMP1, TSB_PTR;
46a88b5ba8SSam Ravnborg
47a88b5ba8SSam Ravnborgsun4v_itlb_miss:
48a88b5ba8SSam Ravnborg	/* Load MMU Miss base into %g2.  */
49a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g2
50a88b5ba8SSam Ravnborg
51a88b5ba8SSam Ravnborg	/* Load UTSB reg into %g1.  */
52a88b5ba8SSam Ravnborg	mov	SCRATCHPAD_UTSBREG1, %g1
53a88b5ba8SSam Ravnborg	ldxa	[%g1] ASI_SCRATCHPAD, %g1
54a88b5ba8SSam Ravnborg
55a88b5ba8SSam Ravnborg	LOAD_ITLB_INFO(%g2, %g4, %g5)
56a88b5ba8SSam Ravnborg	COMPUTE_TAG_TARGET(%g6, %g4, %g5, kvmap_itlb_4v)
57a88b5ba8SSam Ravnborg	COMPUTE_TSB_PTR(%g1, %g4, PAGE_SHIFT, %g3, %g7)
58a88b5ba8SSam Ravnborg
59a88b5ba8SSam Ravnborg	/* Load TSB tag/pte into %g2/%g3 and compare the tag.  */
60a88b5ba8SSam Ravnborg	ldda	[%g1] ASI_QUAD_LDD_PHYS_4V, %g2
61a88b5ba8SSam Ravnborg	cmp	%g2, %g6
62a88b5ba8SSam Ravnborg	bne,a,pn %xcc, tsb_miss_page_table_walk
63a88b5ba8SSam Ravnborg	 mov	FAULT_CODE_ITLB, %g3
64a88b5ba8SSam Ravnborg	andcc	%g3, _PAGE_EXEC_4V, %g0
65a88b5ba8SSam Ravnborg	be,a,pn	%xcc, tsb_do_fault
66a88b5ba8SSam Ravnborg	 mov	FAULT_CODE_ITLB, %g3
67a88b5ba8SSam Ravnborg
68a88b5ba8SSam Ravnborg	/* We have a valid entry, make hypervisor call to load
69a88b5ba8SSam Ravnborg	 * I-TLB and return from trap.
70a88b5ba8SSam Ravnborg	 *
71a88b5ba8SSam Ravnborg	 * %g3:	PTE
72a88b5ba8SSam Ravnborg	 * %g4:	vaddr
73a88b5ba8SSam Ravnborg	 */
74a88b5ba8SSam Ravnborgsun4v_itlb_load:
75a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g6
76a88b5ba8SSam Ravnborg	mov	%o0, %g1		! save %o0
77a88b5ba8SSam Ravnborg	mov	%o1, %g2		! save %o1
78a88b5ba8SSam Ravnborg	mov	%o2, %g5		! save %o2
79a88b5ba8SSam Ravnborg	mov	%o3, %g7		! save %o3
80a88b5ba8SSam Ravnborg	mov	%g4, %o0		! vaddr
81a88b5ba8SSam Ravnborg	ldx	[%g6 + HV_FAULT_I_CTX_OFFSET], %o1	! ctx
82a88b5ba8SSam Ravnborg	mov	%g3, %o2		! PTE
83a88b5ba8SSam Ravnborg	mov	HV_MMU_IMMU, %o3	! flags
84a88b5ba8SSam Ravnborg	ta	HV_MMU_MAP_ADDR_TRAP
85a88b5ba8SSam Ravnborg	brnz,pn	%o0, sun4v_itlb_error
86a88b5ba8SSam Ravnborg	 mov	%g2, %o1		! restore %o1
87a88b5ba8SSam Ravnborg	mov	%g1, %o0		! restore %o0
88a88b5ba8SSam Ravnborg	mov	%g5, %o2		! restore %o2
89a88b5ba8SSam Ravnborg	mov	%g7, %o3		! restore %o3
90a88b5ba8SSam Ravnborg
91a88b5ba8SSam Ravnborg	retry
92a88b5ba8SSam Ravnborg
93a88b5ba8SSam Ravnborgsun4v_dtlb_miss:
94a88b5ba8SSam Ravnborg	/* Load MMU Miss base into %g2.  */
95a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g2
96a88b5ba8SSam Ravnborg
97a88b5ba8SSam Ravnborg	/* Load UTSB reg into %g1.  */
98a88b5ba8SSam Ravnborg	mov	SCRATCHPAD_UTSBREG1, %g1
99a88b5ba8SSam Ravnborg	ldxa	[%g1] ASI_SCRATCHPAD, %g1
100a88b5ba8SSam Ravnborg
101a88b5ba8SSam Ravnborg	LOAD_DTLB_INFO(%g2, %g4, %g5)
102a88b5ba8SSam Ravnborg	COMPUTE_TAG_TARGET(%g6, %g4, %g5, kvmap_dtlb_4v)
103a88b5ba8SSam Ravnborg	COMPUTE_TSB_PTR(%g1, %g4, PAGE_SHIFT, %g3, %g7)
104a88b5ba8SSam Ravnborg
105a88b5ba8SSam Ravnborg	/* Load TSB tag/pte into %g2/%g3 and compare the tag.  */
106a88b5ba8SSam Ravnborg	ldda	[%g1] ASI_QUAD_LDD_PHYS_4V, %g2
107a88b5ba8SSam Ravnborg	cmp	%g2, %g6
108a88b5ba8SSam Ravnborg	bne,a,pn %xcc, tsb_miss_page_table_walk
109a88b5ba8SSam Ravnborg	 mov	FAULT_CODE_DTLB, %g3
110a88b5ba8SSam Ravnborg
111a88b5ba8SSam Ravnborg	/* We have a valid entry, make hypervisor call to load
112a88b5ba8SSam Ravnborg	 * D-TLB and return from trap.
113a88b5ba8SSam Ravnborg	 *
114a88b5ba8SSam Ravnborg	 * %g3:	PTE
115a88b5ba8SSam Ravnborg	 * %g4:	vaddr
116a88b5ba8SSam Ravnborg	 */
117a88b5ba8SSam Ravnborgsun4v_dtlb_load:
118a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g6
119a88b5ba8SSam Ravnborg	mov	%o0, %g1		! save %o0
120a88b5ba8SSam Ravnborg	mov	%o1, %g2		! save %o1
121a88b5ba8SSam Ravnborg	mov	%o2, %g5		! save %o2
122a88b5ba8SSam Ravnborg	mov	%o3, %g7		! save %o3
123a88b5ba8SSam Ravnborg	mov	%g4, %o0		! vaddr
124a88b5ba8SSam Ravnborg	ldx	[%g6 + HV_FAULT_D_CTX_OFFSET], %o1	! ctx
125a88b5ba8SSam Ravnborg	mov	%g3, %o2		! PTE
126a88b5ba8SSam Ravnborg	mov	HV_MMU_DMMU, %o3	! flags
127a88b5ba8SSam Ravnborg	ta	HV_MMU_MAP_ADDR_TRAP
128a88b5ba8SSam Ravnborg	brnz,pn	%o0, sun4v_dtlb_error
129a88b5ba8SSam Ravnborg	 mov	%g2, %o1		! restore %o1
130a88b5ba8SSam Ravnborg	mov	%g1, %o0		! restore %o0
131a88b5ba8SSam Ravnborg	mov	%g5, %o2		! restore %o2
132a88b5ba8SSam Ravnborg	mov	%g7, %o3		! restore %o3
133a88b5ba8SSam Ravnborg
134a88b5ba8SSam Ravnborg	retry
135a88b5ba8SSam Ravnborg
136a88b5ba8SSam Ravnborgsun4v_dtlb_prot:
137a88b5ba8SSam Ravnborg	SET_GL(1)
138a88b5ba8SSam Ravnborg
139a88b5ba8SSam Ravnborg	/* Load MMU Miss base into %g5.  */
140a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g5
141a88b5ba8SSam Ravnborg
142a88b5ba8SSam Ravnborg	ldx	[%g5 + HV_FAULT_D_ADDR_OFFSET], %g5
143a88b5ba8SSam Ravnborg	rdpr	%tl, %g1
144a88b5ba8SSam Ravnborg	cmp	%g1, 1
145a88b5ba8SSam Ravnborg	bgu,pn	%xcc, winfix_trampoline
146a88b5ba8SSam Ravnborg	 mov	FAULT_CODE_DTLB | FAULT_CODE_WRITE, %g4
147a88b5ba8SSam Ravnborg	ba,pt	%xcc, sparc64_realfault_common
148a88b5ba8SSam Ravnborg	 nop
149a88b5ba8SSam Ravnborg
150a88b5ba8SSam Ravnborg	/* Called from trap table:
151a88b5ba8SSam Ravnborg	 * %g4:	vaddr
152a88b5ba8SSam Ravnborg	 * %g5:	context
153a88b5ba8SSam Ravnborg	 * %g6: TAG TARGET
154a88b5ba8SSam Ravnborg	 */
155a88b5ba8SSam Ravnborgsun4v_itsb_miss:
156a88b5ba8SSam Ravnborg	mov	SCRATCHPAD_UTSBREG1, %g1
157a88b5ba8SSam Ravnborg	ldxa	[%g1] ASI_SCRATCHPAD, %g1
158a88b5ba8SSam Ravnborg	brz,pn	%g5, kvmap_itlb_4v
159a88b5ba8SSam Ravnborg	 mov	FAULT_CODE_ITLB, %g3
160a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, sun4v_tsb_miss_common
161a88b5ba8SSam Ravnborg
162a88b5ba8SSam Ravnborg	/* Called from trap table:
163a88b5ba8SSam Ravnborg	 * %g4:	vaddr
164a88b5ba8SSam Ravnborg	 * %g5:	context
165a88b5ba8SSam Ravnborg	 * %g6: TAG TARGET
166a88b5ba8SSam Ravnborg	 */
167a88b5ba8SSam Ravnborgsun4v_dtsb_miss:
168a88b5ba8SSam Ravnborg	mov	SCRATCHPAD_UTSBREG1, %g1
169a88b5ba8SSam Ravnborg	ldxa	[%g1] ASI_SCRATCHPAD, %g1
170a88b5ba8SSam Ravnborg	brz,pn	%g5, kvmap_dtlb_4v
171a88b5ba8SSam Ravnborg	 mov	FAULT_CODE_DTLB, %g3
172a88b5ba8SSam Ravnborg
173a88b5ba8SSam Ravnborg	/* fallthrough */
174a88b5ba8SSam Ravnborg
175a88b5ba8SSam Ravnborgsun4v_tsb_miss_common:
176a88b5ba8SSam Ravnborg	COMPUTE_TSB_PTR(%g1, %g4, PAGE_SHIFT, %g5, %g7)
177a88b5ba8SSam Ravnborg
178a88b5ba8SSam Ravnborg	sub	%g2, TRAP_PER_CPU_FAULT_INFO, %g2
179a88b5ba8SSam Ravnborg
1809e695d2eSDavid Miller#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)
181a88b5ba8SSam Ravnborg	mov	SCRATCHPAD_UTSBREG2, %g5
182a88b5ba8SSam Ravnborg	ldxa	[%g5] ASI_SCRATCHPAD, %g5
183a88b5ba8SSam Ravnborg	cmp	%g5, -1
184a88b5ba8SSam Ravnborg	be,pt	%xcc, 80f
185a88b5ba8SSam Ravnborg	 nop
18637b3a8ffSDavid S. Miller	COMPUTE_TSB_PTR(%g5, %g4, REAL_HPAGE_SHIFT, %g2, %g7)
187a88b5ba8SSam Ravnborg
188a88b5ba8SSam Ravnborg	/* That clobbered %g2, reload it.  */
189a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g2
190a88b5ba8SSam Ravnborg	sub	%g2, TRAP_PER_CPU_FAULT_INFO, %g2
191a88b5ba8SSam Ravnborg
192a88b5ba8SSam Ravnborg80:	stx	%g5, [%g2 + TRAP_PER_CPU_TSB_HUGE_TEMP]
193a88b5ba8SSam Ravnborg#endif
194a88b5ba8SSam Ravnborg
195a88b5ba8SSam Ravnborg	ba,pt	%xcc, tsb_miss_page_table_walk_sun4v_fastpath
196a88b5ba8SSam Ravnborg	 ldx	[%g2 + TRAP_PER_CPU_PGD_PADDR], %g7
197a88b5ba8SSam Ravnborg
198a88b5ba8SSam Ravnborgsun4v_itlb_error:
1994ccb9272Sbob picco	rdpr	%tl, %g1
2004ccb9272Sbob picco	cmp	%g1, 1
2014ccb9272Sbob picco	ble,pt	%icc, sun4v_bad_ra
2024ccb9272Sbob picco	 or	%g0, FAULT_CODE_BAD_RA | FAULT_CODE_ITLB, %g1
2034ccb9272Sbob picco
204a88b5ba8SSam Ravnborg	sethi	%hi(sun4v_err_itlb_vaddr), %g1
205a88b5ba8SSam Ravnborg	stx	%g4, [%g1 + %lo(sun4v_err_itlb_vaddr)]
206a88b5ba8SSam Ravnborg	sethi	%hi(sun4v_err_itlb_ctx), %g1
207a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g6
208a88b5ba8SSam Ravnborg	ldx	[%g6 + HV_FAULT_I_CTX_OFFSET], %o1
209a88b5ba8SSam Ravnborg	stx	%o1, [%g1 + %lo(sun4v_err_itlb_ctx)]
210a88b5ba8SSam Ravnborg	sethi	%hi(sun4v_err_itlb_pte), %g1
211a88b5ba8SSam Ravnborg	stx	%g3, [%g1 + %lo(sun4v_err_itlb_pte)]
212a88b5ba8SSam Ravnborg	sethi	%hi(sun4v_err_itlb_error), %g1
213a88b5ba8SSam Ravnborg	stx	%o0, [%g1 + %lo(sun4v_err_itlb_error)]
214a88b5ba8SSam Ravnborg
2154ccb9272Sbob picco	sethi	%hi(1f), %g7
216a88b5ba8SSam Ravnborg	rdpr	%tl, %g4
217a88b5ba8SSam Ravnborg	ba,pt	%xcc, etraptl1
2184ccb9272Sbob picco1:	 or	%g7, %lo(1f), %g7
219a88b5ba8SSam Ravnborg	mov	%l4, %o1
220a88b5ba8SSam Ravnborg	call	sun4v_itlb_error_report
221a88b5ba8SSam Ravnborg	 add	%sp, PTREGS_OFF, %o0
222a88b5ba8SSam Ravnborg
223a88b5ba8SSam Ravnborg	/* NOTREACHED */
224a88b5ba8SSam Ravnborg
225a88b5ba8SSam Ravnborgsun4v_dtlb_error:
2264ccb9272Sbob picco	rdpr	%tl, %g1
2274ccb9272Sbob picco	cmp	%g1, 1
2284ccb9272Sbob picco	ble,pt	%icc, sun4v_bad_ra
2294ccb9272Sbob picco	 or	%g0, FAULT_CODE_BAD_RA | FAULT_CODE_DTLB, %g1
2304ccb9272Sbob picco
231a88b5ba8SSam Ravnborg	sethi	%hi(sun4v_err_dtlb_vaddr), %g1
232a88b5ba8SSam Ravnborg	stx	%g4, [%g1 + %lo(sun4v_err_dtlb_vaddr)]
233a88b5ba8SSam Ravnborg	sethi	%hi(sun4v_err_dtlb_ctx), %g1
234a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g6
235a88b5ba8SSam Ravnborg	ldx	[%g6 + HV_FAULT_D_CTX_OFFSET], %o1
236a88b5ba8SSam Ravnborg	stx	%o1, [%g1 + %lo(sun4v_err_dtlb_ctx)]
237a88b5ba8SSam Ravnborg	sethi	%hi(sun4v_err_dtlb_pte), %g1
238a88b5ba8SSam Ravnborg	stx	%g3, [%g1 + %lo(sun4v_err_dtlb_pte)]
239a88b5ba8SSam Ravnborg	sethi	%hi(sun4v_err_dtlb_error), %g1
240a88b5ba8SSam Ravnborg	stx	%o0, [%g1 + %lo(sun4v_err_dtlb_error)]
241a88b5ba8SSam Ravnborg
2424ccb9272Sbob picco	sethi	%hi(1f), %g7
243a88b5ba8SSam Ravnborg	rdpr	%tl, %g4
244a88b5ba8SSam Ravnborg	ba,pt	%xcc, etraptl1
2454ccb9272Sbob picco1:	 or	%g7, %lo(1f), %g7
246a88b5ba8SSam Ravnborg	mov	%l4, %o1
247a88b5ba8SSam Ravnborg	call	sun4v_dtlb_error_report
248a88b5ba8SSam Ravnborg	 add	%sp, PTREGS_OFF, %o0
249a88b5ba8SSam Ravnborg
250a88b5ba8SSam Ravnborg	/* NOTREACHED */
251a88b5ba8SSam Ravnborg
2524ccb9272Sbob piccosun4v_bad_ra:
2534ccb9272Sbob picco	or	%g0, %g4, %g5
2544ccb9272Sbob picco	ba,pt	%xcc, sparc64_realfault_common
2554ccb9272Sbob picco	 or	%g1, %g0, %g4
2564ccb9272Sbob picco
2574ccb9272Sbob picco	/* NOTREACHED */
2584ccb9272Sbob picco
259a88b5ba8SSam Ravnborg	/* Instruction Access Exception, tl0. */
260a88b5ba8SSam Ravnborgsun4v_iacc:
261a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g2
262a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_I_TYPE_OFFSET], %g3
263a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_I_ADDR_OFFSET], %g4
264a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_I_CTX_OFFSET], %g5
265a88b5ba8SSam Ravnborg	sllx	%g3, 16, %g3
266a88b5ba8SSam Ravnborg	or	%g5, %g3, %g5
267a88b5ba8SSam Ravnborg	ba,pt	%xcc, etrap
268a88b5ba8SSam Ravnborg	 rd	%pc, %g7
269a88b5ba8SSam Ravnborg	mov	%l4, %o1
270a88b5ba8SSam Ravnborg	mov	%l5, %o2
271a88b5ba8SSam Ravnborg	call	sun4v_insn_access_exception
272a88b5ba8SSam Ravnborg	 add	%sp, PTREGS_OFF, %o0
273a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, rtrap
274a88b5ba8SSam Ravnborg
275a88b5ba8SSam Ravnborg	/* Instruction Access Exception, tl1. */
276a88b5ba8SSam Ravnborgsun4v_iacc_tl1:
277a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g2
278a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_I_TYPE_OFFSET], %g3
279a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_I_ADDR_OFFSET], %g4
280a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_I_CTX_OFFSET], %g5
281a88b5ba8SSam Ravnborg	sllx	%g3, 16, %g3
282a88b5ba8SSam Ravnborg	or	%g5, %g3, %g5
283a88b5ba8SSam Ravnborg	ba,pt	%xcc, etraptl1
284a88b5ba8SSam Ravnborg	 rd	%pc, %g7
285a88b5ba8SSam Ravnborg	mov	%l4, %o1
286a88b5ba8SSam Ravnborg	mov	%l5, %o2
287a88b5ba8SSam Ravnborg	call	sun4v_insn_access_exception_tl1
288a88b5ba8SSam Ravnborg	 add	%sp, PTREGS_OFF, %o0
289a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, rtrap
290a88b5ba8SSam Ravnborg
291a88b5ba8SSam Ravnborg	/* Data Access Exception, tl0. */
292a88b5ba8SSam Ravnborgsun4v_dacc:
293a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g2
294a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_TYPE_OFFSET], %g3
295a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_ADDR_OFFSET], %g4
296a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_CTX_OFFSET], %g5
297a88b5ba8SSam Ravnborg	sllx	%g3, 16, %g3
298a88b5ba8SSam Ravnborg	or	%g5, %g3, %g5
299a88b5ba8SSam Ravnborg	ba,pt	%xcc, etrap
300a88b5ba8SSam Ravnborg	 rd	%pc, %g7
301a88b5ba8SSam Ravnborg	mov	%l4, %o1
302a88b5ba8SSam Ravnborg	mov	%l5, %o2
303a88b5ba8SSam Ravnborg	call	sun4v_data_access_exception
304a88b5ba8SSam Ravnborg	 add	%sp, PTREGS_OFF, %o0
305a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, rtrap
306a88b5ba8SSam Ravnborg
307a88b5ba8SSam Ravnborg	/* Data Access Exception, tl1. */
308a88b5ba8SSam Ravnborgsun4v_dacc_tl1:
309a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g2
310a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_TYPE_OFFSET], %g3
311a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_ADDR_OFFSET], %g4
312a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_CTX_OFFSET], %g5
313a88b5ba8SSam Ravnborg	sllx	%g3, 16, %g3
314a88b5ba8SSam Ravnborg	or	%g5, %g3, %g5
315a88b5ba8SSam Ravnborg	ba,pt	%xcc, etraptl1
316a88b5ba8SSam Ravnborg	 rd	%pc, %g7
317a88b5ba8SSam Ravnborg	mov	%l4, %o1
318a88b5ba8SSam Ravnborg	mov	%l5, %o2
319a88b5ba8SSam Ravnborg	call	sun4v_data_access_exception_tl1
320a88b5ba8SSam Ravnborg	 add	%sp, PTREGS_OFF, %o0
321a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, rtrap
322a88b5ba8SSam Ravnborg
323a88b5ba8SSam Ravnborg	/* Memory Address Unaligned.  */
324a88b5ba8SSam Ravnborgsun4v_mna:
325a88b5ba8SSam Ravnborg	/* Window fixup? */
326a88b5ba8SSam Ravnborg	rdpr	%tl, %g2
327a88b5ba8SSam Ravnborg	cmp	%g2, 1
328a88b5ba8SSam Ravnborg	ble,pt	%icc, 1f
329a88b5ba8SSam Ravnborg	 nop
330a88b5ba8SSam Ravnborg
331a88b5ba8SSam Ravnborg	SET_GL(1)
332a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g2
333a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_ADDR_OFFSET], %g5
334a88b5ba8SSam Ravnborg	mov	HV_FAULT_TYPE_UNALIGNED, %g3
335a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_CTX_OFFSET], %g4
336a88b5ba8SSam Ravnborg	sllx	%g3, 16, %g3
337a88b5ba8SSam Ravnborg	or	%g4, %g3, %g4
338a88b5ba8SSam Ravnborg	ba,pt	%xcc, winfix_mna
339a88b5ba8SSam Ravnborg	 rdpr	%tpc, %g3
340a88b5ba8SSam Ravnborg	/* not reached */
341a88b5ba8SSam Ravnborg
342a88b5ba8SSam Ravnborg1:	ldxa	[%g0] ASI_SCRATCHPAD, %g2
343a88b5ba8SSam Ravnborg	mov	HV_FAULT_TYPE_UNALIGNED, %g3
344a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_ADDR_OFFSET], %g4
345a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_CTX_OFFSET], %g5
346a88b5ba8SSam Ravnborg	sllx	%g3, 16, %g3
347a88b5ba8SSam Ravnborg	or	%g5, %g3, %g5
348a88b5ba8SSam Ravnborg
349a88b5ba8SSam Ravnborg	ba,pt	%xcc, etrap
350a88b5ba8SSam Ravnborg	 rd	%pc, %g7
351a88b5ba8SSam Ravnborg	mov	%l4, %o1
352a88b5ba8SSam Ravnborg	mov	%l5, %o2
353a88b5ba8SSam Ravnborg	call	sun4v_do_mna
354a88b5ba8SSam Ravnborg	 add	%sp, PTREGS_OFF, %o0
355a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, rtrap
3560ae2d26fSBabu Moger	 nop
357a88b5ba8SSam Ravnborg
358a88b5ba8SSam Ravnborg	/* Privileged Action.  */
359a88b5ba8SSam Ravnborgsun4v_privact:
360a88b5ba8SSam Ravnborg	ba,pt	%xcc, etrap
361a88b5ba8SSam Ravnborg	 rd	%pc, %g7
362a88b5ba8SSam Ravnborg	call	do_privact
363a88b5ba8SSam Ravnborg	 add	%sp, PTREGS_OFF, %o0
364a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, rtrap
365a88b5ba8SSam Ravnborg
366a88b5ba8SSam Ravnborg	/* Unaligned ldd float, tl0. */
367a88b5ba8SSam Ravnborgsun4v_lddfmna:
368a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g2
369a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_TYPE_OFFSET], %g3
370a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_ADDR_OFFSET], %g4
371a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_CTX_OFFSET], %g5
372a88b5ba8SSam Ravnborg	sllx	%g3, 16, %g3
373a88b5ba8SSam Ravnborg	or	%g5, %g3, %g5
374a88b5ba8SSam Ravnborg	ba,pt	%xcc, etrap
375a88b5ba8SSam Ravnborg	 rd	%pc, %g7
376a88b5ba8SSam Ravnborg	mov	%l4, %o1
377a88b5ba8SSam Ravnborg	mov	%l5, %o2
378a88b5ba8SSam Ravnborg	call	handle_lddfmna
379a88b5ba8SSam Ravnborg	 add	%sp, PTREGS_OFF, %o0
380a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, rtrap
381a88b5ba8SSam Ravnborg
382a88b5ba8SSam Ravnborg	/* Unaligned std float, tl0. */
383a88b5ba8SSam Ravnborgsun4v_stdfmna:
384a88b5ba8SSam Ravnborg	ldxa	[%g0] ASI_SCRATCHPAD, %g2
385a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_TYPE_OFFSET], %g3
386a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_ADDR_OFFSET], %g4
387a88b5ba8SSam Ravnborg	ldx	[%g2 + HV_FAULT_D_CTX_OFFSET], %g5
388a88b5ba8SSam Ravnborg	sllx	%g3, 16, %g3
389a88b5ba8SSam Ravnborg	or	%g5, %g3, %g5
390a88b5ba8SSam Ravnborg	ba,pt	%xcc, etrap
391a88b5ba8SSam Ravnborg	 rd	%pc, %g7
392a88b5ba8SSam Ravnborg	mov	%l4, %o1
393a88b5ba8SSam Ravnborg	mov	%l5, %o2
394a88b5ba8SSam Ravnborg	call	handle_stdfmna
395a88b5ba8SSam Ravnborg	 add	%sp, PTREGS_OFF, %o0
396a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, rtrap
397a88b5ba8SSam Ravnborg
398a88b5ba8SSam Ravnborg#define BRANCH_ALWAYS	0x10680000
399a88b5ba8SSam Ravnborg#define NOP		0x01000000
400a88b5ba8SSam Ravnborg#define SUN4V_DO_PATCH(OLD, NEW)	\
401a88b5ba8SSam Ravnborg	sethi	%hi(NEW), %g1; \
402a88b5ba8SSam Ravnborg	or	%g1, %lo(NEW), %g1; \
403a88b5ba8SSam Ravnborg	sethi	%hi(OLD), %g2; \
404a88b5ba8SSam Ravnborg	or	%g2, %lo(OLD), %g2; \
405a88b5ba8SSam Ravnborg	sub	%g1, %g2, %g1; \
406a88b5ba8SSam Ravnborg	sethi	%hi(BRANCH_ALWAYS), %g3; \
407a88b5ba8SSam Ravnborg	sll	%g1, 11, %g1; \
408a88b5ba8SSam Ravnborg	srl	%g1, 11 + 2, %g1; \
409a88b5ba8SSam Ravnborg	or	%g3, %lo(BRANCH_ALWAYS), %g3; \
410a88b5ba8SSam Ravnborg	or	%g3, %g1, %g3; \
411a88b5ba8SSam Ravnborg	stw	%g3, [%g2]; \
412a88b5ba8SSam Ravnborg	sethi	%hi(NOP), %g3; \
413a88b5ba8SSam Ravnborg	or	%g3, %lo(NOP), %g3; \
414a88b5ba8SSam Ravnborg	stw	%g3, [%g2 + 0x4]; \
415a88b5ba8SSam Ravnborg	flush	%g2;
416a88b5ba8SSam Ravnborg
417a88b5ba8SSam Ravnborg	.globl	sun4v_patch_tlb_handlers
418a88b5ba8SSam Ravnborg	.type	sun4v_patch_tlb_handlers,#function
419a88b5ba8SSam Ravnborgsun4v_patch_tlb_handlers:
420a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl0_iamiss, sun4v_itlb_miss)
421a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl1_iamiss, sun4v_itlb_miss)
422a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl0_damiss, sun4v_dtlb_miss)
423a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl1_damiss, sun4v_dtlb_miss)
424a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl0_daprot, sun4v_dtlb_prot)
425a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl1_daprot, sun4v_dtlb_prot)
426a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl0_iax, sun4v_iacc)
427a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl1_iax, sun4v_iacc_tl1)
428a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl0_dax, sun4v_dacc)
429a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl1_dax, sun4v_dacc_tl1)
430a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl0_mna, sun4v_mna)
431a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl1_mna, sun4v_mna)
432a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl0_lddfmna, sun4v_lddfmna)
433a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl0_stdfmna, sun4v_stdfmna)
434a88b5ba8SSam Ravnborg	SUN4V_DO_PATCH(tl0_privact, sun4v_privact)
435a88b5ba8SSam Ravnborg	retl
436a88b5ba8SSam Ravnborg	 nop
437a88b5ba8SSam Ravnborg	.size	sun4v_patch_tlb_handlers,.-sun4v_patch_tlb_handlers
438