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.
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to