QueryData genCPUID(QueryContext& context) { QueryData results; if (!genVendorString(results).ok()) { return results; } // Get the CPU meta-data about the model, stepping, family. genFamily(results); int regs[4] = {-1}; int feature_register, feature_bit; for (auto& feature_set : kCPUFeatures) { int eax = feature_set.first; cpuid(eax, 0, regs); for (auto& feature : feature_set.second) { Row r; r["feature"] = feature.first; // Get the return register holding the feature bit. feature_register = 0; if (feature.second.first == "edx") { feature_register = 3; } else if (feature.second.first == "ebx") { feature_register = 1; } else if (feature.second.first == "ecx") { feature_register = 2; } feature_bit = feature.second.second; r["value"] = isBitSet(feature_bit, regs[feature_register]) ? "1" : "0"; r["output_register"] = feature.second.first; r["output_bit"] = INTEGER(feature_bit); r["input_eax"] = boost::lexical_cast<std::string>(eax); results.push_back(r); } } return results; }
QueryData genCPUID(QueryContext& context) { QueryData results; if (!genStrings(results).ok()) { return results; } // Get the CPU meta-data about the model, stepping, family. genFamily(results); int regs[4] = {-1}; for (const auto& feature_set : kCPUFeatures) { auto eax = feature_set.first; cpuid(eax, 0, regs); for (const auto& feature : feature_set.second) { Row r; r["feature"] = feature.first; // Get the return register holding the feature bit. auto feature_register = 0; if (feature.second.first == "edx") { feature_register = 3; } else if (feature.second.first == "ebx") { feature_register = 1; } else if (feature.second.first == "ecx") { feature_register = 2; } auto feature_bit = feature.second.second; r["value"] = isBitSet(feature_bit, regs[feature_register]) ? "1" : "0"; r["output_register"] = feature.second.first; r["output_bit"] = INTEGER(feature_bit); r["input_eax"] = std::to_string(eax); results.push_back(r); } } { Row r; r["output_register"] = "eax,ebx,ecx,edx"; r["output_bit"] = INTEGER(0); cpuid(0x12, 0, regs); std::stringstream sgx0; sgx0 << std::hex << std::setw(8) << std::setfill('0') << static_cast<int>(regs[0]); sgx0 << std::hex << std::setw(8) << std::setfill('0') << static_cast<int>(regs[1]); sgx0 << std::hex << std::setw(8) << std::setfill('0') << static_cast<int>(regs[2]); sgx0 << std::hex << std::setw(8) << std::setfill('0') << static_cast<int>(regs[3]); r["feature"] = "sgx0"; r["value"] = sgx0.str(); r["input_eax"] = std::to_string(0x12); results.push_back(r); cpuid(0x12, 1, regs); std::stringstream sgx1; sgx1 << std::hex << std::setw(8) << std::setfill('0') << static_cast<int>(regs[0]); sgx1 << std::hex << std::setw(8) << std::setfill('0') << static_cast<int>(regs[1]); sgx1 << std::hex << std::setw(8) << std::setfill('0') << static_cast<int>(regs[2]); sgx1 << std::hex << std::setw(8) << std::setfill('0') << static_cast<int>(regs[3]); r["feature"] = "sgx1"; r["value"] = sgx1.str(); r["input_eax"] = std::to_string(0x12) + ",1"; results.push_back(r); } return results; }