xref: /linux/arch/powerpc/kernel/exceptions-64s.S (revision b01c8b54a1a271c0fc4243845927fe1d250767a3)
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
52948cf67cSBenjamin Herrenschmidt	rlwinm	r13,r13,47-31,30,31
53948cf67cSBenjamin Herrenschmidt	cmpwi	cr0,r13,1
54948cf67cSBenjamin Herrenschmidt	bne	1f
55948cf67cSBenjamin Herrenschmidt	b	.power7_wakeup_noloss
56948cf67cSBenjamin Herrenschmidt1:	cmpwi	cr0,r13,2
57948cf67cSBenjamin Herrenschmidt	bne	1f
58948cf67cSBenjamin Herrenschmidt	b	.power7_wakeup_loss
59948cf67cSBenjamin Herrenschmidt	/* Total loss of HV state is fatal, we could try to use the
60948cf67cSBenjamin Herrenschmidt	 * PIR to locate a PACA, then use an emergency stack etc...
61948cf67cSBenjamin Herrenschmidt	 * but for now, let's just stay stuck here
62948cf67cSBenjamin Herrenschmidt	 */
63948cf67cSBenjamin Herrenschmidt1:	cmpwi	cr0,r13,3
64948cf67cSBenjamin Herrenschmidt	beq	.
65948cf67cSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_HVMODE_206)
66948cf67cSBenjamin Herrenschmidt#endif /* CONFIG_PPC_P7_NAP */
67*b01c8b54SPaul Mackerras	EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD,
68*b01c8b54SPaul Mackerras				 NOTEST, 0x100)
690ebc4cdaSBenjamin Herrenschmidt
700ebc4cdaSBenjamin Herrenschmidt	. = 0x200
71*b01c8b54SPaul Mackerrasmachine_check_pSeries_1:
72*b01c8b54SPaul Mackerras	/* This is moved out of line as it can be patched by FW, but
73*b01c8b54SPaul Mackerras	 * some code path might still want to branch into the original
74*b01c8b54SPaul Mackerras	 * vector
75*b01c8b54SPaul Mackerras	 */
76*b01c8b54SPaul Mackerras	b	machine_check_pSeries
770ebc4cdaSBenjamin Herrenschmidt
780ebc4cdaSBenjamin Herrenschmidt	. = 0x300
790ebc4cdaSBenjamin Herrenschmidt	.globl data_access_pSeries
800ebc4cdaSBenjamin Herrenschmidtdata_access_pSeries:
810ebc4cdaSBenjamin Herrenschmidt	HMT_MEDIUM
82673b189aSPaul Mackerras	SET_SCRATCH0(r13)
83*b01c8b54SPaul Mackerras#ifndef CONFIG_POWER4_ONLY
840ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION
85*b01c8b54SPaul Mackerras	b	data_access_check_stab
86*b01c8b54SPaul Mackerrasdata_access_not_stab:
87*b01c8b54SPaul MackerrasEND_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB)
88*b01c8b54SPaul Mackerras#endif
89*b01c8b54SPaul Mackerras	EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common, EXC_STD,
90*b01c8b54SPaul Mackerras				 KVMTEST, 0x300)
910ebc4cdaSBenjamin Herrenschmidt
920ebc4cdaSBenjamin Herrenschmidt	. = 0x380
930ebc4cdaSBenjamin Herrenschmidt	.globl data_access_slb_pSeries
940ebc4cdaSBenjamin Herrenschmidtdata_access_slb_pSeries:
950ebc4cdaSBenjamin Herrenschmidt	HMT_MEDIUM
96673b189aSPaul Mackerras	SET_SCRATCH0(r13)
97*b01c8b54SPaul Mackerras	EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST, 0x380)
980ebc4cdaSBenjamin Herrenschmidt	std	r3,PACA_EXSLB+EX_R3(r13)
990ebc4cdaSBenjamin Herrenschmidt	mfspr	r3,SPRN_DAR
1000ebc4cdaSBenjamin Herrenschmidt#ifdef __DISABLED__
1010ebc4cdaSBenjamin Herrenschmidt	/* Keep that around for when we re-implement dynamic VSIDs */
1020ebc4cdaSBenjamin Herrenschmidt	cmpdi	r3,0
1030ebc4cdaSBenjamin Herrenschmidt	bge	slb_miss_user_pseries
1040ebc4cdaSBenjamin Herrenschmidt#endif /* __DISABLED__ */
105*b01c8b54SPaul Mackerras	mfspr	r12,SPRN_SRR1
1060ebc4cdaSBenjamin Herrenschmidt#ifndef CONFIG_RELOCATABLE
1070ebc4cdaSBenjamin Herrenschmidt	b	.slb_miss_realmode
1080ebc4cdaSBenjamin Herrenschmidt#else
1090ebc4cdaSBenjamin Herrenschmidt	/*
1100ebc4cdaSBenjamin Herrenschmidt	 * We can't just use a direct branch to .slb_miss_realmode
1110ebc4cdaSBenjamin Herrenschmidt	 * because the distance from here to there depends on where
1120ebc4cdaSBenjamin Herrenschmidt	 * the kernel ends up being put.
1130ebc4cdaSBenjamin Herrenschmidt	 */
1140ebc4cdaSBenjamin Herrenschmidt	mfctr	r11
1150ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACAKBASE(r13)
1160ebc4cdaSBenjamin Herrenschmidt	LOAD_HANDLER(r10, .slb_miss_realmode)
1170ebc4cdaSBenjamin Herrenschmidt	mtctr	r10
1180ebc4cdaSBenjamin Herrenschmidt	bctr
1190ebc4cdaSBenjamin Herrenschmidt#endif
1200ebc4cdaSBenjamin Herrenschmidt
121b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0x400, 0x400, instruction_access)
1220ebc4cdaSBenjamin Herrenschmidt
1230ebc4cdaSBenjamin Herrenschmidt	. = 0x480
1240ebc4cdaSBenjamin Herrenschmidt	.globl instruction_access_slb_pSeries
1250ebc4cdaSBenjamin Herrenschmidtinstruction_access_slb_pSeries:
1260ebc4cdaSBenjamin Herrenschmidt	HMT_MEDIUM
127673b189aSPaul Mackerras	SET_SCRATCH0(r13)
128*b01c8b54SPaul Mackerras	EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST, 0x480)
1290ebc4cdaSBenjamin Herrenschmidt	std	r3,PACA_EXSLB+EX_R3(r13)
1300ebc4cdaSBenjamin Herrenschmidt	mfspr	r3,SPRN_SRR0		/* SRR0 is faulting address */
1310ebc4cdaSBenjamin Herrenschmidt#ifdef __DISABLED__
1320ebc4cdaSBenjamin Herrenschmidt	/* Keep that around for when we re-implement dynamic VSIDs */
1330ebc4cdaSBenjamin Herrenschmidt	cmpdi	r3,0
1340ebc4cdaSBenjamin Herrenschmidt	bge	slb_miss_user_pseries
1350ebc4cdaSBenjamin Herrenschmidt#endif /* __DISABLED__ */
136*b01c8b54SPaul Mackerras	mfspr	r12,SPRN_SRR1
1370ebc4cdaSBenjamin Herrenschmidt#ifndef CONFIG_RELOCATABLE
1380ebc4cdaSBenjamin Herrenschmidt	b	.slb_miss_realmode
1390ebc4cdaSBenjamin Herrenschmidt#else
1400ebc4cdaSBenjamin Herrenschmidt	mfctr	r11
1410ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACAKBASE(r13)
1420ebc4cdaSBenjamin Herrenschmidt	LOAD_HANDLER(r10, .slb_miss_realmode)
1430ebc4cdaSBenjamin Herrenschmidt	mtctr	r10
1440ebc4cdaSBenjamin Herrenschmidt	bctr
1450ebc4cdaSBenjamin Herrenschmidt#endif
1460ebc4cdaSBenjamin Herrenschmidt
147b3e6b5dfSBenjamin Herrenschmidt	/* We open code these as we can't have a ". = x" (even with
148b3e6b5dfSBenjamin Herrenschmidt	 * x = "." within a feature section
149b3e6b5dfSBenjamin Herrenschmidt	 */
150a5d4f3adSBenjamin Herrenschmidt	. = 0x500;
151b3e6b5dfSBenjamin Herrenschmidt	.globl hardware_interrupt_pSeries;
152b3e6b5dfSBenjamin Herrenschmidt	.globl hardware_interrupt_hv;
153a5d4f3adSBenjamin Herrenschmidthardware_interrupt_pSeries:
154b3e6b5dfSBenjamin Herrenschmidthardware_interrupt_hv:
155a5d4f3adSBenjamin Herrenschmidt	BEGIN_FTR_SECTION
156*b01c8b54SPaul Mackerras		_MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt,
157*b01c8b54SPaul Mackerras					    EXC_STD, SOFTEN_TEST)
158*b01c8b54SPaul Mackerras		KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x500)
159a5d4f3adSBenjamin Herrenschmidt	FTR_SECTION_ELSE
160*b01c8b54SPaul Mackerras		_MASKABLE_EXCEPTION_PSERIES(0x502, hardware_interrupt,
161*b01c8b54SPaul Mackerras					    EXC_HV, SOFTEN_TEST_HV)
162*b01c8b54SPaul Mackerras		KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x502)
163a5d4f3adSBenjamin Herrenschmidt	ALT_FTR_SECTION_END_IFCLR(CPU_FTR_HVMODE_206)
164a5d4f3adSBenjamin Herrenschmidt
165b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0x600, 0x600, alignment)
166*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x600)
167*b01c8b54SPaul Mackerras
168b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0x700, 0x700, program_check)
169*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x700)
170*b01c8b54SPaul Mackerras
171b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0x800, 0x800, fp_unavailable)
172*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x800)
173a5d4f3adSBenjamin Herrenschmidt
174b3e6b5dfSBenjamin Herrenschmidt	MASKABLE_EXCEPTION_PSERIES(0x900, 0x900, decrementer)
175*b01c8b54SPaul Mackerras	MASKABLE_EXCEPTION_HV(0x980, 0x982, decrementer)
176a5d4f3adSBenjamin Herrenschmidt
177b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0xa00, 0xa00, trap_0a)
178*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xa00)
179*b01c8b54SPaul Mackerras
180b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0xb00, 0xb00, trap_0b)
181*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xb00)
1820ebc4cdaSBenjamin Herrenschmidt
1830ebc4cdaSBenjamin Herrenschmidt	. = 0xc00
1840ebc4cdaSBenjamin Herrenschmidt	.globl	system_call_pSeries
1850ebc4cdaSBenjamin Herrenschmidtsystem_call_pSeries:
1860ebc4cdaSBenjamin Herrenschmidt	HMT_MEDIUM
187*b01c8b54SPaul Mackerras#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
188*b01c8b54SPaul Mackerras	SET_SCRATCH0(r13)
189*b01c8b54SPaul Mackerras	GET_PACA(r13)
190*b01c8b54SPaul Mackerras	std	r9,PACA_EXGEN+EX_R9(r13)
191*b01c8b54SPaul Mackerras	std	r10,PACA_EXGEN+EX_R10(r13)
192*b01c8b54SPaul Mackerras	mfcr	r9
193*b01c8b54SPaul Mackerras	KVMTEST(0xc00)
194*b01c8b54SPaul Mackerras	GET_SCRATCH0(r13)
195*b01c8b54SPaul Mackerras#endif
1960ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION
1970ebc4cdaSBenjamin Herrenschmidt	cmpdi	r0,0x1ebe
1980ebc4cdaSBenjamin Herrenschmidt	beq-	1f
1990ebc4cdaSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_REAL_LE)
2000ebc4cdaSBenjamin Herrenschmidt	mr	r9,r13
2012dd60d79SBenjamin Herrenschmidt	GET_PACA(r13)
2020ebc4cdaSBenjamin Herrenschmidt	mfspr	r11,SPRN_SRR0
2030ebc4cdaSBenjamin Herrenschmidt	mfspr	r12,SPRN_SRR1
204f5f0307fSAnton Blanchard	ld	r10,PACAKBASE(r13)
205f5f0307fSAnton Blanchard	LOAD_HANDLER(r10, system_call_entry)
206f5f0307fSAnton Blanchard	mtspr	SPRN_SRR0,r10
207f5f0307fSAnton Blanchard	ld	r10,PACAKMSR(r13)
2080ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r10
2090ebc4cdaSBenjamin Herrenschmidt	rfid
2100ebc4cdaSBenjamin Herrenschmidt	b	.	/* prevent speculative execution */
2110ebc4cdaSBenjamin Herrenschmidt
212*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xc00)
213*b01c8b54SPaul Mackerras
2140ebc4cdaSBenjamin Herrenschmidt/* Fast LE/BE switch system call */
2150ebc4cdaSBenjamin Herrenschmidt1:	mfspr	r12,SPRN_SRR1
2160ebc4cdaSBenjamin Herrenschmidt	xori	r12,r12,MSR_LE
2170ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r12
2180ebc4cdaSBenjamin Herrenschmidt	rfid		/* return to userspace */
2190ebc4cdaSBenjamin Herrenschmidt	b	.
2200ebc4cdaSBenjamin Herrenschmidt
221b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0xd00, 0xd00, single_step)
222*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xd00)
223b3e6b5dfSBenjamin Herrenschmidt
224b3e6b5dfSBenjamin Herrenschmidt	/* At 0xe??? we have a bunch of hypervisor exceptions, we branch
225b3e6b5dfSBenjamin Herrenschmidt	 * out of line to handle them
226b3e6b5dfSBenjamin Herrenschmidt	 */
227b3e6b5dfSBenjamin Herrenschmidt	. = 0xe00
228b3e6b5dfSBenjamin Herrenschmidt	b	h_data_storage_hv
229b3e6b5dfSBenjamin Herrenschmidt	. = 0xe20
230b3e6b5dfSBenjamin Herrenschmidt	b	h_instr_storage_hv
231b3e6b5dfSBenjamin Herrenschmidt	. = 0xe40
232b3e6b5dfSBenjamin Herrenschmidt	b	emulation_assist_hv
233b3e6b5dfSBenjamin Herrenschmidt	. = 0xe50
234b3e6b5dfSBenjamin Herrenschmidt	b	hmi_exception_hv
235b3e6b5dfSBenjamin Herrenschmidt	. = 0xe60
236b3e6b5dfSBenjamin Herrenschmidt	b	hmi_exception_hv
2370ebc4cdaSBenjamin Herrenschmidt
2380ebc4cdaSBenjamin Herrenschmidt	/* We need to deal with the Altivec unavailable exception
2390ebc4cdaSBenjamin Herrenschmidt	 * here which is at 0xf20, thus in the middle of the
2400ebc4cdaSBenjamin Herrenschmidt	 * prolog code of the PerformanceMonitor one. A little
2410ebc4cdaSBenjamin Herrenschmidt	 * trickery is thus necessary
2420ebc4cdaSBenjamin Herrenschmidt	 */
243c86e2eadSAnton Blanchardperformance_monitor_pSeries_1:
2440ebc4cdaSBenjamin Herrenschmidt	. = 0xf00
2450ebc4cdaSBenjamin Herrenschmidt	b	performance_monitor_pSeries
2460ebc4cdaSBenjamin Herrenschmidt
247c86e2eadSAnton Blanchardaltivec_unavailable_pSeries_1:
2480ebc4cdaSBenjamin Herrenschmidt	. = 0xf20
2490ebc4cdaSBenjamin Herrenschmidt	b	altivec_unavailable_pSeries
2500ebc4cdaSBenjamin Herrenschmidt
251c86e2eadSAnton Blanchardvsx_unavailable_pSeries_1:
2520ebc4cdaSBenjamin Herrenschmidt	. = 0xf40
2530ebc4cdaSBenjamin Herrenschmidt	b	vsx_unavailable_pSeries
2540ebc4cdaSBenjamin Herrenschmidt
2550ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_CBE_RAS
256b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error)
257*b01c8b54SPaul Mackerras	KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1202)
2580ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_CBE_RAS */
259*b01c8b54SPaul Mackerras
260b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0x1300, 0x1300, instruction_breakpoint)
261*b01c8b54SPaul Mackerras	KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x1300)
262*b01c8b54SPaul Mackerras
2630ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_CBE_RAS
264b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_HV(0x1600, 0x1602, cbe_maintenance)
265*b01c8b54SPaul Mackerras	KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1602)
2660ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_CBE_RAS */
267*b01c8b54SPaul Mackerras
268b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(0x1700, 0x1700, altivec_assist)
269*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x1700)
270*b01c8b54SPaul Mackerras
2710ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_CBE_RAS
272b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_HV(0x1800, 0x1802, cbe_thermal)
273*b01c8b54SPaul Mackerras	KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1802)
2740ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_CBE_RAS */
2750ebc4cdaSBenjamin Herrenschmidt
2760ebc4cdaSBenjamin Herrenschmidt	. = 0x3000
2770ebc4cdaSBenjamin Herrenschmidt
278b3e6b5dfSBenjamin Herrenschmidt/*** Out of line interrupts support ***/
279b3e6b5dfSBenjamin Herrenschmidt
280*b01c8b54SPaul Mackerras	/* moved from 0x200 */
281*b01c8b54SPaul Mackerrasmachine_check_pSeries:
282*b01c8b54SPaul Mackerras	.globl machine_check_fwnmi
283*b01c8b54SPaul Mackerrasmachine_check_fwnmi:
284*b01c8b54SPaul Mackerras	HMT_MEDIUM
285*b01c8b54SPaul Mackerras	SET_SCRATCH0(r13)		/* save r13 */
286*b01c8b54SPaul Mackerras	EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common,
287*b01c8b54SPaul Mackerras				 EXC_STD, KVMTEST, 0x200)
288*b01c8b54SPaul Mackerras	KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200)
289*b01c8b54SPaul Mackerras
290*b01c8b54SPaul Mackerras#ifndef CONFIG_POWER4_ONLY
291*b01c8b54SPaul Mackerras	/* moved from 0x300 */
292*b01c8b54SPaul Mackerrasdata_access_check_stab:
293*b01c8b54SPaul Mackerras	GET_PACA(r13)
294*b01c8b54SPaul Mackerras	std	r9,PACA_EXSLB+EX_R9(r13)
295*b01c8b54SPaul Mackerras	std	r10,PACA_EXSLB+EX_R10(r13)
296*b01c8b54SPaul Mackerras	mfspr	r10,SPRN_DAR
297*b01c8b54SPaul Mackerras	mfspr	r9,SPRN_DSISR
298*b01c8b54SPaul Mackerras	srdi	r10,r10,60
299*b01c8b54SPaul Mackerras	rlwimi	r10,r9,16,0x20
300*b01c8b54SPaul Mackerras#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
301*b01c8b54SPaul Mackerras	lbz	r9,PACA_KVM_SVCPU+SVCPU_IN_GUEST(r13)
302*b01c8b54SPaul Mackerras	rlwimi	r10,r9,8,0x300
303*b01c8b54SPaul Mackerras#endif
304*b01c8b54SPaul Mackerras	mfcr	r9
305*b01c8b54SPaul Mackerras	cmpwi	r10,0x2c
306*b01c8b54SPaul Mackerras	beq	do_stab_bolted_pSeries
307*b01c8b54SPaul Mackerras	mtcrf	0x80,r9
308*b01c8b54SPaul Mackerras	ld	r9,PACA_EXSLB+EX_R9(r13)
309*b01c8b54SPaul Mackerras	ld	r10,PACA_EXSLB+EX_R10(r13)
310*b01c8b54SPaul Mackerras	b	data_access_not_stab
311*b01c8b54SPaul Mackerrasdo_stab_bolted_pSeries:
312*b01c8b54SPaul Mackerras	std	r11,PACA_EXSLB+EX_R11(r13)
313*b01c8b54SPaul Mackerras	std	r12,PACA_EXSLB+EX_R12(r13)
314*b01c8b54SPaul Mackerras	GET_SCRATCH0(r10)
315*b01c8b54SPaul Mackerras	std	r10,PACA_EXSLB+EX_R13(r13)
316*b01c8b54SPaul Mackerras	EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted, EXC_STD)
317*b01c8b54SPaul Mackerras#endif /* CONFIG_POWER4_ONLY */
318*b01c8b54SPaul Mackerras
319*b01c8b54SPaul Mackerras	KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300)
320*b01c8b54SPaul Mackerras	KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380)
321*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x400)
322*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXSLB, EXC_STD, 0x480)
323*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x900)
324*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x982)
325*b01c8b54SPaul Mackerras
326*b01c8b54SPaul Mackerras	.align	7
327b3e6b5dfSBenjamin Herrenschmidt	/* moved from 0xe00 */
328*b01c8b54SPaul Mackerras	STD_EXCEPTION_HV(., 0xe02, h_data_storage)
329*b01c8b54SPaul Mackerras	KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0xe02)
330*b01c8b54SPaul Mackerras	STD_EXCEPTION_HV(., 0xe22, h_instr_storage)
331*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe22)
332*b01c8b54SPaul Mackerras	STD_EXCEPTION_HV(., 0xe42, emulation_assist)
333*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe42)
334*b01c8b54SPaul Mackerras	STD_EXCEPTION_HV(., 0xe62, hmi_exception) /* need to flush cache ? */
335*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe62)
3360ebc4cdaSBenjamin Herrenschmidt
3370ebc4cdaSBenjamin Herrenschmidt	/* moved from 0xf00 */
338b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(., 0xf00, performance_monitor)
339*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xf00)
340b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(., 0xf20, altivec_unavailable)
341*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xf20)
342b3e6b5dfSBenjamin Herrenschmidt	STD_EXCEPTION_PSERIES(., 0xf40, vsx_unavailable)
343*b01c8b54SPaul Mackerras	KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xf40)
3440ebc4cdaSBenjamin Herrenschmidt
3450ebc4cdaSBenjamin Herrenschmidt/*
3460ebc4cdaSBenjamin Herrenschmidt * An interrupt came in while soft-disabled; clear EE in SRR1,
3470ebc4cdaSBenjamin Herrenschmidt * clear paca->hard_enabled and return.
3480ebc4cdaSBenjamin Herrenschmidt */
3490ebc4cdaSBenjamin Herrenschmidtmasked_interrupt:
3500ebc4cdaSBenjamin Herrenschmidt	stb	r10,PACAHARDIRQEN(r13)
3510ebc4cdaSBenjamin Herrenschmidt	mtcrf	0x80,r9
3520ebc4cdaSBenjamin Herrenschmidt	ld	r9,PACA_EXGEN+EX_R9(r13)
3530ebc4cdaSBenjamin Herrenschmidt	mfspr	r10,SPRN_SRR1
3540ebc4cdaSBenjamin Herrenschmidt	rldicl	r10,r10,48,1		/* clear MSR_EE */
3550ebc4cdaSBenjamin Herrenschmidt	rotldi	r10,r10,16
3560ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r10
3570ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACA_EXGEN+EX_R10(r13)
358673b189aSPaul Mackerras	GET_SCRATCH0(r13)
3590ebc4cdaSBenjamin Herrenschmidt	rfid
3600ebc4cdaSBenjamin Herrenschmidt	b	.
3610ebc4cdaSBenjamin Herrenschmidt
362a5d4f3adSBenjamin Herrenschmidtmasked_Hinterrupt:
363a5d4f3adSBenjamin Herrenschmidt	stb	r10,PACAHARDIRQEN(r13)
364a5d4f3adSBenjamin Herrenschmidt	mtcrf	0x80,r9
365a5d4f3adSBenjamin Herrenschmidt	ld	r9,PACA_EXGEN+EX_R9(r13)
366a5d4f3adSBenjamin Herrenschmidt	mfspr	r10,SPRN_HSRR1
367a5d4f3adSBenjamin Herrenschmidt	rldicl	r10,r10,48,1		/* clear MSR_EE */
368a5d4f3adSBenjamin Herrenschmidt	rotldi	r10,r10,16
369a5d4f3adSBenjamin Herrenschmidt	mtspr	SPRN_HSRR1,r10
370a5d4f3adSBenjamin Herrenschmidt	ld	r10,PACA_EXGEN+EX_R10(r13)
371673b189aSPaul Mackerras	GET_SCRATCH0(r13)
372a5d4f3adSBenjamin Herrenschmidt	hrfid
373a5d4f3adSBenjamin Herrenschmidt	b	.
374a5d4f3adSBenjamin Herrenschmidt
3750ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_PSERIES
3760ebc4cdaSBenjamin Herrenschmidt/*
3770ebc4cdaSBenjamin Herrenschmidt * Vectors for the FWNMI option.  Share common code.
3780ebc4cdaSBenjamin Herrenschmidt */
3790ebc4cdaSBenjamin Herrenschmidt	.globl system_reset_fwnmi
3800ebc4cdaSBenjamin Herrenschmidt      .align 7
3810ebc4cdaSBenjamin Herrenschmidtsystem_reset_fwnmi:
3820ebc4cdaSBenjamin Herrenschmidt	HMT_MEDIUM
383673b189aSPaul Mackerras	SET_SCRATCH0(r13)		/* save r13 */
384*b01c8b54SPaul Mackerras	EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD,
385*b01c8b54SPaul Mackerras				 NOTEST, 0x100)
3860ebc4cdaSBenjamin Herrenschmidt
3870ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_PSERIES */
3880ebc4cdaSBenjamin Herrenschmidt
3890ebc4cdaSBenjamin Herrenschmidt#ifdef __DISABLED__
3900ebc4cdaSBenjamin Herrenschmidt/*
3910ebc4cdaSBenjamin Herrenschmidt * This is used for when the SLB miss handler has to go virtual,
3920ebc4cdaSBenjamin Herrenschmidt * which doesn't happen for now anymore but will once we re-implement
3930ebc4cdaSBenjamin Herrenschmidt * dynamic VSIDs for shared page tables
3940ebc4cdaSBenjamin Herrenschmidt */
3950ebc4cdaSBenjamin Herrenschmidtslb_miss_user_pseries:
3960ebc4cdaSBenjamin Herrenschmidt	std	r10,PACA_EXGEN+EX_R10(r13)
3970ebc4cdaSBenjamin Herrenschmidt	std	r11,PACA_EXGEN+EX_R11(r13)
3980ebc4cdaSBenjamin Herrenschmidt	std	r12,PACA_EXGEN+EX_R12(r13)
399673b189aSPaul Mackerras	GET_SCRATCH0(r10)
4000ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACA_EXSLB+EX_R9(r13)
4010ebc4cdaSBenjamin Herrenschmidt	ld	r12,PACA_EXSLB+EX_R3(r13)
4020ebc4cdaSBenjamin Herrenschmidt	std	r10,PACA_EXGEN+EX_R13(r13)
4030ebc4cdaSBenjamin Herrenschmidt	std	r11,PACA_EXGEN+EX_R9(r13)
4040ebc4cdaSBenjamin Herrenschmidt	std	r12,PACA_EXGEN+EX_R3(r13)
4050ebc4cdaSBenjamin Herrenschmidt	clrrdi	r12,r13,32
4060ebc4cdaSBenjamin Herrenschmidt	mfmsr	r10
4070ebc4cdaSBenjamin Herrenschmidt	mfspr	r11,SRR0			/* save SRR0 */
4080ebc4cdaSBenjamin Herrenschmidt	ori	r12,r12,slb_miss_user_common@l	/* virt addr of handler */
4090ebc4cdaSBenjamin Herrenschmidt	ori	r10,r10,MSR_IR|MSR_DR|MSR_RI
4100ebc4cdaSBenjamin Herrenschmidt	mtspr	SRR0,r12
4110ebc4cdaSBenjamin Herrenschmidt	mfspr	r12,SRR1			/* and SRR1 */
4120ebc4cdaSBenjamin Herrenschmidt	mtspr	SRR1,r10
4130ebc4cdaSBenjamin Herrenschmidt	rfid
4140ebc4cdaSBenjamin Herrenschmidt	b	.				/* prevent spec. execution */
4150ebc4cdaSBenjamin Herrenschmidt#endif /* __DISABLED__ */
4160ebc4cdaSBenjamin Herrenschmidt
417a58ddea5SAlexander Graf/* KVM's trampoline code needs to be close to the interrupt handlers */
418a58ddea5SAlexander Graf
419a58ddea5SAlexander Graf#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
420a58ddea5SAlexander Graf#include "../kvm/book3s_rmhandlers.S"
421a58ddea5SAlexander Graf#endif
422a58ddea5SAlexander Graf
4230ebc4cdaSBenjamin Herrenschmidt	.align	7
4240ebc4cdaSBenjamin Herrenschmidt	.globl	__end_interrupts
4250ebc4cdaSBenjamin Herrenschmidt__end_interrupts:
4260ebc4cdaSBenjamin Herrenschmidt
4270ebc4cdaSBenjamin Herrenschmidt/*
4280ebc4cdaSBenjamin Herrenschmidt * Code from here down to __end_handlers is invoked from the
4290ebc4cdaSBenjamin Herrenschmidt * exception prologs above.  Because the prologs assemble the
4300ebc4cdaSBenjamin Herrenschmidt * addresses of these handlers using the LOAD_HANDLER macro,
4310ebc4cdaSBenjamin Herrenschmidt * which uses an addi instruction, these handlers must be in
4320ebc4cdaSBenjamin Herrenschmidt * the first 32k of the kernel image.
4330ebc4cdaSBenjamin Herrenschmidt */
4340ebc4cdaSBenjamin Herrenschmidt
4350ebc4cdaSBenjamin Herrenschmidt/*** Common interrupt handlers ***/
4360ebc4cdaSBenjamin Herrenschmidt
4370ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x100, system_reset, .system_reset_exception)
4380ebc4cdaSBenjamin Herrenschmidt
4390ebc4cdaSBenjamin Herrenschmidt	/*
4400ebc4cdaSBenjamin Herrenschmidt	 * Machine check is different because we use a different
4410ebc4cdaSBenjamin Herrenschmidt	 * save area: PACA_EXMC instead of PACA_EXGEN.
4420ebc4cdaSBenjamin Herrenschmidt	 */
4430ebc4cdaSBenjamin Herrenschmidt	.align	7
4440ebc4cdaSBenjamin Herrenschmidt	.globl machine_check_common
4450ebc4cdaSBenjamin Herrenschmidtmachine_check_common:
4460ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC)
4470ebc4cdaSBenjamin Herrenschmidt	FINISH_NAP
4480ebc4cdaSBenjamin Herrenschmidt	DISABLE_INTS
4490ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
4500ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
4510ebc4cdaSBenjamin Herrenschmidt	bl	.machine_check_exception
4520ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
4530ebc4cdaSBenjamin Herrenschmidt
4540ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON_LITE(0x900, decrementer, .timer_interrupt)
4550ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0xa00, trap_0a, .unknown_exception)
4560ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception)
4570ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception)
4580ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception)
459b3e6b5dfSBenjamin Herrenschmidt        STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception)
460b3e6b5dfSBenjamin Herrenschmidt        STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception)
4610ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON_IDLE(0xf00, performance_monitor, .performance_monitor_exception)
4620ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception)
4630ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_ALTIVEC
4640ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x1700, altivec_assist, .altivec_assist_exception)
4650ebc4cdaSBenjamin Herrenschmidt#else
4660ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception)
4670ebc4cdaSBenjamin Herrenschmidt#endif
4680ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_CBE_RAS
4690ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x1200, cbe_system_error, .cbe_system_error_exception)
4700ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x1600, cbe_maintenance, .cbe_maintenance_exception)
4710ebc4cdaSBenjamin Herrenschmidt	STD_EXCEPTION_COMMON(0x1800, cbe_thermal, .cbe_thermal_exception)
4720ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_CBE_RAS */
4730ebc4cdaSBenjamin Herrenschmidt
4740ebc4cdaSBenjamin Herrenschmidt	.align	7
4750ebc4cdaSBenjamin Herrenschmidtsystem_call_entry:
4760ebc4cdaSBenjamin Herrenschmidt	b	system_call_common
4770ebc4cdaSBenjamin Herrenschmidt
4780ebc4cdaSBenjamin Herrenschmidt/*
4790ebc4cdaSBenjamin Herrenschmidt * Here we have detected that the kernel stack pointer is bad.
4800ebc4cdaSBenjamin Herrenschmidt * R9 contains the saved CR, r13 points to the paca,
4810ebc4cdaSBenjamin Herrenschmidt * r10 contains the (bad) kernel stack pointer,
4820ebc4cdaSBenjamin Herrenschmidt * r11 and r12 contain the saved SRR0 and SRR1.
4830ebc4cdaSBenjamin Herrenschmidt * We switch to using an emergency stack, save the registers there,
4840ebc4cdaSBenjamin Herrenschmidt * and call kernel_bad_stack(), which panics.
4850ebc4cdaSBenjamin Herrenschmidt */
4860ebc4cdaSBenjamin Herrenschmidtbad_stack:
4870ebc4cdaSBenjamin Herrenschmidt	ld	r1,PACAEMERGSP(r13)
4880ebc4cdaSBenjamin Herrenschmidt	subi	r1,r1,64+INT_FRAME_SIZE
4890ebc4cdaSBenjamin Herrenschmidt	std	r9,_CCR(r1)
4900ebc4cdaSBenjamin Herrenschmidt	std	r10,GPR1(r1)
4910ebc4cdaSBenjamin Herrenschmidt	std	r11,_NIP(r1)
4920ebc4cdaSBenjamin Herrenschmidt	std	r12,_MSR(r1)
4930ebc4cdaSBenjamin Herrenschmidt	mfspr	r11,SPRN_DAR
4940ebc4cdaSBenjamin Herrenschmidt	mfspr	r12,SPRN_DSISR
4950ebc4cdaSBenjamin Herrenschmidt	std	r11,_DAR(r1)
4960ebc4cdaSBenjamin Herrenschmidt	std	r12,_DSISR(r1)
4970ebc4cdaSBenjamin Herrenschmidt	mflr	r10
4980ebc4cdaSBenjamin Herrenschmidt	mfctr	r11
4990ebc4cdaSBenjamin Herrenschmidt	mfxer	r12
5000ebc4cdaSBenjamin Herrenschmidt	std	r10,_LINK(r1)
5010ebc4cdaSBenjamin Herrenschmidt	std	r11,_CTR(r1)
5020ebc4cdaSBenjamin Herrenschmidt	std	r12,_XER(r1)
5030ebc4cdaSBenjamin Herrenschmidt	SAVE_GPR(0,r1)
5040ebc4cdaSBenjamin Herrenschmidt	SAVE_GPR(2,r1)
5051977b502SPaul Mackerras	ld	r10,EX_R3(r3)
5061977b502SPaul Mackerras	std	r10,GPR3(r1)
5071977b502SPaul Mackerras	SAVE_GPR(4,r1)
5081977b502SPaul Mackerras	SAVE_4GPRS(5,r1)
5091977b502SPaul Mackerras	ld	r9,EX_R9(r3)
5101977b502SPaul Mackerras	ld	r10,EX_R10(r3)
5111977b502SPaul Mackerras	SAVE_2GPRS(9,r1)
5121977b502SPaul Mackerras	ld	r9,EX_R11(r3)
5131977b502SPaul Mackerras	ld	r10,EX_R12(r3)
5141977b502SPaul Mackerras	ld	r11,EX_R13(r3)
5151977b502SPaul Mackerras	std	r9,GPR11(r1)
5161977b502SPaul Mackerras	std	r10,GPR12(r1)
5171977b502SPaul Mackerras	std	r11,GPR13(r1)
51848404f2eSPaul MackerrasBEGIN_FTR_SECTION
51948404f2eSPaul Mackerras	ld	r10,EX_CFAR(r3)
52048404f2eSPaul Mackerras	std	r10,ORIG_GPR3(r1)
52148404f2eSPaul MackerrasEND_FTR_SECTION_IFSET(CPU_FTR_CFAR)
5221977b502SPaul Mackerras	SAVE_8GPRS(14,r1)
5230ebc4cdaSBenjamin Herrenschmidt	SAVE_10GPRS(22,r1)
5240ebc4cdaSBenjamin Herrenschmidt	lhz	r12,PACA_TRAP_SAVE(r13)
5250ebc4cdaSBenjamin Herrenschmidt	std	r12,_TRAP(r1)
5260ebc4cdaSBenjamin Herrenschmidt	addi	r11,r1,INT_FRAME_SIZE
5270ebc4cdaSBenjamin Herrenschmidt	std	r11,0(r1)
5280ebc4cdaSBenjamin Herrenschmidt	li	r12,0
5290ebc4cdaSBenjamin Herrenschmidt	std	r12,0(r11)
5300ebc4cdaSBenjamin Herrenschmidt	ld	r2,PACATOC(r13)
5311977b502SPaul Mackerras	ld	r11,exception_marker@toc(r2)
5321977b502SPaul Mackerras	std	r12,RESULT(r1)
5331977b502SPaul Mackerras	std	r11,STACK_FRAME_OVERHEAD-16(r1)
5340ebc4cdaSBenjamin Herrenschmidt1:	addi	r3,r1,STACK_FRAME_OVERHEAD
5350ebc4cdaSBenjamin Herrenschmidt	bl	.kernel_bad_stack
5360ebc4cdaSBenjamin Herrenschmidt	b	1b
5370ebc4cdaSBenjamin Herrenschmidt
5380ebc4cdaSBenjamin Herrenschmidt/*
5390ebc4cdaSBenjamin Herrenschmidt * Here r13 points to the paca, r9 contains the saved CR,
5400ebc4cdaSBenjamin Herrenschmidt * SRR0 and SRR1 are saved in r11 and r12,
5410ebc4cdaSBenjamin Herrenschmidt * r9 - r13 are saved in paca->exgen.
5420ebc4cdaSBenjamin Herrenschmidt */
5430ebc4cdaSBenjamin Herrenschmidt	.align	7
5440ebc4cdaSBenjamin Herrenschmidt	.globl data_access_common
5450ebc4cdaSBenjamin Herrenschmidtdata_access_common:
5460ebc4cdaSBenjamin Herrenschmidt	mfspr	r10,SPRN_DAR
5470ebc4cdaSBenjamin Herrenschmidt	std	r10,PACA_EXGEN+EX_DAR(r13)
5480ebc4cdaSBenjamin Herrenschmidt	mfspr	r10,SPRN_DSISR
5490ebc4cdaSBenjamin Herrenschmidt	stw	r10,PACA_EXGEN+EX_DSISR(r13)
5500ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x300, PACA_EXGEN)
5510ebc4cdaSBenjamin Herrenschmidt	ld	r3,PACA_EXGEN+EX_DAR(r13)
5520ebc4cdaSBenjamin Herrenschmidt	lwz	r4,PACA_EXGEN+EX_DSISR(r13)
5530ebc4cdaSBenjamin Herrenschmidt	li	r5,0x300
5540ebc4cdaSBenjamin Herrenschmidt	b	.do_hash_page	 	/* Try to handle as hpte fault */
5550ebc4cdaSBenjamin Herrenschmidt
5560ebc4cdaSBenjamin Herrenschmidt	.align  7
557b3e6b5dfSBenjamin Herrenschmidt        .globl  h_data_storage_common
558b3e6b5dfSBenjamin Herrenschmidth_data_storage_common:
559b3e6b5dfSBenjamin Herrenschmidt        mfspr   r10,SPRN_HDAR
560b3e6b5dfSBenjamin Herrenschmidt        std     r10,PACA_EXGEN+EX_DAR(r13)
561b3e6b5dfSBenjamin Herrenschmidt        mfspr   r10,SPRN_HDSISR
562b3e6b5dfSBenjamin Herrenschmidt        stw     r10,PACA_EXGEN+EX_DSISR(r13)
563b3e6b5dfSBenjamin Herrenschmidt        EXCEPTION_PROLOG_COMMON(0xe00, PACA_EXGEN)
564b3e6b5dfSBenjamin Herrenschmidt        bl      .save_nvgprs
565b3e6b5dfSBenjamin Herrenschmidt        addi    r3,r1,STACK_FRAME_OVERHEAD
566b3e6b5dfSBenjamin Herrenschmidt        bl      .unknown_exception
567b3e6b5dfSBenjamin Herrenschmidt        b       .ret_from_except
568b3e6b5dfSBenjamin Herrenschmidt
569b3e6b5dfSBenjamin Herrenschmidt	.align	7
5700ebc4cdaSBenjamin Herrenschmidt	.globl instruction_access_common
5710ebc4cdaSBenjamin Herrenschmidtinstruction_access_common:
5720ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x400, PACA_EXGEN)
5730ebc4cdaSBenjamin Herrenschmidt	ld	r3,_NIP(r1)
5740ebc4cdaSBenjamin Herrenschmidt	andis.	r4,r12,0x5820
5750ebc4cdaSBenjamin Herrenschmidt	li	r5,0x400
5760ebc4cdaSBenjamin Herrenschmidt	b	.do_hash_page		/* Try to handle as hpte fault */
5770ebc4cdaSBenjamin Herrenschmidt
578b3e6b5dfSBenjamin Herrenschmidt        STD_EXCEPTION_COMMON(0xe20, h_instr_storage, .unknown_exception)
579b3e6b5dfSBenjamin Herrenschmidt
5800ebc4cdaSBenjamin Herrenschmidt/*
5810ebc4cdaSBenjamin Herrenschmidt * Here is the common SLB miss user that is used when going to virtual
5820ebc4cdaSBenjamin Herrenschmidt * mode for SLB misses, that is currently not used
5830ebc4cdaSBenjamin Herrenschmidt */
5840ebc4cdaSBenjamin Herrenschmidt#ifdef __DISABLED__
5850ebc4cdaSBenjamin Herrenschmidt	.align	7
5860ebc4cdaSBenjamin Herrenschmidt	.globl	slb_miss_user_common
5870ebc4cdaSBenjamin Herrenschmidtslb_miss_user_common:
5880ebc4cdaSBenjamin Herrenschmidt	mflr	r10
5890ebc4cdaSBenjamin Herrenschmidt	std	r3,PACA_EXGEN+EX_DAR(r13)
5900ebc4cdaSBenjamin Herrenschmidt	stw	r9,PACA_EXGEN+EX_CCR(r13)
5910ebc4cdaSBenjamin Herrenschmidt	std	r10,PACA_EXGEN+EX_LR(r13)
5920ebc4cdaSBenjamin Herrenschmidt	std	r11,PACA_EXGEN+EX_SRR0(r13)
5930ebc4cdaSBenjamin Herrenschmidt	bl	.slb_allocate_user
5940ebc4cdaSBenjamin Herrenschmidt
5950ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACA_EXGEN+EX_LR(r13)
5960ebc4cdaSBenjamin Herrenschmidt	ld	r3,PACA_EXGEN+EX_R3(r13)
5970ebc4cdaSBenjamin Herrenschmidt	lwz	r9,PACA_EXGEN+EX_CCR(r13)
5980ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACA_EXGEN+EX_SRR0(r13)
5990ebc4cdaSBenjamin Herrenschmidt	mtlr	r10
6000ebc4cdaSBenjamin Herrenschmidt	beq-	slb_miss_fault
6010ebc4cdaSBenjamin Herrenschmidt
6020ebc4cdaSBenjamin Herrenschmidt	andi.	r10,r12,MSR_RI		/* check for unrecoverable exception */
6030ebc4cdaSBenjamin Herrenschmidt	beq-	unrecov_user_slb
6040ebc4cdaSBenjamin Herrenschmidt	mfmsr	r10
6050ebc4cdaSBenjamin Herrenschmidt
6060ebc4cdaSBenjamin Herrenschmidt.machine push
6070ebc4cdaSBenjamin Herrenschmidt.machine "power4"
6080ebc4cdaSBenjamin Herrenschmidt	mtcrf	0x80,r9
6090ebc4cdaSBenjamin Herrenschmidt.machine pop
6100ebc4cdaSBenjamin Herrenschmidt
6110ebc4cdaSBenjamin Herrenschmidt	clrrdi	r10,r10,2		/* clear RI before setting SRR0/1 */
6120ebc4cdaSBenjamin Herrenschmidt	mtmsrd	r10,1
6130ebc4cdaSBenjamin Herrenschmidt
6140ebc4cdaSBenjamin Herrenschmidt	mtspr	SRR0,r11
6150ebc4cdaSBenjamin Herrenschmidt	mtspr	SRR1,r12
6160ebc4cdaSBenjamin Herrenschmidt
6170ebc4cdaSBenjamin Herrenschmidt	ld	r9,PACA_EXGEN+EX_R9(r13)
6180ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACA_EXGEN+EX_R10(r13)
6190ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACA_EXGEN+EX_R11(r13)
6200ebc4cdaSBenjamin Herrenschmidt	ld	r12,PACA_EXGEN+EX_R12(r13)
6210ebc4cdaSBenjamin Herrenschmidt	ld	r13,PACA_EXGEN+EX_R13(r13)
6220ebc4cdaSBenjamin Herrenschmidt	rfid
6230ebc4cdaSBenjamin Herrenschmidt	b	.
6240ebc4cdaSBenjamin Herrenschmidt
6250ebc4cdaSBenjamin Herrenschmidtslb_miss_fault:
6260ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x380, PACA_EXGEN)
6270ebc4cdaSBenjamin Herrenschmidt	ld	r4,PACA_EXGEN+EX_DAR(r13)
6280ebc4cdaSBenjamin Herrenschmidt	li	r5,0
6290ebc4cdaSBenjamin Herrenschmidt	std	r4,_DAR(r1)
6300ebc4cdaSBenjamin Herrenschmidt	std	r5,_DSISR(r1)
6310ebc4cdaSBenjamin Herrenschmidt	b	handle_page_fault
6320ebc4cdaSBenjamin Herrenschmidt
6330ebc4cdaSBenjamin Herrenschmidtunrecov_user_slb:
6340ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x4200, PACA_EXGEN)
6350ebc4cdaSBenjamin Herrenschmidt	DISABLE_INTS
6360ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
6370ebc4cdaSBenjamin Herrenschmidt1:	addi	r3,r1,STACK_FRAME_OVERHEAD
6380ebc4cdaSBenjamin Herrenschmidt	bl	.unrecoverable_exception
6390ebc4cdaSBenjamin Herrenschmidt	b	1b
6400ebc4cdaSBenjamin Herrenschmidt
6410ebc4cdaSBenjamin Herrenschmidt#endif /* __DISABLED__ */
6420ebc4cdaSBenjamin Herrenschmidt
6430ebc4cdaSBenjamin Herrenschmidt
6440ebc4cdaSBenjamin Herrenschmidt/*
6450ebc4cdaSBenjamin Herrenschmidt * r13 points to the PACA, r9 contains the saved CR,
6460ebc4cdaSBenjamin Herrenschmidt * r12 contain the saved SRR1, SRR0 is still ready for return
6470ebc4cdaSBenjamin Herrenschmidt * r3 has the faulting address
6480ebc4cdaSBenjamin Herrenschmidt * r9 - r13 are saved in paca->exslb.
6490ebc4cdaSBenjamin Herrenschmidt * r3 is saved in paca->slb_r3
6500ebc4cdaSBenjamin Herrenschmidt * We assume we aren't going to take any exceptions during this procedure.
6510ebc4cdaSBenjamin Herrenschmidt */
6520ebc4cdaSBenjamin Herrenschmidt_GLOBAL(slb_miss_realmode)
6530ebc4cdaSBenjamin Herrenschmidt	mflr	r10
6540ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_RELOCATABLE
6550ebc4cdaSBenjamin Herrenschmidt	mtctr	r11
6560ebc4cdaSBenjamin Herrenschmidt#endif
6570ebc4cdaSBenjamin Herrenschmidt
6580ebc4cdaSBenjamin Herrenschmidt	stw	r9,PACA_EXSLB+EX_CCR(r13)	/* save CR in exc. frame */
6590ebc4cdaSBenjamin Herrenschmidt	std	r10,PACA_EXSLB+EX_LR(r13)	/* save LR */
6600ebc4cdaSBenjamin Herrenschmidt
6610ebc4cdaSBenjamin Herrenschmidt	bl	.slb_allocate_realmode
6620ebc4cdaSBenjamin Herrenschmidt
6630ebc4cdaSBenjamin Herrenschmidt	/* All done -- return from exception. */
6640ebc4cdaSBenjamin Herrenschmidt
6650ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACA_EXSLB+EX_LR(r13)
6660ebc4cdaSBenjamin Herrenschmidt	ld	r3,PACA_EXSLB+EX_R3(r13)
6670ebc4cdaSBenjamin Herrenschmidt	lwz	r9,PACA_EXSLB+EX_CCR(r13)	/* get saved CR */
6680ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_ISERIES
6690ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION
6700ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACALPPACAPTR(r13)
6710ebc4cdaSBenjamin Herrenschmidt	ld	r11,LPPACASRR0(r11)		/* get SRR0 value */
6720ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
6730ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_ISERIES */
6740ebc4cdaSBenjamin Herrenschmidt
6750ebc4cdaSBenjamin Herrenschmidt	mtlr	r10
6760ebc4cdaSBenjamin Herrenschmidt
6770ebc4cdaSBenjamin Herrenschmidt	andi.	r10,r12,MSR_RI	/* check for unrecoverable exception */
6780ebc4cdaSBenjamin Herrenschmidt	beq-	2f
6790ebc4cdaSBenjamin Herrenschmidt
6800ebc4cdaSBenjamin Herrenschmidt.machine	push
6810ebc4cdaSBenjamin Herrenschmidt.machine	"power4"
6820ebc4cdaSBenjamin Herrenschmidt	mtcrf	0x80,r9
6830ebc4cdaSBenjamin Herrenschmidt	mtcrf	0x01,r9		/* slb_allocate uses cr0 and cr7 */
6840ebc4cdaSBenjamin Herrenschmidt.machine	pop
6850ebc4cdaSBenjamin Herrenschmidt
6860ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_ISERIES
6870ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION
6880ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR0,r11
6890ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r12
6900ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
6910ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_ISERIES */
6920ebc4cdaSBenjamin Herrenschmidt	ld	r9,PACA_EXSLB+EX_R9(r13)
6930ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACA_EXSLB+EX_R10(r13)
6940ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACA_EXSLB+EX_R11(r13)
6950ebc4cdaSBenjamin Herrenschmidt	ld	r12,PACA_EXSLB+EX_R12(r13)
6960ebc4cdaSBenjamin Herrenschmidt	ld	r13,PACA_EXSLB+EX_R13(r13)
6970ebc4cdaSBenjamin Herrenschmidt	rfid
6980ebc4cdaSBenjamin Herrenschmidt	b	.	/* prevent speculative execution */
6990ebc4cdaSBenjamin Herrenschmidt
7000ebc4cdaSBenjamin Herrenschmidt2:
7010ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_ISERIES
7020ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION
7030ebc4cdaSBenjamin Herrenschmidt	b	unrecov_slb
7040ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
7050ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_ISERIES */
7060ebc4cdaSBenjamin Herrenschmidt	mfspr	r11,SPRN_SRR0
7070ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACAKBASE(r13)
7080ebc4cdaSBenjamin Herrenschmidt	LOAD_HANDLER(r10,unrecov_slb)
7090ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR0,r10
7100ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACAKMSR(r13)
7110ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r10
7120ebc4cdaSBenjamin Herrenschmidt	rfid
7130ebc4cdaSBenjamin Herrenschmidt	b	.
7140ebc4cdaSBenjamin Herrenschmidt
7150ebc4cdaSBenjamin Herrenschmidtunrecov_slb:
7160ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB)
7170ebc4cdaSBenjamin Herrenschmidt	DISABLE_INTS
7180ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
7190ebc4cdaSBenjamin Herrenschmidt1:	addi	r3,r1,STACK_FRAME_OVERHEAD
7200ebc4cdaSBenjamin Herrenschmidt	bl	.unrecoverable_exception
7210ebc4cdaSBenjamin Herrenschmidt	b	1b
7220ebc4cdaSBenjamin Herrenschmidt
7230ebc4cdaSBenjamin Herrenschmidt	.align	7
7240ebc4cdaSBenjamin Herrenschmidt	.globl hardware_interrupt_common
7250ebc4cdaSBenjamin Herrenschmidt	.globl hardware_interrupt_entry
7260ebc4cdaSBenjamin Herrenschmidthardware_interrupt_common:
7270ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x500, PACA_EXGEN)
7280ebc4cdaSBenjamin Herrenschmidt	FINISH_NAP
7290ebc4cdaSBenjamin Herrenschmidthardware_interrupt_entry:
7300ebc4cdaSBenjamin Herrenschmidt	DISABLE_INTS
7310ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION
7320ebc4cdaSBenjamin Herrenschmidt	bl	.ppc64_runlatch_on
7330ebc4cdaSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_CTRL)
7340ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
7350ebc4cdaSBenjamin Herrenschmidt	bl	.do_IRQ
7360ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except_lite
7370ebc4cdaSBenjamin Herrenschmidt
7380ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_970_NAP
7390ebc4cdaSBenjamin Herrenschmidtpower4_fixup_nap:
7400ebc4cdaSBenjamin Herrenschmidt	andc	r9,r9,r10
7410ebc4cdaSBenjamin Herrenschmidt	std	r9,TI_LOCAL_FLAGS(r11)
7420ebc4cdaSBenjamin Herrenschmidt	ld	r10,_LINK(r1)		/* make idle task do the */
7430ebc4cdaSBenjamin Herrenschmidt	std	r10,_NIP(r1)		/* equivalent of a blr */
7440ebc4cdaSBenjamin Herrenschmidt	blr
7450ebc4cdaSBenjamin Herrenschmidt#endif
7460ebc4cdaSBenjamin Herrenschmidt
7470ebc4cdaSBenjamin Herrenschmidt	.align	7
7480ebc4cdaSBenjamin Herrenschmidt	.globl alignment_common
7490ebc4cdaSBenjamin Herrenschmidtalignment_common:
7500ebc4cdaSBenjamin Herrenschmidt	mfspr	r10,SPRN_DAR
7510ebc4cdaSBenjamin Herrenschmidt	std	r10,PACA_EXGEN+EX_DAR(r13)
7520ebc4cdaSBenjamin Herrenschmidt	mfspr	r10,SPRN_DSISR
7530ebc4cdaSBenjamin Herrenschmidt	stw	r10,PACA_EXGEN+EX_DSISR(r13)
7540ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x600, PACA_EXGEN)
7550ebc4cdaSBenjamin Herrenschmidt	ld	r3,PACA_EXGEN+EX_DAR(r13)
7560ebc4cdaSBenjamin Herrenschmidt	lwz	r4,PACA_EXGEN+EX_DSISR(r13)
7570ebc4cdaSBenjamin Herrenschmidt	std	r3,_DAR(r1)
7580ebc4cdaSBenjamin Herrenschmidt	std	r4,_DSISR(r1)
7590ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
7600ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
7610ebc4cdaSBenjamin Herrenschmidt	ENABLE_INTS
7620ebc4cdaSBenjamin Herrenschmidt	bl	.alignment_exception
7630ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
7640ebc4cdaSBenjamin Herrenschmidt
7650ebc4cdaSBenjamin Herrenschmidt	.align	7
7660ebc4cdaSBenjamin Herrenschmidt	.globl program_check_common
7670ebc4cdaSBenjamin Herrenschmidtprogram_check_common:
7680ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN)
7690ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
7700ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
7710ebc4cdaSBenjamin Herrenschmidt	ENABLE_INTS
7720ebc4cdaSBenjamin Herrenschmidt	bl	.program_check_exception
7730ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
7740ebc4cdaSBenjamin Herrenschmidt
7750ebc4cdaSBenjamin Herrenschmidt	.align	7
7760ebc4cdaSBenjamin Herrenschmidt	.globl fp_unavailable_common
7770ebc4cdaSBenjamin Herrenschmidtfp_unavailable_common:
7780ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0x800, PACA_EXGEN)
7790ebc4cdaSBenjamin Herrenschmidt	bne	1f			/* if from user, just load it up */
7800ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
7810ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
7820ebc4cdaSBenjamin Herrenschmidt	ENABLE_INTS
7830ebc4cdaSBenjamin Herrenschmidt	bl	.kernel_fp_unavailable_exception
7840ebc4cdaSBenjamin Herrenschmidt	BUG_OPCODE
7850ebc4cdaSBenjamin Herrenschmidt1:	bl	.load_up_fpu
7860ebc4cdaSBenjamin Herrenschmidt	b	fast_exception_return
7870ebc4cdaSBenjamin Herrenschmidt
7880ebc4cdaSBenjamin Herrenschmidt	.align	7
7890ebc4cdaSBenjamin Herrenschmidt	.globl altivec_unavailable_common
7900ebc4cdaSBenjamin Herrenschmidtaltivec_unavailable_common:
7910ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0xf20, PACA_EXGEN)
7920ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_ALTIVEC
7930ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION
7940ebc4cdaSBenjamin Herrenschmidt	beq	1f
7950ebc4cdaSBenjamin Herrenschmidt	bl	.load_up_altivec
7960ebc4cdaSBenjamin Herrenschmidt	b	fast_exception_return
7970ebc4cdaSBenjamin Herrenschmidt1:
7980ebc4cdaSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
7990ebc4cdaSBenjamin Herrenschmidt#endif
8000ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
8010ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
8020ebc4cdaSBenjamin Herrenschmidt	ENABLE_INTS
8030ebc4cdaSBenjamin Herrenschmidt	bl	.altivec_unavailable_exception
8040ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
8050ebc4cdaSBenjamin Herrenschmidt
8060ebc4cdaSBenjamin Herrenschmidt	.align	7
8070ebc4cdaSBenjamin Herrenschmidt	.globl vsx_unavailable_common
8080ebc4cdaSBenjamin Herrenschmidtvsx_unavailable_common:
8090ebc4cdaSBenjamin Herrenschmidt	EXCEPTION_PROLOG_COMMON(0xf40, PACA_EXGEN)
8100ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_VSX
8110ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION
8120ebc4cdaSBenjamin Herrenschmidt	bne	.load_up_vsx
8130ebc4cdaSBenjamin Herrenschmidt1:
8140ebc4cdaSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_VSX)
8150ebc4cdaSBenjamin Herrenschmidt#endif
8160ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
8170ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
8180ebc4cdaSBenjamin Herrenschmidt	ENABLE_INTS
8190ebc4cdaSBenjamin Herrenschmidt	bl	.vsx_unavailable_exception
8200ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
8210ebc4cdaSBenjamin Herrenschmidt
8220ebc4cdaSBenjamin Herrenschmidt	.align	7
8230ebc4cdaSBenjamin Herrenschmidt	.globl	__end_handlers
8240ebc4cdaSBenjamin Herrenschmidt__end_handlers:
8250ebc4cdaSBenjamin Herrenschmidt
8260ebc4cdaSBenjamin Herrenschmidt/*
8270ebc4cdaSBenjamin Herrenschmidt * Return from an exception with minimal checks.
8280ebc4cdaSBenjamin Herrenschmidt * The caller is assumed to have done EXCEPTION_PROLOG_COMMON.
8290ebc4cdaSBenjamin Herrenschmidt * If interrupts have been enabled, or anything has been
8300ebc4cdaSBenjamin Herrenschmidt * done that might have changed the scheduling status of
8310ebc4cdaSBenjamin Herrenschmidt * any task or sent any task a signal, you should use
8320ebc4cdaSBenjamin Herrenschmidt * ret_from_except or ret_from_except_lite instead of this.
8330ebc4cdaSBenjamin Herrenschmidt */
8340ebc4cdaSBenjamin Herrenschmidtfast_exc_return_irq:			/* restores irq state too */
8350ebc4cdaSBenjamin Herrenschmidt	ld	r3,SOFTE(r1)
8360ebc4cdaSBenjamin Herrenschmidt	TRACE_AND_RESTORE_IRQ(r3);
8370ebc4cdaSBenjamin Herrenschmidt	ld	r12,_MSR(r1)
8380ebc4cdaSBenjamin Herrenschmidt	rldicl	r4,r12,49,63		/* get MSR_EE to LSB */
8390ebc4cdaSBenjamin Herrenschmidt	stb	r4,PACAHARDIRQEN(r13)	/* restore paca->hard_enabled */
8400ebc4cdaSBenjamin Herrenschmidt	b	1f
8410ebc4cdaSBenjamin Herrenschmidt
8420ebc4cdaSBenjamin Herrenschmidt	.globl	fast_exception_return
8430ebc4cdaSBenjamin Herrenschmidtfast_exception_return:
8440ebc4cdaSBenjamin Herrenschmidt	ld	r12,_MSR(r1)
8450ebc4cdaSBenjamin Herrenschmidt1:	ld	r11,_NIP(r1)
8460ebc4cdaSBenjamin Herrenschmidt	andi.	r3,r12,MSR_RI		/* check if RI is set */
8470ebc4cdaSBenjamin Herrenschmidt	beq-	unrecov_fer
8480ebc4cdaSBenjamin Herrenschmidt
8490ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_VIRT_CPU_ACCOUNTING
8500ebc4cdaSBenjamin Herrenschmidt	andi.	r3,r12,MSR_PR
8510ebc4cdaSBenjamin Herrenschmidt	beq	2f
8520ebc4cdaSBenjamin Herrenschmidt	ACCOUNT_CPU_USER_EXIT(r3, r4)
8530ebc4cdaSBenjamin Herrenschmidt2:
8540ebc4cdaSBenjamin Herrenschmidt#endif
8550ebc4cdaSBenjamin Herrenschmidt
8560ebc4cdaSBenjamin Herrenschmidt	ld	r3,_CCR(r1)
8570ebc4cdaSBenjamin Herrenschmidt	ld	r4,_LINK(r1)
8580ebc4cdaSBenjamin Herrenschmidt	ld	r5,_CTR(r1)
8590ebc4cdaSBenjamin Herrenschmidt	ld	r6,_XER(r1)
8600ebc4cdaSBenjamin Herrenschmidt	mtcr	r3
8610ebc4cdaSBenjamin Herrenschmidt	mtlr	r4
8620ebc4cdaSBenjamin Herrenschmidt	mtctr	r5
8630ebc4cdaSBenjamin Herrenschmidt	mtxer	r6
8640ebc4cdaSBenjamin Herrenschmidt	REST_GPR(0, r1)
8650ebc4cdaSBenjamin Herrenschmidt	REST_8GPRS(2, r1)
8660ebc4cdaSBenjamin Herrenschmidt
8670ebc4cdaSBenjamin Herrenschmidt	mfmsr	r10
8680ebc4cdaSBenjamin Herrenschmidt	rldicl	r10,r10,48,1		/* clear EE */
8690ebc4cdaSBenjamin Herrenschmidt	rldicr	r10,r10,16,61		/* clear RI (LE is 0 already) */
8700ebc4cdaSBenjamin Herrenschmidt	mtmsrd	r10,1
8710ebc4cdaSBenjamin Herrenschmidt
8720ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r12
8730ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR0,r11
8740ebc4cdaSBenjamin Herrenschmidt	REST_4GPRS(10, r1)
8750ebc4cdaSBenjamin Herrenschmidt	ld	r1,GPR1(r1)
8760ebc4cdaSBenjamin Herrenschmidt	rfid
8770ebc4cdaSBenjamin Herrenschmidt	b	.	/* prevent speculative execution */
8780ebc4cdaSBenjamin Herrenschmidt
8790ebc4cdaSBenjamin Herrenschmidtunrecov_fer:
8800ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
8810ebc4cdaSBenjamin Herrenschmidt1:	addi	r3,r1,STACK_FRAME_OVERHEAD
8820ebc4cdaSBenjamin Herrenschmidt	bl	.unrecoverable_exception
8830ebc4cdaSBenjamin Herrenschmidt	b	1b
8840ebc4cdaSBenjamin Herrenschmidt
8850ebc4cdaSBenjamin Herrenschmidt
8860ebc4cdaSBenjamin Herrenschmidt/*
8870ebc4cdaSBenjamin Herrenschmidt * Hash table stuff
8880ebc4cdaSBenjamin Herrenschmidt */
8890ebc4cdaSBenjamin Herrenschmidt	.align	7
8900ebc4cdaSBenjamin Herrenschmidt_STATIC(do_hash_page)
8910ebc4cdaSBenjamin Herrenschmidt	std	r3,_DAR(r1)
8920ebc4cdaSBenjamin Herrenschmidt	std	r4,_DSISR(r1)
8930ebc4cdaSBenjamin Herrenschmidt
8949c7cc234SK.Prasad	andis.	r0,r4,0xa410		/* weird error? */
8950ebc4cdaSBenjamin Herrenschmidt	bne-	handle_page_fault	/* if not, try to insert a HPTE */
8969c7cc234SK.Prasad	andis.  r0,r4,DSISR_DABRMATCH@h
8979c7cc234SK.Prasad	bne-    handle_dabr_fault
8989c7cc234SK.Prasad
8990ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION
9000ebc4cdaSBenjamin Herrenschmidt	andis.	r0,r4,0x0020		/* Is it a segment table fault? */
9010ebc4cdaSBenjamin Herrenschmidt	bne-	do_ste_alloc		/* If so handle it */
90244ae3ab3SMatt EvansEND_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB)
9030ebc4cdaSBenjamin Herrenschmidt
9049c1e1052SPaul Mackerras	clrrdi	r11,r1,THREAD_SHIFT
9059c1e1052SPaul Mackerras	lwz	r0,TI_PREEMPT(r11)	/* If we're in an "NMI" */
9069c1e1052SPaul Mackerras	andis.	r0,r0,NMI_MASK@h	/* (i.e. an irq when soft-disabled) */
9079c1e1052SPaul Mackerras	bne	77f			/* then don't call hash_page now */
9089c1e1052SPaul Mackerras
9090ebc4cdaSBenjamin Herrenschmidt	/*
9100ebc4cdaSBenjamin Herrenschmidt	 * On iSeries, we soft-disable interrupts here, then
9110ebc4cdaSBenjamin Herrenschmidt	 * hard-enable interrupts so that the hash_page code can spin on
9120ebc4cdaSBenjamin Herrenschmidt	 * the hash_table_lock without problems on a shared processor.
9130ebc4cdaSBenjamin Herrenschmidt	 */
9140ebc4cdaSBenjamin Herrenschmidt	DISABLE_INTS
9150ebc4cdaSBenjamin Herrenschmidt
9160ebc4cdaSBenjamin Herrenschmidt	/*
9170ebc4cdaSBenjamin Herrenschmidt	 * Currently, trace_hardirqs_off() will be called by DISABLE_INTS
9180ebc4cdaSBenjamin Herrenschmidt	 * and will clobber volatile registers when irq tracing is enabled
9190ebc4cdaSBenjamin Herrenschmidt	 * so we need to reload them. It may be possible to be smarter here
9200ebc4cdaSBenjamin Herrenschmidt	 * and move the irq tracing elsewhere but let's keep it simple for
9210ebc4cdaSBenjamin Herrenschmidt	 * now
9220ebc4cdaSBenjamin Herrenschmidt	 */
9230ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_TRACE_IRQFLAGS
9240ebc4cdaSBenjamin Herrenschmidt	ld	r3,_DAR(r1)
9250ebc4cdaSBenjamin Herrenschmidt	ld	r4,_DSISR(r1)
9260ebc4cdaSBenjamin Herrenschmidt	ld	r5,_TRAP(r1)
9270ebc4cdaSBenjamin Herrenschmidt	ld	r12,_MSR(r1)
9280ebc4cdaSBenjamin Herrenschmidt	clrrdi	r5,r5,4
9290ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_TRACE_IRQFLAGS */
9300ebc4cdaSBenjamin Herrenschmidt	/*
9310ebc4cdaSBenjamin Herrenschmidt	 * We need to set the _PAGE_USER bit if MSR_PR is set or if we are
9320ebc4cdaSBenjamin Herrenschmidt	 * accessing a userspace segment (even from the kernel). We assume
9330ebc4cdaSBenjamin Herrenschmidt	 * kernel addresses always have the high bit set.
9340ebc4cdaSBenjamin Herrenschmidt	 */
9350ebc4cdaSBenjamin Herrenschmidt	rlwinm	r4,r4,32-25+9,31-9,31-9	/* DSISR_STORE -> _PAGE_RW */
9360ebc4cdaSBenjamin Herrenschmidt	rotldi	r0,r3,15		/* Move high bit into MSR_PR posn */
9370ebc4cdaSBenjamin Herrenschmidt	orc	r0,r12,r0		/* MSR_PR | ~high_bit */
9380ebc4cdaSBenjamin Herrenschmidt	rlwimi	r4,r0,32-13,30,30	/* becomes _PAGE_USER access bit */
9390ebc4cdaSBenjamin Herrenschmidt	ori	r4,r4,1			/* add _PAGE_PRESENT */
9400ebc4cdaSBenjamin Herrenschmidt	rlwimi	r4,r5,22+2,31-2,31-2	/* Set _PAGE_EXEC if trap is 0x400 */
9410ebc4cdaSBenjamin Herrenschmidt
9420ebc4cdaSBenjamin Herrenschmidt	/*
9430ebc4cdaSBenjamin Herrenschmidt	 * r3 contains the faulting address
9440ebc4cdaSBenjamin Herrenschmidt	 * r4 contains the required access permissions
9450ebc4cdaSBenjamin Herrenschmidt	 * r5 contains the trap number
9460ebc4cdaSBenjamin Herrenschmidt	 *
9470ebc4cdaSBenjamin Herrenschmidt	 * at return r3 = 0 for success
9480ebc4cdaSBenjamin Herrenschmidt	 */
9490ebc4cdaSBenjamin Herrenschmidt	bl	.hash_page		/* build HPTE if possible */
9500ebc4cdaSBenjamin Herrenschmidt	cmpdi	r3,0			/* see if hash_page succeeded */
9510ebc4cdaSBenjamin Herrenschmidt
9520ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION
9530ebc4cdaSBenjamin Herrenschmidt	/*
9540ebc4cdaSBenjamin Herrenschmidt	 * If we had interrupts soft-enabled at the point where the
9550ebc4cdaSBenjamin Herrenschmidt	 * DSI/ISI occurred, and an interrupt came in during hash_page,
9560ebc4cdaSBenjamin Herrenschmidt	 * handle it now.
9570ebc4cdaSBenjamin Herrenschmidt	 * We jump to ret_from_except_lite rather than fast_exception_return
9580ebc4cdaSBenjamin Herrenschmidt	 * because ret_from_except_lite will check for and handle pending
9590ebc4cdaSBenjamin Herrenschmidt	 * interrupts if necessary.
9600ebc4cdaSBenjamin Herrenschmidt	 */
9610ebc4cdaSBenjamin Herrenschmidt	beq	13f
9620ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES)
9630ebc4cdaSBenjamin Herrenschmidt
9640ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION
9650ebc4cdaSBenjamin Herrenschmidt	/*
9660ebc4cdaSBenjamin Herrenschmidt	 * Here we have interrupts hard-disabled, so it is sufficient
9670ebc4cdaSBenjamin Herrenschmidt	 * to restore paca->{soft,hard}_enable and get out.
9680ebc4cdaSBenjamin Herrenschmidt	 */
9690ebc4cdaSBenjamin Herrenschmidt	beq	fast_exc_return_irq	/* Return from exception on success */
9700ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES)
9710ebc4cdaSBenjamin Herrenschmidt
9720ebc4cdaSBenjamin Herrenschmidt	/* For a hash failure, we don't bother re-enabling interrupts */
9730ebc4cdaSBenjamin Herrenschmidt	ble-	12f
9740ebc4cdaSBenjamin Herrenschmidt
9750ebc4cdaSBenjamin Herrenschmidt	/*
9760ebc4cdaSBenjamin Herrenschmidt	 * hash_page couldn't handle it, set soft interrupt enable back
977df9ee292SDavid Howells	 * to what it was before the trap.  Note that .arch_local_irq_restore
9780ebc4cdaSBenjamin Herrenschmidt	 * handles any interrupts pending at this point.
9790ebc4cdaSBenjamin Herrenschmidt	 */
9800ebc4cdaSBenjamin Herrenschmidt	ld	r3,SOFTE(r1)
9810ebc4cdaSBenjamin Herrenschmidt	TRACE_AND_RESTORE_IRQ_PARTIAL(r3, 11f)
982df9ee292SDavid Howells	bl	.arch_local_irq_restore
9830ebc4cdaSBenjamin Herrenschmidt	b	11f
9840ebc4cdaSBenjamin Herrenschmidt
9859c7cc234SK.Prasad/* We have a data breakpoint exception - handle it */
9869c7cc234SK.Prasadhandle_dabr_fault:
9875aae8a53SK.Prasad	bl	.save_nvgprs
9889c7cc234SK.Prasad	ld      r4,_DAR(r1)
9899c7cc234SK.Prasad	ld      r5,_DSISR(r1)
9909c7cc234SK.Prasad	addi    r3,r1,STACK_FRAME_OVERHEAD
9919c7cc234SK.Prasad	bl      .do_dabr
9929c7cc234SK.Prasad	b       .ret_from_except_lite
9939c7cc234SK.Prasad
9940ebc4cdaSBenjamin Herrenschmidt/* Here we have a page fault that hash_page can't handle. */
9950ebc4cdaSBenjamin Herrenschmidthandle_page_fault:
9960ebc4cdaSBenjamin Herrenschmidt	ENABLE_INTS
9970ebc4cdaSBenjamin Herrenschmidt11:	ld	r4,_DAR(r1)
9980ebc4cdaSBenjamin Herrenschmidt	ld	r5,_DSISR(r1)
9990ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
10000ebc4cdaSBenjamin Herrenschmidt	bl	.do_page_fault
10010ebc4cdaSBenjamin Herrenschmidt	cmpdi	r3,0
10020ebc4cdaSBenjamin Herrenschmidt	beq+	13f
10030ebc4cdaSBenjamin Herrenschmidt	bl	.save_nvgprs
10040ebc4cdaSBenjamin Herrenschmidt	mr	r5,r3
10050ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
10060ebc4cdaSBenjamin Herrenschmidt	lwz	r4,_DAR(r1)
10070ebc4cdaSBenjamin Herrenschmidt	bl	.bad_page_fault
10080ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
10090ebc4cdaSBenjamin Herrenschmidt
10100ebc4cdaSBenjamin Herrenschmidt13:	b	.ret_from_except_lite
10110ebc4cdaSBenjamin Herrenschmidt
10120ebc4cdaSBenjamin Herrenschmidt/* We have a page fault that hash_page could handle but HV refused
10130ebc4cdaSBenjamin Herrenschmidt * the PTE insertion
10140ebc4cdaSBenjamin Herrenschmidt */
10150ebc4cdaSBenjamin Herrenschmidt12:	bl	.save_nvgprs
10160ebc4cdaSBenjamin Herrenschmidt	mr	r5,r3
10170ebc4cdaSBenjamin Herrenschmidt	addi	r3,r1,STACK_FRAME_OVERHEAD
10180ebc4cdaSBenjamin Herrenschmidt	ld	r4,_DAR(r1)
10190ebc4cdaSBenjamin Herrenschmidt	bl	.low_hash_fault
10200ebc4cdaSBenjamin Herrenschmidt	b	.ret_from_except
10210ebc4cdaSBenjamin Herrenschmidt
10229c1e1052SPaul Mackerras/*
10239c1e1052SPaul Mackerras * We come here as a result of a DSI at a point where we don't want
10249c1e1052SPaul Mackerras * to call hash_page, such as when we are accessing memory (possibly
10259c1e1052SPaul Mackerras * user memory) inside a PMU interrupt that occurred while interrupts
10269c1e1052SPaul Mackerras * were soft-disabled.  We want to invoke the exception handler for
10279c1e1052SPaul Mackerras * the access, or panic if there isn't a handler.
10289c1e1052SPaul Mackerras */
10299c1e1052SPaul Mackerras77:	bl	.save_nvgprs
10309c1e1052SPaul Mackerras	mr	r4,r3
10319c1e1052SPaul Mackerras	addi	r3,r1,STACK_FRAME_OVERHEAD
10329c1e1052SPaul Mackerras	li	r5,SIGSEGV
10339c1e1052SPaul Mackerras	bl	.bad_page_fault
10349c1e1052SPaul Mackerras	b	.ret_from_except
10359c1e1052SPaul Mackerras
10360ebc4cdaSBenjamin Herrenschmidt	/* here we have a segment miss */
10370ebc4cdaSBenjamin Herrenschmidtdo_ste_alloc:
10380ebc4cdaSBenjamin Herrenschmidt	bl	.ste_allocate		/* try to insert stab entry */
10390ebc4cdaSBenjamin Herrenschmidt	cmpdi	r3,0
10400ebc4cdaSBenjamin Herrenschmidt	bne-	handle_page_fault
10410ebc4cdaSBenjamin Herrenschmidt	b	fast_exception_return
10420ebc4cdaSBenjamin Herrenschmidt
10430ebc4cdaSBenjamin Herrenschmidt/*
10440ebc4cdaSBenjamin Herrenschmidt * r13 points to the PACA, r9 contains the saved CR,
10450ebc4cdaSBenjamin Herrenschmidt * r11 and r12 contain the saved SRR0 and SRR1.
10460ebc4cdaSBenjamin Herrenschmidt * r9 - r13 are saved in paca->exslb.
10470ebc4cdaSBenjamin Herrenschmidt * We assume we aren't going to take any exceptions during this procedure.
10480ebc4cdaSBenjamin Herrenschmidt * We assume (DAR >> 60) == 0xc.
10490ebc4cdaSBenjamin Herrenschmidt */
10500ebc4cdaSBenjamin Herrenschmidt	.align	7
10510ebc4cdaSBenjamin Herrenschmidt_GLOBAL(do_stab_bolted)
10520ebc4cdaSBenjamin Herrenschmidt	stw	r9,PACA_EXSLB+EX_CCR(r13)	/* save CR in exc. frame */
10530ebc4cdaSBenjamin Herrenschmidt	std	r11,PACA_EXSLB+EX_SRR0(r13)	/* save SRR0 in exc. frame */
10540ebc4cdaSBenjamin Herrenschmidt
10550ebc4cdaSBenjamin Herrenschmidt	/* Hash to the primary group */
10560ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACASTABVIRT(r13)
10570ebc4cdaSBenjamin Herrenschmidt	mfspr	r11,SPRN_DAR
10580ebc4cdaSBenjamin Herrenschmidt	srdi	r11,r11,28
10590ebc4cdaSBenjamin Herrenschmidt	rldimi	r10,r11,7,52	/* r10 = first ste of the group */
10600ebc4cdaSBenjamin Herrenschmidt
10610ebc4cdaSBenjamin Herrenschmidt	/* Calculate VSID */
10620ebc4cdaSBenjamin Herrenschmidt	/* This is a kernel address, so protovsid = ESID */
10630ebc4cdaSBenjamin Herrenschmidt	ASM_VSID_SCRAMBLE(r11, r9, 256M)
10640ebc4cdaSBenjamin Herrenschmidt	rldic	r9,r11,12,16	/* r9 = vsid << 12 */
10650ebc4cdaSBenjamin Herrenschmidt
10660ebc4cdaSBenjamin Herrenschmidt	/* Search the primary group for a free entry */
10670ebc4cdaSBenjamin Herrenschmidt1:	ld	r11,0(r10)	/* Test valid bit of the current ste	*/
10680ebc4cdaSBenjamin Herrenschmidt	andi.	r11,r11,0x80
10690ebc4cdaSBenjamin Herrenschmidt	beq	2f
10700ebc4cdaSBenjamin Herrenschmidt	addi	r10,r10,16
10710ebc4cdaSBenjamin Herrenschmidt	andi.	r11,r10,0x70
10720ebc4cdaSBenjamin Herrenschmidt	bne	1b
10730ebc4cdaSBenjamin Herrenschmidt
10740ebc4cdaSBenjamin Herrenschmidt	/* Stick for only searching the primary group for now.		*/
10750ebc4cdaSBenjamin Herrenschmidt	/* At least for now, we use a very simple random castout scheme */
10760ebc4cdaSBenjamin Herrenschmidt	/* Use the TB as a random number ;  OR in 1 to avoid entry 0	*/
10770ebc4cdaSBenjamin Herrenschmidt	mftb	r11
10780ebc4cdaSBenjamin Herrenschmidt	rldic	r11,r11,4,57	/* r11 = (r11 << 4) & 0x70 */
10790ebc4cdaSBenjamin Herrenschmidt	ori	r11,r11,0x10
10800ebc4cdaSBenjamin Herrenschmidt
10810ebc4cdaSBenjamin Herrenschmidt	/* r10 currently points to an ste one past the group of interest */
10820ebc4cdaSBenjamin Herrenschmidt	/* make it point to the randomly selected entry			*/
10830ebc4cdaSBenjamin Herrenschmidt	subi	r10,r10,128
10840ebc4cdaSBenjamin Herrenschmidt	or 	r10,r10,r11	/* r10 is the entry to invalidate	*/
10850ebc4cdaSBenjamin Herrenschmidt
10860ebc4cdaSBenjamin Herrenschmidt	isync			/* mark the entry invalid		*/
10870ebc4cdaSBenjamin Herrenschmidt	ld	r11,0(r10)
10880ebc4cdaSBenjamin Herrenschmidt	rldicl	r11,r11,56,1	/* clear the valid bit */
10890ebc4cdaSBenjamin Herrenschmidt	rotldi	r11,r11,8
10900ebc4cdaSBenjamin Herrenschmidt	std	r11,0(r10)
10910ebc4cdaSBenjamin Herrenschmidt	sync
10920ebc4cdaSBenjamin Herrenschmidt
10930ebc4cdaSBenjamin Herrenschmidt	clrrdi	r11,r11,28	/* Get the esid part of the ste		*/
10940ebc4cdaSBenjamin Herrenschmidt	slbie	r11
10950ebc4cdaSBenjamin Herrenschmidt
10960ebc4cdaSBenjamin Herrenschmidt2:	std	r9,8(r10)	/* Store the vsid part of the ste	*/
10970ebc4cdaSBenjamin Herrenschmidt	eieio
10980ebc4cdaSBenjamin Herrenschmidt
10990ebc4cdaSBenjamin Herrenschmidt	mfspr	r11,SPRN_DAR		/* Get the new esid			*/
11000ebc4cdaSBenjamin Herrenschmidt	clrrdi	r11,r11,28	/* Permits a full 32b of ESID		*/
11010ebc4cdaSBenjamin Herrenschmidt	ori	r11,r11,0x90	/* Turn on valid and kp			*/
11020ebc4cdaSBenjamin Herrenschmidt	std	r11,0(r10)	/* Put new entry back into the stab	*/
11030ebc4cdaSBenjamin Herrenschmidt
11040ebc4cdaSBenjamin Herrenschmidt	sync
11050ebc4cdaSBenjamin Herrenschmidt
11060ebc4cdaSBenjamin Herrenschmidt	/* All done -- return from exception. */
11070ebc4cdaSBenjamin Herrenschmidt	lwz	r9,PACA_EXSLB+EX_CCR(r13)	/* get saved CR */
11080ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACA_EXSLB+EX_SRR0(r13)	/* get saved SRR0 */
11090ebc4cdaSBenjamin Herrenschmidt
11100ebc4cdaSBenjamin Herrenschmidt	andi.	r10,r12,MSR_RI
11110ebc4cdaSBenjamin Herrenschmidt	beq-	unrecov_slb
11120ebc4cdaSBenjamin Herrenschmidt
11130ebc4cdaSBenjamin Herrenschmidt	mtcrf	0x80,r9			/* restore CR */
11140ebc4cdaSBenjamin Herrenschmidt
11150ebc4cdaSBenjamin Herrenschmidt	mfmsr	r10
11160ebc4cdaSBenjamin Herrenschmidt	clrrdi	r10,r10,2
11170ebc4cdaSBenjamin Herrenschmidt	mtmsrd	r10,1
11180ebc4cdaSBenjamin Herrenschmidt
11190ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR0,r11
11200ebc4cdaSBenjamin Herrenschmidt	mtspr	SPRN_SRR1,r12
11210ebc4cdaSBenjamin Herrenschmidt	ld	r9,PACA_EXSLB+EX_R9(r13)
11220ebc4cdaSBenjamin Herrenschmidt	ld	r10,PACA_EXSLB+EX_R10(r13)
11230ebc4cdaSBenjamin Herrenschmidt	ld	r11,PACA_EXSLB+EX_R11(r13)
11240ebc4cdaSBenjamin Herrenschmidt	ld	r12,PACA_EXSLB+EX_R12(r13)
11250ebc4cdaSBenjamin Herrenschmidt	ld	r13,PACA_EXSLB+EX_R13(r13)
11260ebc4cdaSBenjamin Herrenschmidt	rfid
11270ebc4cdaSBenjamin Herrenschmidt	b	.	/* prevent speculative execution */
11280ebc4cdaSBenjamin Herrenschmidt
11290ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_PSERIES
11300ebc4cdaSBenjamin Herrenschmidt/*
11310ebc4cdaSBenjamin Herrenschmidt * Data area reserved for FWNMI option.
11320ebc4cdaSBenjamin Herrenschmidt * This address (0x7000) is fixed by the RPA.
11330ebc4cdaSBenjamin Herrenschmidt */
11340ebc4cdaSBenjamin Herrenschmidt	.= 0x7000
11350ebc4cdaSBenjamin Herrenschmidt	.globl fwnmi_data_area
11360ebc4cdaSBenjamin Herrenschmidtfwnmi_data_area:
11370ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_PSERIES */
11380ebc4cdaSBenjamin Herrenschmidt
11390ebc4cdaSBenjamin Herrenschmidt	/* iSeries does not use the FWNMI stuff, so it is safe to put
11400ebc4cdaSBenjamin Herrenschmidt	 * this here, even if we later allow kernels that will boot on
11410ebc4cdaSBenjamin Herrenschmidt	 * both pSeries and iSeries */
11420ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_ISERIES
11430ebc4cdaSBenjamin Herrenschmidt        . = LPARMAP_PHYS
11440ebc4cdaSBenjamin Herrenschmidt	.globl xLparMap
11450ebc4cdaSBenjamin HerrenschmidtxLparMap:
11460ebc4cdaSBenjamin Herrenschmidt	.quad	HvEsidsToMap		/* xNumberEsids */
11470ebc4cdaSBenjamin Herrenschmidt	.quad	HvRangesToMap		/* xNumberRanges */
11480ebc4cdaSBenjamin Herrenschmidt	.quad	STAB0_PAGE		/* xSegmentTableOffs */
11490ebc4cdaSBenjamin Herrenschmidt	.zero	40			/* xRsvd */
11500ebc4cdaSBenjamin Herrenschmidt	/* xEsids (HvEsidsToMap entries of 2 quads) */
11510ebc4cdaSBenjamin Herrenschmidt	.quad	PAGE_OFFSET_ESID	/* xKernelEsid */
11520ebc4cdaSBenjamin Herrenschmidt	.quad	PAGE_OFFSET_VSID	/* xKernelVsid */
11530ebc4cdaSBenjamin Herrenschmidt	.quad	VMALLOC_START_ESID	/* xKernelEsid */
11540ebc4cdaSBenjamin Herrenschmidt	.quad	VMALLOC_START_VSID	/* xKernelVsid */
11550ebc4cdaSBenjamin Herrenschmidt	/* xRanges (HvRangesToMap entries of 3 quads) */
11560ebc4cdaSBenjamin Herrenschmidt	.quad	HvPagesToMap		/* xPages */
11570ebc4cdaSBenjamin Herrenschmidt	.quad	0			/* xOffset */
11580ebc4cdaSBenjamin Herrenschmidt	.quad	PAGE_OFFSET_VSID << (SID_SHIFT - HW_PAGE_SHIFT)	/* xVPN */
11590ebc4cdaSBenjamin Herrenschmidt
11600ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_ISERIES */
11610ebc4cdaSBenjamin Herrenschmidt
11620ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_PSERIES
11630ebc4cdaSBenjamin Herrenschmidt        . = 0x8000
11640ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_PSERIES */
116584493804SBenjamin Herrenschmidt
116684493804SBenjamin Herrenschmidt/*
116784493804SBenjamin Herrenschmidt * Space for CPU0's segment table.
116884493804SBenjamin Herrenschmidt *
116984493804SBenjamin Herrenschmidt * On iSeries, the hypervisor must fill in at least one entry before
117084493804SBenjamin Herrenschmidt * we get control (with relocate on).  The address is given to the hv
117184493804SBenjamin Herrenschmidt * as a page number (see xLparMap above), so this must be at a
117284493804SBenjamin Herrenschmidt * fixed address (the linker can't compute (u64)&initial_stab >>
117384493804SBenjamin Herrenschmidt * PAGE_SHIFT).
117484493804SBenjamin Herrenschmidt */
117584493804SBenjamin Herrenschmidt	. = STAB0_OFFSET	/* 0x8000 */
117684493804SBenjamin Herrenschmidt	.globl initial_stab
117784493804SBenjamin Herrenschmidtinitial_stab:
117884493804SBenjamin Herrenschmidt	.space	4096
1179