Commit 79b92ab2 authored by Yury Norov's avatar Yury Norov Committed by Lu Jialin
Browse files

powerpc/64: don't refer nr_cpu_ids in asm code when it's undefined

mainline inclusion
from mainline-v6.1-rc1
commit 546a073d
category: cleanup
bugzilla: https://gitee.com/openeuler/kernel/issues/I8KQBZ
CVE: NA

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=546a073d628111e3338af689938407e77d5dc38f



--------------------------------

generic_secondary_common_init() calls LOAD_REG_ADDR(r7, nr_cpu_ids)
conditionally on CONFIG_SMP. However, if 'NR_CPUS == 1', kernel doesn't
use the nr_cpu_ids, and in C code, it's just:
  #if NR_CPUS == 1
  #define nr_cpu_ids
  ...

This series makes declaration of nr_cpu_ids conditional on NR_CPUS == 1,
and that reveals the issue, because compiler can't link the
LOAD_REG_ADDR(r7, nr_cpu_ids) against nonexisting symbol.

Current code looks unsafe for those who build kernel with CONFIG_SMP=y and
NR_CPUS == 1. This is weird configuration, but not disallowed.

Fix the linker error by replacing LOAD_REG_ADDR() with LOAD_REG_IMMEDIATE()
conditionally on NR_CPUS == 1.

As the following patch adds CONFIG_FORCE_NR_CPUS option that has the
similar effect on nr_cpu_ids, make the generic_secondary_common_init()
conditional on it too.

Reported-by: default avatarStephen Rothwell <sfr@canb.auug.org.au>
Signed-off-by: default avatarYury Norov <yury.norov@gmail.com>
Signed-off-by: default avatarZheng Zucheng <zhengzucheng@huawei.com>
parent 67d0d7fe
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -398,8 +398,12 @@ generic_secondary_common_init:
#else
	LOAD_REG_ADDR(r8, paca_ptrs)	/* Load paca_ptrs pointe	 */
	ld	r8,0(r8)		/* Get base vaddr of array	 */
#if (NR_CPUS == 1) || defined(CONFIG_FORCE_NR_CPUS)
	LOAD_REG_IMMEDIATE(r7, NR_CPUS)
#else
	LOAD_REG_ADDR(r7, nr_cpu_ids)	/* Load nr_cpu_ids address       */
	lwz	r7,0(r7)		/* also the max paca allocated 	 */
#endif
	li	r5,0			/* logical cpu id                */
1:
	sldi	r9,r5,3			/* get paca_ptrs[] index from cpu id */