1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/cpu.h" 6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <intrin.h> 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <string> 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace base { 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottCPU::CPU() 12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott : type_(0), 13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott family_(0), 14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott model_(0), 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott stepping_(0), 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ext_model_(0), 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ext_family_(0), 18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cpu_vendor_("unknown") { 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Initialize(); 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid CPU::Initialize() { 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int cpu_info[4] = {-1}; 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott char cpu_string[0x20]; 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // __cpuid with an InfoType argument of 0 returns the number of 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // valid Ids in CPUInfo[0] and the CPU identification string in 28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // the other three array elements. The CPU identification string is 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // not in linear order. The code below arranges the information 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // in a human readable form. 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // More info can be found here: 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // http://msdn.microsoft.com/en-us/library/hskdteyh.aspx 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott __cpuid(cpu_info, 0); 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int num_ids = cpu_info[0]; 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott memset(cpu_string, 0, sizeof(cpu_string)); 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *(reinterpret_cast<int*>(cpu_string)) = cpu_info[1]; 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *(reinterpret_cast<int*>(cpu_string+4)) = cpu_info[3]; 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott *(reinterpret_cast<int*>(cpu_string+8)) = cpu_info[2]; 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Interpret CPU feature information. 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (num_ids > 0) { 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott __cpuid(cpu_info, 1); 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott stepping_ = cpu_info[0] & 0xf; 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott model_ = (cpu_info[0] >> 4) & 0xf; 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott family_ = (cpu_info[0] >> 8) & 0xf; 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott type_ = (cpu_info[0] >> 12) & 0x3; 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ext_model_ = (cpu_info[0] >> 16) & 0xf; 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ext_family_ = (cpu_info[0] >> 20) & 0xff; 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott cpu_vendor_ = cpu_string; 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace base 55