svn commit: r326221 - in projects/powernv: conf kern powerpc/aim powerpc/booke powerpc/ofw powerpc/powerpc

Nathan Whitehorn nwhitehorn at FreeBSD.org
Sun Nov 26 04:19:55 UTC 2017


Author: nwhitehorn
Date: Sun Nov 26 04:19:53 2017
New Revision: 326221
URL: https://svnweb.freebsd.org/changeset/base/326221

Log:
  IFC @ r326220

Modified:
  projects/powernv/conf/kern.mk
  projects/powernv/kern/subr_pcpu.c
  projects/powernv/powerpc/aim/aim_machdep.c
  projects/powernv/powerpc/aim/locore32.S
  projects/powernv/powerpc/aim/locore64.S
  projects/powernv/powerpc/aim/mp_cpudep.c
  projects/powernv/powerpc/booke/booke_machdep.c
  projects/powernv/powerpc/ofw/ofw_machdep.c
  projects/powernv/powerpc/powerpc/machdep.c
Directory Properties:
  projects/powernv/   (props changed)

Modified: projects/powernv/conf/kern.mk
==============================================================================
--- projects/powernv/conf/kern.mk	Sun Nov 26 03:53:20 2017	(r326220)
+++ projects/powernv/conf/kern.mk	Sun Nov 26 04:19:53 2017	(r326221)
@@ -181,6 +181,7 @@ CFLAGS.gcc+=	-mabi=elfv2
 .else
 CFLAGS.gcc+=	-mcall-aixdesc
 .endif
+CFLAGS.clang+=	-mabi=elfv2
 .endif
 
 #

Modified: projects/powernv/kern/subr_pcpu.c
==============================================================================
--- projects/powernv/kern/subr_pcpu.c	Sun Nov 26 03:53:20 2017	(r326220)
+++ projects/powernv/kern/subr_pcpu.c	Sun Nov 26 04:19:53 2017	(r326221)
@@ -280,7 +280,7 @@ struct pcpu *
 pcpu_find(u_int cpuid)
 {
 	KASSERT(cpuid_to_pcpu[cpuid] != NULL,
-	    ("Getting unitialized PCPU %d", cpuid));
+	    ("Getting uninitialized PCPU %d", cpuid));
 
 	return (cpuid_to_pcpu[cpuid]);
 }

Modified: projects/powernv/powerpc/aim/aim_machdep.c
==============================================================================
--- projects/powernv/powerpc/aim/aim_machdep.c	Sun Nov 26 03:53:20 2017	(r326220)
+++ projects/powernv/powerpc/aim/aim_machdep.c	Sun Nov 26 04:19:53 2017	(r326221)
@@ -130,7 +130,7 @@ __FBSDID("$FreeBSD$");
 #include <dev/ofw/openfirm.h>
 
 #ifdef __powerpc64__
-extern int n_slbs;
+#include "mmu_oea64.h"
 #endif
 
 #ifndef __powerpc64__

Modified: projects/powernv/powerpc/aim/locore32.S
==============================================================================
--- projects/powernv/powerpc/aim/locore32.S	Sun Nov 26 03:53:20 2017	(r326220)
+++ projects/powernv/powerpc/aim/locore32.S	Sun Nov 26 04:19:53 2017	(r326221)
@@ -79,13 +79,14 @@ __start:
 	/* Set up temporary stack pointer */
 	lwz	%r1,8(%r30)
 	add	%r1,%r1,%r30
-	addi	%r1,%r1,(8+TMPSTKSZ-32)
+	addi	%r1,%r1,(8+TMPSTKSZ-40)
 
 	/* Relocate self */
 	stw	%r3,16(%r1)
 	stw	%r4,20(%r1)
 	stw	%r5,24(%r1)
 	stw	%r6,28(%r1)
+	stw	%r7,32(%r1)
 
 	lwz	%r3,0(%r30) /* _DYNAMIC in %r3 */
 	add	%r3,%r3,%r30
@@ -99,6 +100,7 @@ __start:
 	lwz	%r4,20(%r1)
 	lwz	%r5,24(%r1)
 	lwz	%r6,28(%r1)
+	lwz	%r7,32(%r1)
 
 	/* MD setup */
 	bl	powerpc_init

Modified: projects/powernv/powerpc/aim/locore64.S
==============================================================================
--- projects/powernv/powerpc/aim/locore64.S	Sun Nov 26 03:53:20 2017	(r326220)
+++ projects/powernv/powerpc/aim/locore64.S	Sun Nov 26 04:19:53 2017	(r326221)
@@ -73,6 +73,7 @@ btext:
  * r4: ignored
  * r5: OF client interface pointer (or zero)
  * r6: Loader metadata pointer (or zero)
+ * r7: Magic cookie (0xfb5d104d) to indicate that r6 has loader metadata
  */
 	.text
 ASENTRY_NOPROF(__start)
@@ -108,6 +109,8 @@ ASENTRY_NOPROF(__start)
 	std	%r4,56(%r1)
 	std	%r5,64(%r1)
 	std	%r6,72(%r1)
+	std	%r7,80(%r1)
+
 	bl	1f
 	.llong _DYNAMIC-.
 1:	mflr	%r3
@@ -120,6 +123,7 @@ ASENTRY_NOPROF(__start)
 	ld	%r4,56(%r1)
 	ld	%r5,64(%r1)
 	ld	%r6,72(%r1)
+	ld	%r7,80(%r1)
 
 	/* Begin CPU init */
 	mr	%r4,%r2 /* Replace ignored r4 with tocbase for trap handlers */

