summaryrefslogtreecommitdiffstats
path: root/base/cpu.cc
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 /base/cpu.cc
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
Diffstat (limited to 'base/cpu.cc')
-rw-r--r--base/cpu.cc57
1 files changed, 50 insertions, 7 deletions
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
}