| /** |
| * @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; |
| } |