diff --git a/cpustats/Android.mk b/cpustats/Android.mk
new file mode 100644
index 0000000..2789989
--- /dev/null
+++ b/cpustats/Android.mk
@@ -0,0 +1,10 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := cpustats.c
+
+LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
+LOCAL_MODULE_TAGS := debug
+LOCAL_MODULE := cpustats
+
+include $(BUILD_EXECUTABLE)
diff --git a/cpustats/NOTICE b/cpustats/NOTICE
new file mode 100644
index 0000000..c77f135
--- /dev/null
+++ b/cpustats/NOTICE
@@ -0,0 +1,190 @@
+
+   Copyright (c) 2012, The Android Open Source Project
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
diff --git a/cpustats/cpustats.c b/cpustats/cpustats.c
new file mode 100644
index 0000000..32d75b2
--- /dev/null
+++ b/cpustats/cpustats.c
@@ -0,0 +1,430 @@
+/*
+ * Copyright (c) 2012, The Android Open Source Project
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *  * Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *  * Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *  * Neither the name of Google, Inc. nor the names of its contributors
+ *    may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define MAX_BUF_SIZE 64
+
+struct freq_info {
+    unsigned freq;
+    long unsigned time;
+};
+
+struct cpu_info {
+    long unsigned utime, ntime, stime, itime, iowtime, irqtime, sirqtime;
+    struct freq_info *freqs;
+    int freq_count;
+};
+
+#define die(...) { fprintf(stderr, __VA_ARGS__); exit(EXIT_FAILURE); }
+
+static struct cpu_info old_total_cpu, new_total_cpu, *old_cpus, *new_cpus;
+static int cpu_count, delay, iterations;
+static char minimal, aggregate_freq_stats;
+
+static int get_cpu_count();
+static int get_cpu_count_from_file(char *filename);
+static long unsigned get_cpu_total_time(struct cpu_info *cpu);
+static int get_freq_scales_count(int cpu);
+static void print_stats();
+static void print_cpu_stats(char *label, struct cpu_info *new_cpu, struct cpu_info *old_cpu,
+        char print_freq);
+static void print_freq_stats(struct cpu_info *new_cpu, struct cpu_info *old_cpu);
+static void read_stats();
+static void read_freq_stats(int cpu);
+static char should_aggregate_freq_stats();
+static char should_print_freq_stats();
+static void usage(char *cmd);
+
+int main(int argc, char *argv[]) {
+    struct cpu_info *tmp_cpus, tmp_total_cpu;
+    int i, freq_count;
+
+    delay = 3;
+    iterations = -1;
+    minimal = 0;
+    aggregate_freq_stats = 0;
+
+    for (i = 0; i < argc; i++) {
+        if (!strcmp(argv[i], "-n")) {
+            if (i + 1 >= argc) {
+                fprintf(stderr, "Option -n expects an argument.\n");
+                usage(argv[0]);
+                exit(EXIT_FAILURE);
+            }
+            iterations = atoi(argv[++i]);
+            continue;
+        }
+        if (!strcmp(argv[i], "-d")) {
+            if (i + 1 >= argc) {
+                fprintf(stderr, "Option -d expects an argument.\n");
+                usage(argv[0]);
+                exit(EXIT_FAILURE);
+            }
+            delay = atoi(argv[++i]);
+            continue;
+        }
+        if (!strcmp(argv[i], "-m")) {
+            minimal = 1;
+        }
+        if (!strcmp(argv[i], "-h")) {
+            usage(argv[0]);
+            exit(EXIT_SUCCESS);
+        }
+    }
+
+    cpu_count = get_cpu_count();
+
+    old_cpus = malloc(sizeof(struct cpu_info) * cpu_count);
+    if (!old_cpus) die("Could not allocate struct cpu_info\n");
+    new_cpus = malloc(sizeof(struct cpu_info) * cpu_count);
+    if (!new_cpus) die("Could not allocate struct cpu_info\n");
+
+    for (i = 0; i < cpu_count; i++) {
+        old_cpus[i].freq_count = new_cpus[i].freq_count = get_freq_scales_count(i);
+        new_cpus[i].freqs = malloc(sizeof(struct freq_info) * new_cpus[i].freq_count);
+        if (!new_cpus[i].freqs) die("Could not allocate struct freq_info\n");
+        old_cpus[i].freqs = malloc(sizeof(struct freq_info) * old_cpus[i].freq_count);
+        if (!old_cpus[i].freqs) die("Could not allocate struct freq_info\n");
+    }
+
+    // Read stats without aggregating freq stats in the total cpu
+    read_stats();
+
+    aggregate_freq_stats = should_aggregate_freq_stats();
+    if (aggregate_freq_stats) {
+        old_total_cpu.freq_count = new_total_cpu.freq_count = new_cpus[0].freq_count;
+        new_total_cpu.freqs = malloc(sizeof(struct freq_info) * new_total_cpu.freq_count);
+        if (!new_total_cpu.freqs) die("Could not allocate struct freq_info\n");
+        old_total_cpu.freqs = malloc(sizeof(struct freq_info) * old_total_cpu.freq_count);
+        if (!old_total_cpu.freqs) die("Could not allocate struct freq_info\n");
+
+        // Read stats again with aggregating freq stats in the total cpu
+        read_stats();
+    }
+
+    while ((iterations == -1) || (iterations-- > 0)) {
+        // Swap new and old cpu buffers;
+        tmp_total_cpu = old_total_cpu;
+        old_total_cpu = new_total_cpu;
+        new_total_cpu = tmp_total_cpu;
+
+        tmp_cpus = old_cpus;
+        old_cpus = new_cpus;
+        new_cpus = tmp_cpus;
+
+        sleep(delay);
+        read_stats();
+        print_stats();
+    }
+
+    // Clean up
+    if (aggregate_freq_stats) {
+        free(new_total_cpu.freqs);
+        free(old_total_cpu.freqs);
+    }
+    for (i = 0; i < cpu_count; i++) {
+        free(new_cpus[i].freqs);
+        free(old_cpus[i].freqs);
+    }
+    free(new_cpus);
+    free(old_cpus);
+
+    return 0;
+}
+
+/*
+ * Get the number of CPUs of the system.
+ *
+ * Uses the two files /sys/devices/system/cpu/present and
+ * /sys/devices/system/cpu/online to determine the number of CPUs. Expects the
+ * format of both files to be either 0 or 0-N where N+1 is the number of CPUs.
+ *
+ * Exits if the present CPUs is not equal to the online CPUs
+ */
+static int get_cpu_count() {
+    int cpu_count = get_cpu_count_from_file("/sys/devices/system/cpu/present");
+    if (cpu_count != get_cpu_count_from_file("/sys/devices/system/cpu/online")) {
+        die("present cpus != online cpus\n");
+    }
+    return cpu_count;
+}
+
+/*
+ * Get the number of CPUs from a given filename.
+ */
+static int get_cpu_count_from_file(char *filename) {
+    FILE *file;
+    char line[MAX_BUF_SIZE];
+    int cpu_count;
+
+    file = fopen(filename, "r");
+    if (!file) die("Could not open %s\n", filename);
+    if (!fgets(line, MAX_BUF_SIZE, file)) die("Could not get %s contents\n", filename);
+    fclose(file);
+
+    if (strcmp(line, "0\n") == 0) {
+        return 1;
+    }
+
+    if (1 == sscanf(line, "0-%d\n", &cpu_count)) {
+        return cpu_count + 1;
+    }
+
+    die("Unexpected input in file %s (%s).\n", filename, line);
+    return -1;
+}
+
+/*
+ * Get the number of frequency states a given CPU can be scaled to.
+ */
+static int get_freq_scales_count(int cpu) {
+    FILE *file;
+    char filename[MAX_BUF_SIZE];
+    long unsigned freq;
+    int count = 0;
+
+    sprintf(filename, "/sys/devices/system/cpu/cpu%d/cpufreq/stats/time_in_state", cpu);
+    file = fopen(filename, "r");
+    if (!file) die("Could not open %s\n", filename);
+    do {
+        freq = 0;
+        fscanf(file, "%lu %*d\n", &freq);
+        if (freq) count++;
+    } while(freq);
+    fclose(file);
+
+    return count;
+}
+
+/*
+ * Read the CPU and frequency stats for all cpus.
+ */
+static void read_stats() {
+    FILE *file;
+    char scanline[MAX_BUF_SIZE];
+    int i;
+
+    file = fopen("/proc/stat", "r");
+    if (!file) die("Could not open /proc/stat.\n");
+    fscanf(file, "cpu  %lu %lu %lu %lu %lu %lu %lu %*d %*d %*d\n",
+           &new_total_cpu.utime, &new_total_cpu.ntime, &new_total_cpu.stime, &new_total_cpu.itime,
+           &new_total_cpu.iowtime, &new_total_cpu.irqtime, &new_total_cpu.sirqtime);
+    if (aggregate_freq_stats) {
+        for (i = 0; i < new_total_cpu.freq_count; i++) {
+            new_total_cpu.freqs[i].time = 0;
+        }
+    }
+
+    for (i = 0; i < cpu_count; i++) {
+        sprintf(scanline, "cpu%d %%lu %%lu %%lu %%lu %%lu %%lu %%lu %%*d %%*d %%*d\n", i);
+        fscanf(file, scanline, &new_cpus[i].utime, &new_cpus[i].ntime, &new_cpus[i].stime,
+               &new_cpus[i].itime, &new_cpus[i].iowtime, &new_cpus[i].irqtime,
+               &new_cpus[i].sirqtime);
+        read_freq_stats(i);
+    }
+    fclose(file);
+}
+
+/*
+ * Read the frequency stats for a given cpu.
+ */
+static void read_freq_stats(int cpu) {
+    FILE *file;
+    char filename[MAX_BUF_SIZE];
+    int i;
+
+    sprintf(filename, "/sys/devices/system/cpu/cpu%d/cpufreq/stats/time_in_state", cpu);
+    file = fopen(filename, "r");
+    if (!file) die("Could not open %s\n", filename);
+    for (i = 0; i < new_cpus[cpu].freq_count; i++) {
+        fscanf(file, "%u %lu\n", &new_cpus[cpu].freqs[i].freq,
+               &new_cpus[cpu].freqs[i].time);
+        if (aggregate_freq_stats) {
+            new_total_cpu.freqs[i].freq = new_cpus[cpu].freqs[i].freq;
+            new_total_cpu.freqs[i].time += new_cpus[cpu].freqs[i].time;
+        }
+    }
+    fclose(file);
+}
+
+/*
+ * Get the sum of the cpu time from all categories.
+ */
+static long unsigned get_cpu_total_time(struct cpu_info *cpu) {
+    return (cpu->utime + cpu->ntime + cpu->stime + cpu->itime + cpu->iowtime + cpu->irqtime +
+            cpu->sirqtime);
+}
+
+/*
+ * Print the stats for all CPUs.
+ */
+static void print_stats() {
+    char label[8];
+    int i, j;
+    char print_freq;
+
+    print_freq = should_print_freq_stats();
+
+    print_cpu_stats("Total", &new_total_cpu, &old_total_cpu, 1);
+    for (i = 0; i < cpu_count; i++) {
+        sprintf(label, "cpu%d", i);
+        print_cpu_stats(label, &new_cpus[i], &old_cpus[i], print_freq);
+    }
+    printf("\n");
+}
+
+/*
+ * Print the stats for a single CPU.
+ */
+static void print_cpu_stats(char *label, struct cpu_info *new_cpu, struct cpu_info *old_cpu,
+        char print_freq) {
+    long int total_delta_time;
+
+    if (!minimal) {
+        total_delta_time = get_cpu_total_time(new_cpu) - get_cpu_total_time(old_cpu);
+        printf("%s: User %ld + Nice %ld + Sys %ld + Idle %ld + IOW %ld + IRQ %ld + SIRQ %ld = "
+                "%ld\n", label,
+                new_cpu->utime - old_cpu->utime,
+                new_cpu->ntime - old_cpu->ntime,
+                new_cpu->stime - old_cpu->stime,
+                new_cpu->itime - old_cpu->itime,
+                new_cpu->iowtime - old_cpu->iowtime,
+                new_cpu->irqtime - old_cpu->irqtime,
+                new_cpu->sirqtime - old_cpu->sirqtime,
+                total_delta_time);
+        if (print_freq) {
+            print_freq_stats(new_cpu, old_cpu);
+        }
+    } else {
+        printf("%s,%ld,%ld,%ld,%ld,%ld,%ld,%ld", label,
+                new_cpu->utime - old_cpu->utime,
+                new_cpu->ntime - old_cpu->ntime,
+                new_cpu->stime - old_cpu->stime,
+                new_cpu->itime - old_cpu->itime,
+                new_cpu->iowtime - old_cpu->iowtime,
+                new_cpu->irqtime - old_cpu->irqtime,
+                new_cpu->sirqtime - old_cpu->sirqtime);
+        print_freq_stats(new_cpu, old_cpu);
+        printf("\n");
+    }
+}
+
+/*
+ * Print the CPU stats for a single CPU.
+ */
+static void print_freq_stats(struct cpu_info *new_cpu, struct cpu_info *old_cpu) {
+    long int delta_time, total_delta_time;
+    int i;
+
+    if (new_cpu->freq_count > 0) {
+        if (!minimal) {
+            total_delta_time = 0;
+            printf("  ");
+            for (i = 0; i < new_cpu->freq_count; i++) {
+                delta_time = new_cpu->freqs[i].time - old_cpu->freqs[i].time;
+                total_delta_time += delta_time;
+                printf("%ukHz %ld", new_cpu->freqs[i].freq, delta_time);
+                if (i + 1 != new_cpu->freq_count) {
+                    printf(" + \n  ");
+                } else {
+                    printf(" = ");
+                }
+            }
+            printf("%ld\n", total_delta_time);
+        } else {
+            for (i = 0; i < new_cpu->freq_count; i++) {
+                printf(",%u,%ld", new_cpu->freqs[i].freq,
+                        new_cpu->freqs[i].time - old_cpu->freqs[i].time);
+            }
+        }
+    }
+}
+
+/*
+ * Determine if frequency stats should be printed.
+ *
+ * If the frequency stats are different between CPUs, the stats should be
+ * printed for each CPU, else only the aggregate frequency stats should be
+ * printed.
+ */
+static char should_print_freq_stats() {
+    int i, j;
+
+    for (i = 1; i < cpu_count; i++) {
+        for (j = 0; j < new_cpus[i].freq_count; j++) {
+            if (new_cpus[i].freqs[j].time - old_cpus[i].freqs[j].time !=
+                    new_cpus[0].freqs[j].time - old_cpus[0].freqs[j].time) {
+                return 1;
+            }
+        }
+    }
+    return 0;
+}
+
+/*
+ * Determine if the frequency stats should be aggregated.
+ *
+ * Only aggregate the frequency stats in the total cpu stats if the frequencies
+ * reported by all CPUs are identical.  Must be called after read_stats() has
+ * been called once.
+ */
+static char should_aggregate_freq_stats() {
+    int i, j;
+
+    for (i = 1; i < cpu_count; i++) {
+        if (new_cpus[i].freq_count != new_cpus[0].freq_count) {
+            return 0;
+        }
+        for (j = 0; j < new_cpus[i].freq_count; j++) {
+            if (new_cpus[i].freqs[j].freq != new_cpus[0].freqs[j].freq) {
+                return 0;
+            }
+        }
+    }
+
+    return 1;
+}
+
+/*
+ * Print the usage message.
+ */
+static void usage(char *cmd) {
+    fprintf(stderr, "Usage %s [ -n iterations ] [ -d delay ] [ -c cpu ] [ -m ] [ -h ]\n"
+            "    -n num  Updates to show before exiting.\n"
+            "    -d num  Seconds to wait between updates.\n"
+            "    -m      Display minimal output.\n"
+            "    -h      Display this help screen.\n",
+            cmd);
+}
