Date: Fri, 8 Jul 2016 01:31:28 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r302415 - in projects/powernv/powerpc: aim powerpc pseries Message-ID: <201607080131.u681VSvS026806@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: nwhitehorn Date: Fri Jul 8 01:31:28 2016 New Revision: 302415 URL: https://svnweb.freebsd.org/changeset/base/302415 Log: Handle case when boot CPU is not CPU 0. Modified: projects/powernv/powerpc/aim/mmu_oea64.c projects/powernv/powerpc/powerpc/machdep.c projects/powernv/powerpc/powerpc/mp_machdep.c projects/powernv/powerpc/pseries/platform_chrp.c Modified: projects/powernv/powerpc/aim/mmu_oea64.c ============================================================================== --- projects/powernv/powerpc/aim/mmu_oea64.c Fri Jul 8 00:54:21 2016 (r302414) +++ projects/powernv/powerpc/aim/mmu_oea64.c Fri Jul 8 01:31:28 2016 (r302415) @@ -853,6 +853,7 @@ moea64_late_bootstrap(mmu_t mmup, vm_off int i; vm_offset_t pa, va; void *dpcpu; + struct cpuref bsp; /* * Set up the Open Firmware pmap and add its mappings if not in real @@ -951,6 +952,8 @@ moea64_late_bootstrap(mmu_t mmup, vm_off */ pa = moea64_bootstrap_alloc(DPCPU_SIZE, PAGE_SIZE); dpcpu = (void *)virtual_avail; + if (platform_smp_get_bsp(&bsp) != 0) + bsp.cr_cpuid = 0; va = virtual_avail; virtual_avail += DPCPU_SIZE; while (va < virtual_avail) { @@ -958,7 +961,7 @@ moea64_late_bootstrap(mmu_t mmup, vm_off pa += PAGE_SIZE; va += PAGE_SIZE; } - dpcpu_init(dpcpu, 0); + dpcpu_init(dpcpu, bsp.cr_cpuid); /* * Allocate some things for page zeroing. We put this directly Modified: projects/powernv/powerpc/powerpc/machdep.c ============================================================================== --- projects/powernv/powerpc/powerpc/machdep.c Fri Jul 8 00:54:21 2016 (r302414) +++ projects/powernv/powerpc/powerpc/machdep.c Fri Jul 8 01:31:28 2016 (r302415) @@ -233,6 +233,7 @@ uintptr_t powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp) { struct pcpu *pc; + struct cpuref bsp; vm_offset_t startkernel, endkernel; void *kmdp; char *env; @@ -305,21 +306,11 @@ powerpc_init(vm_offset_t fdt, vm_offset_ */ proc_linkup0(&proc0, &thread0); thread0.td_frame = &frame0; - - /* - * Set up per-cpu data. - */ - pc = __pcpu; - pcpu_init(pc, 0, sizeof(struct pcpu)); - pc->pc_curthread = &thread0; #ifdef __powerpc64__ - __asm __volatile("mr 13,%0" :: "r"(pc->pc_curthread)); + __asm __volatile("mr 13,%0" :: "r"(&thread0)); #else - __asm __volatile("mr 2,%0" :: "r"(pc->pc_curthread)); + __asm __volatile("mr 2,%0" :: "r"(&thread0)); #endif - pc->pc_cpuid = 0; - - __asm __volatile("mtsprg 0, %0" :: "r"(pc)); /* * Init mutexes, which we use heavily in PMAP @@ -367,6 +358,17 @@ powerpc_init(vm_offset_t fdt, vm_offset_ platform_probe_and_attach(); /* + * Set up per-cpu data. + */ + pc = __pcpu; + if (platform_smp_get_bsp(&bsp) != 0) + bsp.cr_cpuid = 0; + pcpu_init(pc, bsp.cr_cpuid, sizeof(struct pcpu)); + pc->pc_curthread = &thread0; + pc->pc_cpuid = bsp.cr_cpuid; + __asm __volatile("mtsprg 0, %0" :: "r"(pc)); + + /* * Bring up MMU */ pmap_bootstrap(startkernel, endkernel); Modified: projects/powernv/powerpc/powerpc/mp_machdep.c ============================================================================== --- projects/powernv/powerpc/powerpc/mp_machdep.c Fri Jul 8 00:54:21 2016 (r302414) +++ projects/powernv/powerpc/powerpc/mp_machdep.c Fri Jul 8 01:31:28 2016 (r302415) @@ -144,7 +144,6 @@ cpu_mp_start(void) error = platform_smp_get_bsp(&bsp); KASSERT(error == 0, ("Don't know BSP")); - KASSERT(bsp.cr_cpuid == 0, ("%s: cpuid != 0", __func__)); error = platform_smp_first_cpu(&cpu); while (!error) { @@ -184,7 +183,7 @@ cpu_mp_announce(void) struct pcpu *pc; int i; - for (i = 0; i <= mp_maxid; i++) { + CPU_FOREACH(i) { pc = pcpu_find(i); if (pc == NULL) continue; Modified: projects/powernv/powerpc/pseries/platform_chrp.c ============================================================================== --- projects/powernv/powerpc/pseries/platform_chrp.c Fri Jul 8 00:54:21 2016 (r302414) +++ projects/powernv/powerpc/pseries/platform_chrp.c Fri Jul 8 01:31:28 2016 (r302415) @@ -458,7 +458,7 @@ chrp_smp_topo(platform_t plat) ncores = ncpus = 0; last_pc = NULL; - for (i = 0; i <= mp_maxid; i++) { + CPU_FOREACH(i) { pc = pcpu_find(i); if (pc == NULL) continue;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201607080131.u681VSvS026806>