blob: 4dbb80fc8dd4029224079ffdd77a455450381327 [file] [log] [blame]
// Copyright 2016 The Fuchsia Authors
// Copyright (c) 2012 Travis Geiselbrecht
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include "tests.h"
#include <err.h>
#include <inttypes.h>
#include <kernel/event.h>
#include <kernel/mp.h>
#include <kernel/mutex.h>
#include <kernel/thread.h>
#include <platform.h>
#include <rand.h>
#include <stdio.h>
#include <zircon/types.h>
int clock_tests(int, const cmd_args*, uint32_t) {
uint64_t c;
zx_time_t t2;
thread_sleep_relative(ZX_MSEC(100));
c = arch_cycle_count();
current_time();
c = arch_cycle_count() - c;
printf("%" PRIu64 " cycles per current_time()\n", c);
printf("making sure time never goes backwards\n");
{
printf("testing current_time()\n");
zx_time_t start = current_time();
zx_time_t last = start;
for (;;) {
t2 = current_time();
//printf("%llu %llu\n", last, t2);
if (t2 < last) {
printf("WARNING: time ran backwards: %" PRIi64 " < %" PRIi64 "\n", t2, last);
last = t2;
continue;
}
last = t2;
if (last - start > ZX_SEC(5))
break;
}
}
printf("counting to 5, in one second intervals\n");
for (int i = 0; i < 5; i++) {
thread_sleep_relative(ZX_SEC(1));
printf("%d\n", i + 1);
}
cpu_mask_t old_affinity = get_current_thread()->cpu_affinity;
for (cpu_num_t cpu = 0; cpu < SMP_MAX_CPUS; cpu++) {
if (!mp_is_cpu_online(cpu))
continue;
printf("measuring cpu clock against current_time() on cpu %u\n", cpu);
thread_set_cpu_affinity(get_current_thread(), cpu_num_to_mask(cpu));
for (int i = 0; i < 3; i++) {
uint64_t cycles = arch_cycle_count();
zx_time_t start = current_time();
while ((current_time() - start) < ZX_SEC(1))
;
cycles = arch_cycle_count() - cycles;
printf("cpu %u: %" PRIu64 " cycles per second\n", cpu, cycles);
}
}
thread_set_cpu_affinity(get_current_thread(), old_affinity);
return 0;
}