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