memtest.cpp revision b4950a59dcd4fa7fa4adaec6c8429388c2640291
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 384e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return d; 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); 392e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project //printf("%d, %d\n", a, b); 393e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (a != b) { 394e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("*** memcmp(%p,%p,%lu) failed %d should be %d\n",s,d,size,b,a); 395e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 1; 396e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 397e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 398e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 399e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 400e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint memcmp_test(int argc, char** argv) 401e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 402e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int option = 0; 403e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (argc >= 2) { 404e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (!strcmp(argv[1], "perf")) option = 0; 405e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "test")) option = 1; 406e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else return -1; 407e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 408e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 409e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int MAX_SIZE = 1024*1024; // 1MB 410e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int CACHED_SPEED_EST = CPU_FREQ_EST*1024*1024; // 150 MB/s 411e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int UNCACHED_SPEED_EST = (CPU_FREQ_EST/4)*1024*1024; // 60 MB/s 412e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* src = (char*)malloc(MAX_SIZE+4+8+32); 413e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* dst = (char*)malloc(MAX_SIZE+4+8+32); 414e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 415e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (option == 0) { 416e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("memcmp() performance test is running, please wait...\n"); 417e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 418e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usleep(10000); 419e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project setpriority(PRIO_PROCESS, 0, -20); 420e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 421e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project static int FAST_SIZES[] = { 1024, DCACHE_SIZE/2, DCACHE_SIZE, DCACHE_SIZE*2, MAX_SIZE }; 422e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 423e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct result_t { int size; float res; }; 424e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project result_t* results = (result_t*)src; 425e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int nbr = 0; 426e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int size = 0; 427e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; ; i++) { 428e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size_t(i) >= sizeof(FAST_SIZES)/sizeof(FAST_SIZES[0])) 429e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 430e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size = FAST_SIZES[i]; 431e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size > MAX_SIZE) { 432e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 433e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 434e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 435e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int REPEAT = (((size < DCACHE_SIZE) ? 436e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (CACHED_SPEED_EST) : (UNCACHED_SPEED_EST)) / size) / 2; 437e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project // ~0.5 second per test 438e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 439e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const nsecs_t overhead = loop_overhead(REPEAT); 440e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 441e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project // tweak to make it a bad case 442e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* ddd = (char*)((long(dst+31)&~31) + 4); 443e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* sss = (char*)((long(src+31)&~31) + 28); 444e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 445e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int offset=0 ; offset<=2 ; offset +=2 ) { 446e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memcpy(ddd, sss+offset, size); // just make sure to load the caches I/D 447e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nsecs_t t = -system_time(); 448e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project register int count = REPEAT; 449e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char c; 450e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project c = memcmp(ddd, sss+offset, size); 451e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project //printf("size %d, memcmp -> %d\n", size, (int)c); 452e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { 453e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project c = memcmp(ddd, sss+offset, size); 454e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project asm volatile (""::"r"(c):"memory"); 455e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (--count); 456e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project t += system_time() - overhead; 457e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const float throughput = (size*1000000000.0f*REPEAT) / (1024*1024*t); 458e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project results[nbr].size = size; 459e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project results[nbr].res = throughput; 460e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nbr++; 461e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 462e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 463e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 464e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%9s %9s %9s\n", "size", "MB/s", "MB/s (nc)"); 465e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; i<nbr ; i+=2) { 466e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%9d %9ld %9ld\n", results[i].size, (long)results[i].res, (long)results[i+1].res); 467e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 468e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else { 469e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("memcmp() validation test is running, please wait...\n"); 470e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 471e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 472e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const char* const s = (const char*)src + 1024; 473e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const char* const d = (const char*)dst + 1024; 474e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int nb = 0; 475e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int j=0 ; j<32 ; j++) { 476e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 477e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char *curr0 = (char*)src; 478e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char *curr1 = (char*)dst; 479e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; i<MAX_SIZE ; i++) { 480e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char c = rand(); 481e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *curr0++ = c; 482e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *curr1++ = c; 483e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 484e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (j) { 485e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project src[1024 + j] ^= 0xFF; 486e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 487e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 488e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 489e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int size=0 ; size<32 && !nb ; size++) { 490e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int o=0 ; o<4 ; o++) { 491e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nb += validate_memcmp(s+o, d+o, size); 492e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 493e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project // memmove((char*)d+1, d, size); 494e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int o=0 ; o<4 ; o++) { 495e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nb += validate_memcmp(s, d+o, size); 496e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 497e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 498e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 499e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (nb) printf("%d error(s) found\n", nb); 500e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else printf("success!\n"); 501e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 502e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 503e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project free(dst); 504e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project free(src); 505e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 506e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 507e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 508e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 509e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 510e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark strlen 511e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 512e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 513e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint strlen_test(int argc, char** argv) 514e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 515e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int option = 0; 516e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (argc >= 2) { 517e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (!strcmp(argv[1], "perf")) option = 0; 518e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else if (!strcmp(argv[1], "test")) option = 1; 519e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else return -1; 520e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 521e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 522e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int MAX_SIZE = 1024*1024; // 1MB 523e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int CACHED_SPEED_EST = CPU_FREQ_EST*1024*1024; // 195 MB/s 524e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int UNCACHED_SPEED_EST = CPU_FREQ_EST*1024*1024; // 195 MB/s 525e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project char* str = (char*)calloc(MAX_SIZE+4+8, 1); 526e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 527e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (option == 0) { 528e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("strlen() performance test is running, please wait...\n"); 529e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 530e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usleep(10000); 531e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project setpriority(PRIO_PROCESS, 0, -20); 532e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 533e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project static int FAST_SIZES[] = { 1024, DCACHE_SIZE/2, DCACHE_SIZE, DCACHE_SIZE*2, MAX_SIZE }; 534e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const size_t FAST_SIZES_COUNT = sizeof(FAST_SIZES)/sizeof(FAST_SIZES[0]); 535e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct result_t { int size; float res; }; 536e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project result_t results[FAST_SIZES_COUNT*2]; 537e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int nbr = 0; 538e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int size = 0; 539e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; ; i++) { 540e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size_t(i) >= sizeof(FAST_SIZES)/sizeof(FAST_SIZES[0])) 541e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 542e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size = FAST_SIZES[i]; 543e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (size > MAX_SIZE) { 544e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project break; 545e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 546e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int REPEAT = (((size < DCACHE_SIZE) ? 547e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project (CACHED_SPEED_EST) : (UNCACHED_SPEED_EST)) / size); 548e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project // ~0.5 second per test 549e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 550e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const nsecs_t overhead = loop_overhead(REPEAT); 551e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 552e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int j=0 ; j<2 ; j++) { 553e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(str, 'A', size-1); 554e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (j==0) preload(str, DCACHE_SIZE*4); // flush D 555e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else preload(str, size); // load D 556e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 557e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nsecs_t t = -system_time(); 558e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t count = REPEAT; 559e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int c=0; 560e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { 561e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project c = strlen(str); 562e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project asm volatile (""::"r"(c):"memory"); 563e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (--count); 564e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project t += system_time() - overhead; 565e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 566e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const float throughput = (size*1000000000.0f*REPEAT) / (1024*1024*t); 567e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project results[nbr].size = size; 568e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project results[nbr].res = throughput; 569e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nbr++; 570e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 571e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 572e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 573e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%9s %9s %9s\n", "size", "MB/s", "MB/s (cached)"); 574e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; i<nbr ; i+=2) { 575e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%9d %9ld %9ld\n", results[i].size, (long)results[i].res, (long)results[i+1].res); 576e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 577e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 578e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 579e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 580e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project free(str); 581e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 582e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 583e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 584e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 585e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 586e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 587e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark malloc 588e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 589e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 590e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint malloc_test(int argc, char** argv) 591e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 592e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project bool fill = (argc>=2 && !strcmp(argv[1], "fill")); 593e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t total = 0; 594e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t size = 0x40000000; 595e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project while (size) { 596e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project void* addr = malloc(size); 597e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (addr == 0) { 598e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("size = %9lu failed\n", size); 599e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size >>= 1; 600e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else { 601e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project total += size; 602e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("size = %9lu, addr = %p (total = %9lu (%lu MB))\n", 603e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size, addr, total, total / (1024*1024)); 604e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (fill) { 605e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("filling...\n"); 606e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 607e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(addr, 0, size); 608e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 609e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size = size + size>>1; 610e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 611e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 612e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("done. allocated %lu MB\n", total / (1024*1024)); 613e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 614e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 615e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 616e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 617e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 618e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark madvise 619e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 620e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 621e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint madvise_test(int argc, char** argv) 622e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 623e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project for (int i=0 ; i<2 ; i++) { 624e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project size_t size = i==0 ? 4096 : 48*1024*1024; // 48 MB 625e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Allocating %lu MB... ", size/(1024*1024)); fflush(stdout); 626e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project void* addr1 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 627e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%p (%s)\n", addr1, addr1==(void*)-1 ? "failed" : "OK"); fflush(stdout); 628e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 629e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("touching %p...\n", addr1); fflush(stdout); 630e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(addr1, 0x55, size); 631e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 632e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("advising DONTNEED...\n"); fflush(stdout); 633e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project madvise(addr1, size, MADV_DONTNEED); 634e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 635e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("reading back %p...\n", addr1); fflush(stdout); 636e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (*(long*)addr1 == 0) { 637e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("madvise freed some pages\n"); 638e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else if (*(long*)addr1 == 0x55555555) { 639e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("pages are still there\n"); 640e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } else { 641e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("getting garbage back\n"); 642e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 643e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 644e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Allocating %lu MB... ", size/(1024*1024)); fflush(stdout); 645e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project void* addr2 = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 646e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("%p (%s)\n", addr2, addr2==(void*)-1 ? "failed" : "OK"); fflush(stdout); 647e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 648e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("touching %p...\n", addr2); fflush(stdout); 649e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(addr2, 0xAA, size); 650e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 651e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("unmap %p ...\n", addr2); fflush(stdout); 652e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project munmap(addr2, size); 653e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 654e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("touching %p...\n", addr1); fflush(stdout); 655e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project memset(addr1, 0x55, size); 656e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 657e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("unmap %p ...\n", addr1); fflush(stdout); 658e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project munmap(addr1, size); 659e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 660e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 661e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Done\n"); fflush(stdout); 662e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 663e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 664e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 665e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 666e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 667e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark cpufreq 668e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 669e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 670e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint cpufreq_test(int argc, char** argv) 671e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 672e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct timespec res; 673e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project clock_getres(CLOCK_REALTIME, &res); 674e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_REALTIME resolution: %lu ns\n", res.tv_nsec); 675e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project clock_getres(CLOCK_MONOTONIC, &res); 676e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_MONOTONIC resolution: %lu ns\n", res.tv_nsec); 677e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project clock_getres(CLOCK_PROCESS_CPUTIME_ID, &res); 678e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_PROCESS_CPUTIME_ID resolution: %lu ns\n", res.tv_nsec); 679e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project clock_getres(CLOCK_THREAD_CPUTIME_ID, &res); 680e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_THREAD_CPUTIME_ID resolution: %lu ns\n", res.tv_nsec); 681e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 682e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (clock_getres(CLOCK_REALTIME_HR, &res) != 0) 683e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_REALTIME_HR resolution: %lu ns\n", res.tv_nsec); 684e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else 685e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_REALTIME_HR not supported\n"); 686e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 687e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if (clock_getres(CLOCK_MONOTONIC_HR, &res) != 0) 688e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_MONOTONIC_HR resolution: %lu ns\n", res.tv_nsec); 689e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project else 690e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("CLOCK_MONOTONIC_HR not supported\n"); 691e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 692e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("\nEstimating the CPU frequency, please wait...\n"); 693e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fflush(stdout); 694e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project usleep(10000); 695e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project setpriority(PRIO_PROCESS, 0, -20); 696e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 697e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const int LOOP_CYCLES = 1+BRANCH_CYCLE; // 1 cycle + 3 cycles for the branch 698e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const size_t REPEAT = CPU_FREQ_EST*1000000; // ~4 seconds (4cycles/loop) 699e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project register size_t count = REPEAT; 700e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project nsecs_t t = system_time(); 701e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project do { // this loop generates 1+3 cycles 702e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project asm volatile ("":::"memory"); 703e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } while (--count); 704e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project t = system_time() - t; 705e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project const float freq = t ? (1000.0f*float(REPEAT)*LOOP_CYCLES) / t : 0; 706e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("this CPU frequency: %ld MHz\n", long(freq+0.5f)); 707e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 708e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 709e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 710e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#if 0 711e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark - 712e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#pragma mark crash_test 713e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#endif 714e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 715e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint crash_test(int argc, char** argv) 716e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 717e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("about to crash...\n"); 718e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project asm volatile( 719e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project "mov r0, #0 \n" 720e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project "mov r1, #1 \n" 721e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project "mov r2, #2 \n" 722e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project "mov r3, #3 \n" 723e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project "ldr r12, [r0] \n" 724e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project ); 725e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 726e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 727e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 728e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 729e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint stack_smasher_test(int argc, char** argv) 730e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 731e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int dummy = 0; 732e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("corrupting our stack...\n"); 733e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project *(volatile long long*)&dummy = 0; 734e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 735e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 736e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 737e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project// -------------------------------------------------------------------- 738e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 739e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectextern "C" void thumb_function_1(int*p); 740e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectextern "C" void thumb_function_2(int*p); 741e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectextern "C" void arm_function_3(int*p); 742e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectextern "C" void arm_function_2(int*p); 743e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectextern "C" void arm_function_1(int*p); 744e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 745e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid arm_function_3(int*p) { 746e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int a = 0; 747e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project thumb_function_2(&a); 748e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 749e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 750e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid arm_function_2(int*p) { 751e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int a = 0; 752e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project thumb_function_1(&a); 753e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 754e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 755e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid arm_function_1(int*p) { 756e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int a = 0; 757e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project arm_function_2(&a); 758e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 759e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 760e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint crawl_test(int argc, char** argv) 761e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 762e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int a = 0; 763e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project arm_function_1(&a); 764e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 765e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 766e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 767