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.h205
1 files changed, 176 insertions, 29 deletions
diff --git a/indra/llcommon/llprocessor.h b/indra/llcommon/llprocessor.h
index 6364d3c8bb..746d007a7f 100644
--- a/indra/llcommon/llprocessor.h
+++ b/indra/llcommon/llprocessor.h
@@ -2,48 +2,195 @@
* @file llprocessor.h
* @brief Code to figure out the processor. Originally by Benjamin Jurke.
*
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
*
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
*
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
+// Author: Benjamin Jurke
+// File history: 27.02.2002 File created.
+///////////////////////////////////////////
+
#ifndef LLPROCESSOR_H
#define LLPROCESSOR_H
-class LLProcessorInfoImpl;
-class LL_COMMON_API LLProcessorInfo
+// Options:
+///////////
+#if LL_WINDOWS
+#define PROCESSOR_FREQUENCY_MEASURE_AVAILABLE
+#endif
+
+#if LL_MSVC && _M_X64
+# define LL_X86_64 1
+# define LL_X86 1
+#elif LL_MSVC && _M_IX86
+# define LL_X86 1
+#elif LL_GNUC && ( defined(__amd64__) || defined(__x86_64__) )
+# define LL_X86_64 1
+# define LL_X86 1
+#elif LL_GNUC && ( defined(__i386__) )
+# define LL_X86 1
+#elif LL_GNUC && ( defined(__powerpc__) || defined(__ppc__) )
+# define LL_PPC 1
+#endif
+
+
+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 Altivec_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;
+};
+
+struct ProcessorCache
+{
+ bool bPresent;
+ char strSize[32]; /* Flawfinder: ignore */
+ unsigned int uiAssociativeWays;
+ unsigned int uiLineSize;
+ bool bSectored;
+ char strCache[128]; /* Flawfinder: ignore */
+};
+
+struct ProcessorL1Cache
+{
+ ProcessorCache Instruction;
+ ProcessorCache Data;
+};
+
+struct ProcessorTLB
+{
+ bool bPresent;
+ char strPageSize[32]; /* Flawfinder: ignore */
+ unsigned int uiAssociativeWays;
+ unsigned int uiEntries;
+ char strTLB[128]; /* Flawfinder: ignore */
+};
+
+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;
+};
+
+
+// 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:
- LLProcessorInfo();
- ~LLProcessorInfo();
-
- F64 getCPUFrequency() const;
- bool hasSSE() const;
- bool hasSSE2() const;
- bool hasAltivec() const;
- std::string getCPUFamilyName() const;
- std::string getCPUBrandName() const;
- std::string getCPUFeatureDescription() const;
+ F64 uqwFrequency;
+ char strCPUName[128]; /* Flawfinder: ignore */
+ ProcessorInfo CPUInfo;
+
+// Private functions:
+/////////////////////
private:
- LLProcessorInfoImpl* mImpl;
+ 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 std::string& strFilename);
};
-#endif // LLPROCESSOR_H
+
+#endif