xref: /linux/arch/powerpc/kernel/exceptions-64s.S (revision 371fefd6f2dc46668e00871930dde613b88d4bde)
10ebc4cdaSBenjamin Herrenschmidt/*
20ebc4cdaSBenjamin Herrenschmidt * This file contains the 64-bit "server" PowerPC variant
30ebc4cdaSBenjamin Herrenschmidt * of the low level exception handling including exception
40ebc4cdaSBenjamin Herrenschmidt * vectors, exception return, part of the slb and stab
50ebc4cdaSBenjamin Herrenschmidt * handling and other fixed offset specific things.
60ebc4cdaSBenjamin Herrenschmidt *
70ebc4cdaSBenjamin Herrenschmidt * This file is meant to be #included from head_64.S due to
825985edcSLucas De Marchi * position dependent assembly.
90ebc4cdaSBenjamin Herrenschmidt *
100ebc4cdaSBenjamin Herrenschmidt * Most of this originates from head_64.S and thus has the same
110ebc4cdaSBenjamin Herrenschmidt * copyright history.
120ebc4cdaSBenjamin Herrenschmidt *
130ebc4cdaSBenjamin Herrenschmidt */
140ebc4cdaSBenjamin Herrenschmidt
158aa34ab8SBenjamin Herrenschmidt#include <asm/exception-64s.h>
1646f52210SStephen Rothwell#include <asm/ptrace.h>
178aa34ab8SBenjamin Herrenschmidt
180ebc4cdaSBenjamin Herrenschmidt/*
190ebc4cdaSBenjamin Herrenschmidt * We layout physical memory as follows:
200ebc4cdaSBenjamin Herrenschmidt * 0x0000 - 0x00ff : Secondary processor spin code
210ebc4cdaSBenjamin Herrenschmidt * 0x0100 - 0x2fff : pSeries Interrupt prologs
220ebc4cdaSBenjamin Herrenschmidt * 0x3000 - 0x5fff : interrupt support, iSeries and common interrupt prologs
230ebc4cdaSBenjamin Herrenschmidt * 0x6000 - 0x6fff : Initial (CPU0) segment table
240ebc4cdaSBenjamin Herrenschmidt * 0x7000 - 0x7fff : FWNMI data area
250ebc4cdaSBenjamin Herrenschmidt * 0x8000 -        : Early init and support code
260ebc4cdaSBenjamin Herrenschmidt */
270ebc4cdaSBenjamin Herrenschmidt
280ebc4cdaSBenjamin Herrenschmidt/*
290ebc4cdaSBenjamin Herrenschmidt * This is the start of the interrupt handlers for pSeries
300ebc4cdaSBenjamin Herrenschmidt * This code runs with relocation off.
310ebc4cdaSBenjamin Herrenschmidt * Code from here to __end_interrupts gets copied down to real
320ebc4cdaSBenjamin Herrenschmidt * address 0x100 when we are running a relocatable kernel.
330ebc4cdaSBenjamin Herrenschmidt * Therefore any relative branches in this section must only
340ebc4cdaSBenjamin Herrenschmidt * branch to labels in this section.
350ebc4cdaSBenjamin Herrenschmidt */
360ebc4cdaSBenjamin Herrenschmidt	. = 0x100
370ebc4cdaSBenjamin Herrenschmidt	.globl __start_interrupts
380ebc4cdaSBenjamin Herrenschmidt__start_interrupts:
390ebc4cdaSBenjamin Herrenschmidt
40948cf67cSBenjamin Herrenschmidt	.globl system_reset_pSeries;
41948cf67cSBenjamin Herrenschmidtsystem_reset_pSeries:
42948cf67cSBenjamin Herrenschmidt	HMT_MEDIUM;
43948cf67cSBenjamin Herrenschmidt	SET_SCRATCH0(r13)
44948cf67cSBenjamin Herrenschmidt#ifdef CONFIG_PPC_P7_NAP
45948cf67cSBenjamin HerrenschmidtBEGIN_FTR_SECTION
46948cf67cSBenjamin Herrenschmidt	/* Running native on arch 2.06 or later, check if we are
47948cf67cSBenjamin Herrenschmidt	 * waking up from nap. We only handle no state loss and
48948cf67cSBenjamin Herrenschmidt	 * supervisor state loss. We do -not- handle hypervisor
49948cf67cSBenjamin Herrenschmidt	 * state loss at this time.
50948cf67cSBenjamin Herrenschmidt	 */
51948cf67cSBenjamin Herrenschmidt	mfspr	r13,SPRN_SRR1
52*371fefd6SPaul Mackerras	rlwinm.	r13,r13,47-31,30,31
53*371fefd6SPaul Mackerras	beq	9f
54*371fefd6SPaul Mackerras
55*371fefd6SPaul Mackerras	/* waking up from powersave (nap) state */
56*371fefd6SPaul Mackerras	cmpwi	cr1,r13,2
57948cf67cSBenjamin Herrenschmidt	/* Total loss of HV state is fatal, we could try to use the
58948cf67cSBenjamin Herrenschmidt	 * PIR to locate a PACA, then use an emergency stack etc...
59948cf67cSBenjamin Herrenschmidt	 * but for now, let's just stay stuck here
60948cf67cSBenjamin Herrenschmidt	 */
61*371fefd6SPaul Mackerras	bgt	cr1,.
62*371fefd6SPaul Mackerras	GET_PACA(r13)
63*371fefd6SPaul Mackerras
64*371fefd6SPaul Mackerras#ifdef CONFIG_KVM_BOOK3S_64_HV
65*371fefd6SPaul Mackerras	lbz	r0,PACAPROCSTART(r13)
66*371fefd6SPaul Mackerras	cmpwi	r0,0x80
67*371fefd6SPaul Mackerras	bne	1f
68*371fefd6SPaul Mackerras	li	r0,0
69*371fefd6SPaul Mackerras	stb	r0,PACAPROCSTART(r13)
70*371fefd6SPaul Mackerras	b	kvm_start_guest
71*371fefd6SPaul Mackerras1:
72*371fefd6SPaul Mackerras#endif
73*371fefd6SPaul Mackerras
74*371fefd6SPaul Mackerras	beq	cr1,2f
75*371fefd6SPaul Mackerras	b	.power7_wakeup_noloss
76*371fefd6SPaul Mackerras2:	b	.power7_wakeup_loss
77*371fefd6SPaul Mackerras9:
78948cf67cSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_HVMODE_206)
79948cf67cSBenjamin Herrenschmidt#endif /* CONFIG_PPC_P7_NAP */
80b01c8b54SPaul Mackerras	EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD,
81b01c8b54SPaul Mackerras				 NOTEST, 0x100)
820ebc4cdaSBenjamin Herrenschmidt
830ebc4cdaSBenjamin Herrenschmidt	. = 0x200
84b01c8b54SPaul Mackerrasmachine_check_pSeries_1:
85b01c8b54SPaul Mackerras	/* This is moved out of line as it can be patched by FW, but
86b01c8b54SPaul Mackerras	 * some code path might still want to branch into the original
87b01c8b54SPaul Mackerras	 * vector
88b01c8b54SPaul Mackerras	 */
89b01c8b54SPaul Mackerras	b	machine_check_pSeries
900ebc4cdaSBenjamin Herrenschmidt
910ebc4cdaSBenjamin Herrenschmidt	. = 0x300
920ebc4cdaSBenjamin Herrenschmidt	.globl data_access_pSeries
930ebc4cdaSBenjamin Herrenschmidtdata_access_pSeries:
940ebc4cdaSBenjamin Herrenschmidt	HMT_MEDIUM
95673b189aSPaul Mackerras	SET_SCRATCH0(r13)
96b01c8b54SPaul Mackerras#ifndef CONFIG_POWER4_ONLY
970ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION
98b01c8b54SPaul Mackerras	b	data_access_check_stab
99b01c8b54SPaul Mackerrasdata_access_not_stab:
100b01c8b54SPaul MackerrasEND_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB)
101b01c8b54SPaul Mackerras#endif
102b01c8b54SPaul Mackerras	EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common, EXC_STD,
103de56a948SPaul Mackerras				 KVMTEST_PR, 0x300)
1040ebc4cdaSBenjamin Herrenschmidt
1050ebc4cdaSBenjamin Herrenschmidt	. = 0x380
1060ebc4cdaSBenjamin Herrenschmidt	.globl data_access_slb_pSeries
1070ebc4cdaSBenjamin Herrenschmidtdata_access_slb_pSeries:
1080ebc4cdaSBenjamin Herrenschmidt	HMT_MEDIUM
109673b189aSPaul Mackerras	SET_SCRATCH0(r13)
110de56a948SPaul Mackerras	EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x380)
1110ebc4cdaSBenjamin Herrenschmidt	std	r3,PACA_EXSLB+EX_R3(r13)
1120ebc4cdaSBenjamin Herrenschmidt	mfspr	r3,SPRN_DAR
1130ebc4cdaSBenjamin Herrenschmidt#ifdef __DISABLED__
1140ebc4cdaSBenjamin Herrenschmidt	/* Keep that around for when we re-implement dynamic VSIDs */
1150ebc4cdaSBenjamin Herrenschmidt	cmpdi	r3,0
1160ebc4cdaSBenjamin Herrenschmidt	bge	slb_miss_user_pseries
1170ebc4cdaSBenjamin Herrenschmidt#endif /* __DISABLED__ */
118b01c8b54SPaul Mackerras	mfspr	r12,SPRN_SRR1
1190ebc4cdaSBenjamin Herrenschmidt#ifndef CONFIG_RELOCATABLE
1200ebc4cdaSBenjamin Herrenschmidt	b	.slb_miss_realmode
1210ebc4cdaSBenjamin Herrenschmidt#else
1220ebc4cdaSBenjamin Herrenschmidt	/*
1230ebc4cdaSBenjamin Herrenschmidt	 * We can't just use a direct branch to .slb_miss_realmode
1240ebc4cdaSBenjamin Herrenschmidt	 * because the distance from here to there depends on where
1250ebc4cdaSBenjamin Herrenschmidt	 * the kernel ends up being put.
1260ebc4cdaSBenjamin Herrenschmidt	 */
1270ebc4cdaSBenjamin Herrenschmidt	mfctr	r11
1280ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACAKBASE(r13)
1290ebc4cdaSBenjamin Herrenschmidt	LOAD_HANDLER(r10, .slb_miss_realmode)
1300ebc4cdaSBenjamin Herrenschmidt	mtctr	r10
1310ebc4cdaSBenjamin Herrenschmidt	bctr
1320ebc4cdaSBenjamin Herrenschmidt#endif
1330ebc4cdaSBenjamin Herrenschmidt
134b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0x400, 0x400, instruction_access)
1350ebc4cdaSBenjamin Herrenschmidt
1360ebc4cdaSBenjamin Herrenschmidt	. = 0x480
1370ebc4cdaSBenjamin Herrenschmidt	.globl instruction_access_slb_pSeries
1380ebc4cdaSBenjamin Herrenschmidtinstruction_access_slb_pSeries:
1390ebc4cdaSBenjamin Herrenschmidt	HMT_MEDIUM
140673b189aSPaul Mackerras	SET_SCRATCH0(r13)
141de56a948SPaul Mackerras	EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x480)
1420ebc4cdaSBenjamin Herrenschmidt	std	r3,PACA_EXSLB+EX_R3(r13)
1430ebc4cdaSBenjamin Herrenschmidt	mfspr	r3,SPRN_SRR0		/* SRR0 is faulting address */
1440ebc4cdaSBenjamin Herrenschmidt#ifdef __DISABLED__
1450ebc4cdaSBenjamin Herrenschmidt	/* Keep that around for when we re-implement dynamic VSIDs */
1460ebc4cdaSBenjamin Herrenschmidt	cmpdi	r3,0
1470ebc4cdaSBenjamin Herrenschmidt	bge	slb_miss_user_pseries
1480ebc4cdaSBenjamin Herrenschmidt#endif /* __DISABLED__ */
149b01c8b54SPaul Mackerras	mfspr	r12,SPRN_SRR1
1500ebc4cdaSBenjamin Herrenschmidt#ifndef CONFIG_RELOCATABLE
1510ebc4cdaSBenjamin Herrenschmidt	b	.slb_miss_realmode
1520ebc4cdaSBenjamin Herrenschmidt#else
1530ebc4cdaSBenjamin Herrenschmidt	mfctr	r11
1540ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACAKBASE(r13)
1550ebc4cdaSBenjamin Herrenschmidt	LOAD_HANDLER(r10, .slb_miss_realmode)
1560ebc4cdaSBenjamin Herrenschmidt	mtctr	r10
1570ebc4cdaSBenjamin Herrenschmidt	bctr
1580ebc4cdaSBenjamin Herrenschmidt#endif
1590ebc4cdaSBenjamin Herrenschmidt
160b3e6b5dfSBenjamin Herrenschmidt	/* We open code these as we can't have a ". = x" (even with
161b3e6b5dfSBenjamin Herrenschmidt	 * x = "." within a feature section
162b3e6b5dfSBenjamin Herrenschmidt	 */
163a5d4f3adSBenjamin Herrenschmidt	. = 0x500;
164b3e6b5dfSBenjamin Herrenschmidt	.globl hardware_interrupt_pSeries;
165b3e6b5dfSBenjamin Herrenschmidt	.globl hardware_interrupt_hv;
166a5d4f3adSBenjamin Herrenschmidthardware_interrupt_pSeries:
167b3e6b5dfSBenjamin Herrenschmidthardware_interrupt_hv:
168a5d4f3adSBenjamin Herrenschmidt	BEGIN_FTR_SECTION
169b01c8b54SPaul Mackerras		_MASKABLE_EXCEPTION_PSERIES(0x502, hardware_interrupt,
170b01c8b54SPaul Mackerras					    EXC_HV, SOFTEN_TEST_HV)
171b01c8b54SPaul Mackerras		KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x502)
172de56a948SPaul Mackerras	FTR_SECTION_ELSE
173de56a948SPaul Mackerras		_MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt,
174de56a948SPaul Mackerras					    EXC_STD, SOFTEN_TEST_PR)
175de56a948SPaul Mackerras		KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x500)
176de56a948SPaul Mackerras	ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE_206)
177a5d4f3adSBenjamin Herrenschmidt
178b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0x600, 0x600, alignment)
179de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x600)
180b01c8b54SPaul Mackerras
181b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0x700, 0x700, program_check)
182de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x700)
183b01c8b54SPaul Mackerras
184b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0x800, 0x800, fp_unavailable)
185de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x800)
186a5d4f3adSBenjamin Herrenschmidt
187b3e6b5dfSBenjamin Herrenschmidt	MASKABLE_EXCEPTION_PSERIES(0x900, 0x900, decrementer)
188b01c8b54SPaul Mackerras	MASKABLE_EXCEPTION_HV(0x980, 0x982, decrementer)
189a5d4f3adSBenjamin Herrenschmidt
190b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0xa00, 0xa00, trap_0a)
191de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xa00)
192b01c8b54SPaul Mackerras
193b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0xb00, 0xb00, trap_0b)
194de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xb00)
1950ebc4cdaSBenjamin Herrenschmidt
1960ebc4cdaSBenjamin Herrenschmidt	. = 0xc00
1970ebc4cdaSBenjamin Herrenschmidt	.globl	system_call_pSeries
1980ebc4cdaSBenjamin Herrenschmidtsystem_call_pSeries:
1990ebc4cdaSBenjamin Herrenschmidt	HMT_MEDIUM
200b01c8b54SPaul Mackerras#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
201b01c8b54SPaul Mackerras	SET_SCRATCH0(r13)
202b01c8b54SPaul Mackerras	GET_PACA(r13)
203b01c8b54SPaul Mackerras	std	r9,PACA_EXGEN+EX_R9(r13)
204b01c8b54SPaul Mackerras	std	r10,PACA_EXGEN+EX_R10(r13)
205b01c8b54SPaul Mackerras	mfcr	r9
206b01c8b54SPaul Mackerras	KVMTEST(0xc00)
207b01c8b54SPaul Mackerras	GET_SCRATCH0(r13)
208b01c8b54SPaul Mackerras#endif
2090ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION
2100ebc4cdaSBenjamin Herrenschmidt	cmpdi	r0,0x1ebe
2110ebc4cdaSBenjamin Herrenschmidt	beq-	1f
2120ebc4cdaSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_REAL_LE)
2130ebc4cdaSBenjamin Herrenschmidt	mr	r9,r13
2142dd60d79SBenjamin Herrenschmidt	GET_PACA(r13)
2150ebc4cdaSBenjamin Herrenschmidt	mfspr	r11,SPRN_SRR0
2160ebc4cdaSBenjamin Herrenschmidt	mfspr	r12,SPRN_SRR1
217f5f0307fSAnton Blanchard	ld	r10,PACAKBASE(r13)
218f5f0307fSAnton Blanchard	LOAD_HANDLER(r10, system_call_entry)
219f5f0307fSAnton Blanchard	mtspr	SPRN_SRR0,r10
220f5f0307fSAnton Blanchard	ld	r10,PACAKMSR(r13)
2210ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r10
2220ebc4cdaSBenjamin Herrenschmidt	rfid
2230ebc4cdaSBenjamin Herrenschmidt	b	.	/* prevent speculative execution */
2240ebc4cdaSBenjamin Herrenschmidt
225b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xc00)
226b01c8b54SPaul Mackerras
2270ebc4cdaSBenjamin Herrenschmidt/* Fast LE/BE switch system call */
2280ebc4cdaSBenjamin Herrenschmidt1:	mfspr	r12,SPRN_SRR1
2290ebc4cdaSBenjamin Herrenschmidt	xori	r12,r12,MSR_LE
2300ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r12
2310ebc4cdaSBenjamin Herrenschmidt	rfid		/* return to userspace */
2320ebc4cdaSBenjamin Herrenschmidt	b	.
2330ebc4cdaSBenjamin Herrenschmidt
234b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0xd00, 0xd00, single_step)
235de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xd00)
236b3e6b5dfSBenjamin Herrenschmidt
237b3e6b5dfSBenjamin Herrenschmidt	/* At 0xe??? we have a bunch of hypervisor exceptions, we branch
238b3e6b5dfSBenjamin Herrenschmidt	 * out of line to handle them
239b3e6b5dfSBenjamin Herrenschmidt	 */
240b3e6b5dfSBenjamin Herrenschmidt	. = 0xe00
241b3e6b5dfSBenjamin Herrenschmidt	b	h_data_storage_hv
242b3e6b5dfSBenjamin Herrenschmidt	. = 0xe20
243b3e6b5dfSBenjamin Herrenschmidt	b	h_instr_storage_hv
244b3e6b5dfSBenjamin Herrenschmidt	. = 0xe40
245b3e6b5dfSBenjamin Herrenschmidt	b	emulation_assist_hv
246b3e6b5dfSBenjamin Herrenschmidt	. = 0xe50
247b3e6b5dfSBenjamin Herrenschmidt	b	hmi_exception_hv
248b3e6b5dfSBenjamin Herrenschmidt	. = 0xe60
249b3e6b5dfSBenjamin Herrenschmidt	b	hmi_exception_hv
2500ebc4cdaSBenjamin Herrenschmidt
2510ebc4cdaSBenjamin Herrenschmidt	/* We need to deal with the Altivec unavailable exception
2520ebc4cdaSBenjamin Herrenschmidt	 * here which is at 0xf20, thus in the middle of the
2530ebc4cdaSBenjamin Herrenschmidt	 * prolog code of the PerformanceMonitor one. A little
2540ebc4cdaSBenjamin Herrenschmidt	 * trickery is thus necessary
2550ebc4cdaSBenjamin Herrenschmidt	 */
256c86e2eadSAnton Blanchardperformance_monitor_pSeries_1:
2570ebc4cdaSBenjamin Herrenschmidt	. = 0xf00
2580ebc4cdaSBenjamin Herrenschmidt	b	performance_monitor_pSeries
2590ebc4cdaSBenjamin Herrenschmidt
260c86e2eadSAnton Blanchardaltivec_unavailable_pSeries_1:
2610ebc4cdaSBenjamin Herrenschmidt	. = 0xf20
2620ebc4cdaSBenjamin Herrenschmidt	b	altivec_unavailable_pSeries
2630ebc4cdaSBenjamin Herrenschmidt
264c86e2eadSAnton Blanchardvsx_unavailable_pSeries_1:
2650ebc4cdaSBenjamin Herrenschmidt	. = 0xf40
2660ebc4cdaSBenjamin Herrenschmidt	b	vsx_unavailable_pSeries
2670ebc4cdaSBenjamin Herrenschmidt
2680ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_CBE_RAS
269b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error)
270de56a948SPaul Mackerras	KVM_HANDLER_PR_SKIP(PACA_EXGEN, EXC_HV, 0x1202)
2710ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_CBE_RAS */
272b01c8b54SPaul Mackerras
273b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0x1300, 0x1300, instruction_breakpoint)
274de56a948SPaul Mackerras	KVM_HANDLER_PR_SKIP(PACA_EXGEN, EXC_STD, 0x1300)
275b01c8b54SPaul Mackerras
2760ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_CBE_RAS
277b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_HV(0x1600, 0x1602, cbe_maintenance)
278de56a948SPaul Mackerras	KVM_HANDLER_PR_SKIP(PACA_EXGEN, EXC_HV, 0x1602)
2790ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_CBE_RAS */
280b01c8b54SPaul Mackerras
281b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0x1700, 0x1700, altivec_assist)
282de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x1700)
283b01c8b54SPaul Mackerras
2840ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_CBE_RAS
285b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_HV(0x1800, 0x1802, cbe_thermal)
286de56a948SPaul Mackerras	KVM_HANDLER_PR_SKIP(PACA_EXGEN, EXC_HV, 0x1802)
2870ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_CBE_RAS */
2880ebc4cdaSBenjamin Herrenschmidt
2890ebc4cdaSBenjamin Herrenschmidt	. = 0x3000
2900ebc4cdaSBenjamin Herrenschmidt
291b3e6b5dfSBenjamin Herrenschmidt/*** Out of line interrupts support ***/
292b3e6b5dfSBenjamin Herrenschmidt
293b01c8b54SPaul Mackerras	/* moved from 0x200 */
294b01c8b54SPaul Mackerrasmachine_check_pSeries:
295b01c8b54SPaul Mackerras	.globl machine_check_fwnmi
296b01c8b54SPaul Mackerrasmachine_check_fwnmi:
297b01c8b54SPaul Mackerras	HMT_MEDIUM
298b01c8b54SPaul Mackerras	SET_SCRATCH0(r13)		/* save r13 */
299b01c8b54SPaul Mackerras	EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common,
300b01c8b54SPaul Mackerras				 EXC_STD, KVMTEST, 0x200)
301b01c8b54SPaul Mackerras	KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200)
302b01c8b54SPaul Mackerras
303b01c8b54SPaul Mackerras#ifndef CONFIG_POWER4_ONLY
304b01c8b54SPaul Mackerras	/* moved from 0x300 */
305b01c8b54SPaul Mackerrasdata_access_check_stab:
306b01c8b54SPaul Mackerras	GET_PACA(r13)
307b01c8b54SPaul Mackerras	std	r9,PACA_EXSLB+EX_R9(r13)
308b01c8b54SPaul Mackerras	std	r10,PACA_EXSLB+EX_R10(r13)
309b01c8b54SPaul Mackerras	mfspr	r10,SPRN_DAR
310b01c8b54SPaul Mackerras	mfspr	r9,SPRN_DSISR
311b01c8b54SPaul Mackerras	srdi	r10,r10,60
312b01c8b54SPaul Mackerras	rlwimi	r10,r9,16,0x20
313de56a948SPaul Mackerras#ifdef CONFIG_KVM_BOOK3S_PR
3143c42bf8aSPaul Mackerras	lbz	r9,HSTATE_IN_GUEST(r13)
315b01c8b54SPaul Mackerras	rlwimi	r10,r9,8,0x300
316b01c8b54SPaul Mackerras#endif
317b01c8b54SPaul Mackerras	mfcr	r9
318b01c8b54SPaul Mackerras	cmpwi	r10,0x2c
319b01c8b54SPaul Mackerras	beq	do_stab_bolted_pSeries
320b01c8b54SPaul Mackerras	mtcrf	0x80,r9
321b01c8b54SPaul Mackerras	ld	r9,PACA_EXSLB+EX_R9(r13)
322b01c8b54SPaul Mackerras	ld	r10,PACA_EXSLB+EX_R10(r13)
323b01c8b54SPaul Mackerras	b	data_access_not_stab
324b01c8b54SPaul Mackerrasdo_stab_bolted_pSeries:
325b01c8b54SPaul Mackerras	std	r11,PACA_EXSLB+EX_R11(r13)
326b01c8b54SPaul Mackerras	std	r12,PACA_EXSLB+EX_R12(r13)
327b01c8b54SPaul Mackerras	GET_SCRATCH0(r10)
328b01c8b54SPaul Mackerras	std	r10,PACA_EXSLB+EX_R13(r13)
329b01c8b54SPaul Mackerras	EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted, EXC_STD)
330b01c8b54SPaul Mackerras#endif /* CONFIG_POWER4_ONLY */
331b01c8b54SPaul Mackerras
332de56a948SPaul Mackerras	KVM_HANDLER_PR_SKIP(PACA_EXGEN, EXC_STD, 0x300)
333de56a948SPaul Mackerras	KVM_HANDLER_PR_SKIP(PACA_EXSLB, EXC_STD, 0x380)
334de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x400)
335de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXSLB, EXC_STD, 0x480)
336de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x900)
337b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x982)
338b01c8b54SPaul Mackerras
339b01c8b54SPaul Mackerras	.align	7
340b3e6b5dfSBenjamin Herrenschmidt	/* moved from 0xe00 */
341b01c8b54SPaul Mackerras	STD_EXCEPTION_HV(., 0xe02, h_data_storage)
342b01c8b54SPaul Mackerras	KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0xe02)
343b01c8b54SPaul Mackerras	STD_EXCEPTION_HV(., 0xe22, h_instr_storage)
344b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe22)
345b01c8b54SPaul Mackerras	STD_EXCEPTION_HV(., 0xe42, emulation_assist)
346b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe42)
347b01c8b54SPaul Mackerras	STD_EXCEPTION_HV(., 0xe62, hmi_exception) /* need to flush cache ? */
348b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe62)
3490ebc4cdaSBenjamin Herrenschmidt
3500ebc4cdaSBenjamin Herrenschmidt	/* moved from 0xf00 */
351b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(., 0xf00, performance_monitor)
352de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf00)
353b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(., 0xf20, altivec_unavailable)
354de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20)
355b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(., 0xf40, vsx_unavailable)
356de56a948SPaul Mackerras	KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40)
3570ebc4cdaSBenjamin Herrenschmidt
3580ebc4cdaSBenjamin Herrenschmidt/*
3590ebc4cdaSBenjamin Herrenschmidt * An interrupt came in while soft-disabled; clear EE in SRR1,
3600ebc4cdaSBenjamin Herrenschmidt * clear paca->hard_enabled and return.
3610ebc4cdaSBenjamin Herrenschmidt */
3620ebc4cdaSBenjamin Herrenschmidtmasked_interrupt:
3630ebc4cdaSBenjamin Herrenschmidt	stb	r10,PACAHARDIRQEN(r13)
3640ebc4cdaSBenjamin Herrenschmidt	mtcrf	0x80,r9
3650ebc4cdaSBenjamin Herrenschmidt	ld	r9,PACA_EXGEN+EX_R9(r13)
3660ebc4cdaSBenjamin Herrenschmidt	mfspr	r10,SPRN_SRR1
3670ebc4cdaSBenjamin Herrenschmidt	rldicl	r10,r10,48,1		/* clear MSR_EE */
3680ebc4cdaSBenjamin Herrenschmidt	rotldi	r10,r10,16
3690ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r10
3700ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACA_EXGEN+EX_R10(r13)
371673b189aSPaul Mackerras	GET_SCRATCH0(r13)
3720ebc4cdaSBenjamin Herrenschmidt	rfid
3730ebc4cdaSBenjamin Herrenschmidt	b	.
3740ebc4cdaSBenjamin Herrenschmidt
375a5d4f3adSBenjamin Herrenschmidtmasked_Hinterrupt:
376a5d4f3adSBenjamin Herrenschmidt	stb	r10,PACAHARDIRQEN(r13)
377a5d4f3adSBenjamin Herrenschmidt	mtcrf	0x80,r9
378a5d4f3adSBenjamin Herrenschmidt	ld	r9,PACA_EXGEN+EX_R9(r13)
379a5d4f3adSBenjamin Herrenschmidt	mfspr	r10,SPRN_HSRR1
380a5d4f3adSBenjamin Herrenschmidt	rldicl	r10,r10,48,1		/* clear MSR_EE */
381a5d4f3adSBenjamin Herrenschmidt	rotldi	r10,r10,16
382a5d4f3adSBenjamin Herrenschmidt	mtspr	SPRN_HSRR1,r10
383a5d4f3adSBenjamin Herrenschmidt	ld	r10,PACA_EXGEN+EX_R10(r13)
384673b189aSPaul Mackerras	GET_SCRATCH0(r13)
385a5d4f3adSBenjamin Herrenschmidt	hrfid
386a5d4f3adSBenjamin Herrenschmidt	b	.
387a5d4f3adSBenjamin Herrenschmidt
3880ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_PSERIES
3890ebc4cdaSBenjamin Herrenschmidt/*
3900ebc4cdaSBenjamin Herrenschmidt * Vectors for the FWNMI option.  Share common code.
3910ebc4cdaSBenjamin Herrenschmidt */
3920ebc4cdaSBenjamin Herrenschmidt	.globl system_reset_fwnmi
3930ebc4cdaSBenjamin Herrenschmidt      .align 7
3940ebc4cdaSBenjamin Herrenschmidtsystem_reset_fwnmi:
3950ebc4cdaSBenjamin Herrenschmidt	HMT_MEDIUM
396673b189aSPaul Mackerras	SET_SCRATCH0(r13)		/* save r13 */
397b01c8b54SPaul Mackerras	EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD,
398b01c8b54SPaul Mackerras				 NOTEST, 0x100)
3990ebc4cdaSBenjamin Herrenschmidt
4000ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_PSERIES */
4010ebc4cdaSBenjamin Herrenschmidt
4020ebc4cdaSBenjamin Herrenschmidt#ifdef __DISABLED__
4030ebc4cdaSBenjamin Herrenschmidt/*
4040ebc4cdaSBenjamin Herrenschmidt * This is used for when the SLB miss handler has to go virtual,
4050ebc4cdaSBenjamin Herrenschmidt * which doesn't happen for now anymore but will once we re-implement
4060ebc4cdaSBenjamin Herrenschmidt * dynamic VSIDs for shared page tables
4070ebc4cdaSBenjamin Herrenschmidt */
4080ebc4cdaSBenjamin Herrenschmidtslb_miss_user_pseries:
4090ebc4cdaSBenjamin Herrenschmidt	std	r10,PACA_EXGEN+EX_R10(r13)
4100ebc4cdaSBenjamin Herrenschmidt	std	r11,PACA_EXGEN+EX_R11(r13)
4110ebc4cdaSBenjamin Herrenschmidt	std	r12,PACA_EXGEN+EX_R12(r13)
412673b189aSPaul Mackerras	GET_SCRATCH0(r10)
4130ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACA_EXSLB+EX_R9(r13)
4140ebc4cdaSBenjamin Herrenschmidt	ld	r12,PACA_EXSLB+EX_R3(r13)
4150ebc4cdaSBenjamin Herrenschmidt	std	r10,PACA_EXGEN+EX_R13(r13)
4160ebc4cdaSBenjamin Herrenschmidt	std	r11,PACA_EXGEN+EX_R9(r13)
4170ebc4cdaSBenjamin Herrenschmidt	std	r12,PACA_EXGEN+EX_R3(r13)
4180ebc4cdaSBenjamin Herrenschmidt	clrrdi	r12,r13,32
4190ebc4cdaSBenjamin Herrenschmidt	mfmsr	r10
4200ebc4cdaSBenjamin Herrenschmidt	mfspr	r11,SRR0			/* save SRR0 */
4210ebc4cdaSBenjamin Herrenschmidt	ori	r12,r12,slb_miss_user_common@l	/* virt addr of handler */
4220ebc4cdaSBenjamin Herrenschmidt	ori	r10,r10,MSR_IR|MSR_DR|MSR_RI
4230ebc4cdaSBenjamin Herrenschmidt	mtspr	SRR0,r12
4240ebc4cdaSBenjamin Herrenschmidt	mfspr	r12,SRR1			/* and SRR1 */
4250ebc4cdaSBenjamin Herrenschmidt	mtspr	SRR1,r10
4260ebc4cdaSBenjamin Herrenschmidt	rfid
4270ebc4cdaSBenjamin Herrenschmidt	b	.				/* prevent spec. execution */
4280ebc4cdaSBenjamin Herrenschmidt#endif /* __DISABLED__ */
4290ebc4cdaSBenjamin Herrenschmidt
430a58ddea5SAlexander Graf/* KVM's trampoline code needs to be close to the interrupt handlers */
431a58ddea5SAlexander Graf
432a58ddea5SAlexander Graf#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
433de56a948SPaul Mackerras#ifdef CONFIG_KVM_BOOK3S_PR
434a58ddea5SAlexander Graf#include "../kvm/book3s_rmhandlers.S"
435de56a948SPaul Mackerras#else
436de56a948SPaul Mackerras#include "../kvm/book3s_hv_rmhandlers.S"
437de56a948SPaul Mackerras#endif
438a58ddea5SAlexander Graf#endif
439a58ddea5SAlexander Graf
4400ebc4cdaSBenjamin Herrenschmidt	.align	7
4410ebc4cdaSBenjamin Herrenschmidt	.globl	__end_interrupts
4420ebc4cdaSBenjamin Herrenschmidt__end_interrupts:
4430ebc4cdaSBenjamin Herrenschmidt
4440ebc4cdaSBenjamin Herrenschmidt/*
4450ebc4cdaSBenjamin Herrenschmidt * Code from here down to __end_handlers is invoked from the
4460ebc4cdaSBenjamin Herrenschmidt * exception prologs above.  Because the prologs assemble the
4470ebc4cdaSBenjamin Herrenschmidt * addresses of these handlers using the LOAD_HANDLER macro,
4480ebc4cdaSBenjamin Herrenschmidt * which uses an addi instruction, these handlers must be in
4490ebc4cdaSBenjamin Herrenschmidt * the first 32k of the kernel image.
4500ebc4cdaSBenjamin Herrenschmidt */
4510ebc4cdaSBenjamin Herrenschmidt
4520ebc4cdaSBenjamin Herrenschmidt/*** Common interrupt handlers ***/
4530ebc4cdaSBenjamin Herrenschmidt
4540ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x100, system_reset, .system_reset_exception)
4550ebc4cdaSBenjamin Herrenschmidt
4560ebc4cdaSBenjamin Herrenschmidt	/*
4570ebc4cdaSBenjamin Herrenschmidt	 * Machine check is different because we use a different
4580ebc4cdaSBenjamin Herrenschmidt	 * save area: PACA_EXMC instead of PACA_EXGEN.
4590ebc4cdaSBenjamin Herrenschmidt	 */
4600ebc4cdaSBenjamin Herrenschmidt	.align	7
4610ebc4cdaSBenjamin Herrenschmidt	.globl machine_check_common
4620ebc4cdaSBenjamin Herrenschmidtmachine_check_common:
4630ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC)
4640ebc4cdaSBenjamin Herrenschmidt	FINISH_NAP
4650ebc4cdaSBenjamin Herrenschmidt	DISABLE_INTS
4660ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
4670ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
4680ebc4cdaSBenjamin Herrenschmidt	bl	.machine_check_exception
4690ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
4700ebc4cdaSBenjamin Herrenschmidt
4710ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON_LITE(0x900, decrementer, .timer_interrupt)
4720ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0xa00, trap_0a, .unknown_exception)
4730ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception)
4740ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception)
4750ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception)
476b3e6b5dfSBenjamin Herrenschmidt        STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception)
477b3e6b5dfSBenjamin Herrenschmidt        STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception)
4780ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON_IDLE(0xf00, performance_monitor, .performance_monitor_exception)
4790ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception)
4800ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_ALTIVEC
4810ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x1700, altivec_assist, .altivec_assist_exception)
4820ebc4cdaSBenjamin Herrenschmidt#else
4830ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception)
4840ebc4cdaSBenjamin Herrenschmidt#endif
4850ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_CBE_RAS
4860ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x1200, cbe_system_error, .cbe_system_error_exception)
4870ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x1600, cbe_maintenance, .cbe_maintenance_exception)
4880ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x1800, cbe_thermal, .cbe_thermal_exception)
4890ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_CBE_RAS */
4900ebc4cdaSBenjamin Herrenschmidt
4910ebc4cdaSBenjamin Herrenschmidt	.align	7
4920ebc4cdaSBenjamin Herrenschmidtsystem_call_entry:
4930ebc4cdaSBenjamin Herrenschmidt	b	system_call_common
4940ebc4cdaSBenjamin Herrenschmidt
4950ebc4cdaSBenjamin Herrenschmidt/*
4960ebc4cdaSBenjamin Herrenschmidt * Here we have detected that the kernel stack pointer is bad.
4970ebc4cdaSBenjamin Herrenschmidt * R9 contains the saved CR, r13 points to the paca,
4980ebc4cdaSBenjamin Herrenschmidt * r10 contains the (bad) kernel stack pointer,
4990ebc4cdaSBenjamin Herrenschmidt * r11 and r12 contain the saved SRR0 and SRR1.
5000ebc4cdaSBenjamin Herrenschmidt * We switch to using an emergency stack, save the registers there,
5010ebc4cdaSBenjamin Herrenschmidt * and call kernel_bad_stack(), which panics.
5020ebc4cdaSBenjamin Herrenschmidt */
5030ebc4cdaSBenjamin Herrenschmidtbad_stack:
5040ebc4cdaSBenjamin Herrenschmidt	ld	r1,PACAEMERGSP(r13)
5050ebc4cdaSBenjamin Herrenschmidt	subi	r1,r1,64+INT_FRAME_SIZE
5060ebc4cdaSBenjamin Herrenschmidt	std	r9,_CCR(r1)
5070ebc4cdaSBenjamin Herrenschmidt	std	r10,GPR1(r1)
5080ebc4cdaSBenjamin Herrenschmidt	std	r11,_NIP(r1)
5090ebc4cdaSBenjamin Herrenschmidt	std	r12,_MSR(r1)
5100ebc4cdaSBenjamin Herrenschmidt	mfspr	r11,SPRN_DAR
5110ebc4cdaSBenjamin Herrenschmidt	mfspr	r12,SPRN_DSISR
5120ebc4cdaSBenjamin Herrenschmidt	std	r11,_DAR(r1)
5130ebc4cdaSBenjamin Herrenschmidt	std	r12,_DSISR(r1)
5140ebc4cdaSBenjamin Herrenschmidt	mflr	r10
5150ebc4cdaSBenjamin Herrenschmidt	mfctr	r11
5160ebc4cdaSBenjamin Herrenschmidt	mfxer	r12
5170ebc4cdaSBenjamin Herrenschmidt	std	r10,_LINK(r1)
5180ebc4cdaSBenjamin Herrenschmidt	std	r11,_CTR(r1)
5190ebc4cdaSBenjamin Herrenschmidt	std	r12,_XER(r1)
5200ebc4cdaSBenjamin Herrenschmidt	SAVE_GPR(0,r1)
5210ebc4cdaSBenjamin Herrenschmidt	SAVE_GPR(2,r1)
5221977b502SPaul Mackerras	ld	r10,EX_R3(r3)
5231977b502SPaul Mackerras	std	r10,GPR3(r1)
5241977b502SPaul Mackerras	SAVE_GPR(4,r1)
5251977b502SPaul Mackerras	SAVE_4GPRS(5,r1)
5261977b502SPaul Mackerras	ld	r9,EX_R9(r3)
5271977b502SPaul Mackerras	ld	r10,EX_R10(r3)
5281977b502SPaul Mackerras	SAVE_2GPRS(9,r1)
5291977b502SPaul Mackerras	ld	r9,EX_R11(r3)
5301977b502SPaul Mackerras	ld	r10,EX_R12(r3)
5311977b502SPaul Mackerras	ld	r11,EX_R13(r3)
5321977b502SPaul Mackerras	std	r9,GPR11(r1)
5331977b502SPaul Mackerras	std	r10,GPR12(r1)
5341977b502SPaul Mackerras	std	r11,GPR13(r1)
53548404f2eSPaul MackerrasBEGIN_FTR_SECTION
53648404f2eSPaul Mackerras	ld	r10,EX_CFAR(r3)
53748404f2eSPaul Mackerras	std	r10,ORIG_GPR3(r1)
53848404f2eSPaul MackerrasEND_FTR_SECTION_IFSET(CPU_FTR_CFAR)
5391977b502SPaul Mackerras	SAVE_8GPRS(14,r1)
5400ebc4cdaSBenjamin Herrenschmidt	SAVE_10GPRS(22,r1)
5410ebc4cdaSBenjamin Herrenschmidt	lhz	r12,PACA_TRAP_SAVE(r13)
5420ebc4cdaSBenjamin Herrenschmidt	std	r12,_TRAP(r1)
5430ebc4cdaSBenjamin Herrenschmidt	addi	r11,r1,INT_FRAME_SIZE
5440ebc4cdaSBenjamin Herrenschmidt	std	r11,0(r1)
5450ebc4cdaSBenjamin Herrenschmidt	li	r12,0
5460ebc4cdaSBenjamin Herrenschmidt	std	r12,0(r11)
5470ebc4cdaSBenjamin Herrenschmidt	ld	r2,PACATOC(r13)
5481977b502SPaul Mackerras	ld	r11,exception_marker@toc(r2)
5491977b502SPaul Mackerras	std	r12,RESULT(r1)
5501977b502SPaul Mackerras	std	r11,STACK_FRAME_OVERHEAD-16(r1)
5510ebc4cdaSBenjamin Herrenschmidt1:	addi	r3,r1,STACK_FRAME_OVERHEAD
5520ebc4cdaSBenjamin Herrenschmidt	bl	.kernel_bad_stack
5530ebc4cdaSBenjamin Herrenschmidt	b	1b
5540ebc4cdaSBenjamin Herrenschmidt
5550ebc4cdaSBenjamin Herrenschmidt/*
5560ebc4cdaSBenjamin Herrenschmidt * Here r13 points to the paca, r9 contains the saved CR,
5570ebc4cdaSBenjamin Herrenschmidt * SRR0 and SRR1 are saved in r11 and r12,
5580ebc4cdaSBenjamin Herrenschmidt * r9 - r13 are saved in paca->exgen.
5590ebc4cdaSBenjamin Herrenschmidt */
5600ebc4cdaSBenjamin Herrenschmidt	.align	7
5610ebc4cdaSBenjamin Herrenschmidt	.globl data_access_common
5620ebc4cdaSBenjamin Herrenschmidtdata_access_common:
5630ebc4cdaSBenjamin Herrenschmidt	mfspr	r10,SPRN_DAR
5640ebc4cdaSBenjamin Herrenschmidt	std	r10,PACA_EXGEN+EX_DAR(r13)
5650ebc4cdaSBenjamin Herrenschmidt	mfspr	r10,SPRN_DSISR
5660ebc4cdaSBenjamin Herrenschmidt	stw	r10,PACA_EXGEN+EX_DSISR(r13)
5670ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x300, PACA_EXGEN)
5680ebc4cdaSBenjamin Herrenschmidt	ld	r3,PACA_EXGEN+EX_DAR(r13)
5690ebc4cdaSBenjamin Herrenschmidt	lwz	r4,PACA_EXGEN+EX_DSISR(r13)
5700ebc4cdaSBenjamin Herrenschmidt	li	r5,0x300
5710ebc4cdaSBenjamin Herrenschmidt	b	.do_hash_page	 	/* Try to handle as hpte fault */
5720ebc4cdaSBenjamin Herrenschmidt
5730ebc4cdaSBenjamin Herrenschmidt	.align  7
574b3e6b5dfSBenjamin Herrenschmidt        .globl  h_data_storage_common
575b3e6b5dfSBenjamin Herrenschmidth_data_storage_common:
576b3e6b5dfSBenjamin Herrenschmidt        mfspr   r10,SPRN_HDAR
577b3e6b5dfSBenjamin Herrenschmidt        std     r10,PACA_EXGEN+EX_DAR(r13)
578b3e6b5dfSBenjamin Herrenschmidt        mfspr   r10,SPRN_HDSISR
579b3e6b5dfSBenjamin Herrenschmidt        stw     r10,PACA_EXGEN+EX_DSISR(r13)
580b3e6b5dfSBenjamin Herrenschmidt        EXCEPTION_PROLOG_COMMON(0xe00, PACA_EXGEN)
581b3e6b5dfSBenjamin Herrenschmidt        bl      .save_nvgprs
582b3e6b5dfSBenjamin Herrenschmidt        addi    r3,r1,STACK_FRAME_OVERHEAD
583b3e6b5dfSBenjamin Herrenschmidt        bl      .unknown_exception
584b3e6b5dfSBenjamin Herrenschmidt        b       .ret_from_except
585b3e6b5dfSBenjamin Herrenschmidt
586b3e6b5dfSBenjamin Herrenschmidt	.align	7
5870ebc4cdaSBenjamin Herrenschmidt	.globl instruction_access_common
5880ebc4cdaSBenjamin Herrenschmidtinstruction_access_common:
5890ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x400, PACA_EXGEN)
5900ebc4cdaSBenjamin Herrenschmidt	ld	r3,_NIP(r1)
5910ebc4cdaSBenjamin Herrenschmidt	andis.	r4,r12,0x5820
5920ebc4cdaSBenjamin Herrenschmidt	li	r5,0x400
5930ebc4cdaSBenjamin Herrenschmidt	b	.do_hash_page		/* Try to handle as hpte fault */
5940ebc4cdaSBenjamin Herrenschmidt
595b3e6b5dfSBenjamin Herrenschmidt        STD_EXCEPTION_COMMON(0xe20, h_instr_storage, .unknown_exception)
596b3e6b5dfSBenjamin Herrenschmidt
5970ebc4cdaSBenjamin Herrenschmidt/*
5980ebc4cdaSBenjamin Herrenschmidt * Here is the common SLB miss user that is used when going to virtual
5990ebc4cdaSBenjamin Herrenschmidt * mode for SLB misses, that is currently not used
6000ebc4cdaSBenjamin Herrenschmidt */
6010ebc4cdaSBenjamin Herrenschmidt#ifdef __DISABLED__
6020ebc4cdaSBenjamin Herrenschmidt	.align	7
6030ebc4cdaSBenjamin Herrenschmidt	.globl	slb_miss_user_common
6040ebc4cdaSBenjamin Herrenschmidtslb_miss_user_common:
6050ebc4cdaSBenjamin Herrenschmidt	mflr	r10
6060ebc4cdaSBenjamin Herrenschmidt	std	r3,PACA_EXGEN+EX_DAR(r13)
6070ebc4cdaSBenjamin Herrenschmidt	stw	r9,PACA_EXGEN+EX_CCR(r13)
6080ebc4cdaSBenjamin Herrenschmidt	std	r10,PACA_EXGEN+EX_LR(r13)
6090ebc4cdaSBenjamin Herrenschmidt	std	r11,PACA_EXGEN+EX_SRR0(r13)
6100ebc4cdaSBenjamin Herrenschmidt	bl	.slb_allocate_user
6110ebc4cdaSBenjamin Herrenschmidt
6120ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACA_EXGEN+EX_LR(r13)
6130ebc4cdaSBenjamin Herrenschmidt	ld	r3,PACA_EXGEN+EX_R3(r13)
6140ebc4cdaSBenjamin Herrenschmidt	lwz	r9,PACA_EXGEN+EX_CCR(r13)
6150ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACA_EXGEN+EX_SRR0(r13)
6160ebc4cdaSBenjamin Herrenschmidt	mtlr	r10
6170ebc4cdaSBenjamin Herrenschmidt	beq-	slb_miss_fault
6180ebc4cdaSBenjamin Herrenschmidt
6190ebc4cdaSBenjamin Herrenschmidt	andi.	r10,r12,MSR_RI		/* check for unrecoverable exception */
6200ebc4cdaSBenjamin Herrenschmidt	beq-	unrecov_user_slb
6210ebc4cdaSBenjamin Herrenschmidt	mfmsr	r10
6220ebc4cdaSBenjamin Herrenschmidt
6230ebc4cdaSBenjamin Herrenschmidt.machine push
6240ebc4cdaSBenjamin Herrenschmidt.machine "power4"
6250ebc4cdaSBenjamin Herrenschmidt	mtcrf	0x80,r9
6260ebc4cdaSBenjamin Herrenschmidt.machine pop
6270ebc4cdaSBenjamin Herrenschmidt
6280ebc4cdaSBenjamin Herrenschmidt	clrrdi	r10,r10,2		/* clear RI before setting SRR0/1 */
6290ebc4cdaSBenjamin Herrenschmidt	mtmsrd	r10,1
6300ebc4cdaSBenjamin Herrenschmidt
6310ebc4cdaSBenjamin Herrenschmidt	mtspr	SRR0,r11
6320ebc4cdaSBenjamin Herrenschmidt	mtspr	SRR1,r12
6330ebc4cdaSBenjamin Herrenschmidt
6340ebc4cdaSBenjamin Herrenschmidt	ld	r9,PACA_EXGEN+EX_R9(r13)
6350ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACA_EXGEN+EX_R10(r13)
6360ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACA_EXGEN+EX_R11(r13)
6370ebc4cdaSBenjamin Herrenschmidt	ld	r12,PACA_EXGEN+EX_R12(r13)
6380ebc4cdaSBenjamin Herrenschmidt	ld	r13,PACA_EXGEN+EX_R13(r13)
6390ebc4cdaSBenjamin Herrenschmidt	rfid
6400ebc4cdaSBenjamin Herrenschmidt	b	.
6410ebc4cdaSBenjamin Herrenschmidt
6420ebc4cdaSBenjamin Herrenschmidtslb_miss_fault:
6430ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x380, PACA_EXGEN)
6440ebc4cdaSBenjamin Herrenschmidt	ld	r4,PACA_EXGEN+EX_DAR(r13)
6450ebc4cdaSBenjamin Herrenschmidt	li	r5,0
6460ebc4cdaSBenjamin Herrenschmidt	std	r4,_DAR(r1)
6470ebc4cdaSBenjamin Herrenschmidt	std	r5,_DSISR(r1)
6480ebc4cdaSBenjamin Herrenschmidt	b	handle_page_fault
6490ebc4cdaSBenjamin Herrenschmidt
6500ebc4cdaSBenjamin Herrenschmidtunrecov_user_slb:
6510ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x4200, PACA_EXGEN)
6520ebc4cdaSBenjamin Herrenschmidt	DISABLE_INTS
6530ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
6540ebc4cdaSBenjamin Herrenschmidt1:	addi	r3,r1,STACK_FRAME_OVERHEAD
6550ebc4cdaSBenjamin Herrenschmidt	bl	.unrecoverable_exception
6560ebc4cdaSBenjamin Herrenschmidt	b	1b
6570ebc4cdaSBenjamin Herrenschmidt
6580ebc4cdaSBenjamin Herrenschmidt#endif /* __DISABLED__ */
6590ebc4cdaSBenjamin Herrenschmidt
6600ebc4cdaSBenjamin Herrenschmidt
6610ebc4cdaSBenjamin Herrenschmidt/*
6620ebc4cdaSBenjamin Herrenschmidt * r13 points to the PACA, r9 contains the saved CR,
6630ebc4cdaSBenjamin Herrenschmidt * r12 contain the saved SRR1, SRR0 is still ready for return
6640ebc4cdaSBenjamin Herrenschmidt * r3 has the faulting address
6650ebc4cdaSBenjamin Herrenschmidt * r9 - r13 are saved in paca->exslb.
6660ebc4cdaSBenjamin Herrenschmidt * r3 is saved in paca->slb_r3
6670ebc4cdaSBenjamin Herrenschmidt * We assume we aren't going to take any exceptions during this procedure.
6680ebc4cdaSBenjamin Herrenschmidt */
6690ebc4cdaSBenjamin Herrenschmidt_GLOBAL(slb_miss_realmode)
6700ebc4cdaSBenjamin Herrenschmidt	mflr	r10
6710ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_RELOCATABLE
6720ebc4cdaSBenjamin Herrenschmidt	mtctr	r11
6730ebc4cdaSBenjamin Herrenschmidt#endif
6740ebc4cdaSBenjamin Herrenschmidt
6750ebc4cdaSBenjamin Herrenschmidt	stw	r9,PACA_EXSLB+EX_CCR(r13)	/* save CR in exc. frame */
6760ebc4cdaSBenjamin Herrenschmidt	std	r10,PACA_EXSLB+EX_LR(r13)	/* save LR */
6770ebc4cdaSBenjamin Herrenschmidt
6780ebc4cdaSBenjamin Herrenschmidt	bl	.slb_allocate_realmode
6790ebc4cdaSBenjamin Herrenschmidt
6800ebc4cdaSBenjamin Herrenschmidt	/* All done -- return from exception. */
6810ebc4cdaSBenjamin Herrenschmidt
6820ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACA_EXSLB+EX_LR(r13)
6830ebc4cdaSBenjamin Herrenschmidt	ld	r3,PACA_EXSLB+EX_R3(r13)
6840ebc4cdaSBenjamin Herrenschmidt	lwz	r9,PACA_EXSLB+EX_CCR(r13)	/* get saved CR */
6850ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_ISERIES
6860ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION
6870ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACALPPACAPTR(r13)
6880ebc4cdaSBenjamin Herrenschmidt	ld	r11,LPPACASRR0(r11)		/* get SRR0 value */
6890ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
6900ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_ISERIES */
6910ebc4cdaSBenjamin Herrenschmidt
6920ebc4cdaSBenjamin Herrenschmidt	mtlr	r10
6930ebc4cdaSBenjamin Herrenschmidt
6940ebc4cdaSBenjamin Herrenschmidt	andi.	r10,r12,MSR_RI	/* check for unrecoverable exception */
6950ebc4cdaSBenjamin Herrenschmidt	beq-	2f
6960ebc4cdaSBenjamin Herrenschmidt
6970ebc4cdaSBenjamin Herrenschmidt.machine	push
6980ebc4cdaSBenjamin Herrenschmidt.machine	"power4"
6990ebc4cdaSBenjamin Herrenschmidt	mtcrf	0x80,r9
7000ebc4cdaSBenjamin Herrenschmidt	mtcrf	0x01,r9		/* slb_allocate uses cr0 and cr7 */
7010ebc4cdaSBenjamin Herrenschmidt.machine	pop
7020ebc4cdaSBenjamin Herrenschmidt
7030ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_ISERIES
7040ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION
7050ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR0,r11
7060ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r12
7070ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
7080ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_ISERIES */
7090ebc4cdaSBenjamin Herrenschmidt	ld	r9,PACA_EXSLB+EX_R9(r13)
7100ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACA_EXSLB+EX_R10(r13)
7110ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACA_EXSLB+EX_R11(r13)
7120ebc4cdaSBenjamin Herrenschmidt	ld	r12,PACA_EXSLB+EX_R12(r13)
7130ebc4cdaSBenjamin Herrenschmidt	ld	r13,PACA_EXSLB+EX_R13(r13)
7140ebc4cdaSBenjamin Herrenschmidt	rfid
7150ebc4cdaSBenjamin Herrenschmidt	b	.	/* prevent speculative execution */
7160ebc4cdaSBenjamin Herrenschmidt
7170ebc4cdaSBenjamin Herrenschmidt2:
7180ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_ISERIES
7190ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION
7200ebc4cdaSBenjamin Herrenschmidt	b	unrecov_slb
7210ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
7220ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_ISERIES */
7230ebc4cdaSBenjamin Herrenschmidt	mfspr	r11,SPRN_SRR0
7240ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACAKBASE(r13)
7250ebc4cdaSBenjamin Herrenschmidt	LOAD_HANDLER(r10,unrecov_slb)
7260ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR0,r10
7270ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACAKMSR(r13)
7280ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r10
7290ebc4cdaSBenjamin Herrenschmidt	rfid
7300ebc4cdaSBenjamin Herrenschmidt	b	.
7310ebc4cdaSBenjamin Herrenschmidt
7320ebc4cdaSBenjamin Herrenschmidtunrecov_slb:
7330ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB)
7340ebc4cdaSBenjamin Herrenschmidt	DISABLE_INTS
7350ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
7360ebc4cdaSBenjamin Herrenschmidt1:	addi	r3,r1,STACK_FRAME_OVERHEAD
7370ebc4cdaSBenjamin Herrenschmidt	bl	.unrecoverable_exception
7380ebc4cdaSBenjamin Herrenschmidt	b	1b
7390ebc4cdaSBenjamin Herrenschmidt
7400ebc4cdaSBenjamin Herrenschmidt	.align	7
7410ebc4cdaSBenjamin Herrenschmidt	.globl hardware_interrupt_common
7420ebc4cdaSBenjamin Herrenschmidt	.globl hardware_interrupt_entry
7430ebc4cdaSBenjamin Herrenschmidthardware_interrupt_common:
7440ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x500, PACA_EXGEN)
7450ebc4cdaSBenjamin Herrenschmidt	FINISH_NAP
7460ebc4cdaSBenjamin Herrenschmidthardware_interrupt_entry:
7470ebc4cdaSBenjamin Herrenschmidt	DISABLE_INTS
7480ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION
7490ebc4cdaSBenjamin Herrenschmidt	bl	.ppc64_runlatch_on
7500ebc4cdaSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_CTRL)
7510ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
7520ebc4cdaSBenjamin Herrenschmidt	bl	.do_IRQ
7530ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except_lite
7540ebc4cdaSBenjamin Herrenschmidt
7550ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_970_NAP
7560ebc4cdaSBenjamin Herrenschmidtpower4_fixup_nap:
7570ebc4cdaSBenjamin Herrenschmidt	andc	r9,r9,r10
7580ebc4cdaSBenjamin Herrenschmidt	std	r9,TI_LOCAL_FLAGS(r11)
7590ebc4cdaSBenjamin Herrenschmidt	ld	r10,_LINK(r1)		/* make idle task do the */
7600ebc4cdaSBenjamin Herrenschmidt	std	r10,_NIP(r1)		/* equivalent of a blr */
7610ebc4cdaSBenjamin Herrenschmidt	blr
7620ebc4cdaSBenjamin Herrenschmidt#endif
7630ebc4cdaSBenjamin Herrenschmidt
7640ebc4cdaSBenjamin Herrenschmidt	.align	7
7650ebc4cdaSBenjamin Herrenschmidt	.globl alignment_common
7660ebc4cdaSBenjamin Herrenschmidtalignment_common:
7670ebc4cdaSBenjamin Herrenschmidt	mfspr	r10,SPRN_DAR
7680ebc4cdaSBenjamin Herrenschmidt	std	r10,PACA_EXGEN+EX_DAR(r13)
7690ebc4cdaSBenjamin Herrenschmidt	mfspr	r10,SPRN_DSISR
7700ebc4cdaSBenjamin Herrenschmidt	stw	r10,PACA_EXGEN+EX_DSISR(r13)
7710ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x600, PACA_EXGEN)
7720ebc4cdaSBenjamin Herrenschmidt	ld	r3,PACA_EXGEN+EX_DAR(r13)
7730ebc4cdaSBenjamin Herrenschmidt	lwz	r4,PACA_EXGEN+EX_DSISR(r13)
7740ebc4cdaSBenjamin Herrenschmidt	std	r3,_DAR(r1)
7750ebc4cdaSBenjamin Herrenschmidt	std	r4,_DSISR(r1)
7760ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
7770ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
7780ebc4cdaSBenjamin Herrenschmidt	ENABLE_INTS
7790ebc4cdaSBenjamin Herrenschmidt	bl	.alignment_exception
7800ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
7810ebc4cdaSBenjamin Herrenschmidt
7820ebc4cdaSBenjamin Herrenschmidt	.align	7
7830ebc4cdaSBenjamin Herrenschmidt	.globl program_check_common
7840ebc4cdaSBenjamin Herrenschmidtprogram_check_common:
7850ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN)
7860ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
7870ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
7880ebc4cdaSBenjamin Herrenschmidt	ENABLE_INTS
7890ebc4cdaSBenjamin Herrenschmidt	bl	.program_check_exception
7900ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
7910ebc4cdaSBenjamin Herrenschmidt
7920ebc4cdaSBenjamin Herrenschmidt	.align	7
7930ebc4cdaSBenjamin Herrenschmidt	.globl fp_unavailable_common
7940ebc4cdaSBenjamin Herrenschmidtfp_unavailable_common:
7950ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x800, PACA_EXGEN)
7960ebc4cdaSBenjamin Herrenschmidt	bne	1f			/* if from user, just load it up */
7970ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
7980ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
7990ebc4cdaSBenjamin Herrenschmidt	ENABLE_INTS
8000ebc4cdaSBenjamin Herrenschmidt	bl	.kernel_fp_unavailable_exception
8010ebc4cdaSBenjamin Herrenschmidt	BUG_OPCODE
8020ebc4cdaSBenjamin Herrenschmidt1:	bl	.load_up_fpu
8030ebc4cdaSBenjamin Herrenschmidt	b	fast_exception_return
8040ebc4cdaSBenjamin Herrenschmidt
8050ebc4cdaSBenjamin Herrenschmidt	.align	7
8060ebc4cdaSBenjamin Herrenschmidt	.globl altivec_unavailable_common
8070ebc4cdaSBenjamin Herrenschmidtaltivec_unavailable_common:
8080ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0xf20, PACA_EXGEN)
8090ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_ALTIVEC
8100ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION
8110ebc4cdaSBenjamin Herrenschmidt	beq	1f
8120ebc4cdaSBenjamin Herrenschmidt	bl	.load_up_altivec
8130ebc4cdaSBenjamin Herrenschmidt	b	fast_exception_return
8140ebc4cdaSBenjamin Herrenschmidt1:
8150ebc4cdaSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
8160ebc4cdaSBenjamin Herrenschmidt#endif
8170ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
8180ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
8190ebc4cdaSBenjamin Herrenschmidt	ENABLE_INTS
8200ebc4cdaSBenjamin Herrenschmidt	bl	.altivec_unavailable_exception
8210ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
8220ebc4cdaSBenjamin Herrenschmidt
8230ebc4cdaSBenjamin Herrenschmidt	.align	7
8240ebc4cdaSBenjamin Herrenschmidt	.globl vsx_unavailable_common
8250ebc4cdaSBenjamin Herrenschmidtvsx_unavailable_common:
8260ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0xf40, PACA_EXGEN)
8270ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_VSX
8280ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION
8290ebc4cdaSBenjamin Herrenschmidt	bne	.load_up_vsx
8300ebc4cdaSBenjamin Herrenschmidt1:
8310ebc4cdaSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_VSX)
8320ebc4cdaSBenjamin Herrenschmidt#endif
8330ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
8340ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
8350ebc4cdaSBenjamin Herrenschmidt	ENABLE_INTS
8360ebc4cdaSBenjamin Herrenschmidt	bl	.vsx_unavailable_exception
8370ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
8380ebc4cdaSBenjamin Herrenschmidt
8390ebc4cdaSBenjamin Herrenschmidt	.align	7
8400ebc4cdaSBenjamin Herrenschmidt	.globl	__end_handlers
8410ebc4cdaSBenjamin Herrenschmidt__end_handlers:
8420ebc4cdaSBenjamin Herrenschmidt
8430ebc4cdaSBenjamin Herrenschmidt/*
8440ebc4cdaSBenjamin Herrenschmidt * Return from an exception with minimal checks.
8450ebc4cdaSBenjamin Herrenschmidt * The caller is assumed to have done EXCEPTION_PROLOG_COMMON.
8460ebc4cdaSBenjamin Herrenschmidt * If interrupts have been enabled, or anything has been
8470ebc4cdaSBenjamin Herrenschmidt * done that might have changed the scheduling status of
8480ebc4cdaSBenjamin Herrenschmidt * any task or sent any task a signal, you should use
8490ebc4cdaSBenjamin Herrenschmidt * ret_from_except or ret_from_except_lite instead of this.
8500ebc4cdaSBenjamin Herrenschmidt */
8510ebc4cdaSBenjamin Herrenschmidtfast_exc_return_irq:			/* restores irq state too */
8520ebc4cdaSBenjamin Herrenschmidt	ld	r3,SOFTE(r1)
8530ebc4cdaSBenjamin Herrenschmidt	TRACE_AND_RESTORE_IRQ(r3);
8540ebc4cdaSBenjamin Herrenschmidt	ld	r12,_MSR(r1)
8550ebc4cdaSBenjamin Herrenschmidt	rldicl	r4,r12,49,63		/* get MSR_EE to LSB */
8560ebc4cdaSBenjamin Herrenschmidt	stb	r4,PACAHARDIRQEN(r13)	/* restore paca->hard_enabled */
8570ebc4cdaSBenjamin Herrenschmidt	b	1f
8580ebc4cdaSBenjamin Herrenschmidt
8590ebc4cdaSBenjamin Herrenschmidt	.globl	fast_exception_return
8600ebc4cdaSBenjamin Herrenschmidtfast_exception_return:
8610ebc4cdaSBenjamin Herrenschmidt	ld	r12,_MSR(r1)
8620ebc4cdaSBenjamin Herrenschmidt1:	ld	r11,_NIP(r1)
8630ebc4cdaSBenjamin Herrenschmidt	andi.	r3,r12,MSR_RI		/* check if RI is set */
8640ebc4cdaSBenjamin Herrenschmidt	beq-	unrecov_fer
8650ebc4cdaSBenjamin Herrenschmidt
8660ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_VIRT_CPU_ACCOUNTING
8670ebc4cdaSBenjamin Herrenschmidt	andi.	r3,r12,MSR_PR
8680ebc4cdaSBenjamin Herrenschmidt	beq	2f
8690ebc4cdaSBenjamin Herrenschmidt	ACCOUNT_CPU_USER_EXIT(r3, r4)
8700ebc4cdaSBenjamin Herrenschmidt2:
8710ebc4cdaSBenjamin Herrenschmidt#endif
8720ebc4cdaSBenjamin Herrenschmidt
8730ebc4cdaSBenjamin Herrenschmidt	ld	r3,_CCR(r1)
8740ebc4cdaSBenjamin Herrenschmidt	ld	r4,_LINK(r1)
8750ebc4cdaSBenjamin Herrenschmidt	ld	r5,_CTR(r1)
8760ebc4cdaSBenjamin Herrenschmidt	ld	r6,_XER(r1)
8770ebc4cdaSBenjamin Herrenschmidt	mtcr	r3
8780ebc4cdaSBenjamin Herrenschmidt	mtlr	r4
8790ebc4cdaSBenjamin Herrenschmidt	mtctr	r5
8800ebc4cdaSBenjamin Herrenschmidt	mtxer	r6
8810ebc4cdaSBenjamin Herrenschmidt	REST_GPR(0, r1)
8820ebc4cdaSBenjamin Herrenschmidt	REST_8GPRS(2, r1)
8830ebc4cdaSBenjamin Herrenschmidt
8840ebc4cdaSBenjamin Herrenschmidt	mfmsr	r10
8850ebc4cdaSBenjamin Herrenschmidt	rldicl	r10,r10,48,1		/* clear EE */
8860ebc4cdaSBenjamin Herrenschmidt	rldicr	r10,r10,16,61		/* clear RI (LE is 0 already) */
8870ebc4cdaSBenjamin Herrenschmidt	mtmsrd	r10,1
8880ebc4cdaSBenjamin Herrenschmidt
8890ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r12
8900ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR0,r11
8910ebc4cdaSBenjamin Herrenschmidt	REST_4GPRS(10, r1)
8920ebc4cdaSBenjamin Herrenschmidt	ld	r1,GPR1(r1)
8930ebc4cdaSBenjamin Herrenschmidt	rfid
8940ebc4cdaSBenjamin Herrenschmidt	b	.	/* prevent speculative execution */
8950ebc4cdaSBenjamin Herrenschmidt
8960ebc4cdaSBenjamin Herrenschmidtunrecov_fer:
8970ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
8980ebc4cdaSBenjamin Herrenschmidt1:	addi	r3,r1,STACK_FRAME_OVERHEAD
8990ebc4cdaSBenjamin Herrenschmidt	bl	.unrecoverable_exception
9000ebc4cdaSBenjamin Herrenschmidt	b	1b
9010ebc4cdaSBenjamin Herrenschmidt
9020ebc4cdaSBenjamin Herrenschmidt
9030ebc4cdaSBenjamin Herrenschmidt/*
9040ebc4cdaSBenjamin Herrenschmidt * Hash table stuff
9050ebc4cdaSBenjamin Herrenschmidt */
9060ebc4cdaSBenjamin Herrenschmidt	.align	7
9070ebc4cdaSBenjamin Herrenschmidt_STATIC(do_hash_page)
9080ebc4cdaSBenjamin Herrenschmidt	std	r3,_DAR(r1)
9090ebc4cdaSBenjamin Herrenschmidt	std	r4,_DSISR(r1)
9100ebc4cdaSBenjamin Herrenschmidt
9119c7cc234SK.Prasad	andis.	r0,r4,0xa410		/* weird error? */
9120ebc4cdaSBenjamin Herrenschmidt	bne-	handle_page_fault	/* if not, try to insert a HPTE */
9139c7cc234SK.Prasad	andis.  r0,r4,DSISR_DABRMATCH@h
9149c7cc234SK.Prasad	bne-    handle_dabr_fault
9159c7cc234SK.Prasad
9160ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION
9170ebc4cdaSBenjamin Herrenschmidt	andis.	r0,r4,0x0020		/* Is it a segment table fault? */
9180ebc4cdaSBenjamin Herrenschmidt	bne-	do_ste_alloc		/* If so handle it */
91944ae3ab3SMatt EvansEND_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB)
9200ebc4cdaSBenjamin Herrenschmidt
9219c1e1052SPaul Mackerras	clrrdi	r11,r1,THREAD_SHIFT
9229c1e1052SPaul Mackerras	lwz	r0,TI_PREEMPT(r11)	/* If we're in an "NMI" */
9239c1e1052SPaul Mackerras	andis.	r0,r0,NMI_MASK@h	/* (i.e. an irq when soft-disabled) */
9249c1e1052SPaul Mackerras	bne	77f			/* then don't call hash_page now */
9259c1e1052SPaul Mackerras
9260ebc4cdaSBenjamin Herrenschmidt	/*
9270ebc4cdaSBenjamin Herrenschmidt	 * On iSeries, we soft-disable interrupts here, then
9280ebc4cdaSBenjamin Herrenschmidt	 * hard-enable interrupts so that the hash_page code can spin on
9290ebc4cdaSBenjamin Herrenschmidt	 * the hash_table_lock without problems on a shared processor.
9300ebc4cdaSBenjamin Herrenschmidt	 */
9310ebc4cdaSBenjamin Herrenschmidt	DISABLE_INTS
9320ebc4cdaSBenjamin Herrenschmidt
9330ebc4cdaSBenjamin Herrenschmidt	/*
9340ebc4cdaSBenjamin Herrenschmidt	 * Currently, trace_hardirqs_off() will be called by DISABLE_INTS
9350ebc4cdaSBenjamin Herrenschmidt	 * and will clobber volatile registers when irq tracing is enabled
9360ebc4cdaSBenjamin Herrenschmidt	 * so we need to reload them. It may be possible to be smarter here
9370ebc4cdaSBenjamin Herrenschmidt	 * and move the irq tracing elsewhere but let's keep it simple for
9380ebc4cdaSBenjamin Herrenschmidt	 * now
9390ebc4cdaSBenjamin Herrenschmidt	 */
9400ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_TRACE_IRQFLAGS
9410ebc4cdaSBenjamin Herrenschmidt	ld	r3,_DAR(r1)
9420ebc4cdaSBenjamin Herrenschmidt	ld	r4,_DSISR(r1)
9430ebc4cdaSBenjamin Herrenschmidt	ld	r5,_TRAP(r1)
9440ebc4cdaSBenjamin Herrenschmidt	ld	r12,_MSR(r1)
9450ebc4cdaSBenjamin Herrenschmidt	clrrdi	r5,r5,4
9460ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_TRACE_IRQFLAGS */
9470ebc4cdaSBenjamin Herrenschmidt	/*
9480ebc4cdaSBenjamin Herrenschmidt	 * We need to set the _PAGE_USER bit if MSR_PR is set or if we are
9490ebc4cdaSBenjamin Herrenschmidt	 * accessing a userspace segment (even from the kernel). We assume
9500ebc4cdaSBenjamin Herrenschmidt	 * kernel addresses always have the high bit set.
9510ebc4cdaSBenjamin Herrenschmidt	 */
9520ebc4cdaSBenjamin Herrenschmidt	rlwinm	r4,r4,32-25+9,31-9,31-9	/* DSISR_STORE -> _PAGE_RW */
9530ebc4cdaSBenjamin Herrenschmidt	rotldi	r0,r3,15		/* Move high bit into MSR_PR posn */
9540ebc4cdaSBenjamin Herrenschmidt	orc	r0,r12,r0		/* MSR_PR | ~high_bit */
9550ebc4cdaSBenjamin Herrenschmidt	rlwimi	r4,r0,32-13,30,30	/* becomes _PAGE_USER access bit */
9560ebc4cdaSBenjamin Herrenschmidt	ori	r4,r4,1			/* add _PAGE_PRESENT */
9570ebc4cdaSBenjamin Herrenschmidt	rlwimi	r4,r5,22+2,31-2,31-2	/* Set _PAGE_EXEC if trap is 0x400 */
9580ebc4cdaSBenjamin Herrenschmidt
9590ebc4cdaSBenjamin Herrenschmidt	/*
9600ebc4cdaSBenjamin Herrenschmidt	 * r3 contains the faulting address
9610ebc4cdaSBenjamin Herrenschmidt	 * r4 contains the required access permissions
9620ebc4cdaSBenjamin Herrenschmidt	 * r5 contains the trap number
9630ebc4cdaSBenjamin Herrenschmidt	 *
9640ebc4cdaSBenjamin Herrenschmidt	 * at return r3 = 0 for success
9650ebc4cdaSBenjamin Herrenschmidt	 */
9660ebc4cdaSBenjamin Herrenschmidt	bl	.hash_page		/* build HPTE if possible */
9670ebc4cdaSBenjamin Herrenschmidt	cmpdi	r3,0			/* see if hash_page succeeded */
9680ebc4cdaSBenjamin Herrenschmidt
9690ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION
9700ebc4cdaSBenjamin Herrenschmidt	/*
9710ebc4cdaSBenjamin Herrenschmidt	 * If we had interrupts soft-enabled at the point where the
9720ebc4cdaSBenjamin Herrenschmidt	 * DSI/ISI occurred, and an interrupt came in during hash_page,
9730ebc4cdaSBenjamin Herrenschmidt	 * handle it now.
9740ebc4cdaSBenjamin Herrenschmidt	 * We jump to ret_from_except_lite rather than fast_exception_return
9750ebc4cdaSBenjamin Herrenschmidt	 * because ret_from_except_lite will check for and handle pending
9760ebc4cdaSBenjamin Herrenschmidt	 * interrupts if necessary.
9770ebc4cdaSBenjamin Herrenschmidt	 */
9780ebc4cdaSBenjamin Herrenschmidt	beq	13f
9790ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
9800ebc4cdaSBenjamin Herrenschmidt
9810ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION
9820ebc4cdaSBenjamin Herrenschmidt	/*
9830ebc4cdaSBenjamin Herrenschmidt	 * Here we have interrupts hard-disabled, so it is sufficient
9840ebc4cdaSBenjamin Herrenschmidt	 * to restore paca->{soft,hard}_enable and get out.
9850ebc4cdaSBenjamin Herrenschmidt	 */
9860ebc4cdaSBenjamin Herrenschmidt	beq	fast_exc_return_irq	/* Return from exception on success */
9870ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES)
9880ebc4cdaSBenjamin Herrenschmidt
9890ebc4cdaSBenjamin Herrenschmidt	/* For a hash failure, we don't bother re-enabling interrupts */
9900ebc4cdaSBenjamin Herrenschmidt	ble-	12f
9910ebc4cdaSBenjamin Herrenschmidt
9920ebc4cdaSBenjamin Herrenschmidt	/*
9930ebc4cdaSBenjamin Herrenschmidt	 * hash_page couldn't handle it, set soft interrupt enable back
994df9ee292SDavid Howells	 * to what it was before the trap.  Note that .arch_local_irq_restore
9950ebc4cdaSBenjamin Herrenschmidt	 * handles any interrupts pending at this point.
9960ebc4cdaSBenjamin Herrenschmidt	 */
9970ebc4cdaSBenjamin Herrenschmidt	ld	r3,SOFTE(r1)
9980ebc4cdaSBenjamin Herrenschmidt	TRACE_AND_RESTORE_IRQ_PARTIAL(r3, 11f)
999df9ee292SDavid Howells	bl	.arch_local_irq_restore
10000ebc4cdaSBenjamin Herrenschmidt	b	11f
10010ebc4cdaSBenjamin Herrenschmidt
10029c7cc234SK.Prasad/* We have a data breakpoint exception - handle it */
10039c7cc234SK.Prasadhandle_dabr_fault:
10045aae8a53SK.Prasad	bl	.save_nvgprs
10059c7cc234SK.Prasad	ld      r4,_DAR(r1)
10069c7cc234SK.Prasad	ld      r5,_DSISR(r1)
10079c7cc234SK.Prasad	addi    r3,r1,STACK_FRAME_OVERHEAD
10089c7cc234SK.Prasad	bl      .do_dabr
10099c7cc234SK.Prasad	b       .ret_from_except_lite
10109c7cc234SK.Prasad
10110ebc4cdaSBenjamin Herrenschmidt/* Here we have a page fault that hash_page can't handle. */
10120ebc4cdaSBenjamin Herrenschmidthandle_page_fault:
10130ebc4cdaSBenjamin Herrenschmidt	ENABLE_INTS
10140ebc4cdaSBenjamin Herrenschmidt11:	ld	r4,_DAR(r1)
10150ebc4cdaSBenjamin Herrenschmidt	ld	r5,_DSISR(r1)
10160ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
10170ebc4cdaSBenjamin Herrenschmidt	bl	.do_page_fault
10180ebc4cdaSBenjamin Herrenschmidt	cmpdi	r3,0
10190ebc4cdaSBenjamin Herrenschmidt	beq+	13f
10200ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
10210ebc4cdaSBenjamin Herrenschmidt	mr	r5,r3
10220ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
10230ebc4cdaSBenjamin Herrenschmidt	lwz	r4,_DAR(r1)
10240ebc4cdaSBenjamin Herrenschmidt	bl	.bad_page_fault
10250ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
10260ebc4cdaSBenjamin Herrenschmidt
10270ebc4cdaSBenjamin Herrenschmidt13:	b	.ret_from_except_lite
10280ebc4cdaSBenjamin Herrenschmidt
10290ebc4cdaSBenjamin Herrenschmidt/* We have a page fault that hash_page could handle but HV refused
10300ebc4cdaSBenjamin Herrenschmidt * the PTE insertion
10310ebc4cdaSBenjamin Herrenschmidt */
10320ebc4cdaSBenjamin Herrenschmidt12:	bl	.save_nvgprs
10330ebc4cdaSBenjamin Herrenschmidt	mr	r5,r3
10340ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
10350ebc4cdaSBenjamin Herrenschmidt	ld	r4,_DAR(r1)
10360ebc4cdaSBenjamin Herrenschmidt	bl	.low_hash_fault
10370ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
10380ebc4cdaSBenjamin Herrenschmidt
10399c1e1052SPaul Mackerras/*
10409c1e1052SPaul Mackerras * We come here as a result of a DSI at a point where we don't want
10419c1e1052SPaul Mackerras * to call hash_page, such as when we are accessing memory (possibly
10429c1e1052SPaul Mackerras * user memory) inside a PMU interrupt that occurred while interrupts
10439c1e1052SPaul Mackerras * were soft-disabled.  We want to invoke the exception handler for
10449c1e1052SPaul Mackerras * the access, or panic if there isn't a handler.
10459c1e1052SPaul Mackerras */
10469c1e1052SPaul Mackerras77:	bl	.save_nvgprs
10479c1e1052SPaul Mackerras	mr	r4,r3
10489c1e1052SPaul Mackerras	addi	r3,r1,STACK_FRAME_OVERHEAD
10499c1e1052SPaul Mackerras	li	r5,SIGSEGV
10509c1e1052SPaul Mackerras	bl	.bad_page_fault
10519c1e1052SPaul Mackerras	b	.ret_from_except
10529c1e1052SPaul Mackerras
10530ebc4cdaSBenjamin Herrenschmidt	/* here we have a segment miss */
10540ebc4cdaSBenjamin Herrenschmidtdo_ste_alloc:
10550ebc4cdaSBenjamin Herrenschmidt	bl	.ste_allocate		/* try to insert stab entry */
10560ebc4cdaSBenjamin Herrenschmidt	cmpdi	r3,0
10570ebc4cdaSBenjamin Herrenschmidt	bne-	handle_page_fault
10580ebc4cdaSBenjamin Herrenschmidt	b	fast_exception_return
10590ebc4cdaSBenjamin Herrenschmidt
10600ebc4cdaSBenjamin Herrenschmidt/*
10610ebc4cdaSBenjamin Herrenschmidt * r13 points to the PACA, r9 contains the saved CR,
10620ebc4cdaSBenjamin Herrenschmidt * r11 and r12 contain the saved SRR0 and SRR1.
10630ebc4cdaSBenjamin Herrenschmidt * r9 - r13 are saved in paca->exslb.
10640ebc4cdaSBenjamin Herrenschmidt * We assume we aren't going to take any exceptions during this procedure.
10650ebc4cdaSBenjamin Herrenschmidt * We assume (DAR >> 60) == 0xc.
10660ebc4cdaSBenjamin Herrenschmidt */
10670ebc4cdaSBenjamin Herrenschmidt	.align	7
10680ebc4cdaSBenjamin Herrenschmidt_GLOBAL(do_stab_bolted)
10690ebc4cdaSBenjamin Herrenschmidt	stw	r9,PACA_EXSLB+EX_CCR(r13)	/* save CR in exc. frame */
10700ebc4cdaSBenjamin Herrenschmidt	std	r11,PACA_EXSLB+EX_SRR0(r13)	/* save SRR0 in exc. frame */
10710ebc4cdaSBenjamin Herrenschmidt
10720ebc4cdaSBenjamin Herrenschmidt	/* Hash to the primary group */
10730ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACASTABVIRT(r13)
10740ebc4cdaSBenjamin Herrenschmidt	mfspr	r11,SPRN_DAR
10750ebc4cdaSBenjamin Herrenschmidt	srdi	r11,r11,28
10760ebc4cdaSBenjamin Herrenschmidt	rldimi	r10,r11,7,52	/* r10 = first ste of the group */
10770ebc4cdaSBenjamin Herrenschmidt
10780ebc4cdaSBenjamin Herrenschmidt	/* Calculate VSID */
10790ebc4cdaSBenjamin Herrenschmidt	/* This is a kernel address, so protovsid = ESID */
10800ebc4cdaSBenjamin Herrenschmidt	ASM_VSID_SCRAMBLE(r11, r9, 256M)
10810ebc4cdaSBenjamin Herrenschmidt	rldic	r9,r11,12,16	/* r9 = vsid << 12 */
10820ebc4cdaSBenjamin Herrenschmidt
10830ebc4cdaSBenjamin Herrenschmidt	/* Search the primary group for a free entry */
10840ebc4cdaSBenjamin Herrenschmidt1:	ld	r11,0(r10)	/* Test valid bit of the current ste	*/
10850ebc4cdaSBenjamin Herrenschmidt	andi.	r11,r11,0x80
10860ebc4cdaSBenjamin Herrenschmidt	beq	2f
10870ebc4cdaSBenjamin Herrenschmidt	addi	r10,r10,16
10880ebc4cdaSBenjamin Herrenschmidt	andi.	r11,r10,0x70
10890ebc4cdaSBenjamin Herrenschmidt	bne	1b
10900ebc4cdaSBenjamin Herrenschmidt
10910ebc4cdaSBenjamin Herrenschmidt	/* Stick for only searching the primary group for now.		*/
10920ebc4cdaSBenjamin Herrenschmidt	/* At least for now, we use a very simple random castout scheme */
10930ebc4cdaSBenjamin Herrenschmidt	/* Use the TB as a random number ;  OR in 1 to avoid entry 0	*/
10940ebc4cdaSBenjamin Herrenschmidt	mftb	r11
10950ebc4cdaSBenjamin Herrenschmidt	rldic	r11,r11,4,57	/* r11 = (r11 << 4) & 0x70 */
10960ebc4cdaSBenjamin Herrenschmidt	ori	r11,r11,0x10
10970ebc4cdaSBenjamin Herrenschmidt
10980ebc4cdaSBenjamin Herrenschmidt	/* r10 currently points to an ste one past the group of interest */
10990ebc4cdaSBenjamin Herrenschmidt	/* make it point to the randomly selected entry			*/
11000ebc4cdaSBenjamin Herrenschmidt	subi	r10,r10,128
11010ebc4cdaSBenjamin Herrenschmidt	or 	r10,r10,r11	/* r10 is the entry to invalidate	*/
11020ebc4cdaSBenjamin Herrenschmidt
11030ebc4cdaSBenjamin Herrenschmidt	isync			/* mark the entry invalid		*/
11040ebc4cdaSBenjamin Herrenschmidt	ld	r11,0(r10)
11050ebc4cdaSBenjamin Herrenschmidt	rldicl	r11,r11,56,1	/* clear the valid bit */
11060ebc4cdaSBenjamin Herrenschmidt	rotldi	r11,r11,8
11070ebc4cdaSBenjamin Herrenschmidt	std	r11,0(r10)
11080ebc4cdaSBenjamin Herrenschmidt	sync
11090ebc4cdaSBenjamin Herrenschmidt
11100ebc4cdaSBenjamin Herrenschmidt	clrrdi	r11,r11,28	/* Get the esid part of the ste		*/
11110ebc4cdaSBenjamin Herrenschmidt	slbie	r11
11120ebc4cdaSBenjamin Herrenschmidt
11130ebc4cdaSBenjamin Herrenschmidt2:	std	r9,8(r10)	/* Store the vsid part of the ste	*/
11140ebc4cdaSBenjamin Herrenschmidt	eieio
11150ebc4cdaSBenjamin Herrenschmidt
11160ebc4cdaSBenjamin Herrenschmidt	mfspr	r11,SPRN_DAR		/* Get the new esid			*/
11170ebc4cdaSBenjamin Herrenschmidt	clrrdi	r11,r11,28	/* Permits a full 32b of ESID		*/
11180ebc4cdaSBenjamin Herrenschmidt	ori	r11,r11,0x90	/* Turn on valid and kp			*/
11190ebc4cdaSBenjamin Herrenschmidt	std	r11,0(r10)	/* Put new entry back into the stab	*/
11200ebc4cdaSBenjamin Herrenschmidt
11210ebc4cdaSBenjamin Herrenschmidt	sync
11220ebc4cdaSBenjamin Herrenschmidt
11230ebc4cdaSBenjamin Herrenschmidt	/* All done -- return from exception. */
11240ebc4cdaSBenjamin Herrenschmidt	lwz	r9,PACA_EXSLB+EX_CCR(r13)	/* get saved CR */
11250ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACA_EXSLB+EX_SRR0(r13)	/* get saved SRR0 */
11260ebc4cdaSBenjamin Herrenschmidt
11270ebc4cdaSBenjamin Herrenschmidt	andi.	r10,r12,MSR_RI
11280ebc4cdaSBenjamin Herrenschmidt	beq-	unrecov_slb
11290ebc4cdaSBenjamin Herrenschmidt
11300ebc4cdaSBenjamin Herrenschmidt	mtcrf	0x80,r9			/* restore CR */
11310ebc4cdaSBenjamin Herrenschmidt
11320ebc4cdaSBenjamin Herrenschmidt	mfmsr	r10
11330ebc4cdaSBenjamin Herrenschmidt	clrrdi	r10,r10,2
11340ebc4cdaSBenjamin Herrenschmidt	mtmsrd	r10,1
11350ebc4cdaSBenjamin Herrenschmidt
11360ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR0,r11
11370ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r12
11380ebc4cdaSBenjamin Herrenschmidt	ld	r9,PACA_EXSLB+EX_R9(r13)
11390ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACA_EXSLB+EX_R10(r13)
11400ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACA_EXSLB+EX_R11(r13)
11410ebc4cdaSBenjamin Herrenschmidt	ld	r12,PACA_EXSLB+EX_R12(r13)
11420ebc4cdaSBenjamin Herrenschmidt	ld	r13,PACA_EXSLB+EX_R13(r13)
11430ebc4cdaSBenjamin Herrenschmidt	rfid
11440ebc4cdaSBenjamin Herrenschmidt	b	.	/* prevent speculative execution */
11450ebc4cdaSBenjamin Herrenschmidt
11460ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_PSERIES
11470ebc4cdaSBenjamin Herrenschmidt/*
11480ebc4cdaSBenjamin Herrenschmidt * Data area reserved for FWNMI option.
11490ebc4cdaSBenjamin Herrenschmidt * This address (0x7000) is fixed by the RPA.
11500ebc4cdaSBenjamin Herrenschmidt */
11510ebc4cdaSBenjamin Herrenschmidt	.= 0x7000
11520ebc4cdaSBenjamin Herrenschmidt	.globl fwnmi_data_area
11530ebc4cdaSBenjamin Herrenschmidtfwnmi_data_area:
11540ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_PSERIES */
11550ebc4cdaSBenjamin Herrenschmidt
11560ebc4cdaSBenjamin Herrenschmidt	/* iSeries does not use the FWNMI stuff, so it is safe to put
11570ebc4cdaSBenjamin Herrenschmidt	 * this here, even if we later allow kernels that will boot on
11580ebc4cdaSBenjamin Herrenschmidt	 * both pSeries and iSeries */
11590ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_ISERIES
11600ebc4cdaSBenjamin Herrenschmidt        . = LPARMAP_PHYS
11610ebc4cdaSBenjamin Herrenschmidt	.globl xLparMap
11620ebc4cdaSBenjamin HerrenschmidtxLparMap:
11630ebc4cdaSBenjamin Herrenschmidt	.quad	HvEsidsToMap		/* xNumberEsids */
11640ebc4cdaSBenjamin Herrenschmidt	.quad	HvRangesToMap		/* xNumberRanges */
11650ebc4cdaSBenjamin Herrenschmidt	.quad	STAB0_PAGE		/* xSegmentTableOffs */
11660ebc4cdaSBenjamin Herrenschmidt	.zero	40			/* xRsvd */
11670ebc4cdaSBenjamin Herrenschmidt	/* xEsids (HvEsidsToMap entries of 2 quads) */
11680ebc4cdaSBenjamin Herrenschmidt	.quad	PAGE_OFFSET_ESID	/* xKernelEsid */
11690ebc4cdaSBenjamin Herrenschmidt	.quad	PAGE_OFFSET_VSID	/* xKernelVsid */
11700ebc4cdaSBenjamin Herrenschmidt	.quad	VMALLOC_START_ESID	/* xKernelEsid */
11710ebc4cdaSBenjamin Herrenschmidt	.quad	VMALLOC_START_VSID	/* xKernelVsid */
11720ebc4cdaSBenjamin Herrenschmidt	/* xRanges (HvRangesToMap entries of 3 quads) */
11730ebc4cdaSBenjamin Herrenschmidt	.quad	HvPagesToMap		/* xPages */
11740ebc4cdaSBenjamin Herrenschmidt	.quad	0			/* xOffset */
11750ebc4cdaSBenjamin Herrenschmidt	.quad	PAGE_OFFSET_VSID << (SID_SHIFT - HW_PAGE_SHIFT)	/* xVPN */
11760ebc4cdaSBenjamin Herrenschmidt
11770ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_ISERIES */
11780ebc4cdaSBenjamin Herrenschmidt
11790ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_PSERIES
11800ebc4cdaSBenjamin Herrenschmidt        . = 0x8000
11810ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_PSERIES */
118284493804SBenjamin Herrenschmidt
118384493804SBenjamin Herrenschmidt/*
118484493804SBenjamin Herrenschmidt * Space for CPU0's segment table.
118584493804SBenjamin Herrenschmidt *
118684493804SBenjamin Herrenschmidt * On iSeries, the hypervisor must fill in at least one entry before
118784493804SBenjamin Herrenschmidt * we get control (with relocate on).  The address is given to the hv
118884493804SBenjamin Herrenschmidt * as a page number (see xLparMap above), so this must be at a
118984493804SBenjamin Herrenschmidt * fixed address (the linker can't compute (u64)&initial_stab >>
119084493804SBenjamin Herrenschmidt * PAGE_SHIFT).
119184493804SBenjamin Herrenschmidt */
119284493804SBenjamin Herrenschmidt	. = STAB0_OFFSET	/* 0x8000 */
119384493804SBenjamin Herrenschmidt	.globl initial_stab
119484493804SBenjamin Herrenschmidtinitial_stab:
119584493804SBenjamin Herrenschmidt	.space	4096
1196