svn commit: r197184 - in projects/ppc64/sys/powerpc: aim aim64
include
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Mon Sep 14 03:53:49 UTC 2009
Author: nwhitehorn
Date: Mon Sep 14 03:53:48 2009
New Revision: 197184
URL: http://svn.freebsd.org/changeset/base/197184
Log:
Fix some register sizes, and fix the cacheline size determination HID5
for G5s. This helps not mire us in an infinite nest of decrementer
interrupts, which is always good, and gets the machine mounting root over
NFS before dying.
Remaining mysteries:
1. The 64-bit kernel sees the CPU tick almost exactly 3 times faster than
the 32-bit kernel. This makes no sense.
2. There is some memory corruption associated with thread switching. Once
the kernel is multithreaded, I get interesting errors like "corrupt
spinlock" and miscellaneous assertion failures in random places.
Modified:
projects/ppc64/sys/powerpc/aim/clock.c
projects/ppc64/sys/powerpc/aim/machdep.c
projects/ppc64/sys/powerpc/aim64/machdep.c
projects/ppc64/sys/powerpc/aim64/mmu_oea64.c
projects/ppc64/sys/powerpc/include/cpufunc.h
projects/ppc64/sys/powerpc/include/hid.h
Modified: projects/ppc64/sys/powerpc/aim/clock.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/clock.c Sun Sep 13 23:12:05 2009 (r197183)
+++ projects/ppc64/sys/powerpc/aim/clock.c Mon Sep 14 03:53:48 2009 (r197184)
@@ -95,8 +95,7 @@ static struct timecounter decr_timecount
void
decr_intr(struct trapframe *frame)
{
- long tick;
- int nticks;
+ int32_t tick, nticks;
/*
* Check whether we are initialized.
Modified: projects/ppc64/sys/powerpc/aim/machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/machdep.c Sun Sep 13 23:12:05 2009 (r197183)
+++ projects/ppc64/sys/powerpc/aim/machdep.c Mon Sep 14 03:53:48 2009 (r197184)
@@ -342,9 +342,9 @@ powerpc_init(u_int startkernel, u_int en
case IBM970FX:
case IBM970MP:
case IBM970GX:
- scratch = mfspr64upper(SPR_HID5,msr);
+ scratch = mfspr(SPR_HID5);
scratch &= ~HID5_970_DCBZ_SIZE_HI;
- mtspr64(SPR_HID5, scratch, mfspr(SPR_HID5), msr);
+ mtspr(SPR_HID5, scratch);
break;
}
Modified: projects/ppc64/sys/powerpc/aim64/machdep.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim64/machdep.c Sun Sep 13 23:12:05 2009 (r197183)
+++ projects/ppc64/sys/powerpc/aim64/machdep.c Mon Sep 14 03:53:48 2009 (r197184)
@@ -334,7 +334,7 @@ powerpc_init(u_int startkernel, u_int en
case IBM970MP:
case IBM970GX:
scratch = mfspr(SPR_HID5);
- scratch &= ~((register_t)HID5_970_DCBZ_SIZE_HI << 32);
+ scratch &= ~HID5_970_DCBZ_SIZE_HI;
mtspr(SPR_HID5, scratch);
break;
}
@@ -825,7 +825,7 @@ cpu_halt(void)
void
cpu_idle(int busy)
{
- uint32_t msr;
+ register_t msr;
msr = mfmsr();
Modified: projects/ppc64/sys/powerpc/aim64/mmu_oea64.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim64/mmu_oea64.c Sun Sep 13 23:12:05 2009 (r197183)
+++ projects/ppc64/sys/powerpc/aim64/mmu_oea64.c Mon Sep 14 03:53:48 2009 (r197184)
@@ -759,7 +759,7 @@ moea64_bridge_bootstrap(mmu_t mmup, vm_o
int ofw_mappings;
vm_size_t size, physsz, hwphyssz;
vm_offset_t pa, va, off;
- uint32_t msr;
+ register_t msr;
void *dpcpu;
/* We don't have a direct map since there is no BAT */
Modified: projects/ppc64/sys/powerpc/include/cpufunc.h
==============================================================================
--- projects/ppc64/sys/powerpc/include/cpufunc.h Sun Sep 13 23:12:05 2009 (r197183)
+++ projects/ppc64/sys/powerpc/include/cpufunc.h Mon Sep 14 03:53:48 2009 (r197184)
@@ -68,6 +68,15 @@ mtmsr(register_t value)
__asm __volatile ("mtmsr %0; isync" :: "r"(value));
}
+#ifdef __powerpc64__
+static __inline void
+mtmsrd(register_t value)
+{
+
+ __asm __volatile ("mtmsrd %0; isync" :: "r"(value));
+}
+#endif
+
static __inline register_t
mfmsr(void)
{
@@ -78,6 +87,7 @@ mfmsr(void)
return (value);
}
+#ifndef __powerpc64__
static __inline void
mtsrin(vm_offset_t va, register_t value)
{
@@ -94,6 +104,7 @@ mfsrin(vm_offset_t va)
return (value);
}
+#endif
static __inline void
mtdec(register_t value)
@@ -126,6 +137,9 @@ static __inline u_quad_t
mftb(void)
{
u_quad_t tb;
+ #ifdef __powerpc64__
+ __asm __volatile ("mftb %0" : "=r"(tb));
+ #else
uint32_t *tbup = (uint32_t *)&tb;
uint32_t *tblp = tbup + 1;
@@ -133,6 +147,7 @@ mftb(void)
*tbup = mfspr(TBR_TBU);
*tblp = mfspr(TBR_TBL);
} while (*tbup != mfspr(TBR_TBU));
+ #endif
return (tb);
}
Modified: projects/ppc64/sys/powerpc/include/hid.h
==============================================================================
--- projects/ppc64/sys/powerpc/include/hid.h Sun Sep 13 23:12:05 2009 (r197183)
+++ projects/ppc64/sys/powerpc/include/hid.h Mon Sep 14 03:53:48 2009 (r197184)
@@ -154,6 +154,6 @@
#define HID0_E500_DEFAULT_SET (HID0_EMCP | HID0_E500_TBEN)
#define HID1_E500_DEFAULT_SET (HID1_E500_ABE | HID1_E500_ASTME)
-#define HID5_970_DCBZ_SIZE_HI 0x01000000 /* dcbz does a 32-byte store */
+#define HID5_970_DCBZ_SIZE_HI 0x00000080UL /* dcbz does a 32-byte store */
#endif /* _POWERPC_HID_H_ */
More information about the svn-src-projects
mailing list