Skip to content
Snippets Groups Projects
Commit 1cceeb7e authored by rtoy's avatar rtoy
Browse files

lisp/lisp.c:

o Add function for ppc to compute the number of CPU cycles per
  timebase ticks.  Save this in a global variable.

code/time.lisp:
o Adjust cycle-count/float for ppc to use the cycles-per-tick to
  compute the actual number of CPU cycles, so we can display cycles
  instead of ticks.
parent 51e70805
No related branches found
No related tags found
No related merge requests found
......@@ -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)))
......
/*
* 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();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment