diff options
author | puttaraju.r@samsung.com <puttaraju.r@samsung.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-28 15:33:26 +0000 |
---|---|---|
committer | puttaraju.r@samsung.com <puttaraju.r@samsung.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-28 15:33:26 +0000 |
commit | 3a23f63c2ae4f56bae97806eb7f8759a8e2895a6 (patch) | |
tree | 9d36cc9534e3e5b8189b13ed919f8bd18b95ae58 | |
parent | 146eae3d95239b048fc4f1e778f43e0f59be9b96 (diff) | |
download | chromium_src-3a23f63c2ae4f56bae97806eb7f8759a8e2895a6.zip chromium_src-3a23f63c2ae4f56bae97806eb7f8759a8e2895a6.tar.gz chromium_src-3a23f63c2ae4f56bae97806eb7f8759a8e2895a6.tar.bz2 |
Parsing /proc/cpuinfo for cpu branding information on Android and Aura.
BUG=313454
Review URL: https://codereview.chromium.org/188443003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@266575 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | android_webview/lib/main/aw_main_delegate.cc | 6 | ||||
-rw-r--r-- | base/cpu.cc | 57 | ||||
-rw-r--r-- | chrome/app/chrome_main_delegate.cc | 6 | ||||
-rw-r--r-- | content/shell/app/shell_main_delegate.cc | 6 |
4 files changed, 68 insertions, 7 deletions
diff --git a/android_webview/lib/main/aw_main_delegate.cc b/android_webview/lib/main/aw_main_delegate.cc index a9f6bf6..68f8d7c 100644 --- a/android_webview/lib/main/aw_main_delegate.cc +++ b/android_webview/lib/main/aw_main_delegate.cc @@ -16,6 +16,7 @@ #include "android_webview/native/external_video_surface_container_impl.h" #include "android_webview/renderer/aw_content_renderer_client.h" #include "base/command_line.h" +#include "base/cpu.h" #include "base/lazy_instance.h" #include "base/logging.h" #include "base/memory/scoped_ptr.h" @@ -83,6 +84,11 @@ bool AwMainDelegate::BasicStartupComplete(int* exit_code) { void AwMainDelegate::PreSandboxStartup() { // TODO(torne): When we have a separate renderer process, we need to handle // being passed open FDs for the resource paks here. +#if defined(ARCH_CPU_ARM_FAMILY) + // Create an instance of the CPU class to parse /proc/cpuinfo and cache + // cpu_brand info. + base::CPU cpu_info; +#endif } void AwMainDelegate::SandboxInitialized(const std::string& process_type) { diff --git a/base/cpu.cc b/base/cpu.cc index 66207a1..3fa9413 100644 --- a/base/cpu.cc +++ b/base/cpu.cc @@ -11,6 +11,11 @@ #include "base/basictypes.h" #include "build/build_config.h" +#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX)) +#include "base/file_util.h" +#include "base/lazy_instance.h" +#endif + #if defined(ARCH_CPU_X86_FAMILY) #if defined(_MSC_VER) #include <intrin.h> @@ -84,6 +89,49 @@ uint64 _xgetbv(uint32 xcr) { #endif // !_MSC_VER #endif // ARCH_CPU_X86_FAMILY +#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX)) + +std::string ParseCpuInfo() { + const char kProcessorPrefix[] = "Processor"; + std::string contents, cpu_brand; + ReadFileToString(FilePath("/proc/cpuinfo"), &contents); + DCHECK(!contents.empty()); + if (!contents.empty()) { + std::istringstream iss(contents); + std::string line; + while (std::getline(iss, line)) { + if (line.compare(0, strlen(kProcessorPrefix), kProcessorPrefix) == 0) { + size_t pos = line.find(": "); + if (pos != std::string::npos) { + cpu_brand.assign(line.substr(pos + 2)); + break; + } + } + } + } + return cpu_brand; +} + +class LazyCpuInfoValue { + public: + LazyCpuInfoValue() : value_(ParseCpuInfo()) {} + const std::string& value() { return value_; } + + private: + const std::string value_; + DISALLOW_COPY_AND_ASSIGN(LazyCpuInfoValue); +}; + +base::LazyInstance<LazyCpuInfoValue> g_lazy_cpu_brand = + LAZY_INSTANCE_INITIALIZER; + +const std::string& CpuBrandInfo() { + return g_lazy_cpu_brand.Get().value(); +} + +#endif // defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || + // defined(OS_LINUX)) + } // anonymous namespace void CPU::Initialize() { @@ -157,13 +205,8 @@ void CPU::Initialize() { __cpuid(cpu_info, parameter_containing_non_stop_time_stamp_counter); has_non_stop_time_stamp_counter_ = (cpu_info[3] & (1 << 8)) != 0; } -#elif defined(ARCH_CPU_ARM_FAMILY) - // TODO(piman): Expand this. ARM has a CPUID register, but it's not available - // in user mode. /proc/cpuinfo has some information, but it's non standard, - // platform-specific, and not accessible from the sandbox. - // For some purposes, this first approximation is enough. - // crbug.com/313454 - cpu_brand_.assign("ARM"); +#elif defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX)) + cpu_brand_.assign(CpuBrandInfo()); #endif } diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc index 4162af8..8d7b296 100644 --- a/chrome/app/chrome_main_delegate.cc +++ b/chrome/app/chrome_main_delegate.cc @@ -5,6 +5,7 @@ #include "chrome/app/chrome_main_delegate.h" #include "base/command_line.h" +#include "base/cpu.h" #include "base/files/file_path.h" #include "base/i18n/rtl.h" #include "base/lazy_instance.h" @@ -647,6 +648,11 @@ void ChromeMainDelegate::PreSandboxStartup() { #if defined(OS_WIN) child_process_logging::Init(); #endif +#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX)) + // Create an instance of the CPU class to parse /proc/cpuinfo and cache + // cpu_brand info. + base::CPU cpu_info; +#endif // Initialize the user data dir for any process type that needs it. if (chrome::ProcessNeedsProfileDir(process_type)) diff --git a/content/shell/app/shell_main_delegate.cc b/content/shell/app/shell_main_delegate.cc index eb6442e..3eecb83 100644 --- a/content/shell/app/shell_main_delegate.cc +++ b/content/shell/app/shell_main_delegate.cc @@ -6,6 +6,7 @@ #include "base/base_switches.h" #include "base/command_line.h" +#include "base/cpu.h" #include "base/files/file.h" #include "base/files/file_path.h" #include "base/lazy_instance.h" @@ -186,6 +187,11 @@ bool ShellMainDelegate::BasicStartupComplete(int* exit_code) { } void ShellMainDelegate::PreSandboxStartup() { +#if defined(ARCH_CPU_ARM_FAMILY) && (defined(OS_ANDROID) || defined(OS_LINUX)) + // Create an instance of the CPU class to parse /proc/cpuinfo and cache + // cpu_brand info. + base::CPU cpu_info; +#endif if (CommandLine::ForCurrentProcess()->HasSwitch( switches::kEnableCrashReporter)) { std::string process_type = |