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