xref: /aosp_15_r20/external/stressapptest/src/os.h (revision 424fb153c814cbcb3e8904974796228774b3229a)
1*424fb153SAndroid Build Coastguard Worker // Copyright 2006 Google Inc. All Rights Reserved.
2*424fb153SAndroid Build Coastguard Worker // Author: nsanders, menderico
3*424fb153SAndroid Build Coastguard Worker 
4*424fb153SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*424fb153SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*424fb153SAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*424fb153SAndroid Build Coastguard Worker 
8*424fb153SAndroid Build Coastguard Worker //      http://www.apache.org/licenses/LICENSE-2.0
9*424fb153SAndroid Build Coastguard Worker 
10*424fb153SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*424fb153SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*424fb153SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*424fb153SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*424fb153SAndroid Build Coastguard Worker // limitations under the License.
15*424fb153SAndroid Build Coastguard Worker 
16*424fb153SAndroid Build Coastguard Worker #ifndef STRESSAPPTEST_OS_H_  // NOLINT
17*424fb153SAndroid Build Coastguard Worker #define STRESSAPPTEST_OS_H_
18*424fb153SAndroid Build Coastguard Worker 
19*424fb153SAndroid Build Coastguard Worker #include <dirent.h>
20*424fb153SAndroid Build Coastguard Worker #include <unistd.h>
21*424fb153SAndroid Build Coastguard Worker #include <sys/syscall.h>
22*424fb153SAndroid Build Coastguard Worker 
23*424fb153SAndroid Build Coastguard Worker #include <string>
24*424fb153SAndroid Build Coastguard Worker #include <list>
25*424fb153SAndroid Build Coastguard Worker #include <map>
26*424fb153SAndroid Build Coastguard Worker #include <vector>
27*424fb153SAndroid Build Coastguard Worker 
28*424fb153SAndroid Build Coastguard Worker // This file must work with autoconf on its public version,
29*424fb153SAndroid Build Coastguard Worker // so these includes are correct.
30*424fb153SAndroid Build Coastguard Worker #include "adler32memcpy.h"  // NOLINT
31*424fb153SAndroid Build Coastguard Worker #include "sattypes.h"       // NOLINT
32*424fb153SAndroid Build Coastguard Worker #include "clock.h"          // NOLINT
33*424fb153SAndroid Build Coastguard Worker 
34*424fb153SAndroid Build Coastguard Worker const char kPagemapPath[] = "/proc/self/pagemap";
35*424fb153SAndroid Build Coastguard Worker 
36*424fb153SAndroid Build Coastguard Worker struct PCIDevice {
37*424fb153SAndroid Build Coastguard Worker   int32 domain;
38*424fb153SAndroid Build Coastguard Worker   uint16 bus;
39*424fb153SAndroid Build Coastguard Worker   uint8 dev;
40*424fb153SAndroid Build Coastguard Worker   uint8 func;
41*424fb153SAndroid Build Coastguard Worker   uint16 vendor_id;
42*424fb153SAndroid Build Coastguard Worker   uint16 device_id;
43*424fb153SAndroid Build Coastguard Worker   uint64 base_addr[6];
44*424fb153SAndroid Build Coastguard Worker   uint64 size[6];
45*424fb153SAndroid Build Coastguard Worker };
46*424fb153SAndroid Build Coastguard Worker 
47*424fb153SAndroid Build Coastguard Worker typedef vector<PCIDevice*> PCIDevices;
48*424fb153SAndroid Build Coastguard Worker 
49*424fb153SAndroid Build Coastguard Worker class ErrorDiag;
50*424fb153SAndroid Build Coastguard Worker 
51*424fb153SAndroid Build Coastguard Worker class Clock;
52*424fb153SAndroid Build Coastguard Worker 
53*424fb153SAndroid Build Coastguard Worker // This class implements OS/Platform specific funtions.
54*424fb153SAndroid Build Coastguard Worker class OsLayer {
55*424fb153SAndroid Build Coastguard Worker  public:
56*424fb153SAndroid Build Coastguard Worker   OsLayer();
57*424fb153SAndroid Build Coastguard Worker   virtual ~OsLayer();
58*424fb153SAndroid Build Coastguard Worker 
59*424fb153SAndroid Build Coastguard Worker   // Set the minimum amount of hugepages that should be available for testing.
60*424fb153SAndroid Build Coastguard Worker   // Must be set before Initialize().
SetMinimumHugepagesSize(int64 min_bytes)61*424fb153SAndroid Build Coastguard Worker   void SetMinimumHugepagesSize(int64 min_bytes) {
62*424fb153SAndroid Build Coastguard Worker     min_hugepages_bytes_ = min_bytes;
63*424fb153SAndroid Build Coastguard Worker   }
64*424fb153SAndroid Build Coastguard Worker 
65*424fb153SAndroid Build Coastguard Worker   // Set the minium amount of memory that should not be allocated. This only
66*424fb153SAndroid Build Coastguard Worker   // has any affect if hugepages are not used.
67*424fb153SAndroid Build Coastguard Worker   // Must be set before Initialize().
SetReserveSize(int64 reserve_mb)68*424fb153SAndroid Build Coastguard Worker   void SetReserveSize(int64 reserve_mb) {
69*424fb153SAndroid Build Coastguard Worker     reserve_mb_ = reserve_mb;
70*424fb153SAndroid Build Coastguard Worker   }
71*424fb153SAndroid Build Coastguard Worker 
72*424fb153SAndroid Build Coastguard Worker   // Set parameters needed to translate physical address to memory module.
SetDramMappingParams(uintptr_t channel_hash,int channel_width,vector<vector<string>> * channels)73*424fb153SAndroid Build Coastguard Worker   void SetDramMappingParams(uintptr_t channel_hash, int channel_width,
74*424fb153SAndroid Build Coastguard Worker                             vector< vector<string> > *channels) {
75*424fb153SAndroid Build Coastguard Worker     channel_hash_ = channel_hash;
76*424fb153SAndroid Build Coastguard Worker     channel_width_ = channel_width;
77*424fb153SAndroid Build Coastguard Worker     channels_ = channels;
78*424fb153SAndroid Build Coastguard Worker   }
79*424fb153SAndroid Build Coastguard Worker 
80*424fb153SAndroid Build Coastguard Worker   // Initializes data strctures and open files.
81*424fb153SAndroid Build Coastguard Worker   // Returns false on error.
82*424fb153SAndroid Build Coastguard Worker   virtual bool Initialize();
83*424fb153SAndroid Build Coastguard Worker 
84*424fb153SAndroid Build Coastguard Worker   // Virtual to physical. This implementation is optional for
85*424fb153SAndroid Build Coastguard Worker   // subclasses to implement.
86*424fb153SAndroid Build Coastguard Worker   // Takes a pointer, and returns the corresponding bus address.
87*424fb153SAndroid Build Coastguard Worker   virtual uint64 VirtualToPhysical(void *vaddr);
88*424fb153SAndroid Build Coastguard Worker 
89*424fb153SAndroid Build Coastguard Worker   // Prints failed dimm. This implementation is optional for
90*424fb153SAndroid Build Coastguard Worker   // subclasses to implement.
91*424fb153SAndroid Build Coastguard Worker   // Takes a bus address and string, and prints the DIMM name
92*424fb153SAndroid Build Coastguard Worker   // into the string. Returns the DIMM number that corresponds to the
93*424fb153SAndroid Build Coastguard Worker   // address given, or -1 if unable to identify the DIMM number.
94*424fb153SAndroid Build Coastguard Worker   // Note that subclass implementations of FindDimm() MUST fill
95*424fb153SAndroid Build Coastguard Worker   // buf with at LEAST one non-whitespace character (provided len > 0).
96*424fb153SAndroid Build Coastguard Worker   virtual int FindDimm(uint64 addr, char *buf, int len);
97*424fb153SAndroid Build Coastguard Worker 
98*424fb153SAndroid Build Coastguard Worker   // Classifies addresses according to "regions"
99*424fb153SAndroid Build Coastguard Worker   // This may mean different things on different platforms.
100*424fb153SAndroid Build Coastguard Worker   virtual int32 FindRegion(uint64 paddr);
101*424fb153SAndroid Build Coastguard Worker   // Find cpu cores associated with a region. Either NUMA or arbitrary.
102*424fb153SAndroid Build Coastguard Worker   virtual cpu_set_t *FindCoreMask(int32 region);
103*424fb153SAndroid Build Coastguard Worker   // Return cpu cores associated with a region in a hex string.
104*424fb153SAndroid Build Coastguard Worker   virtual string FindCoreMaskFormat(int32 region);
105*424fb153SAndroid Build Coastguard Worker 
106*424fb153SAndroid Build Coastguard Worker   // Returns the HD device that contains this file.
107*424fb153SAndroid Build Coastguard Worker   virtual string FindFileDevice(string filename);
108*424fb153SAndroid Build Coastguard Worker 
109*424fb153SAndroid Build Coastguard Worker   // Returns a list of paths coresponding to HD devices found on this machine.
110*424fb153SAndroid Build Coastguard Worker   virtual list<string> FindFileDevices();
111*424fb153SAndroid Build Coastguard Worker 
112*424fb153SAndroid Build Coastguard Worker   // Polls for errors. This implementation is optional.
113*424fb153SAndroid Build Coastguard Worker   // This will poll once for errors and return zero iff no errors were found.
114*424fb153SAndroid Build Coastguard Worker   virtual int ErrorPoll();
115*424fb153SAndroid Build Coastguard Worker 
116*424fb153SAndroid Build Coastguard Worker   // Delay an appropriate amount of time between polling.
117*424fb153SAndroid Build Coastguard Worker   virtual void ErrorWait();
118*424fb153SAndroid Build Coastguard Worker 
119*424fb153SAndroid Build Coastguard Worker   // Report errors. This implementation is mandatory.
120*424fb153SAndroid Build Coastguard Worker   // This will output a machine readable line regarding the error.
121*424fb153SAndroid Build Coastguard Worker   virtual bool ErrorReport(const char *part, const char *symptom, int count);
122*424fb153SAndroid Build Coastguard Worker 
123*424fb153SAndroid Build Coastguard Worker   // Flushes page cache. Used to circumvent the page cache when doing disk
124*424fb153SAndroid Build Coastguard Worker   // I/O.  This will be a NOP until ActivateFlushPageCache() is called, which
125*424fb153SAndroid Build Coastguard Worker   // is typically done when opening a file with O_DIRECT fails.
126*424fb153SAndroid Build Coastguard Worker   // Returns false on error, true on success or NOP.
127*424fb153SAndroid Build Coastguard Worker   // Subclasses may implement this in machine specific ways..
128*424fb153SAndroid Build Coastguard Worker   virtual bool FlushPageCache(void);
129*424fb153SAndroid Build Coastguard Worker   // Enable FlushPageCache() to actually do the flush instead of being a NOP.
130*424fb153SAndroid Build Coastguard Worker   virtual void ActivateFlushPageCache(void);
131*424fb153SAndroid Build Coastguard Worker 
132*424fb153SAndroid Build Coastguard Worker   // Flushes cacheline. Used to distinguish read or write errors.
133*424fb153SAndroid Build Coastguard Worker   // Subclasses may implement this in machine specific ways..
134*424fb153SAndroid Build Coastguard Worker   // Takes a pointer, and flushed the cacheline containing that pointer.
135*424fb153SAndroid Build Coastguard Worker   virtual void Flush(void *vaddr);
136*424fb153SAndroid Build Coastguard Worker 
137*424fb153SAndroid Build Coastguard Worker   // Fast flush, for use in performance critical code.
138*424fb153SAndroid Build Coastguard Worker   // This is bound at compile time, and will not pick up
139*424fb153SAndroid Build Coastguard Worker   // any runtime machine configuration info.
FastFlush(void * vaddr)140*424fb153SAndroid Build Coastguard Worker   inline static void FastFlush(void *vaddr) {
141*424fb153SAndroid Build Coastguard Worker #ifdef STRESSAPPTEST_CPU_PPC
142*424fb153SAndroid Build Coastguard Worker     asm volatile("dcbf 0,%0; sync" : : "r" (vaddr));
143*424fb153SAndroid Build Coastguard Worker #elif defined(STRESSAPPTEST_CPU_X86_64) || defined(STRESSAPPTEST_CPU_I686)
144*424fb153SAndroid Build Coastguard Worker     // Put mfence before and after clflush to make sure:
145*424fb153SAndroid Build Coastguard Worker     // 1. The write before the clflush is committed to memory bus;
146*424fb153SAndroid Build Coastguard Worker     // 2. The read after the clflush is hitting the memory bus.
147*424fb153SAndroid Build Coastguard Worker     //
148*424fb153SAndroid Build Coastguard Worker     // From Intel manual:
149*424fb153SAndroid Build Coastguard Worker     // CLFLUSH is only ordered by the MFENCE instruction. It is not guaranteed
150*424fb153SAndroid Build Coastguard Worker     // to be ordered by any other fencing, serializing or other CLFLUSH
151*424fb153SAndroid Build Coastguard Worker     // instruction. For example, software can use an MFENCE instruction to
152*424fb153SAndroid Build Coastguard Worker     // insure that previous stores are included in the write-back.
153*424fb153SAndroid Build Coastguard Worker     asm volatile("mfence");
154*424fb153SAndroid Build Coastguard Worker     asm volatile("clflush (%0)" : : "r" (vaddr));
155*424fb153SAndroid Build Coastguard Worker     asm volatile("mfence");
156*424fb153SAndroid Build Coastguard Worker #elif defined(STRESSAPPTEST_CPU_ARMV7A)
157*424fb153SAndroid Build Coastguard Worker     // ARMv7a cachelines are 8 words (32 bytes).
158*424fb153SAndroid Build Coastguard Worker     syscall(__ARM_NR_cacheflush, vaddr, reinterpret_cast<char*>(vaddr) + 32, 0);
159*424fb153SAndroid Build Coastguard Worker #elif defined(STRESSAPPTEST_CPU_AARCH64)
160*424fb153SAndroid Build Coastguard Worker     asm volatile("dc cvau, %0" : : "r" (vaddr));
161*424fb153SAndroid Build Coastguard Worker     asm volatile("dsb ish");
162*424fb153SAndroid Build Coastguard Worker     asm volatile("ic ivau, %0" : : "r" (vaddr));
163*424fb153SAndroid Build Coastguard Worker     asm volatile("dsb ish");
164*424fb153SAndroid Build Coastguard Worker     asm volatile("isb");
165*424fb153SAndroid Build Coastguard Worker #else
166*424fb153SAndroid Build Coastguard Worker   #warning "Unsupported CPU type: Unable to force cache flushes."
167*424fb153SAndroid Build Coastguard Worker #endif
168*424fb153SAndroid Build Coastguard Worker   }
169*424fb153SAndroid Build Coastguard Worker 
170*424fb153SAndroid Build Coastguard Worker   // Fast flush, for use in performance critical code.
171*424fb153SAndroid Build Coastguard Worker   // This is bound at compile time, and will not pick up
172*424fb153SAndroid Build Coastguard Worker   // any runtime machine configuration info.  Takes a NULL-terminated
173*424fb153SAndroid Build Coastguard Worker   // array of addresses to flush.
FastFlushList(void ** vaddrs)174*424fb153SAndroid Build Coastguard Worker   inline static void FastFlushList(void **vaddrs) {
175*424fb153SAndroid Build Coastguard Worker #ifdef STRESSAPPTEST_CPU_PPC
176*424fb153SAndroid Build Coastguard Worker     while (*vaddrs) {
177*424fb153SAndroid Build Coastguard Worker       asm volatile("dcbf 0,%0" : : "r" (*vaddrs++));
178*424fb153SAndroid Build Coastguard Worker     }
179*424fb153SAndroid Build Coastguard Worker     asm volatile("sync");
180*424fb153SAndroid Build Coastguard Worker #elif defined(STRESSAPPTEST_CPU_X86_64) || defined(STRESSAPPTEST_CPU_I686)
181*424fb153SAndroid Build Coastguard Worker     // Put mfence before and after clflush to make sure:
182*424fb153SAndroid Build Coastguard Worker     // 1. The write before the clflush is committed to memory bus;
183*424fb153SAndroid Build Coastguard Worker     // 2. The read after the clflush is hitting the memory bus.
184*424fb153SAndroid Build Coastguard Worker     //
185*424fb153SAndroid Build Coastguard Worker     // From Intel manual:
186*424fb153SAndroid Build Coastguard Worker     // CLFLUSH is only ordered by the MFENCE instruction. It is not guaranteed
187*424fb153SAndroid Build Coastguard Worker     // to be ordered by any other fencing, serializing or other CLFLUSH
188*424fb153SAndroid Build Coastguard Worker     // instruction. For example, software can use an MFENCE instruction to
189*424fb153SAndroid Build Coastguard Worker     // insure that previous stores are included in the write-back.
190*424fb153SAndroid Build Coastguard Worker     asm volatile("mfence");
191*424fb153SAndroid Build Coastguard Worker     while (*vaddrs) {
192*424fb153SAndroid Build Coastguard Worker       asm volatile("clflush (%0)" : : "r" (*vaddrs++));
193*424fb153SAndroid Build Coastguard Worker     }
194*424fb153SAndroid Build Coastguard Worker     asm volatile("mfence");
195*424fb153SAndroid Build Coastguard Worker #elif defined(STRESSAPPTEST_CPU_ARMV7A) || defined(STRESSAPPTEST_CPU_AARCH64)
196*424fb153SAndroid Build Coastguard Worker     while (*vaddrs) {
197*424fb153SAndroid Build Coastguard Worker       FastFlush(*vaddrs++);
198*424fb153SAndroid Build Coastguard Worker     }
199*424fb153SAndroid Build Coastguard Worker #else
200*424fb153SAndroid Build Coastguard Worker     #warning "Unsupported CPU type: Unable to force cache flushes."
201*424fb153SAndroid Build Coastguard Worker #endif
202*424fb153SAndroid Build Coastguard Worker   }
203*424fb153SAndroid Build Coastguard Worker 
204*424fb153SAndroid Build Coastguard Worker   // Fast flush hint, for use in performance critical code.
205*424fb153SAndroid Build Coastguard Worker   // This is bound at compile time, and will not pick up
206*424fb153SAndroid Build Coastguard Worker   // any runtime machine configuration info.  Note that this
207*424fb153SAndroid Build Coastguard Worker   // will not guarantee that a flush happens, but will at least
208*424fb153SAndroid Build Coastguard Worker   // hint that it should.  This is useful for speeding up
209*424fb153SAndroid Build Coastguard Worker   // parallel march algorithms.
FastFlushHint(void * vaddr)210*424fb153SAndroid Build Coastguard Worker   inline static void FastFlushHint(void *vaddr) {
211*424fb153SAndroid Build Coastguard Worker #ifdef STRESSAPPTEST_CPU_PPC
212*424fb153SAndroid Build Coastguard Worker     asm volatile("dcbf 0,%0" : : "r" (vaddr));
213*424fb153SAndroid Build Coastguard Worker #elif defined(STRESSAPPTEST_CPU_X86_64) || defined(STRESSAPPTEST_CPU_I686)
214*424fb153SAndroid Build Coastguard Worker     // From Intel manual:
215*424fb153SAndroid Build Coastguard Worker     // CLFLUSH is only ordered by the MFENCE instruction. It is not guaranteed
216*424fb153SAndroid Build Coastguard Worker     // to be ordered by any other fencing, serializing or other CLFLUSH
217*424fb153SAndroid Build Coastguard Worker     // instruction. For example, software can use an MFENCE instruction to
218*424fb153SAndroid Build Coastguard Worker     // insure that previous stores are included in the write-back.
219*424fb153SAndroid Build Coastguard Worker     asm volatile("clflush (%0)" : : "r" (vaddr));
220*424fb153SAndroid Build Coastguard Worker #elif defined(STRESSAPPTEST_CPU_ARMV7A) || defined(STRESSAPPTEST_CPU_AARCH64)
221*424fb153SAndroid Build Coastguard Worker     FastFlush(vaddr);
222*424fb153SAndroid Build Coastguard Worker #else
223*424fb153SAndroid Build Coastguard Worker     #warning "Unsupported CPU type: Unable to force cache flushes."
224*424fb153SAndroid Build Coastguard Worker #endif
225*424fb153SAndroid Build Coastguard Worker   }
226*424fb153SAndroid Build Coastguard Worker 
227*424fb153SAndroid Build Coastguard Worker   // Fast flush, for use in performance critical code.
228*424fb153SAndroid Build Coastguard Worker   // This is bound at compile time, and will not pick up
229*424fb153SAndroid Build Coastguard Worker   // any runtime machine configuration info.  Sync's any
230*424fb153SAndroid Build Coastguard Worker   // transactions for ordering FastFlushHints.
FastFlushSync()231*424fb153SAndroid Build Coastguard Worker   inline static void FastFlushSync() {
232*424fb153SAndroid Build Coastguard Worker #ifdef STRESSAPPTEST_CPU_PPC
233*424fb153SAndroid Build Coastguard Worker     asm volatile("sync");
234*424fb153SAndroid Build Coastguard Worker #elif defined(STRESSAPPTEST_CPU_X86_64) || defined(STRESSAPPTEST_CPU_I686)
235*424fb153SAndroid Build Coastguard Worker     // Put mfence before and after clflush to make sure:
236*424fb153SAndroid Build Coastguard Worker     // 1. The write before the clflush is committed to memory bus;
237*424fb153SAndroid Build Coastguard Worker     // 2. The read after the clflush is hitting the memory bus.
238*424fb153SAndroid Build Coastguard Worker     //
239*424fb153SAndroid Build Coastguard Worker     // From Intel manual:
240*424fb153SAndroid Build Coastguard Worker     // CLFLUSH is only ordered by the MFENCE instruction. It is not guaranteed
241*424fb153SAndroid Build Coastguard Worker     // to be ordered by any other fencing, serializing or other CLFLUSH
242*424fb153SAndroid Build Coastguard Worker     // instruction. For example, software can use an MFENCE instruction to
243*424fb153SAndroid Build Coastguard Worker     // insure that previous stores are included in the write-back.
244*424fb153SAndroid Build Coastguard Worker     asm volatile("mfence");
245*424fb153SAndroid Build Coastguard Worker #elif defined(STRESSAPPTEST_CPU_ARMV7A) || defined(STRESSAPPTEST_CPU_AARCH64)
246*424fb153SAndroid Build Coastguard Worker     // This is a NOP, FastFlushHint() always does a full flush, so there's
247*424fb153SAndroid Build Coastguard Worker     // nothing to do for FastFlushSync().
248*424fb153SAndroid Build Coastguard Worker #else
249*424fb153SAndroid Build Coastguard Worker   #warning "Unsupported CPU type: Unable to force cache flushes."
250*424fb153SAndroid Build Coastguard Worker #endif
251*424fb153SAndroid Build Coastguard Worker   }
252*424fb153SAndroid Build Coastguard Worker 
253*424fb153SAndroid Build Coastguard Worker   // Get time in cpu timer ticks. Useful for matching MCEs with software
254*424fb153SAndroid Build Coastguard Worker   // actions.
GetTimestamp(void)255*424fb153SAndroid Build Coastguard Worker   inline static uint64 GetTimestamp(void) {
256*424fb153SAndroid Build Coastguard Worker     uint64 tsc;
257*424fb153SAndroid Build Coastguard Worker #ifdef STRESSAPPTEST_CPU_PPC
258*424fb153SAndroid Build Coastguard Worker     uint32 tbl, tbu, temp;
259*424fb153SAndroid Build Coastguard Worker     __asm __volatile(
260*424fb153SAndroid Build Coastguard Worker       "1:\n"
261*424fb153SAndroid Build Coastguard Worker       "mftbu  %2\n"
262*424fb153SAndroid Build Coastguard Worker       "mftb   %0\n"
263*424fb153SAndroid Build Coastguard Worker       "mftbu  %1\n"
264*424fb153SAndroid Build Coastguard Worker       "cmpw   %2,%1\n"
265*424fb153SAndroid Build Coastguard Worker       "bne    1b\n"
266*424fb153SAndroid Build Coastguard Worker       : "=r"(tbl), "=r"(tbu), "=r"(temp)
267*424fb153SAndroid Build Coastguard Worker       :
268*424fb153SAndroid Build Coastguard Worker       : "cc");
269*424fb153SAndroid Build Coastguard Worker 
270*424fb153SAndroid Build Coastguard Worker     tsc = (static_cast<uint64>(tbu) << 32) | static_cast<uint64>(tbl);
271*424fb153SAndroid Build Coastguard Worker #elif defined(STRESSAPPTEST_CPU_X86_64) || defined(STRESSAPPTEST_CPU_I686)
272*424fb153SAndroid Build Coastguard Worker     datacast_t data;
273*424fb153SAndroid Build Coastguard Worker     __asm __volatile("rdtsc" : "=a" (data.l32.l), "=d"(data.l32.h));
274*424fb153SAndroid Build Coastguard Worker     tsc = data.l64;
275*424fb153SAndroid Build Coastguard Worker #elif defined(STRESSAPPTEST_CPU_ARMV7A)
276*424fb153SAndroid Build Coastguard Worker     #warning "Unsupported CPU type ARMV7A: your timer may not function correctly"
277*424fb153SAndroid Build Coastguard Worker     tsc = 0;
278*424fb153SAndroid Build Coastguard Worker #elif defined(STRESSAPPTEST_CPU_AARCH64)
279*424fb153SAndroid Build Coastguard Worker     __asm __volatile("mrs %0, CNTVCT_EL0" : "=r" (tsc) : : );
280*424fb153SAndroid Build Coastguard Worker #else
281*424fb153SAndroid Build Coastguard Worker     #warning "Unsupported CPU type: your timer may not function correctly"
282*424fb153SAndroid Build Coastguard Worker     tsc = 0;
283*424fb153SAndroid Build Coastguard Worker #endif
284*424fb153SAndroid Build Coastguard Worker     return (tsc);
285*424fb153SAndroid Build Coastguard Worker   }
286*424fb153SAndroid Build Coastguard Worker 
287*424fb153SAndroid Build Coastguard Worker   // Find the free memory on the machine.
288*424fb153SAndroid Build Coastguard Worker   virtual int64 FindFreeMemSize();
289*424fb153SAndroid Build Coastguard Worker 
290*424fb153SAndroid Build Coastguard Worker   // Allocates test memory of length bytes.
291*424fb153SAndroid Build Coastguard Worker   // Subclasses must implement this.
292*424fb153SAndroid Build Coastguard Worker   // Call PepareTestMem to get a pointer.
293*424fb153SAndroid Build Coastguard Worker   virtual int64 AllocateAllMem();  // Returns length.
294*424fb153SAndroid Build Coastguard Worker   // Returns success.
295*424fb153SAndroid Build Coastguard Worker   virtual bool AllocateTestMem(int64 length, uint64 paddr_base);
296*424fb153SAndroid Build Coastguard Worker   virtual void FreeTestMem();
297*424fb153SAndroid Build Coastguard Worker 
298*424fb153SAndroid Build Coastguard Worker   // Prepares the memory for use. You must call this
299*424fb153SAndroid Build Coastguard Worker   // before using test memory, and after you are done.
300*424fb153SAndroid Build Coastguard Worker   virtual void *PrepareTestMem(uint64 offset, uint64 length);
301*424fb153SAndroid Build Coastguard Worker   virtual void ReleaseTestMem(void *addr, uint64 offset, uint64 length);
302*424fb153SAndroid Build Coastguard Worker 
303*424fb153SAndroid Build Coastguard Worker   // Machine type detected. Can we implement all these functions correctly?
304*424fb153SAndroid Build Coastguard Worker   // Returns true if machine type is detected and implemented.
305*424fb153SAndroid Build Coastguard Worker   virtual bool IsSupported();
306*424fb153SAndroid Build Coastguard Worker 
307*424fb153SAndroid Build Coastguard Worker   // Returns 32 for 32-bit, 64 for 64-bit.
308*424fb153SAndroid Build Coastguard Worker   virtual int AddressMode();
309*424fb153SAndroid Build Coastguard Worker   // Update OsLayer state regarding cpu support for various features.
310*424fb153SAndroid Build Coastguard Worker   virtual void GetFeatures();
311*424fb153SAndroid Build Coastguard Worker 
312*424fb153SAndroid Build Coastguard Worker   // Open, read, write pci cfg through /proc/bus/pci. fd is /proc/pci file.
313*424fb153SAndroid Build Coastguard Worker   virtual int PciOpen(int bus, int device, int function);
314*424fb153SAndroid Build Coastguard Worker   virtual void PciWrite(int fd, uint32 offset, uint32 value, int width);
315*424fb153SAndroid Build Coastguard Worker   virtual uint32 PciRead(int fd, uint32 offset, int width);
316*424fb153SAndroid Build Coastguard Worker 
317*424fb153SAndroid Build Coastguard Worker   // Read MSRs
318*424fb153SAndroid Build Coastguard Worker   virtual bool ReadMSR(uint32 core, uint32 address, uint64 *data);
319*424fb153SAndroid Build Coastguard Worker   virtual bool WriteMSR(uint32 core, uint32 address, uint64 *data);
320*424fb153SAndroid Build Coastguard Worker 
321*424fb153SAndroid Build Coastguard Worker   // Extract bits [n+len-1, n] from a 32 bit word.
322*424fb153SAndroid Build Coastguard Worker   // so GetBitField(0x0f00, 8, 4) == 0xf.
323*424fb153SAndroid Build Coastguard Worker   virtual uint32 GetBitField(uint32 val, uint32 n, uint32 len);
324*424fb153SAndroid Build Coastguard Worker 
325*424fb153SAndroid Build Coastguard Worker   // Platform and CPU specific CPU-stressing function.
326*424fb153SAndroid Build Coastguard Worker   // Returns true on success, false otherwise.
327*424fb153SAndroid Build Coastguard Worker   virtual bool CpuStressWorkload();
328*424fb153SAndroid Build Coastguard Worker 
329*424fb153SAndroid Build Coastguard Worker   // Causes false errors for unittesting.
330*424fb153SAndroid Build Coastguard Worker   // Setting to "true" causes errors to be injected.
set_error_injection(bool errors)331*424fb153SAndroid Build Coastguard Worker   void set_error_injection(bool errors) { error_injection_ = errors; }
error_injection()332*424fb153SAndroid Build Coastguard Worker   bool error_injection() const { return error_injection_; }
333*424fb153SAndroid Build Coastguard Worker 
334*424fb153SAndroid Build Coastguard Worker   // Is SAT using normal malloc'd memory, or exotic mmap'd memory.
normal_mem()335*424fb153SAndroid Build Coastguard Worker   bool normal_mem() const { return normal_mem_; }
336*424fb153SAndroid Build Coastguard Worker 
337*424fb153SAndroid Build Coastguard Worker   // Get numa config, if available..
num_nodes()338*424fb153SAndroid Build Coastguard Worker   int num_nodes() const { return num_nodes_; }
num_cpus()339*424fb153SAndroid Build Coastguard Worker   int num_cpus() const { return num_cpus_; }
340*424fb153SAndroid Build Coastguard Worker 
341*424fb153SAndroid Build Coastguard Worker   // Handle to platform-specific error diagnoser.
342*424fb153SAndroid Build Coastguard Worker   ErrorDiag *error_diagnoser_;
343*424fb153SAndroid Build Coastguard Worker 
344*424fb153SAndroid Build Coastguard Worker   // Disambiguate between different "warm" memcopies.
345*424fb153SAndroid Build Coastguard Worker   virtual bool AdlerMemcpyWarm(uint64 *dstmem, uint64 *srcmem,
346*424fb153SAndroid Build Coastguard Worker                                unsigned int size_in_bytes,
347*424fb153SAndroid Build Coastguard Worker                                AdlerChecksum *checksum);
348*424fb153SAndroid Build Coastguard Worker 
349*424fb153SAndroid Build Coastguard Worker   // Store a callback to use to print
350*424fb153SAndroid Build Coastguard Worker   // app-specific info about the last error location.
351*424fb153SAndroid Build Coastguard Worker   // This call back is called with a physical address, and the app can fill in
352*424fb153SAndroid Build Coastguard Worker   // the most recent transaction that occurred at that address.
353*424fb153SAndroid Build Coastguard Worker   typedef bool (*ErrCallback)(uint64 paddr, string *buf);
set_err_log_callback(ErrCallback err_log_callback)354*424fb153SAndroid Build Coastguard Worker   void set_err_log_callback(
355*424fb153SAndroid Build Coastguard Worker     ErrCallback err_log_callback) {
356*424fb153SAndroid Build Coastguard Worker     err_log_callback_ = err_log_callback;
357*424fb153SAndroid Build Coastguard Worker   }
get_err_log_callback()358*424fb153SAndroid Build Coastguard Worker   ErrCallback get_err_log_callback() { return err_log_callback_; }
359*424fb153SAndroid Build Coastguard Worker 
360*424fb153SAndroid Build Coastguard Worker   // Set a clock object that can be overridden for use with unit tests.
SetClock(Clock * clock)361*424fb153SAndroid Build Coastguard Worker   void SetClock(Clock *clock) {
362*424fb153SAndroid Build Coastguard Worker     if (clock_) {
363*424fb153SAndroid Build Coastguard Worker       delete clock_;
364*424fb153SAndroid Build Coastguard Worker     }
365*424fb153SAndroid Build Coastguard Worker     clock_ = clock;
366*424fb153SAndroid Build Coastguard Worker     time_initialized_ = clock_->Now();
367*424fb153SAndroid Build Coastguard Worker   }
368*424fb153SAndroid Build Coastguard Worker 
369*424fb153SAndroid Build Coastguard Worker  protected:
370*424fb153SAndroid Build Coastguard Worker   void *testmem_;                // Location of test memory.
371*424fb153SAndroid Build Coastguard Worker   uint64 testmemsize_;           // Size of test memory.
372*424fb153SAndroid Build Coastguard Worker   int64 totalmemsize_;           // Size of available memory.
373*424fb153SAndroid Build Coastguard Worker   int64 min_hugepages_bytes_;    // Minimum hugepages size.
374*424fb153SAndroid Build Coastguard Worker   int64 reserve_mb_;             // Minimum amount of memory to reserve in MB.
375*424fb153SAndroid Build Coastguard Worker   bool  error_injection_;        // Do error injection?
376*424fb153SAndroid Build Coastguard Worker   bool  normal_mem_;             // Memory DMA capable?
377*424fb153SAndroid Build Coastguard Worker   bool  use_hugepages_;          // Use hugepage shmem?
378*424fb153SAndroid Build Coastguard Worker   bool  use_posix_shm_;          // Use 4k page shmem?
379*424fb153SAndroid Build Coastguard Worker   bool  dynamic_mapped_shmem_;   // Conserve virtual address space.
380*424fb153SAndroid Build Coastguard Worker   bool  mmapped_allocation_;     // Was memory allocated using mmap()?
381*424fb153SAndroid Build Coastguard Worker   int   shmid_;                  // Handle to shmem
382*424fb153SAndroid Build Coastguard Worker   vector< vector<string> > *channels_;  // Memory module names per channel.
383*424fb153SAndroid Build Coastguard Worker   uint64 channel_hash_;          // Mask of address bits XORed for channel.
384*424fb153SAndroid Build Coastguard Worker   int channel_width_;            // Channel width in bits.
385*424fb153SAndroid Build Coastguard Worker 
386*424fb153SAndroid Build Coastguard Worker   int64 regionsize_;             // Size of memory "regions"
387*424fb153SAndroid Build Coastguard Worker   int   regioncount_;            // Number of memory "regions"
388*424fb153SAndroid Build Coastguard Worker   int   num_cpus_;               // Number of cpus in the system.
389*424fb153SAndroid Build Coastguard Worker   int   num_nodes_;              // Number of nodes in the system.
390*424fb153SAndroid Build Coastguard Worker   int   num_cpus_per_node_;      // Number of cpus per node in the system.
391*424fb153SAndroid Build Coastguard Worker   int   address_mode_;           // Are we running 32 or 64 bit?
392*424fb153SAndroid Build Coastguard Worker   bool  has_vector_;             // Do we have sse2/neon instructions?
393*424fb153SAndroid Build Coastguard Worker   bool  has_clflush_;            // Do we have clflush instructions?
394*424fb153SAndroid Build Coastguard Worker   bool  use_flush_page_cache_;   // Do we need to flush the page cache?
395*424fb153SAndroid Build Coastguard Worker 
396*424fb153SAndroid Build Coastguard Worker 
397*424fb153SAndroid Build Coastguard Worker   time_t time_initialized_;      // Start time of test.
398*424fb153SAndroid Build Coastguard Worker 
399*424fb153SAndroid Build Coastguard Worker   vector<cpu_set_t> cpu_sets_;   // Cache for cpu masks.
400*424fb153SAndroid Build Coastguard Worker   vector<bool> cpu_sets_valid_;  // If the cpu mask cache is valid.
401*424fb153SAndroid Build Coastguard Worker 
402*424fb153SAndroid Build Coastguard Worker   // Get file descriptor for dev msr.
403*424fb153SAndroid Build Coastguard Worker   virtual int OpenMSR(uint32 core, uint32 address);
404*424fb153SAndroid Build Coastguard Worker 
405*424fb153SAndroid Build Coastguard Worker   // Look up how many hugepages there are.
406*424fb153SAndroid Build Coastguard Worker   virtual int64 FindHugePages();
407*424fb153SAndroid Build Coastguard Worker 
408*424fb153SAndroid Build Coastguard Worker   // Link to find last transaction at an error location.
409*424fb153SAndroid Build Coastguard Worker   ErrCallback err_log_callback_;
410*424fb153SAndroid Build Coastguard Worker 
411*424fb153SAndroid Build Coastguard Worker   // Object to wrap the time function.
412*424fb153SAndroid Build Coastguard Worker   Clock *clock_;
413*424fb153SAndroid Build Coastguard Worker 
414*424fb153SAndroid Build Coastguard Worker  private:
415*424fb153SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(OsLayer);
416*424fb153SAndroid Build Coastguard Worker };
417*424fb153SAndroid Build Coastguard Worker 
418*424fb153SAndroid Build Coastguard Worker // Selects and returns the proper OS and hardware interface.  Does not call
419*424fb153SAndroid Build Coastguard Worker // OsLayer::Initialize() on the new object.
420*424fb153SAndroid Build Coastguard Worker OsLayer *OsLayerFactory(const std::map<std::string, std::string> &options);
421*424fb153SAndroid Build Coastguard Worker 
422*424fb153SAndroid Build Coastguard Worker #endif  // STRESSAPPTEST_OS_H_ NOLINT
423