Unverified Commit 38a94c46 authored by Andy Chiu's avatar Andy Chiu Committed by Palmer Dabbelt
Browse files

riscv: smp: fail booting up smp if inconsistent vlen is detected



Currently we only support Vector for SMP platforms, that is, all SMP
cores have the same vlenb. If we happen to detect a mismatching vlen, it
is better to just fail bootting it up to prevent further race/scheduling
issues.

Also, move .Lsecondary_park forward and chage `tail smp_callin` into a
regular call in the early assembly. So a core would be parked right
after a return from smp_callin. Note that a successful smp_callin
does not return.

Fixes: 7017858e ("riscv: Introduce riscv_v_vsize to record size of Vector context")
Reported-by: default avatarConor Dooley <conor.dooley@microchip.com>
Closes: https://lore.kernel.org/linux-riscv/20240228-vicinity-cornstalk-4b8eb5fe5730@spud/


Signed-off-by: default avatarAndy Chiu <andy.chiu@sifive.com>
Reviewed-by: default avatarConor Dooley <conor.dooley@microchip.com>
Reviewed-by: default avatarYunhui Cui <cuiyunhui@bytedance.com>
Link: https://lore.kernel.org/r/20240510-zve-detection-v5-2-0711bdd26c12@sifive.com


Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent 77afe3e5
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -165,9 +165,20 @@ secondary_start_sbi:
#endif
	call .Lsetup_trap_vector
	scs_load_current
	tail smp_callin
	call smp_callin
#endif /* CONFIG_SMP */

.align 2
.Lsecondary_park:
	/*
	 * Park this hart if we:
	 *  - have too many harts on CONFIG_RISCV_BOOT_SPINWAIT
	 *  - receive an early trap, before setup_trap_vector finished
	 *  - fail in smp_callin(), as a successful one wouldn't return
	 */
	wfi
	j .Lsecondary_park

.align 2
.Lsetup_trap_vector:
	/* Set trap vector to exception handler */
@@ -181,12 +192,6 @@ secondary_start_sbi:
	csrw CSR_SCRATCH, zero
	ret

.align 2
.Lsecondary_park:
	/* We lack SMP support or have too many harts, so park this hart */
	wfi
	j .Lsecondary_park

SYM_CODE_END(_start)

SYM_CODE_START(_start_kernel)
+9 −5
Original line number Diff line number Diff line
@@ -214,6 +214,15 @@ asmlinkage __visible void smp_callin(void)
	struct mm_struct *mm = &init_mm;
	unsigned int curr_cpuid = smp_processor_id();

	if (has_vector()) {
		/*
		 * Return as early as possible so the hart with a mismatching
		 * vlen won't boot.
		 */
		if (riscv_v_setup_vsize())
			return;
	}

	/* All kernel threads share the same mm context.  */
	mmgrab(mm);
	current->active_mm = mm;
@@ -226,11 +235,6 @@ asmlinkage __visible void smp_callin(void)
	numa_add_cpu(curr_cpuid);
	set_cpu_online(curr_cpuid, true);

	if (has_vector()) {
		if (riscv_v_setup_vsize())
			elf_hwcap &= ~COMPAT_HWCAP_ISA_V;
	}

	riscv_user_isa_enable();

	/*