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