summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorputtaraju.r@samsung.com <puttaraju.r@samsung.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-28 15:33:26 +0000
committerputtaraju.r@samsung.com <puttaraju.r@samsung.com@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-28 15:33:26 +0000
commit3a23f63c2ae4f56bae97806eb7f8759a8e2895a6 (patch)
tree9d36cc9534e3e5b8189b13ed919f8bd18b95ae58
parent146eae3d95239b048fc4f1e778f43e0f59be9b96 (diff)
downloadchromium_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.cc6
-rw-r--r--base/cpu.cc57
-rw-r--r--chrome/app/chrome_main_delegate.cc6
-rw-r--r--content/shell/app/shell_main_delegate.cc6
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 =