svn commit: r328651 - in head/sys/powerpc: aim booke include powerpc

Nathan Whitehorn nwhitehorn at FreeBSD.org
Thu Feb 1 05:31:26 UTC 2018


Author: nwhitehorn
Date: Thu Feb  1 05:31:24 2018
New Revision: 328651
URL: https://svnweb.freebsd.org/changeset/base/328651

Log:
  Change the default MSR values used when starting userland and kernel
  threads from compile-time defines to global variables. This removes a
  significant amount of duplicated runtime patches to the compile-time
  defines, centralizing the conditional logic in the early startup code.
  
  Reviewed by:	jhibbits

Modified:
  head/sys/powerpc/aim/aim_machdep.c
  head/sys/powerpc/aim/mp_cpudep.c
  head/sys/powerpc/booke/booke_machdep.c
  head/sys/powerpc/include/psl.h
  head/sys/powerpc/powerpc/exec_machdep.c
  head/sys/powerpc/powerpc/genassym.c
  head/sys/powerpc/powerpc/machdep.c
  head/sys/powerpc/powerpc/vm_machdep.c

Modified: head/sys/powerpc/aim/aim_machdep.c
==============================================================================
--- head/sys/powerpc/aim/aim_machdep.c	Thu Feb  1 05:28:02 2018	(r328650)
+++ head/sys/powerpc/aim/aim_machdep.c	Thu Feb  1 05:31:24 2018	(r328651)
@@ -178,6 +178,27 @@ aim_cpu_init(vm_offset_t toc)
 	trap_offset = 0;
 	cacheline_warn = 0;
 
