Author: grehan
Date: Wed Jun 10 12:47:54 2009
New Revision: 193909
URL: http://svn.freebsd.org/changeset/base/193909

Log:
  Get the gdb/psim emulator functioning again.
  
  aim/machdep.c:
    - the       RI status register bit needs to be set when     doing the 
mtmsrd 64-bit
      instruction       test
    - psim doesn't implement the dcbz instruction       so the run-time 
cacheline
      test fails.       Set the cachline size to 32 to avoid infinite loops in
      future calls to __syncicache()
  
  aim/platform_chrp.c:
    - if after iterating through / and a name property of "cpus" still isn't
      found, just       search directly for '/cpus'.
    - psim doesn't put a "reg" property on it's cpu nodes, so assume 0
      since it is       uniprocessor-only at this point
  
  powerpc/openpic.c
    - the       number of CPUs reported is 1 too many on psim's openpic
  
  Reviewed by:  nwhitehorn
  MFC after:    1 week (openpic part)

Modified:
  head/sys/powerpc/aim/machdep.c
  head/sys/powerpc/aim/platform_chrp.c
  head/sys/powerpc/powerpc/openpic.c

Modified: head/sys/powerpc/aim/machdep.c
==============================================================================
--- head/sys/powerpc/aim/machdep.c      Wed Jun 10 12:20:11 2009        
(r193908)
+++ head/sys/powerpc/aim/machdep.c      Wed Jun 10 12:47:54 2009        
(r193909)
@@ -359,7 +359,7 @@ powerpc_init(u_int startkernel, u_int en
         */
 
        msr = mfmsr();
-       mtmsr(msr & ~(PSL_IR | PSL_DR));
+       mtmsr((msr & ~(PSL_IR | PSL_DR)) | PSL_RI);
        isync();
 
        /*
@@ -380,6 +380,12 @@ powerpc_init(u_int startkernel, u_int en
        for (cacheline_size = 0; cacheline_size < 0x100 &&
            cache_check[cacheline_size] == 0; cacheline_size++);
 
+       /* Work around psim bug */
+       if (cacheline_size == 0) {
+               printf("WARNING: cacheline size undetermined, setting to 32\n");
+               cacheline_size = 32;
+       }
+
        /*
         * Figure out whether we need to use the 64 bit PMAP. This works by
         * executing an instruction that is only legal on 64-bit PPC (mtmsrd),

Modified: head/sys/powerpc/aim/platform_chrp.c
==============================================================================
--- head/sys/powerpc/aim/platform_chrp.c        Wed Jun 10 12:20:11 2009        
(r193908)
+++ head/sys/powerpc/aim/platform_chrp.c        Wed Jun 10 12:47:54 2009        
(r193909)
@@ -102,7 +102,7 @@ static u_long
 chrp_timebase_freq(platform_t plat, struct cpuref *cpuref)
 {
        phandle_t phandle;
-       u_long ticks = -1;
+       long ticks = -1;
 
        phandle = cpuref->cr_hwref;
 
@@ -122,8 +122,14 @@ chrp_smp_fill_cpuref(struct cpuref *cpur
 
        cpuref->cr_hwref = cpu;
        res = OF_getprop(cpu, "reg", &cpuid, sizeof(cpuid));
-       if (res < 0)
-               return (ENOENT);
+
+       /*
+        * psim doesn't have a reg property, so assume 0 as for the
+        * uniprocessor case in the CHRP spec. 
+        */
+       if (res < 0) {
+               cpuid = 0;
+       }
 
        cpuref->cr_cpuid = cpuid & 0xff;
        return (0);
@@ -145,10 +151,18 @@ chrp_smp_first_cpu(platform_t plat, stru
                        break;
                dev = OF_peer(dev);
        }
-       if (dev == 0)
-               return (ENOENT);
+       if (dev == 0) {
+               /*
+                * psim doesn't have a name property on the /cpus node,
+                * but it can be found directly
+                */
+               dev = OF_finddevice("/cpus");
+               if (dev == 0)
+                       return (ENOENT);
+       }
 
        cpu = OF_child(dev);
+
        while (cpu != 0) {
                res = OF_getprop(cpu, "device_type", buf, sizeof(buf));
                if (res > 0 && strcmp(buf, "cpu") == 0)

Modified: head/sys/powerpc/powerpc/openpic.c
==============================================================================
--- head/sys/powerpc/powerpc/openpic.c  Wed Jun 10 12:20:11 2009        
(r193908)
+++ head/sys/powerpc/powerpc/openpic.c  Wed Jun 10 12:47:54 2009        
(r193909)
@@ -122,10 +122,12 @@ openpic_attach(device_t dev)
            OPENPIC_FEATURE_LAST_IRQ_SHIFT) + 1;
 
        /*
-        * PSIM seems to report 1 too many IRQs
+        * PSIM seems to report 1 too many IRQs and CPUs
         */
-       if (sc->sc_psim)
+       if (sc->sc_psim) {
                sc->sc_nirq--;
+               sc->sc_ncpu--;
+       }
 
        if (bootverbose)
                device_printf(dev,
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to