1// Copyright 2016 The Fuchsia Authors
2// Copyright (c) 2012 Travis Geiselbrecht
3//
4// Use of this source code is governed by a MIT-style
5// license that can be found in the LICENSE file or at
6// https://opensource.org/licenses/MIT
7
8#include "tests.h"
9
10#include <err.h>
11#include <inttypes.h>
12#include <kernel/event.h>
13#include <kernel/mp.h>
14#include <kernel/mutex.h>
15#include <kernel/thread.h>
16#include <platform.h>
17#include <rand.h>
18#include <stdio.h>
19#include <zircon/types.h>
20
21int clock_tests(int, const cmd_args*, uint32_t) {
22    uint64_t c;
23    zx_time_t t2;
24
25    thread_sleep_relative(ZX_MSEC(100));
26    c = arch_cycle_count();
27    current_time();
28    c = arch_cycle_count() - c;
29    printf("%" PRIu64 " cycles per current_time()\n", c);
30
31    printf("making sure time never goes backwards\n");
32    {
33        printf("testing current_time()\n");
34        zx_time_t start = current_time();
35        zx_time_t last = start;
36        for (;;) {
37            t2 = current_time();
38            //printf("%llu %llu\n", last, t2);
39            if (t2 < last) {
40                printf("WARNING: time ran backwards: %" PRIi64 " < %" PRIi64 "\n", t2, last);
41                last = t2;
42                continue;
43            }
44            last = t2;
45            if (last - start > ZX_SEC(5))
46                break;
47        }
48    }
49
50    printf("counting to 5, in one second intervals\n");
51    for (int i = 0; i < 5; i++) {
52        thread_sleep_relative(ZX_SEC(1));
53        printf("%d\n", i + 1);
54    }
55
56    cpu_mask_t old_affinity = get_current_thread()->cpu_affinity;
57
58    for (cpu_num_t cpu = 0; cpu < SMP_MAX_CPUS; cpu++) {
59        if (!mp_is_cpu_online(cpu))
60            continue;
61
62        printf("measuring cpu clock against current_time() on cpu %u\n", cpu);
63
64        thread_set_cpu_affinity(get_current_thread(), cpu_num_to_mask(cpu));
65
66        for (int i = 0; i < 3; i++) {
67            uint64_t cycles = arch_cycle_count();
68            zx_time_t start = current_time();
69            while ((current_time() - start) < ZX_SEC(1))
70                ;
71            cycles = arch_cycle_count() - cycles;
72            printf("cpu %u: %" PRIu64 " cycles per second\n", cpu, cycles);
73        }
74    }
75
76    thread_set_cpu_affinity(get_current_thread(), old_affinity);
77
78    return 0;
79}
80