diff --git a/code/time.lisp b/code/time.lisp
index 446fa77ca342076d9bca6c85566ff9d8d7a1bbb4..7b7074d9e72d33b14b2d9e5cdc6461de2f84a431 100644
--- a/code/time.lisp
+++ b/code/time.lisp
@@ -5,7 +5,7 @@
 ;;; Carnegie Mellon University, and has been placed in the public domain.
 ;;;
 (ext:file-comment
-  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/time.lisp,v 1.27 2004/10/09 02:47:44 rtoy Exp $")
+  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/time.lisp,v 1.28 2005/04/15 01:40:07 rtoy Exp $")
 ;;;
 ;;; **********************************************************************
 ;;;
@@ -281,11 +281,22 @@
 		       (system:get-system-info)
     (values user sys faults (get-bytes-consed))))
 
-#+(or pentium sparc-v9 ppc)
+#+(or pentium sparc-v9)
 (defun cycle-count/float ()
   (multiple-value-bind (lo hi)
       (vm::read-cycle-counter)
     (+ (* hi (expt 2.0d0 32)) lo)))
+#+ppc
+(progn
+(alien:def-alien-variable cycles-per-tick c-call:int)
+(defun cycle-count/float ()
+  (multiple-value-bind (lo hi)
+      (vm::read-cycle-counter)
+    ;; The cycle counter on PPC isn't really a cycle counter.  It
+    ;; counts ticks, so we need to convert ticks to cycles.
+    ;; CYCLES-PER-TICK is the scale factor, computed in C.
+    (* cycles-per-tick (+ (* hi (expt 2.0d0 32)) lo))))
+)
 
 #-(or pentium sparc-v9 ppc)
 (defun cycle-count/float () 0.0)
@@ -379,9 +390,7 @@
 		    (max (/ (- new-run-utime old-run-utime) 1000000.0) 0.0)
 		    (max (/ (- new-run-stime old-run-stime) 1000000.0) 0.0)
 		    (truncate cycle-count)
-		    ;; The counter for PPC isn't the number of CPU
-		    ;; cycles, unlike x86 and Ultrasparc.
-		    #+ppc "time-base" #-ppc "CPU"
+		    "CPU"
 		    (unless (zerop gc-run-time)
 		      (/ (float gc-run-time)
 			 (float internal-time-units-per-second)))
diff --git a/lisp/lisp.c b/lisp/lisp.c
index 076a2d4db15c851df003a23210b95e1a0280038d..0764ed2b53a0f66407f7333aa4aa2f15399504dc 100644
--- a/lisp/lisp.c
+++ b/lisp/lisp.c
@@ -1,7 +1,7 @@
 /*
  * main() entry point for a stand alone lisp image.
  *
- * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/lisp.c,v 1.46 2005/02/04 15:03:52 rtoy Exp $
+ * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/lisp.c,v 1.47 2005/04/15 01:40:08 rtoy Exp $
  *
  */
 
@@ -395,6 +395,53 @@ prepend_core_path(char* lib, char* corefile)
 int builtin_image_flag = 0;
 long initial_function_addr = 0;
 
+#ifdef DARWIN
+#include <sys/param.h>
+#include <sys/sysctl.h>
+
+int cycles_per_tick = 1;
+
+/*
+ * Compute the conversion factor from the numbef of time base ticks to
+ * clock frequency.  The timebase counter on PPC is not a cycle
+ * counter; we have to derive the relationship ourselves.
+ */
+
+void timebase_init()
+{
+  int mib[2];
+  int tbfrequency;
+  int cpufrequency;
+  unsigned int miblen;
+  size_t len;
+
+  mib[0] = CTL_HW;
+#ifndef HW_TB_FREQ
+  /*
+   * Mac OS X 10.2.8 doesn't have this, so we take it from 10.3.8,
+   * which does.
+   */
+#define HW_TB_FREQ	23
+#endif  
+  mib[1] = HW_TB_FREQ;
+  miblen = 2;
+  len = sizeof(tbfrequency);
+
+  if (sysctl(mib, miblen, &tbfrequency, &len, NULL, 0) == -1) {
+    perror("Error getting HW_TB_FREQ from sysctl: ");
+  }
+
+  mib[0] = CTL_HW;
+  mib[1] = HW_CPU_FREQ;
+  miblen = 2;
+  len = sizeof(cpufrequency);
+  if (sysctl(mib, miblen, &cpufrequency, &len, NULL, 0) == -1) {
+    perror("Error getting HW_CPU_FREQ from sysctl: ");
+  }
+
+  cycles_per_tick = cpufrequency / tbfrequency;
+}
+#endif
 /* And here be main. */
 
 int main(int argc, char *argv[], char *envp[])
@@ -700,6 +747,9 @@ int main(int argc, char *argv[], char *envp[])
      */
     sigint_init();
 
+#ifdef DARWIN
+    timebase_init();
+#endif
     if (monitor) {
         while (1) {
             ldb_monitor();