Modified: projects/powernv/powerpc/aim/mp_cpudep.c
==============================================================================
--- projects/powernv/powerpc/aim/mp_cpudep.c	Sun Nov 26 03:53:20 2017	(r326220)
+++ projects/powernv/powerpc/aim/mp_cpudep.c	Sun Nov 26 04:19:53 2017	(r326221)
@@ -378,8 +378,10 @@ cpudep_ap_setup()
 	case IBMPOWER7PLUS:
 	case IBMPOWER8:
 	case IBMPOWER8E:
+#ifdef __powerpc64__
 		if (mfmsr() & PSL_HV)
 			mtspr(SPR_LPCR, mfspr(SPR_LPCR) | LPCR_LPES);
+#endif
 		break;
 	default:
 #ifdef __powerpc64__

Modified: projects/powernv/powerpc/booke/booke_machdep.c
==============================================================================
--- projects/powernv/powerpc/booke/booke_machdep.c	Sun Nov 26 03:53:20 2017	(r326220)
+++ projects/powernv/powerpc/booke/booke_machdep.c	Sun Nov 26 04:19:53 2017	(r326221)
@@ -200,7 +200,8 @@ extern void *int_performance_counter;
 	    ("Handler " #handler " too far from interrupt vector base")); \
 	mtspr(ivor, (uintptr_t)(&handler) & 0xffffUL);
 
-uintptr_t powerpc_init(vm_offset_t fdt, vm_offset_t, vm_offset_t, void *mdp);
+uintptr_t powerpc_init(vm_offset_t fdt, vm_offset_t, vm_offset_t, void *mdp,
+    vm_offset_t mdp_cookie);
 void booke_cpu_init(void);
 
 void
@@ -346,7 +347,11 @@ booke_init(u_long arg1, u_long arg2)
 		break;
 	}
 
-	ret = powerpc_init(dtbp, 0, 0, mdp);
+	/*
+	 * Last element is a magic cookie that indicates that the metadata
+	 * pointer is meaningful.
+	 */
+	ret = powerpc_init(dtbp, 0, 0, mdp, (mdp == NULL) ? 0 : 0xfb5d104d);
 
 	/* Enable caches */
 	booke_enable_l1_cache();

Modified: projects/powernv/powerpc/ofw/ofw_machdep.c
==============================================================================
--- projects/powernv/powerpc/ofw/ofw_machdep.c	Sun Nov 26 03:53:20 2017	(r326220)
+++ projects/powernv/powerpc/ofw/ofw_machdep.c	Sun Nov 26 04:19:53 2017	(r326221)
@@ -243,7 +243,7 @@ excise_fdt_reserved(struct mem_region *avail, int asz)
 	    ("Exceeded number of FDT reservations"));
 	/* Add a virtual entry for the FDT itself */
 	if (fdt != NULL) {
-		fdtmap[j].address = (uint64_t)fdt & ~PAGE_MASK;
+		fdtmap[j].address = (vm_offset_t)fdt & ~PAGE_MASK;
 		fdtmap[j].size = round_page(fdt_totalsize(fdt));
 		fdtmapsize += sizeof(fdtmap[0]);
 	}
@@ -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: projects/powernv/powerpc/powerpc/machdep.c
==============================================================================
--- projects/powernv/powerpc/powerpc/machdep.c	Sun Nov 26 03:53:20 2017	(r326220)
+++ projects/powernv/powerpc/powerpc/machdep.c	Sun Nov 26 04:19:53 2017	(r326221)
@@ -154,7 +154,8 @@ SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, 
 SYSCTL_INT(_machdep, CPU_CACHELINE, cacheline_size,
 	   CTLFLAG_RD, &cacheline_size, 0, "");
 
-uintptr_t	powerpc_init(vm_offset_t, vm_offset_t, vm_offset_t, void *);
+uintptr_t	powerpc_init(vm_offset_t, vm_offset_t, vm_offset_t, void *,
+		    vm_offset_t);
 
 long		Maxmem = 0;
 long		realmem = 0;
@@ -232,13 +233,14 @@ void aim_cpu_init(vm_offset_t toc);
 void booke_cpu_init(void);
 
 uintptr_t
-powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp)
+powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offset_t ofentry, void *mdp,
+    vm_offset_t mdp_cookie)
 {
 	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;
@@ -251,8 +253,11 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offs
 	startkernel = __startkernel;
 	endkernel = __endkernel;
 
-	/* Check for ePAPR loader, which puts a magic value into r6 */
-	if (mdp == (void *)0x65504150)
+	/*
+	 * If the metadata pointer cookie is not set to the magic value,
+	 * the number in mdp should be treated as nonsense.
+	 */
+	if (mdp_cookie != 0xfb5d104d)
 		mdp = NULL;
 
 #ifdef AIM
@@ -321,13 +326,11 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offs
 	/*
 	 * Init mutexes, which we use heavily in PMAP
 	 */
-
 	mutex_init();
 
 	/*
 	 * Install the OF client interface
 	 */
-
 	OF_bootstrap();
 
 	if (ofw_bootargs)
@@ -338,19 +341,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 */
@@ -367,7 +357,8 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offs
 	platform_probe_and_attach();
 
 	/*
-	 * Set up per-cpu data.
+	 * Set up per-cpu data for the BSP now that the platform can tell
+	 * us which that is.
 	 */
 	if (platform_smp_get_bsp(&bsp) != 0)
 		bsp.cr_cpuid = 0;
@@ -379,6 +370,11 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offs
 	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


More information about the svn-src-projects mailing list