+	/* General setup for AIM CPUs */
+	psl_kernset = PSL_EE | PSL_ME | PSL_IR | PSL_DR | PSL_RI;
+
+#ifdef __powerpc64__
+	psl_kernset |= PSL_SF;
+	if (mfmsr() & PSL_HV)
+		psl_kernset |= PSL_HV;
+#endif
+	psl_userset = psl_kernset | PSL_PR;
+#ifdef __powerpc64__
+	psl_userset32 = psl_userset & ~PSL_SF;
+#endif
+
+	/* Bits that users aren't allowed to change */
+	psl_userstatic = ~(PSL_VEC | PSL_FP | PSL_FE0 | PSL_FE1);
+	/*
+	 * Mask bits from the SRR1 that aren't really the MSR:
+	 * Bits 1-4, 10-15 (ppc32), 33-36, 42-47 (ppc64)
+	 */
+	psl_userstatic &= ~0x783f0000UL;
+
 	/* Various very early CPU fix ups */
 	switch (mfpvr() >> 16) {
 		/*

Modified: head/sys/powerpc/aim/mp_cpudep.c
==============================================================================
--- head/sys/powerpc/aim/mp_cpudep.c	Thu Feb  1 05:28:02 2018	(r328650)
+++ head/sys/powerpc/aim/mp_cpudep.c	Thu Feb  1 05:31:24 2018	(r328651)
@@ -111,7 +111,7 @@ cpudep_ap_bootstrap(void)
 {
 	register_t msr, sp;
 
-	msr = PSL_KERNSET & ~PSL_EE;
+	msr = psl_kernset & ~PSL_EE;
 	mtmsr(msr);
 
 	pcpup->pc_curthread = pcpup->pc_idlethread;

Modified: head/sys/powerpc/booke/booke_machdep.c
==============================================================================
--- head/sys/powerpc/booke/booke_machdep.c	Thu Feb  1 05:28:02 2018	(r328650)
+++ head/sys/powerpc/booke/booke_machdep.c	Thu Feb  1 05:31:24 2018	(r328651)
@@ -210,6 +210,16 @@ booke_cpu_init(void)
 
 	cpu_features |= PPC_FEATURE_BOOKE;
 
+	psl_kernset = PSL_CE | PSL_ME | PSL_EE;
+#ifdef __powerpc64__
+	psl_kernset |= PSL_CM;
+#endif
+	psl_userset = psl_kernset | PSL_PR;
+#ifdef __powerpc64__
+	psl_userset32 = psl_kernset & ~PSL_CM;
+#endif
+	psl_userstatic = ~(PSL_VEC | PSL_FP | PSL_FE0 | PSL_FE1);
+
 	pmap_mmu_install(MMU_TYPE_BOOKE, BUS_PROBE_GENERIC);
 }
 

Modified: head/sys/powerpc/include/psl.h
==============================================================================
--- head/sys/powerpc/include/psl.h	Thu Feb  1 05:28:02 2018	(r328650)
+++ head/sys/powerpc/include/psl.h	Thu Feb  1 05:31:24 2018	(r328651)
@@ -90,28 +90,13 @@
 #define	PSL_FE_PREC	(PSL_FE0 | PSL_FE1) /* precise */
 #define	PSL_FE_DFLT	PSL_FE_DIS	/* default == none */
 
-#if defined(BOOKE_E500)
-/* Initial kernel MSR, use IS=1 ad DS=1. */
-#define PSL_KERNSET_INIT	(PSL_IS | PSL_DS)
+#ifndef LOCORE
+extern register_t psl_kernset;		/* Default MSR values for kernel */
+extern register_t psl_userset;		/* Default MSR values for userland */
 #ifdef __powerpc64__
-#define PSL_KERNSET		(PSL_CM | PSL_CE | PSL_ME | PSL_EE)
-#else
-#define PSL_KERNSET		(PSL_CE | PSL_ME | PSL_EE)
+extern register_t psl_userset32;	/* Default user MSR values for 32-bit */
 #endif
-#define PSL_SRR1_MASK	0x00000000UL	/* No mask on Book-E */
-#elif defined(BOOKE_PPC4XX)
-#define PSL_KERNSET	(PSL_CE | PSL_ME | PSL_EE | PSL_FP)
-#define PSL_SRR1_MASK	0x00000000UL	/* No mask on Book-E */
-#elif defined(AIM)
-#ifdef __powerpc64__
-#define	PSL_KERNSET	(PSL_SF | PSL_EE | PSL_ME | PSL_IR | PSL_DR | PSL_RI)
-#else
-#define	PSL_KERNSET	(PSL_EE | PSL_ME | PSL_IR | PSL_DR | PSL_RI)
+extern register_t psl_userstatic;	/* Bits of SRR1 userland may not set */
 #endif
-#define PSL_SRR1_MASK	0x783f0000UL	/* Bits 1-4, 10-15 (ppc32), 33-36, 42-47 (ppc64) */
-#endif
-
-#define	PSL_USERSET	(PSL_KERNSET | PSL_PR)
-#define	PSL_USERSTATIC	(~(PSL_VEC | PSL_FP | PSL_FE0 | PSL_FE1) & ~PSL_SRR1_MASK)
 
 #endif	/* _MACHINE_PSL_H_ */

Modified: head/sys/powerpc/powerpc/exec_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/exec_machdep.c	Thu Feb  1 05:28:02 2018	(r328650)
+++ head/sys/powerpc/powerpc/exec_machdep.c	Thu Feb  1 05:31:24 2018	(r328651)
@@ -454,7 +454,7 @@ set_mcontext(struct thread *td, mcontext_t *mcp)
 	/*
 	 * Don't let the user set privileged MSR bits
 	 */
-	if ((mcp->mc_srr1 & PSL_USERSTATIC) != (tf->srr1 & PSL_USERSTATIC)) {
+	if ((mcp->mc_srr1 & psl_userstatic) != (tf->srr1 & psl_userstatic)) {
 		return (EINVAL);
 	}
 
@@ -538,16 +538,8 @@ exec_setregs(struct thread *td, struct image_params *i
 	tf->srr0 = imgp->entry_addr;
 	#ifdef __powerpc64__
 	tf->fixreg[12] = imgp->entry_addr;
-	#ifdef AIM
-	tf->srr1 = PSL_SF | PSL_USERSET | PSL_FE_DFLT;
-	if (mfmsr() & PSL_HV)
-		tf->srr1 |= PSL_HV;
-	#elif defined(BOOKE)
-	tf->srr1 = PSL_CM | PSL_USERSET | PSL_FE_DFLT;
 	#endif
-	#else
-	tf->srr1 = PSL_USERSET | PSL_FE_DFLT;
-	#endif
+	tf->srr1 = psl_userset | PSL_FE_DFLT;
 	td->td_pcb->pcb_flags = 0;
 }
 
@@ -572,14 +564,7 @@ ppc32_setregs(struct thread *td, struct image_params *
 	tf->fixreg[8] = (register_t)imgp->ps_strings;	/* NetBSD extension */
 
 	tf->srr0 = imgp->entry_addr;
-	tf->srr1 = PSL_USERSET | PSL_FE_DFLT;
-#ifdef AIM
-	tf->srr1 &= ~PSL_SF;
-	if (mfmsr() & PSL_HV)
-		tf->srr1 |= PSL_HV;
-#elif defined(BOOKE)
-	tf->srr1 &= ~PSL_CM;
-#endif
+	tf->srr1 = psl_userset32 | PSL_FE_DFLT;
 	td->td_pcb->pcb_flags = 0;
 }
 #endif
@@ -990,7 +975,7 @@ cpu_copy_thread(struct thread *td, struct thread *td0)
 
 	/* Setup to release spin count in fork_exit(). */
 	td->td_md.md_spinlock_count = 1;
-	td->td_md.md_saved_msr = PSL_KERNSET;
+	td->td_md.md_saved_msr = psl_kernset;
 }
 
 void
@@ -1015,9 +1000,10 @@ cpu_set_upcall(struct thread *td, void (*entry)(void *
 	tf->fixreg[3] = (register_t)arg;
 	if (SV_PROC_FLAG(td->td_proc, SV_ILP32)) {
 		tf->srr0 = (register_t)entry;
-		tf->srr1 = PSL_USERSET | PSL_FE_DFLT;
 		#ifdef __powerpc64__
-		tf->srr1 &= ~PSL_SF;
+		tf->srr1 = psl_userset32 | PSL_FE_DFLT;
+		#else
+		tf->srr1 = psl_userset | PSL_FE_DFLT;
 		#endif
 	} else {
 	    #ifdef __powerpc64__
@@ -1026,14 +1012,10 @@ cpu_set_upcall(struct thread *td, void (*entry)(void *
 		tf->srr0 = entry_desc[0];
 		tf->fixreg[2] = entry_desc[1];
 		tf->fixreg[11] = entry_desc[2];
-		tf->srr1 = PSL_SF | PSL_USERSET | PSL_FE_DFLT;
+		tf->srr1 = psl_userset | PSL_FE_DFLT;
 	    #endif
 	}
 
-	#ifdef __powerpc64__
-	if (mfmsr() & PSL_HV)
-		tf->srr1 |= PSL_HV;
-	#endif
 	td->td_pcb->pcb_flags = 0;
 
 	td->td_retval[0] = (register_t)entry;

Modified: head/sys/powerpc/powerpc/genassym.c
==============================================================================
--- head/sys/powerpc/powerpc/genassym.c	Thu Feb  1 05:28:02 2018	(r328650)
+++ head/sys/powerpc/powerpc/genassym.c	Thu Feb  1 05:31:24 2018	(r328651)
@@ -236,10 +236,6 @@ ASSYM(PSL_UCLE, PSL_UCLE);
 ASSYM(PSL_WE, PSL_WE);
 ASSYM(PSL_UBLE, PSL_UBLE);
 
-#if defined(BOOKE_E500)
-ASSYM(PSL_KERNSET_INIT, PSL_KERNSET_INIT);
-#endif
-
 #if defined(AIM) && defined(__powerpc64__)
 ASSYM(PSL_SF, PSL_SF);
 ASSYM(PSL_HV, PSL_HV);
@@ -268,7 +264,4 @@ ASSYM(PSL_FP, PSL_FP);
 ASSYM(PSL_ME, PSL_ME);
 ASSYM(PSL_PR, PSL_PR);
 ASSYM(PSL_PMM, PSL_PMM);
-ASSYM(PSL_KERNSET, PSL_KERNSET);
-ASSYM(PSL_USERSET, PSL_USERSET);
-ASSYM(PSL_USERSTATIC, PSL_USERSTATIC);
 

Modified: head/sys/powerpc/powerpc/machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/machdep.c	Thu Feb  1 05:28:02 2018	(r328650)
+++ head/sys/powerpc/powerpc/machdep.c	Thu Feb  1 05:31:24 2018	(r328651)
@@ -160,6 +160,14 @@ uintptr_t	powerpc_init(vm_offset_t, vm_offset_t, vm_of
 long		Maxmem = 0;
 long		realmem = 0;
 
+/* Default MSR values set in the AIM/Book-E early startup code */
+register_t	psl_kernset;
+register_t	psl_userset;
+register_t	psl_userstatic;
+#ifdef __powerpc64__
+register_t	psl_userset32;
+#endif
+
 struct kva_md_info kmi;
 
 static void
@@ -380,7 +388,7 @@ powerpc_init(vm_offset_t fdt, vm_offset_t toc, vm_offs
 	 * Bring up MMU
 	 */
 	pmap_bootstrap(startkernel, endkernel);
-	mtmsr(PSL_KERNSET & ~PSL_EE);
+	mtmsr(psl_kernset & ~PSL_EE);
 
 	/*
 	 * Initialize params/tunables that are derived from memsize

Modified: head/sys/powerpc/powerpc/vm_machdep.c
==============================================================================
--- head/sys/powerpc/powerpc/vm_machdep.c	Thu Feb  1 05:28:02 2018	(r328650)
+++ head/sys/powerpc/powerpc/vm_machdep.c	Thu Feb  1 05:31:24 2018	(r328651)
@@ -167,7 +167,7 @@ cpu_fork(struct thread *td1, struct proc *p2, struct t
 
 	/* Setup to release spin count in fork_exit(). */
 	td2->td_md.md_spinlock_count = 1;
-	td2->td_md.md_saved_msr = PSL_KERNSET;
+	td2->td_md.md_saved_msr = psl_kernset;
 
 	/*
  	 * Now cpu_switch() can schedule the new process.


More information about the svn-src-head mailing list