summaryrefslogtreecommitdiff
path: root/indra/llcommon/llprocessor.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/llcommon/llprocessor.h')
-rw-r--r--indra/llcommon/llprocessor.h158
1 files changed, 158 insertions, 0 deletions
diff --git a/indra/llcommon/llprocessor.h b/indra/llcommon/llprocessor.h
new file mode 100644
index 0000000000..ad44e2ccb3
--- /dev/null
+++ b/indra/llcommon/llprocessor.h
@@ -0,0 +1,158 @@
+/**
+ * @file llprocessor.h
+ * @brief Code to figure out the processor. Originally by Benjamin Jurke.
+ *
+ * Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+// Author: Benjamin Jurke
+// File history: 27.02.2002 File created.
+///////////////////////////////////////////
+
+
+#ifndef PROCESSOR_H
+#define PROCESSOR_H
+
+// Options:
+///////////
+#if LL_WINDOWS
+#define PROCESSOR_FREQUENCY_MEASURE_AVAILABLE
+#endif
+// Includes <windows.h> --> code gets os-dependend (Win32)
+
+
+typedef struct ProcessorExtensions
+{
+ bool FPU_FloatingPointUnit;
+ bool VME_Virtual8086ModeEnhancements;
+ bool DE_DebuggingExtensions;
+ bool PSE_PageSizeExtensions;
+ bool TSC_TimeStampCounter;
+ bool MSR_ModelSpecificRegisters;
+ bool PAE_PhysicalAddressExtension;
+ bool MCE_MachineCheckException;
+ bool CX8_COMPXCHG8B_Instruction;
+ bool APIC_AdvancedProgrammableInterruptController;
+ unsigned int APIC_ID;
+ bool SEP_FastSystemCall;
+ bool MTRR_MemoryTypeRangeRegisters;
+ bool PGE_PTE_GlobalFlag;
+ bool MCA_MachineCheckArchitecture;
+ bool CMOV_ConditionalMoveAndCompareInstructions;
+ bool FGPAT_PageAttributeTable;
+ bool PSE36_36bitPageSizeExtension;
+ bool PN_ProcessorSerialNumber;
+ bool CLFSH_CFLUSH_Instruction;
+ unsigned int CLFLUSH_InstructionCacheLineSize;
+ bool DS_DebugStore;
+ bool ACPI_ThermalMonitorAndClockControl;
+ bool EMMX_MultimediaExtensions;
+ bool MMX_MultimediaExtensions;
+ bool FXSR_FastStreamingSIMD_ExtensionsSaveRestore;
+ bool SSE_StreamingSIMD_Extensions;
+ bool SSE2_StreamingSIMD2_Extensions;
+ bool SS_SelfSnoop;
+ bool HT_HyperThreading;
+ unsigned int HT_HyterThreadingSiblings;
+ bool TM_ThermalMonitor;
+ bool IA64_Intel64BitArchitecture;
+ bool _3DNOW_InstructionExtensions;
+ bool _E3DNOW_InstructionExtensions;
+ bool AA64_AMD64BitArchitecture;
+} ProcessorExtensions;
+
+typedef struct ProcessorCache
+{
+ bool bPresent;
+ char strSize[32]; /* Flawfinder: ignore */
+ unsigned int uiAssociativeWays;
+ unsigned int uiLineSize;
+ bool bSectored;
+ char strCache[128]; /* Flawfinder: ignore */
+} ProcessorCache;
+
+typedef struct ProcessorL1Cache
+{
+ ProcessorCache Instruction;
+ ProcessorCache Data;
+} ProcessorL1Cache;
+
+typedef struct ProcessorTLB
+{
+ bool bPresent;
+ char strPageSize[32]; /* Flawfinder: ignore */
+ unsigned int uiAssociativeWays;
+ unsigned int uiEntries;
+ char strTLB[128]; /* Flawfinder: ignore */
+} ProcessorTLB;
+
+typedef struct ProcessorInfo
+{
+ char strVendor[16]; /* Flawfinder: ignore */
+ unsigned int uiFamily;
+ unsigned int uiExtendedFamily;
+ char strFamily[64]; /* Flawfinder: ignore */
+ unsigned int uiModel;
+ unsigned int uiExtendedModel;
+ char strModel[128]; /* Flawfinder: ignore */
+ unsigned int uiStepping;
+ unsigned int uiType;
+ char strType[64]; /* Flawfinder: ignore */
+ unsigned int uiBrandID;
+ char strBrandID[64]; /* Flawfinder: ignore */
+ char strProcessorSerial[64]; /* Flawfinder: ignore */
+ unsigned long MaxSupportedLevel;
+ unsigned long MaxSupportedExtendedLevel;
+ ProcessorExtensions _Ext;
+ ProcessorL1Cache _L1;
+ ProcessorCache _L2;
+ ProcessorCache _L3;
+ ProcessorCache _Trace;
+ ProcessorTLB _Instruction;
+ ProcessorTLB _Data;
+} ProcessorInfo;
+
+
+// CProcessor
+// ==========
+// Class for detecting the processor name, type and available
+// extensions as long as it's speed.
+/////////////////////////////////////////////////////////////
+class CProcessor
+{
+// Constructor / Destructor:
+////////////////////////////
+public:
+ CProcessor();
+
+// Private vars:
+////////////////
+public:
+ F64 uqwFrequency;
+ char strCPUName[128]; /* Flawfinder: ignore */
+ ProcessorInfo CPUInfo;
+
+// Private functions:
+/////////////////////
+private:
+ bool AnalyzeIntelProcessor();
+ bool AnalyzeAMDProcessor();
+ bool AnalyzeUnknownProcessor();
+ bool CheckCPUIDPresence();
+ void DecodeProcessorConfiguration(unsigned int cfg);
+ void TranslateProcessorConfiguration();
+ void GetStandardProcessorConfiguration();
+ void GetStandardProcessorExtensions();
+
+// Public functions:
+////////////////////
+public:
+ F64 GetCPUFrequency(unsigned int uiMeasureMSecs);
+ const ProcessorInfo *GetCPUInfo();
+ bool CPUInfoToText(char *strBuffer, unsigned int uiMaxLen);
+ bool WriteInfoTextFile(const char *strFilename);
+};
+
+
+#endif