| // Copyright 2016 The Fuchsia Authors |
| // Copyright (c) 2014 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 <arch.h> |
| #include <inttypes.h> |
| #include <lib/console.h> |
| #include <platform.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <zircon/types.h> |
| |
| #include <arch/ops.h> |
| |
| #include "tests.h" |
| |
| static void bench_cache(size_t bufsize, uint8_t* buf) { |
| zx_time_t t; |
| bool do_free; |
| |
| printf("cache line size %" PRIu32 "\n", arch_dcache_line_size()); |
| |
| if (buf == 0) { |
| buf = (uint8_t*)memalign(arch_dcache_line_size(), bufsize); |
| do_free = true; |
| } else { |
| do_free = false; |
| } |
| |
| printf("buf %p, size %zu\n", buf, bufsize); |
| |
| if (!buf) |
| return; |
| |
| t = current_time(); |
| arch_clean_cache_range((vaddr_t)buf, bufsize); |
| zx_duration_t duration = current_time() - t; |
| |
| printf("took %" PRIi64 " nsecs to clean %zu bytes (cold)\n", duration, bufsize); |
| |
| memset(buf, 0x99, bufsize); |
| |
| t = current_time(); |
| arch_clean_cache_range((vaddr_t)buf, bufsize); |
| duration = current_time() - t; |
| |
| if (do_free) |
| free(buf); |
| |
| printf("took %" PRIi64 " nsecs to clean %zu bytes (hot)\n", duration, bufsize); |
| } |
| |
| static int cache_tests(int argc, const cmd_args* argv, uint32_t flags) { |
| uint8_t* buf; |
| buf = (uint8_t*)((argc > 1) ? argv[1].u : 0UL); |
| |
| printf("testing cache\n"); |
| |
| bench_cache(2 * 1024, buf); |
| bench_cache(64 * 1024, buf); |
| bench_cache(256 * 1024, buf); |
| bench_cache(1 * 1024 * 1024, buf); |
| bench_cache(8 * 1024 * 1024, buf); |
| return 0; |
| } |
| |
| STATIC_COMMAND_START |
| STATIC_COMMAND("cache_tests", "test/bench the cpu cache", &cache_tests) |
| STATIC_COMMAND_END(cache_tests) |