1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "instruction_set_features_mips64.h"
18 
19 #include <fstream>
20 #include <sstream>
21 
22 #include "base/stringprintf.h"
23 #include "utils.h"  // For Trim.
24 
25 namespace art {
26 
FromVariant(const std::string & variant,std::string * error_msg ATTRIBUTE_UNUSED)27 const Mips64InstructionSetFeatures* Mips64InstructionSetFeatures::FromVariant(
28     const std::string& variant, std::string* error_msg ATTRIBUTE_UNUSED) {
29   if (variant != "default" && variant != "mips64r6") {
30     LOG(WARNING) << "Unexpected CPU variant for Mips64 using defaults: " << variant;
31   }
32   bool smp = true;  // Conservative default.
33   return new Mips64InstructionSetFeatures(smp);
34 }
35 
FromBitmap(uint32_t bitmap)36 const Mips64InstructionSetFeatures* Mips64InstructionSetFeatures::FromBitmap(uint32_t bitmap) {
37   bool smp = (bitmap & kSmpBitfield) != 0;
38   return new Mips64InstructionSetFeatures(smp);
39 }
40 
FromCppDefines()41 const Mips64InstructionSetFeatures* Mips64InstructionSetFeatures::FromCppDefines() {
42   const bool smp = true;
43 
44   return new Mips64InstructionSetFeatures(smp);
45 }
46 
FromCpuInfo()47 const Mips64InstructionSetFeatures* Mips64InstructionSetFeatures::FromCpuInfo() {
48   // Look in /proc/cpuinfo for features we need.  Only use this when we can guarantee that
49   // the kernel puts the appropriate feature flags in here.  Sometimes it doesn't.
50   bool smp = false;
51 
52   std::ifstream in("/proc/cpuinfo");
53   if (!in.fail()) {
54     while (!in.eof()) {
55       std::string line;
56       std::getline(in, line);
57       if (!in.eof()) {
58         LOG(INFO) << "cpuinfo line: " << line;
59         if (line.find("processor") != std::string::npos && line.find(": 1") != std::string::npos) {
60           smp = true;
61         }
62       }
63     }
64     in.close();
65   } else {
66     LOG(ERROR) << "Failed to open /proc/cpuinfo";
67   }
68   return new Mips64InstructionSetFeatures(smp);
69 }
70 
FromHwcap()71 const Mips64InstructionSetFeatures* Mips64InstructionSetFeatures::FromHwcap() {
72   UNIMPLEMENTED(WARNING);
73   return FromCppDefines();
74 }
75 
FromAssembly()76 const Mips64InstructionSetFeatures* Mips64InstructionSetFeatures::FromAssembly() {
77   UNIMPLEMENTED(WARNING);
78   return FromCppDefines();
79 }
80 
Equals(const InstructionSetFeatures * other) const81 bool Mips64InstructionSetFeatures::Equals(const InstructionSetFeatures* other) const {
82   if (kMips64 != other->GetInstructionSet()) {
83     return false;
84   }
85   return (IsSmp() == other->IsSmp());
86 }
87 
AsBitmap() const88 uint32_t Mips64InstructionSetFeatures::AsBitmap() const {
89   return (IsSmp() ? kSmpBitfield : 0);
90 }
91 
GetFeatureString() const92 std::string Mips64InstructionSetFeatures::GetFeatureString() const {
93   std::string result;
94   if (IsSmp()) {
95     result += "smp";
96   } else {
97     result += "-smp";
98   }
99   return result;
100 }
101 
AddFeaturesFromSplitString(const bool smp,const std::vector<std::string> & features,std::string * error_msg) const102 const InstructionSetFeatures* Mips64InstructionSetFeatures::AddFeaturesFromSplitString(
103     const bool smp, const std::vector<std::string>& features, std::string* error_msg) const {
104   auto i = features.begin();
105   if (i != features.end()) {
106     // We don't have any features.
107     std::string feature = Trim(*i);
108     *error_msg = StringPrintf("Unknown instruction set feature: '%s'", feature.c_str());
109     return nullptr;
110   }
111   return new Mips64InstructionSetFeatures(smp);
112 }
113 
114 }  // namespace art
115