blob: c95cb582041586ea16dbe33c663f3e48fe24e786 [file] [log] [blame]
/**
* @file op_cpufreq.c
* get cpu frequency definition
*
* @remark Copyright 2003 OProfile authors
* @remark Read the file COPYING
*
* @author John Levon
* @author Philippe Elie
*/
#include <stdio.h>
#include <stdlib.h>
#include "op_fileio.h"
double op_cpu_frequency(void)
{
double fval = 0.0;
unsigned long uval;
char * line = NULL;
FILE * fp = op_try_open_file("/proc/cpuinfo", "r");
if (!fp)
return 0.0;
while (1) {
line = op_get_line(fp);
if (!line)
break;
if (line[0] == '\0') {
free(line);
continue;
}
/* x86/parisc/ia64/x86_64 */
if (sscanf(line, "cpu MHz : %lf", &fval) == 1)
break;
/* ppc/ppc64 */
if (sscanf(line, "clock : %lfMHz", &fval) == 1)
break;
/* alpha */
if (sscanf(line, "cycle frequency [Hz] : %lu", &uval) == 1) {
fval = uval / 1E6;
break;
}
/* sparc64 if CONFIG_SMP only */
if (sscanf(line, "Cpu0ClkTck : %lx", &uval) == 1) {
fval = uval / 1E6;
break;
}
/* mips including loongson2 */
if (sscanf(line, "BogoMIPS : %lu", &uval) == 1) {
fval = uval * 3 / 2;
break;
}
/* s390 doesn't provide cpu freq, checked up to 2.6-test4 */
free(line);
}
if (line)
free(line);
op_close_file(fp);
return fval;
}