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