From owner-svn-src-all@freebsd.org Sat Nov 25 23:23:26 2017 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 4111BDF34BC; Sat, 25 Nov 2017 23:23:26 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 1AE9873C65; Sat, 25 Nov 2017 23:23:26 +0000 (UTC) (envelope-from nwhitehorn@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id vAPNNP3b093842; Sat, 25 Nov 2017 23:23:25 GMT (envelope-from nwhitehorn@FreeBSD.org) Received: (from nwhitehorn@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id vAPNNP6v093840; Sat, 25 Nov 2017 23:23:25 GMT (envelope-from nwhitehorn@FreeBSD.org) Message-Id: <201711252323.vAPNNP6v093840@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: nwhitehorn set sender to nwhitehorn@FreeBSD.org using -f From: Nathan Whitehorn Date: Sat, 25 Nov 2017 23:23:25 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r326217 - in head/sys/powerpc: ofw powerpc X-SVN-Group: head X-SVN-Commit-Author: nwhitehorn X-SVN-Commit-Paths: in head/sys/powerpc: ofw powerpc X-SVN-Commit-Revision: 326217 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 25 Nov 2017 23:23:26 -0000 Author: nwhitehorn Date: Sat Nov 25 23:23:24 2017 New Revision: 326217 URL: https://svnweb.freebsd.org/changeset/base/326217 Log: Avoid assumptions about the BSP being CPU 0. MFC after: 3 weeks Modified: head/sys/powerpc/ofw/ofw_machdep.c head/sys/powerpc/powerpc/machdep.c Modified: head/sys/powerpc/ofw/ofw_machdep.c ============================================================================== --- head/sys/powerpc/ofw/ofw_machdep.c Sat Nov 25 22:43:52 2017 (r326216) +++ head/sys/powerpc/ofw/ofw_machdep.c Sat Nov 25 23:23:24 2017 (r326217) @@ -530,11 +530,16 @@ openfirmware(void *args) return (-1); #ifdef SMP - rv_args.args = args; - rv_args.in_progress = 1; - smp_rendezvous(smp_no_rendezvous_barrier, ofw_rendezvous_dispatch, - smp_no_rendezvous_barrier, &rv_args); - result = rv_args.retval; + if (cold) { + result = openfirmware_core(args); + } else { + rv_args.args = args; + rv_args.in_progress = 1; + smp_rendezvous(smp_no_rendezvous_barrier, + ofw_rendezvous_dispatch, smp_no_rendezvous_barrier, + &rv_args); + result = rv_args.retval; + } #else result = openfirmware_core(args); #endif Modified: head/sys/powerpc/powerpc/machdep.c ============================================================================== --- head/sys/powerpc/powerpc/machdep.c Sat Nov 25 22:43:52 2017 (r326216) +++ head/sys/powerpc/powerpc/machdep.c Sat Nov 25 23:23:24 2017 (r326217) @@ -235,9 +235,10 @@ 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; + char *env; bool ofw_bootargs = false; #ifdef DDB vm_offset_t ksym_start; @@ -311,32 +312,20 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offs */ 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 */ - mutex_init(); /* * Install the OF client interface */ - OF_bootstrap(); if (ofw_bootargs) @@ -347,19 +336,6 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offs */ cninit(); - /* - * Complain if there is no metadata. - */ - if (mdp == NULL || kmdp == NULL) { - printf("powerpc_init: no loader metadata.\n"); - } - - /* - * Init KDB - */ - - kdb_init(); - #ifdef AIM aim_cpu_init(toc); #else /* BOOKE */ @@ -374,6 +350,25 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offs */ platform_probe_and_attach(); + + /* + * Set up real per-cpu data. + */ + if (platform_smp_get_bsp(&bsp) != 0) + bsp.cr_cpuid = 0; + pc = &__pcpu[bsp.cr_cpuid]; + pcpu_init(pc, bsp.cr_cpuid, sizeof(struct pcpu)); + pc->pc_curthread = &thread0; + thread0.td_oncpu = bsp.cr_cpuid; + pc->pc_cpuid = bsp.cr_cpuid; + pc->pc_hwref = bsp.cr_hwref; + pc->pc_pir = mfspr(SPR_PIR); + __asm __volatile("mtsprg 0, %0" :: "r"(pc)); + + /* + * Init KDB + */ + kdb_init(); /* * Bring up MMU