Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61383407 authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt
Browse files

powerpc: Make room in exception vector area



The FWNMI region is fixed at 0x7000 and the vector are now
overflowing that with some configurations. Fix that by moving
some hash management code out of that region as it doesn't need
to be that close to the call sites (isn't accessed using
conditional branches).

Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent e13e895f
Loading
Loading
Loading
Loading
+55 −55
Original line number Diff line number Diff line
@@ -1180,6 +1180,61 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
	.globl	__end_handlers
__end_handlers:

	/* Equivalents to the above handlers for relocation-on interrupt vectors */
	STD_RELON_EXCEPTION_HV(., 0xe00, h_data_storage)
	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe00)
	STD_RELON_EXCEPTION_HV(., 0xe20, h_instr_storage)
	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe20)
	STD_RELON_EXCEPTION_HV(., 0xe40, emulation_assist)
	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe40)
	STD_RELON_EXCEPTION_HV(., 0xe60, hmi_exception)
	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe60)
	MASKABLE_RELON_EXCEPTION_HV(., 0xe80, h_doorbell)
	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe80)

	STD_RELON_EXCEPTION_PSERIES(., 0xf00, performance_monitor)
	STD_RELON_EXCEPTION_PSERIES(., 0xf20, altivec_unavailable)
	STD_RELON_EXCEPTION_PSERIES(., 0xf40, vsx_unavailable)

#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
/*
 * Data area reserved for FWNMI option.
 * This address (0x7000) is fixed by the RPA.
 */
	.= 0x7000
	.globl fwnmi_data_area
fwnmi_data_area:

	/* pseries and powernv need to keep the whole page from
	 * 0x7000 to 0x8000 free for use by the firmware
	 */
	. = 0x8000
#endif /* defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */

/* Space for CPU0's segment table */
	.balign 4096
	.globl initial_stab
initial_stab:
	.space	4096

#ifdef CONFIG_PPC_POWERNV
_GLOBAL(opal_mc_secondary_handler)
	HMT_MEDIUM_PPR_DISCARD
	SET_SCRATCH0(r13)
	GET_PACA(r13)
	clrldi	r3,r3,2
	tovirt(r3,r3)
	std	r3,PACA_OPAL_MC_EVT(r13)
	ld	r13,OPAL_MC_SRR0(r3)
	mtspr	SPRN_SRR0,r13
	ld	r13,OPAL_MC_SRR1(r3)
	mtspr	SPRN_SRR1,r13
	ld	r3,OPAL_MC_GPR3(r3)
	GET_SCRATCH0(r13)
	b	machine_check_pSeries
#endif /* CONFIG_PPC_POWERNV */


/*
 * Hash table stuff
 */
@@ -1373,58 +1428,3 @@ _GLOBAL(do_stab_bolted)
	ld	r13,PACA_EXSLB+EX_R13(r13)
	rfid
	b	.	/* prevent speculative execution */


	/* Equivalents to the above handlers for relocation-on interrupt vectors */
	STD_RELON_EXCEPTION_HV(., 0xe00, h_data_storage)
	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe00)
	STD_RELON_EXCEPTION_HV(., 0xe20, h_instr_storage)
	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe20)
	STD_RELON_EXCEPTION_HV(., 0xe40, emulation_assist)
	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe40)
	STD_RELON_EXCEPTION_HV(., 0xe60, hmi_exception)
	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe60)
	MASKABLE_RELON_EXCEPTION_HV(., 0xe80, h_doorbell)
	KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe80)

	STD_RELON_EXCEPTION_PSERIES(., 0xf00, performance_monitor)
	STD_RELON_EXCEPTION_PSERIES(., 0xf20, altivec_unavailable)
	STD_RELON_EXCEPTION_PSERIES(., 0xf40, vsx_unavailable)

#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
/*
 * Data area reserved for FWNMI option.
 * This address (0x7000) is fixed by the RPA.
 */
	.= 0x7000
	.globl fwnmi_data_area
fwnmi_data_area:

	/* pseries and powernv need to keep the whole page from
	 * 0x7000 to 0x8000 free for use by the firmware
	 */
	. = 0x8000
#endif /* defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */

/* Space for CPU0's segment table */
	.balign 4096
	.globl initial_stab
initial_stab:
	.space	4096

#ifdef CONFIG_PPC_POWERNV
_GLOBAL(opal_mc_secondary_handler)
	HMT_MEDIUM_PPR_DISCARD
	SET_SCRATCH0(r13)
	GET_PACA(r13)
	clrldi	r3,r3,2
	tovirt(r3,r3)
	std	r3,PACA_OPAL_MC_EVT(r13)
	ld	r13,OPAL_MC_SRR0(r3)
	mtspr	SPRN_SRR0,r13
	ld	r13,OPAL_MC_SRR1(r3)
	mtspr	SPRN_SRR1,r13
	ld	r3,OPAL_MC_GPR3(r3)
	GET_SCRATCH0(r13)
	b	machine_check_pSeries
#endif /* CONFIG_PPC_POWERNV */