memtest.cpp revision e16cb84e2324f05334d18dcf5956f20f44262b62
1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* 2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * you may not use this file except in compliance with the License. 6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * You may obtain a copy of the License at 7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * See the License for the specific language governing permissions and 14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * limitations under the License. 15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */ 16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h> 18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h> 19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <string.h> 20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/time.h> 21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <time.h> 22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h> 23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sched.h> 24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/resource.h> 25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/syscall.h> 26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/types.h> 27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/mman.h> 28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectconst int DCACHE_SIZE = 8*1024; 31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectconst int CPU_FREQ_EST = 195; 32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectconst int BRANCH_CYCLE = 3; 33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#else 34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectconst int DCACHE_SIZE = 32*1024; 35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectconst int CPU_FREQ_EST = 384; 36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectconst int BRANCH_CYCLE = 2; 37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projecttypedef long long nsecs_t; 40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic nsecs_t system_time() 42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct timespec t; 44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project t.tv_sec = t.tv_nsec = 0; 45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project clock_gettime(CLOCK_MONOTONIC, &t); 46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return nsecs_t(t.tv_sec)*1000000000LL + t.tv_nsec; 47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectnsecs_t loop_overhead(size_t count) __attribute__((noinline)); 50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectnsecs_t loop_overhead(size_t count) 51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nsecs_t overhead = -system_time(); 53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { 54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project asm volatile ("":::"memory"); 55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (--count); 56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project overhead += system_time(); 57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return overhead; 58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void preload(volatile char* addr, size_t s) 61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (size_t i=0 ; i<s ; i+=32) { 63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char c = addr[i]; 64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (void)c; 65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void usage(char* p) { 69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf( "Usage: %s <test> <options>\n" 70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project "<test> is one of the following:\n" 71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project " cpufreq\n" 72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project " memcpy [perf [fast] | test]\n" 73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project " memset [perf | test]\n" 74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project " memcmp [perf | test]\n" 75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project " strlen [perf | test]\n" 76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project " malloc [fill]\n" 77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project " madvise\n" 78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project " resampler\n" 79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project " crash\n" 80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project " stack (stack smasher)\n" 81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project " crawl\n" 82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project , p); 83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 84e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint cpufreq_test(int argc, char** argv); 86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint memcpy_test(int argc, char** argv); 87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint memset_test(int argc, char** argv); 88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint memcmp_test(int argc, char** argv); 89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint strlen_test(int argc, char** argv); 90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint malloc_test(int argc, char** argv); 91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint madvise_test(int argc, char** argv); 92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint crash_test(int argc, char** argv); 93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint stack_smasher_test(int argc, char** argv); 94e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint crawl_test(int argc, char** argv); 95e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 98e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark main 99e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 100e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 101e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main(int argc, char** argv) 102e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 103e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (argc == 1) { 104e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usage(argv[0]); 105e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 106e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 107e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int err = -1; 108e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (!strcmp(argv[1], "cpufreq")) err = cpufreq_test(argc-1, argv+1); 109e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "memcpy")) err = memcpy_test(argc-1, argv+1); 110e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "memset")) err = memset_test(argc-1, argv+1); 111e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "memcmp")) err = memcmp_test(argc-1, argv+1); 112e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "strlen")) err = strlen_test(argc-1, argv+1); 113e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "malloc")) err = malloc_test(argc-1, argv+1); 114e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "madvise")) err = madvise_test(argc-1, argv+1); 115e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "crash")) err = crash_test(argc-1, argv+1); 116e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "stack")) err = stack_smasher_test(argc-1, argv+1); 117e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "crawl")) err = crawl_test(argc-1, argv+1); 118e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (err) { 119e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usage(argv[0]); 120e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 121e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 122e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 123e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 124e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 125e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 126e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark memcpy 127e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 128e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 129e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint validate_memcpy(char* s, char* d, size_t size); 130e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint validate_memset(char* s, char c, size_t size); 131e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 132e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint memcpy_test(int argc, char** argv) 133e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 134e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int option = 0; 135e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (argc >= 2) { 136e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (!strcmp(argv[1], "perf")) option = 0; 137e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "test")) option = 1; 138e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else return -1; 139e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 140e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 141e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int MAX_SIZE = 1024*1024; // 1MB 142e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int CACHED_SPEED_EST = CPU_FREQ_EST*1024*1024; // 150 MB/s 143e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int UNCACHED_SPEED_EST = (CPU_FREQ_EST/4)*1024*1024; // 60 MB/s 144e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* src = (char*)malloc(MAX_SIZE+4+8+32); 145e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* dst = (char*)malloc(MAX_SIZE+4+8+32); 146e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(src, 0, MAX_SIZE+4+8+32); 147e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(dst, 0, MAX_SIZE+4+8+32); 148e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 149e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (option == 0) { 150e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project bool fast = (argc>=3 && !strcmp(argv[2], "fast")); 151e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("memcpy() performance test is running, please wait...\n"); 152e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 153e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usleep(10000); 154e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project setpriority(PRIO_PROCESS, 0, -20); 155e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project static int FAST_SIZES[] = { 1024, DCACHE_SIZE/2, DCACHE_SIZE, DCACHE_SIZE*2, MAX_SIZE }; 156e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 157e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct result_t { int size; float res; }; 158e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project result_t* results = (result_t*)src; 159e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int nbr = 0; 160e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int size = 0; 161e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; ; i++) { 162e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (!fast) { 163e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size<128) size += 8; 164e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (size<1024) size += 128; 165e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (size<16384) size += 1024; 166e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else size <<= 1; 167e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else { 168e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size_t(i) >= sizeof(FAST_SIZES)/sizeof(FAST_SIZES[0])) 169e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 170e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size = FAST_SIZES[i]; 171e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 172e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size > MAX_SIZE) { 173e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 174e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 175e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 176e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int REPEAT = (((size < DCACHE_SIZE) ? 177e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (CACHED_SPEED_EST) : (UNCACHED_SPEED_EST)) / size) / 2; 178e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project // ~0.5 second per test 179e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 180e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const nsecs_t overhead = loop_overhead(REPEAT); 181e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 182e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project // tweak to make it a bad case 183e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* ddd = (char*)((long(dst+31)&~31) + 4); 184e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* sss = (char*)((long(src+31)&~31) + 28); 185e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 186e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int offset=0 ; offset<=2 ; offset +=2 ) { 187e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memcpy(dst, src, size); // just make sure to load the caches I/D 188e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nsecs_t t = -system_time(); 189e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project register int count = REPEAT; 190e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { 191e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memcpy(ddd, sss+offset, size); 192e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (--count); 193e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project t += system_time() - overhead; 194e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const float throughput = (size*1000000000.0f*REPEAT) / (1024*1024*t); 195e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project results[nbr].size = size; 196e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project results[nbr].res = throughput; 197e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nbr++; 198e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 199e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 200e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 201e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%9s %9s %9s\n", "size", "MB/s", "MB/s (nc)"); 202e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; i<nbr ; i+=2) { 203e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%9d %9ld %9ld\n", results[i].size, (long)results[i].res, (long)results[i+1].res); 204e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 205e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else if (option == 1) { 206e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("memcpy() validation test is running, please wait...\n"); 207e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 208e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* curr = (char*)src; 209e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; i<MAX_SIZE ; i++) { 210e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char c = rand(); 211e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *curr++ = c != 0x55 ? c : 0xAA; 212e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 213e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* s = src + 1024; 214e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* d = dst + 1024; 215e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int nb = 0; 216e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int size=0 ; size<4096 && !nb ; size++) { 217e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nb += validate_memcpy(s, d, size); 218e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int o=1 ; o<32 && !nb ; o++) { 219e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nb += validate_memcpy(s+o, d, size); 220e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nb += validate_memcpy(s, d+o, size); 221e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nb += validate_memcpy(s+o, d+o, size); 222e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 223e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 224e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (nb) printf("%d error(s) found\n", nb); 225e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else printf("success!\n"); 226e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 227e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 228e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project free(dst); 229e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project free(src); 230e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 231e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 232e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 233e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint validate_memcpy(char* s, char* d, size_t size) 234e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 235e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int nberr = 0; 236e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(d-4, 0x55, size+8); 237e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memcpy(s, d, size); 238e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (memcmp(s,d,size)) { 239e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("*** memcpy(%p,%p,%lu) destination != source\n",s,d,size); 240e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nberr++; 241e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 242e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project bool r = (d[size]==0x55)&&(d[size+1]==0x55)&&(d[size+2]==0x55)&&(d[size+3]==0x55); 243e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (!r) { 244e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("*** memcpy(%p,%p,%lu) clobbered past end of destination!\n",s,d,size); 245e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nberr++; 246e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 247e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project r = (d[-1]==0x55)&&(d[-2]==0x55)&&(d[-3]==0x55)&&(d[-4]==0x55); 248e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (!r) { 249e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("*** memcpy(%p,%p,%lu) clobbered before start of destination!\n",s,d,size); 250e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nberr++; 251e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 252e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return nberr; 253e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 254e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 255e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 256e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 257e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 258e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark memset 259e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 260e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 261e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint memset_test(int argc, char** argv) 262e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 263e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int option = 0; 264e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (argc >= 2) { 265e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (!strcmp(argv[1], "perf")) option = 0; 266e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "test")) option = 1; 267e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else return -1; 268e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 269e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 270e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int MAX_SIZE = 1024*1024; // 1MB 271e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int CACHED_SPEED_EST = CPU_FREQ_EST*1024*1024; // 195 MB/s 272e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int UNCACHED_SPEED_EST = CPU_FREQ_EST*1024*1024; // 195 MB/s 273e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* dst = (char*)malloc(MAX_SIZE+4+8); 274e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 275e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (option == 0) { 276e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("memset() performance test is running, please wait...\n"); 277e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 278e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usleep(10000); 279e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project setpriority(PRIO_PROCESS, 0, -20); 280e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 281e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project static int FAST_SIZES[] = { 1024, DCACHE_SIZE/2, DCACHE_SIZE, DCACHE_SIZE*2, MAX_SIZE }; 282e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const size_t FAST_SIZES_COUNT = sizeof(FAST_SIZES)/sizeof(FAST_SIZES[0]); 283e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct result_t { int size; float res; }; 284e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project result_t results[FAST_SIZES_COUNT*2]; 285e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int nbr = 0; 286e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int size = 0; 287e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; ; i++) { 288e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size_t(i) >= sizeof(FAST_SIZES)/sizeof(FAST_SIZES[0])) 289e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 290e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size = FAST_SIZES[i]; 291e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size > MAX_SIZE) { 292e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 293e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 294e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int REPEAT = (((size < DCACHE_SIZE) ? 295e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (CACHED_SPEED_EST) : (UNCACHED_SPEED_EST)) / size); 296e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project // ~0.5 second per test 297e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 298e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const nsecs_t overhead = loop_overhead(REPEAT); 299e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 300e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int j=0 ; j<2 ; j++) { 301e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (j==0) preload(dst, DCACHE_SIZE*4); // flush D 302e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else preload(dst, size); // load D 303e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nsecs_t t = -system_time(); 304e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t count = REPEAT; 305e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { 306e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(dst, 0, size); 307e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (--count); 308e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project t += system_time() - overhead; 309e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 310e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const float throughput = (size*1000000000.0f*REPEAT) / (1024*1024*t); 311e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project results[nbr].size = size; 312e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project results[nbr].res = throughput; 313e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nbr++; 314e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 315e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 316e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 317e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%9s %9s %9s\n", "size", "MB/s", "MB/s (cached)"); 318e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; i<nbr ; i+=2) { 319e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%9d %9ld %9ld\n", results[i].size, (long)results[i].res, (long)results[i+1].res); 320e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 321e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else if (option == 1) { 322e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("memset() validation test is running, please wait...\n"); 323e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 324e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* d = dst + 1024; 325e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int nb = 0; 326e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int o=1 ; o<32 ; o++) { 327e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int size=0 ; size<4096 && !nb ; size++) { 328e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nb += validate_memset(d, char(o), size); 329e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nb += validate_memset(d+o, char(o), size); 330e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 331e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 332e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (nb) printf("%d error(s) found\n", nb); 333e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else printf("success!\n"); 334e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 335e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 336e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project free(dst); 337e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 338e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 339e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 340e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint validate_memset(char* d, char c, size_t size) 341e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 342e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int nberr = 0; 343e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (size_t i=0; i<size ; d[i++]=0xaa) ; 344e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project d[-1] = 0x55; 345e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project d[size+1] = 0x55; 346e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(d, c, size); 347e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (d[size+1]!=0x55) { 348e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("*** memset(%p,%02x,%lu) clobbered past end of destination!\n",d,(int)c,size); 349e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nberr++; 350e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 351e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (d[-1]!=0x55) { 352e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("*** memset(%p,%02x,%lu) clobbered before start of destination!\n",d,(int)c,size); 353e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nberr++; 354e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 355e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (size_t i=0 ; i<size ; i++) { 356e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (d[i] != c) { 357e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("*** memset(%p,%02x,%lu) failed at offset %lu\n",d,(int)c,size, i); 358e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nberr++; 359e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 360e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 361e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 362e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return nberr; 363e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 364e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 365e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 366e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 367e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark memcmp 368e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 369e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 370e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int ref_memcmp(const void *s1, const void *s2, size_t n) 371e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 372e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const unsigned char *c1 = (const unsigned char *)s1, *c2 = (const unsigned char *)s2; 373e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int d = 0; 374e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 375e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project while ( n-- ) { 376e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project d = (int)*c1++ - (int)*c2++; 377e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if ( d ) 378e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 379e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 380e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 381e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return d; 382e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 383e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 384e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint validate_memcmp(const char* s, const char* d, size_t size) 385e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 386e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 387e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int a = ref_memcmp(s, d, size); 388e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int b = memcmp(s, d, size); 389e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project //printf("%d, %d\n", a, b); 390e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (a != b) { 391e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("*** memcmp(%p,%p,%lu) failed %d should be %d\n",s,d,size,b,a); 392e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 1; 393e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 394e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 395e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 396e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 397e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint memcmp_test(int argc, char** argv) 398e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 399e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int option = 0; 400e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (argc >= 2) { 401e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (!strcmp(argv[1], "perf")) option = 0; 402e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "test")) option = 1; 403e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else return -1; 404e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 405e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 406e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int MAX_SIZE = 1024*1024; // 1MB 407e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int CACHED_SPEED_EST = CPU_FREQ_EST*1024*1024; // 150 MB/s 408e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int UNCACHED_SPEED_EST = (CPU_FREQ_EST/4)*1024*1024; // 60 MB/s 409e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* src = (char*)malloc(MAX_SIZE+4+8+32); 410e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* dst = (char*)malloc(MAX_SIZE+4+8+32); 411e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 412e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (option == 0) { 413e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("memcmp() performance test is running, please wait...\n"); 414e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 415e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usleep(10000); 416e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project setpriority(PRIO_PROCESS, 0, -20); 417e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 418e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project static int FAST_SIZES[] = { 1024, DCACHE_SIZE/2, DCACHE_SIZE, DCACHE_SIZE*2, MAX_SIZE }; 419e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 420e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct result_t { int size; float res; }; 421e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project result_t* results = (result_t*)src; 422e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int nbr = 0; 423e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int size = 0; 424e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; ; i++) { 425e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size_t(i) >= sizeof(FAST_SIZES)/sizeof(FAST_SIZES[0])) 426e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 427e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size = FAST_SIZES[i]; 428e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size > MAX_SIZE) { 429e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 430e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 431e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 432e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int REPEAT = (((size < DCACHE_SIZE) ? 433e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (CACHED_SPEED_EST) : (UNCACHED_SPEED_EST)) / size) / 2; 434e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project // ~0.5 second per test 435e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 436e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const nsecs_t overhead = loop_overhead(REPEAT); 437e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 438e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project // tweak to make it a bad case 439e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* ddd = (char*)((long(dst+31)&~31) + 4); 440e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* sss = (char*)((long(src+31)&~31) + 28); 441e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 442e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int offset=0 ; offset<=2 ; offset +=2 ) { 443e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memcpy(ddd, sss+offset, size); // just make sure to load the caches I/D 444e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nsecs_t t = -system_time(); 445e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project register int count = REPEAT; 446e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char c; 447e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project c = memcmp(ddd, sss+offset, size); 448e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project //printf("size %d, memcmp -> %d\n", size, (int)c); 449e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { 450e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project c = memcmp(ddd, sss+offset, size); 451e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project asm volatile (""::"r"(c):"memory"); 452e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (--count); 453e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project t += system_time() - overhead; 454e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const float throughput = (size*1000000000.0f*REPEAT) / (1024*1024*t); 455e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project results[nbr].size = size; 456e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project results[nbr].res = throughput; 457e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nbr++; 458e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 459e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 460e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 461e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%9s %9s %9s\n", "size", "MB/s", "MB/s (nc)"); 462e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; i<nbr ; i+=2) { 463e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%9d %9ld %9ld\n", results[i].size, (long)results[i].res, (long)results[i+1].res); 464e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 465e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else { 466e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("memcmp() validation test is running, please wait...\n"); 467e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 468e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 469e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const char* const s = (const char*)src + 1024; 470e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const char* const d = (const char*)dst + 1024; 471e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int nb = 0; 472e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int j=0 ; j<32 ; j++) { 473e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 474e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char *curr0 = (char*)src; 475e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char *curr1 = (char*)dst; 476e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; i<MAX_SIZE ; i++) { 477e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char c = rand(); 478e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *curr0++ = c; 479e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *curr1++ = c; 480e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 481e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (j) { 482e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src[1024 + j] ^= 0xFF; 483e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 484e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 485e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 486e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int size=0 ; size<32 && !nb ; size++) { 487e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int o=0 ; o<4 ; o++) { 488e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nb += validate_memcmp(s+o, d+o, size); 489e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 490e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project // memmove((char*)d+1, d, size); 491e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int o=0 ; o<4 ; o++) { 492e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nb += validate_memcmp(s, d+o, size); 493e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 494e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 495e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 496e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (nb) printf("%d error(s) found\n", nb); 497e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else printf("success!\n"); 498e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 499e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 500e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project free(dst); 501e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project free(src); 502e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 503e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 504e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 505e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 506e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 507e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark strlen 508e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 509e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 510e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint strlen_test(int argc, char** argv) 511e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 512e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int option = 0; 513e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (argc >= 2) { 514e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (!strcmp(argv[1], "perf")) option = 0; 515e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "test")) option = 1; 516e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else return -1; 517e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 518e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 519e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int MAX_SIZE = 1024*1024; // 1MB 520e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int CACHED_SPEED_EST = CPU_FREQ_EST*1024*1024; // 195 MB/s 521e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int UNCACHED_SPEED_EST = CPU_FREQ_EST*1024*1024; // 195 MB/s 522e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* str = (char*)calloc(MAX_SIZE+4+8, 1); 523e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 524e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (option == 0) { 525e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("strlen() performance test is running, please wait...\n"); 526e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 527e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usleep(10000); 528e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project setpriority(PRIO_PROCESS, 0, -20); 529e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 530e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project static int FAST_SIZES[] = { 1024, DCACHE_SIZE/2, DCACHE_SIZE, DCACHE_SIZE*2, MAX_SIZE }; 531e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const size_t FAST_SIZES_COUNT = sizeof(FAST_SIZES)/sizeof(FAST_SIZES[0]); 532e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct result_t { int size; float res; }; 533e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project result_t results[FAST_SIZES_COUNT*2]; 534e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int nbr = 0; 535e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int size = 0; 536e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; ; i++) { 537e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size_t(i) >= sizeof(FAST_SIZES)/sizeof(FAST_SIZES[0])) 538e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 539e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size = FAST_SIZES[i]; 540e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size > MAX_SIZE) { 541e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 542e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 543e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int REPEAT = (((size < DCACHE_SIZE) ? 544e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (CACHED_SPEED_EST) : (UNCACHED_SPEED_EST)) / size); 545e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project // ~0.5 second per test 546e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 547e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const nsecs_t overhead = loop_overhead(REPEAT); 548e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 549e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int j=0 ; j<2 ; j++) { 550e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(str, 'A', size-1); 551e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (j==0) preload(str, DCACHE_SIZE*4); // flush D 552e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else preload(str, size); // load D 553e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 554e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nsecs_t t = -system_time(); 555e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t count = REPEAT; 556e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int c=0; 557e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { 558e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project c = strlen(str); 559e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project asm volatile (""::"r"(c):"memory"); 560e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (--count); 561e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project t += system_time() - overhead; 562e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 563e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const float throughput = (size*1000000000.0f*REPEAT) / (1024*1024*t); 564e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project results[nbr].size = size; 565e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project results[nbr].res = throughput; 566e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nbr++; 567e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 568e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 569e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 570e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%9s %9s %9s\n", "size", "MB/s", "MB/s (cached)"); 571e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; i<nbr ; i+=2) { 572e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%9d %9ld %9ld\n", results[i].size, (long)results[i].res, (long)results[i+1].res); 573e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 574e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 575e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 576e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 577e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project free(str); 578e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 579e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 580e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 581e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 582e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 583e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 584e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark malloc 585e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 586e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 587e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint malloc_test(int argc, char** argv) 588e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 589e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project bool fill = (argc>=2 && !strcmp(argv[1], "fill")); 590e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t total = 0; 591e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t size = 0x40000000; 592e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project while (size) { 593e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project void* addr = malloc(size); 594e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (addr == 0) { 595e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("size = %9lu failed\n", size); 596e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size >>= 1; 597e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else { 598e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project total += size; 599e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("size = %9lu, addr = %p (total = %9lu (%lu MB))\n", 600e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size, addr, total, total / (1024*1024)); 601e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (fill) { 602e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("filling...\n"); 603e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 604e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(addr, 0, size); 605e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 606e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size = size + size>>1; 607e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 608e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 609e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("done. allocated %lu MB\n", total / (1024*1024)); 610e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 611e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 612e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 613e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 614e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 615e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark madvise 616e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 617e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 618e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint madvise_test(int argc, char** argv) 619e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 620e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; i<2 ; i++) { 621e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t size = i==0 ? 4096 : 48*1024*1024; // 48 MB 622e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Allocating %lu MB... ", size/(1024*1024)); fflush(stdout); 623e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project void* addr1 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 624e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%p (%s)\n", addr1, addr1==(void*)-1 ? "failed" : "OK"); fflush(stdout); 625e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 626e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("touching %p...\n", addr1); fflush(stdout); 627e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(addr1, 0x55, size); 628e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 629e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("advising DONTNEED...\n"); fflush(stdout); 630e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project madvise(addr1, size, MADV_DONTNEED); 631e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 632e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("reading back %p...\n", addr1); fflush(stdout); 633e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (*(long*)addr1 == 0) { 634e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("madvise freed some pages\n"); 635e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else if (*(long*)addr1 == 0x55555555) { 636e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("pages are still there\n"); 637e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else { 638e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("getting garbage back\n"); 639e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 640e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 641e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Allocating %lu MB... ", size/(1024*1024)); fflush(stdout); 642e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project void* addr2 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 643e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%p (%s)\n", addr2, addr2==(void*)-1 ? "failed" : "OK"); fflush(stdout); 644e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 645e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("touching %p...\n", addr2); fflush(stdout); 646e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(addr2, 0xAA, size); 647e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 648e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("unmap %p ...\n", addr2); fflush(stdout); 649e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project munmap(addr2, size); 650e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 651e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("touching %p...\n", addr1); fflush(stdout); 652e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(addr1, 0x55, size); 653e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 654e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("unmap %p ...\n", addr1); fflush(stdout); 655e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project munmap(addr1, size); 656e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 657e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 658e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Done\n"); fflush(stdout); 659e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 660e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 661e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 662e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 663e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 664e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark cpufreq 665e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 666e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 667e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint cpufreq_test(int argc, char** argv) 668e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 669e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct timespec res; 670e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project clock_getres(CLOCK_REALTIME, &res); 671e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_REALTIME resolution: %lu ns\n", res.tv_nsec); 672e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project clock_getres(CLOCK_MONOTONIC, &res); 673e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_MONOTONIC resolution: %lu ns\n", res.tv_nsec); 674e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project clock_getres(CLOCK_PROCESS_CPUTIME_ID, &res); 675e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_PROCESS_CPUTIME_ID resolution: %lu ns\n", res.tv_nsec); 676e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project clock_getres(CLOCK_THREAD_CPUTIME_ID, &res); 677e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_THREAD_CPUTIME_ID resolution: %lu ns\n", res.tv_nsec); 678e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 679e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (clock_getres(CLOCK_REALTIME_HR, &res) != 0) 680e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_REALTIME_HR resolution: %lu ns\n", res.tv_nsec); 681e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else 682e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_REALTIME_HR not supported\n"); 683e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 684e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (clock_getres(CLOCK_MONOTONIC_HR, &res) != 0) 685e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_MONOTONIC_HR resolution: %lu ns\n", res.tv_nsec); 686e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else 687e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_MONOTONIC_HR not supported\n"); 688e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 689e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("\nEstimating the CPU frequency, please wait...\n"); 690e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 691e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usleep(10000); 692e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project setpriority(PRIO_PROCESS, 0, -20); 693e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 694e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int LOOP_CYCLES = 1+BRANCH_CYCLE; // 1 cycle + 3 cycles for the branch 695e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const size_t REPEAT = CPU_FREQ_EST*1000000; // ~4 seconds (4cycles/loop) 696e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project register size_t count = REPEAT; 697e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nsecs_t t = system_time(); 698e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { // this loop generates 1+3 cycles 699e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project asm volatile ("":::"memory"); 700e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (--count); 701e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project t = system_time() - t; 702e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const float freq = t ? (1000.0f*float(REPEAT)*LOOP_CYCLES) / t : 0; 703e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("this CPU frequency: %ld MHz\n", long(freq+0.5f)); 704e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 705e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 706e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 707e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 708e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 709e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark crash_test 710e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 711e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 712e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint crash_test(int argc, char** argv) 713e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 714e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("about to crash...\n"); 715e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project asm volatile( 716e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project "mov r0, #0 \n" 717e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project "mov r1, #1 \n" 718e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project "mov r2, #2 \n" 719e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project "mov r3, #3 \n" 720e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project "ldr r12, [r0] \n" 721e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project ); 722e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 723e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 724e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 725e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 726e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint stack_smasher_test(int argc, char** argv) 727e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 728e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int dummy = 0; 729e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("corrupting our stack...\n"); 730e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *(volatile long long*)&dummy = 0; 731e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 732e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 733e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 734e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project// -------------------------------------------------------------------- 735e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 736e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectextern "C" void thumb_function_1(int*p); 737e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectextern "C" void thumb_function_2(int*p); 738e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectextern "C" void arm_function_3(int*p); 739e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectextern "C" void arm_function_2(int*p); 740e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectextern "C" void arm_function_1(int*p); 741e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 742e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid arm_function_3(int*p) { 743e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int a = 0; 744e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project thumb_function_2(&a); 745e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 746e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 747e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid arm_function_2(int*p) { 748e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int a = 0; 749e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project thumb_function_1(&a); 750e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 751e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 752e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid arm_function_1(int*p) { 753e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int a = 0; 754e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project arm_function_2(&a); 755e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 756e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 757e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint crawl_test(int argc, char** argv) 758e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 759e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int a = 0; 760e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project arm_function_1(&a); 761e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 762e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 763e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 764