1b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// Copyright 2006 Google Inc. All Rights Reserved. 2b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 3b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// Licensed under the Apache License, Version 2.0 (the "License"); 4b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// you may not use this file except in compliance with the License. 5b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// You may obtain a copy of the License at 6b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 7b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// http://www.apache.org/licenses/LICENSE-2.0 8b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 9b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// Unless required by applicable law or agreed to in writing, software 10b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// distributed under the License is distributed on an "AS IS" BASIS, 11b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// See the License for the specific language governing permissions and 13b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// limitations under the License. 14b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 15b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#ifndef STRESSAPPTEST_SATTYPES_H_ 16b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#define STRESSAPPTEST_SATTYPES_H_ 17b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 18b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#include <arpa/inet.h> 19b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#include <sched.h> 20b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#include <stdio.h> 21b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#include <stdlib.h> 22b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#include <sys/types.h> 23b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#include <time.h> 24b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#include <string.h> 25b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#include <algorithm> 26b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#include <string> 27b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 28b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#ifdef HAVE_CONFIG_H // Built using autoconf 29af3e2eba53c86b352f49634dcffd23775b3de6beScott Anderson#ifdef __ANDROID__ 30241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#include "stressapptest_config_android.h" // NOLINT 31af3e2eba53c86b352f49634dcffd23775b3de6beScott Anderson#else 32241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#include "stressapptest_config.h" // NOLINT 33241f33a3e958842e3db803c03300764bd2ee9c19Nick Sandersusing namespace __gnu_cxx; //NOLINT 34241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#endif // __ANDROID__ 35af3e2eba53c86b352f49634dcffd23775b3de6beScott Andersonusing namespace std; 36b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 37b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersontypedef signed long long int64; 38b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersontypedef signed int int32; 39b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersontypedef signed short int int16; 40b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersontypedef signed char int8; 41b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 42b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersontypedef unsigned long long uint64; 43b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersontypedef unsigned int uint32; 44b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersontypedef unsigned short uint16; 45b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersontypedef unsigned char uint8; 46b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 47b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ 48b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson TypeName(const TypeName&); \ 49b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson void operator=(const TypeName&) 50b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 51b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersoninline const char* Timestamp() { 52b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson return STRESSAPPTEST_TIMESTAMP; 53b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson} 54b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 55b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersoninline const char* BuildChangelist() { 56b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson return "open source release"; 57b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson} 58b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 59b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic const bool kOpenSource = true; 60241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#else // !HAVE_CONFIG_H 61b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic const bool kOpenSource = false; 62241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders #include "googlesattypes.h" // NOLINT 63241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#endif // HAVE_CONFIG_H 64b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// Workaround to allow 32/64 bit conversion 65b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// without running into strict aliasing problems. 66b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonunion datacast_t { 67b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson uint64 l64; 68b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson struct { 69b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson uint32 l; 70b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson uint32 h; 71b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson } l32; 72b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson}; 73b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 74b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 75b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// File sync'd print to console and log 76b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonvoid logprintf(int priority, const char *format, ...); 77b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 78241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders// Stop the log and dump any queued lines. 79241f33a3e958842e3db803c03300764bd2ee9c19Nick Sandersvoid logstop(); 80241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders 81b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// We print to stderr ourselves first in case we're in such a bad state that the 82b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// logger can't work. 83b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#define sat_assert(x) \ 84b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson{\ 85b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson if (!(x)) {\ 86241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders logstop();\ 87b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson fprintf(stderr, "Assertion failed at %s:%d\n", __FILE__, __LINE__);\ 88b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson logprintf(0, "Assertion failed at %s:%d\n", __FILE__, __LINE__);\ 89b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson exit(1);\ 90b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson }\ 91b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson} 92b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 93b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#if !defined(CPU_SETSIZE) 94b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson // Define type and macros for cpu mask operations 95b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson // Note: this code is hacked together to deal with difference 96b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson // function signatures across versions of glibc, ie those that take 97b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson // cpu_set_t versus those that take unsigned long. -johnhuang 98b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson typedef uint64 cpu_set_t; 99b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson #define CPU_SETSIZE (sizeof(cpu_set_t) * 8) 100b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson #define CPU_ISSET(index, cpu_set_ptr) (*(cpu_set_ptr) & 1ull << (index)) 101b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson #define CPU_SET(index, cpu_set_ptr) (*(cpu_set_ptr) |= 1ull << (index)) 102b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson #define CPU_ZERO(cpu_set_ptr) (*(cpu_set_ptr) = 0) 103b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson #define CPU_CLR(index, cpu_set_ptr) (*(cpu_set_ptr) &= ~(1ull << (index))) 104b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#endif 105b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 106b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic inline bool cpuset_isequal(const cpu_set_t *c1, const cpu_set_t *c2) { 107b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson for (int i = 0; i < CPU_SETSIZE; ++i) 108b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson if ((CPU_ISSET(i, c1) != 0) != (CPU_ISSET(i, c2) != 0)) 109b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson return false; 110b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson return true; 111b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson} 112b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 113b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic inline bool cpuset_issubset(const cpu_set_t *c1, const cpu_set_t *c2) { 114b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson for (int i = 0; i < CPU_SETSIZE; ++i) 115b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson if (CPU_ISSET(i, c1) && !CPU_ISSET(i, c2)) 116b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson return false; 117b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson return true; 118b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson} 119b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 120b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic inline int cpuset_count(const cpu_set_t *cpuset) { 121b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson int count = 0; 122b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson for (int i = 0; i < CPU_SETSIZE; ++i) 123b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson if (CPU_ISSET(i, cpuset)) 124b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson ++count; 125b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson return count; 126b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson} 127b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 128b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic inline void cpuset_set_ab(cpu_set_t *cpuset, int a, int b) { 129b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson CPU_ZERO(cpuset); 130b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson for (int i = a; i < b; ++i) 131b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson CPU_SET(i, cpuset); 132b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson} 133b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 134b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic inline string cpuset_format(const cpu_set_t *cpuset) { 135b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson string format; 136b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson int digit = 0, last_non_zero_size = 1; 137b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson for (int i = 0; i < CPU_SETSIZE; ++i) { 138b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson if (CPU_ISSET(i, cpuset)) { 139b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson digit |= 1 << (i & 3); 140b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson } 141b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson if ((i & 3) == 3) { 142b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson format += char(digit <= 9 ? '0' + digit: 'A' + digit - 10); 143b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson if (digit) { 144b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson last_non_zero_size = format.size(); 145b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson digit = 0; 146b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson } 147b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson } 148b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson } 149b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson if (digit) { 150b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson format += char(digit <= 9 ? '0' + digit: 'A' + digit - 10); 151b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson last_non_zero_size = format.size(); 152b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson } 153b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson format.erase(last_non_zero_size); 154b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson reverse(format.begin(), format.end()); 155b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson return format; 156b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson} 157b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 158b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic const int32 kUSleepOneSecond = 1000000; 159b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 160b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// This is guaranteed not to use signals. 161b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersoninline bool sat_usleep(int32 microseconds) { 162b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson timespec req; 163b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson req.tv_sec = microseconds / 1000000; 164b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson // Convert microseconds argument to nano seconds. 165b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson req.tv_nsec = (microseconds % 1000000) * 1000; 166b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson return nanosleep(&req, NULL) == 0; 167b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson} 168b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 169b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// This is guaranteed not to use signals. 170b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersoninline bool sat_sleep(time_t seconds) { 171b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson timespec req; 172b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson req.tv_sec = seconds; 173b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson req.tv_nsec = 0; 174b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson return nanosleep(&req, NULL) == 0; 175b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson} 176b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 177b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// Get an error code description for use in error messages. 178b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// 179b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// Args: 180b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// error_num: an errno error code 181b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersoninline string ErrorString(int error_num) { 182b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson char buf[256]; 1838f1c60d605d31447b4f9ccf86029790bed3fb3f3Scott Anderson#ifdef STRERROR_R_CHAR_P 184b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson return string(strerror_r(error_num, buf, sizeof buf)); 1858f1c60d605d31447b4f9ccf86029790bed3fb3f3Scott Anderson#else 1868f1c60d605d31447b4f9ccf86029790bed3fb3f3Scott Anderson if (strerror_r(error_num, buf, sizeof buf)) 1878f1c60d605d31447b4f9ccf86029790bed3fb3f3Scott Anderson return "unknown failure"; 1888f1c60d605d31447b4f9ccf86029790bed3fb3f3Scott Anderson else 1898f1c60d605d31447b4f9ccf86029790bed3fb3f3Scott Anderson return string(buf); 1908f1c60d605d31447b4f9ccf86029790bed3fb3f3Scott Anderson#endif 191b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson} 192b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 193241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders// Execute the cpuid instruction and pass back the contents of the registers. 194241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders// This only works on x86 based platforms. 195241f33a3e958842e3db803c03300764bd2ee9c19Nick Sandersinline void cpuid( 196241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { 197241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders *ebx = 0; 198241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders *ecx = 0; 199241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders *edx = 0; 200241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders // CPUID features documented at: 201241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders // http://www.sandpile.org/ia32/cpuid.htm 202241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#if defined(STRESSAPPTEST_CPU_I686) || defined(STRESSAPPTEST_CPU_X86_64) 203241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#if defined(__PIC__) && defined(STRESSAPPTEST_CPU_I686) 204241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders // In PIC compilations using the i686 cpu type, ebx contains the address 205241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders // of the global offset table. The compiler can't properly handle constraints 206241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders // using the ebx register for this compile, so preserve the register 207241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders // ourselves. 208241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders asm( 209241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders "mov %%ebx, %%edi;" 210241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders "cpuid;" 211241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders "xchg %%edi, %%ebx;" 212241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders // Output registers. 213241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders : "=a" (*eax), "=D" (*ebx), "=c" (*ecx), "=d" (*edx) 214241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders // Input registers. 215241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders : "a" (*eax) 216241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders ); // Asm 217241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#else 218241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders asm( 219241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders "cpuid;" 220241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders // Output registers. 221241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) 222241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders // Input registers. 223241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders : "a" (*eax) 224241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders ); // Asm 225241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#endif // defined(__PIC__) && defined(STRESSAPPTEST_CPU_I686) 226241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#elif defined(STRESSAPPTEST_CPU_PPC) 227241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders return; 228241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#elif defined(STRESSAPPTEST_CPU_ARMV7A) 229241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders return; 230241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#else 231241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#warning "Unsupported CPU type." 232241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders#endif 233241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders} 234241f33a3e958842e3db803c03300764bd2ee9c19Nick Sanders 235b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson// Define handy constants here 236b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic const int kTicksPerSec = 100; 237b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic const int kMegabyte = (1024LL*1024LL); 238b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic const int kSatDiskPageMax = 32; 239b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic const int kSatDiskPage = 8; 240b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic const int kSatPageSize = (1024LL*1024LL); 241b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic const int kCacheLineSize = 64; 242b0114cb9f332db144f65291211ae65f7f0e814e6Scott Andersonstatic const uint16_t kNetworkPort = 19996; 243b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson 244b0114cb9f332db144f65291211ae65f7f0e814e6Scott Anderson#endif // STRESSAPPTEST_SATTYPES_H_ 245