You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							149 lines
						
					
					
						
							4.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							149 lines
						
					
					
						
							4.0 KiB
						
					
					
				| 
 | |
| #include "types.h" | |
| #include "string.h" | |
| #include "print.h" | |
|  | |
| 
 | |
| static const char* szFeatures[] = { | |
|     "x87 FPU On Chip", | |
|     "Virtual-8086 Mode Enhancement", | |
|     "Debugging Extensions", | |
|     "Page Size Extensions", | |
|     "Time Stamp Counter", | |
|     "RDMR and WRMSR Support", | |
|     "Physical Address Extensions", | |
|     "Machine Check Exception", | |
|     "CMPXCHG8B Instruction", | |
|     "APIC On Chip", | |
|     "Unknown1", | |
|     "SYSENTER and SYSEXIT", | |
|     "Memory Type Range Registers", | |
|     "PTE Global Bit", | |
|     "Machine Check Architecture", | |
|     "Conditional Move/Compare Instruction", | |
|     "Page Attribute Table", | |
|     "36-bit Page Size Extension", | |
|     "Processor Serial Number", | |
|     "CFLUSH Extension", | |
|     "Unknown2", | |
|     "Debug Store", | |
|     "ThermalMonitor and Clock Ctrl", | |
|     "MMX Technology", | |
|     "FXSAVE/FXRSTOR", | |
|     "SSE Extensions", | |
|     "SSE2 Extensions", | |
|     "Self Snoop", | |
|     "Multithreading Technology", | |
|     "Thermal Monitor", | |
|     "Unknown4", | |
|     "Pending Break Enable" | |
| 
 | |
| }; | |
| 
 | |
| #if defined(_WIN32) | |
| // implementation originally from: | |
| // https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2008/hskdteyh(v=vs.90)?redirectedfrom=MSDN | |
| #include <intrin.h> | |
| void cpuid() { | |
| 	ULE_TYPES_H_FTAG; | |
|     int nSteppingID = 0; | |
|     int nModel = 0; | |
|     int nFamily = 0; | |
|     int nProcessorType = 0; | |
|     int nExtendedmodel = 0; | |
|     int nExtendedfamily = 0; | |
|     int nBrandIndex = 0; | |
|     int nCLFLUSHcachelinesize = 0; | |
|     int nLogicalProcessors = 0; | |
|     int nAPICPhysicalID = 0; | |
|     int nFeatureInfo = 0; | |
|     int nCacheLineSize = 0; | |
|     int nL2Associativity = 0; | |
|     int nCacheSizeK = 0; | |
|     int nPhysicalAddress = 0; | |
|     int nVirtualAddress = 0; | |
|     int nRet = 0; | |
| 
 | |
|     int nCores = 0; | |
|     int nCacheType = 0; | |
|     int nCacheLevel = 0; | |
|     int nMaxThread = 0; | |
|     int nSysLineSize = 0; | |
|     int nPhysicalLinePartitions = 0; | |
|     int nWaysAssociativity = 0; | |
|     int nNumberSets = 0; | |
| 
 | |
|     unsigned    nIds, nExIds, i; | |
| 
 | |
|     bool    bSSE3Instructions = false; | |
|     bool    bMONITOR_MWAIT = false; | |
|     bool    bCPLQualifiedDebugStore = false; | |
|     bool    bVirtualMachineExtensions = false; | |
|     bool    bEnhancedIntelSpeedStepTechnology = false; | |
|     bool    bThermalMonitor2 = false; | |
|     bool    bSupplementalSSE3 = false; | |
|     bool    bL1ContextID = false; | |
|     bool    bCMPXCHG16B = false; | |
|     bool    bxTPRUpdateControl = false; | |
|     bool    bPerfDebugCapabilityMSR = false; | |
|     bool    bSSE41Extensions = false; | |
|     bool    bSSE42Extensions = false; | |
|     bool    bPOPCNT = false; | |
| 
 | |
|     bool    bMultithreading = false; | |
| 
 | |
|     bool    bLAHF_SAHFAvailable = false; | |
|     bool    bCmpLegacy = false; | |
|     bool    bSVM = false; | |
|     bool    bExtApicSpace = false; | |
|     bool    bAltMovCr8 = false; | |
|     bool    bLZCNT = false; | |
|     bool    bSSE4A = false; | |
|     bool    bMisalignedSSE = false; | |
|     bool    bPREFETCH = false; | |
|     bool    bSKINITandDEV = false; | |
|     bool    bSYSCALL_SYSRETAvailable = false; | |
|     bool    bExecuteDisableBitAvailable = false; | |
|     bool    bMMXExtensions = false; | |
|     bool    bFFXSR = false; | |
|     bool    b1GBSupport = false; | |
|     bool    bRDTSCP = false; | |
|     bool    b64Available = false; | |
|     bool    b3DNowExt = false; | |
|     bool    b3DNow = false; | |
|     bool    bNestedPaging = false; | |
|     bool    bLBRVisualization = false; | |
|     bool    bFP128 = false; | |
|     bool    bMOVOptimization = false; | |
| 
 | |
|     bool    bSelfInit = false; | |
|     bool    bFullyAssociative = false; | |
| 
 | |
|     int cpuinfo[4] = { -1 }; | |
|     __cpuid(cpuinfo, 0); | |
|     unsigned count = cpuinfo[0]; | |
| 
 | |
|     char cpustring[0x20]; | |
|     String::memset((void*) cpustring, '\0', sizeof(cpustring)); | |
|     *((int*)  cpustring)      = cpuinfo[1]; | |
|     *((int*) (cpustring + 4)) = cpuinfo[3]; | |
|     *((int*) (cpustring + 8)) = cpuinfo[2]; | |
|     println("CPU Identification String: %s", cpustring); | |
| 
 | |
|     //for (s32 i = 0; i < count; i++) { | |
|     //    __cpuid(cpuinfo, i); | |
|     //    println("info type: %d", i); | |
|     //    println("cpuinfo[0] = 0x%x", cpuinfo[0]); | |
|     //    println("cpuinfo[1] = 0x%x", cpuinfo[1]); | |
|     //    println("cpuinfo[2] = 0x%x", cpuinfo[2]); | |
|     //    println("cpuinfo[3] = 0x%x", cpuinfo[3]); | |
|     //} | |
| } | |
| 
 | |
| #else | |
| void cpuid() { | |
| 	ULE_TYPES_H_FTAG; | |
| } | |
| 
 | |
| #endif | |
| 
 |