1
0

Hardware.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #include "Hardware.h"
  2. #include <array>
  3. #include <vector>
  4. #include <bitset>
  5. #include <cstring>
  6. #ifdef __GNUC__
  7. #include <cpuid.h>
  8. #else
  9. #include <intrin.h>
  10. #endif
  11. using mnd::CpuInfo;
  12. CpuInfo::CpuInfo(void)
  13. {
  14. std::array<unsigned int, 4> dat;
  15. std::vector<std::array<unsigned int, 4>> cpuData;
  16. std::vector<std::array<unsigned int, 4>> extData;
  17. unsigned int nData;
  18. unsigned int nExtData;
  19. #ifdef __GNUC__
  20. __cpuid(0, dat[0], dat[1], dat[2], dat[3]);
  21. nData = dat[0];
  22. __cpuid(0x80000000, dat[0], dat[1], dat[2], dat[3]);
  23. nExtData = dat[0];
  24. #else
  25. __cpuid((int*) dat.data(), 0);
  26. nData = dat[0];
  27. __cpuid((int*) dat.data(), 0x80000000);
  28. nExtData = dat[0];
  29. #endif
  30. for (int i = 0; i <= nData; i++) {
  31. #ifdef __GNUC__
  32. __get_cpuid(i, &dat[0], &dat[1], &dat[2], &dat[3]);
  33. #else
  34. __cpuidex((int*) dat.data(), i, 0);
  35. #endif
  36. cpuData.push_back(dat);
  37. }
  38. for (int i = 0x80000000; i <= nExtData; i++) {
  39. #ifdef __GNUC__
  40. __get_cpuid(i, &dat[0], &dat[1], &dat[2], &dat[3]);
  41. #else
  42. __cpuidex((int*) dat.data(), i, 0);
  43. #endif
  44. extData.push_back(dat);
  45. }
  46. char vendor[32];
  47. memset(vendor, 0, sizeof vendor);
  48. *reinterpret_cast<int*>(vendor) = cpuData[0][1];
  49. *reinterpret_cast<int*>(vendor + 4) = cpuData[0][3];
  50. *reinterpret_cast<int*>(vendor + 8) = cpuData[0][2];
  51. this->vendor = vendor;
  52. char brand[64];
  53. memset(brand, 0, sizeof brand);
  54. if (nExtData >= 0x80000004) {
  55. memcpy(brand, extData[2].data(), sizeof(dat));
  56. memcpy(brand + 16, extData[3].data(), sizeof(dat));
  57. memcpy(brand + 32, extData[4].data(), sizeof(dat));
  58. this->brand = brand;
  59. // trim
  60. this->brand.erase(0, this->brand.find_first_not_of(" \n\r\t"));
  61. this->brand.erase(this->brand.find_last_not_of(" \n\r\t") + 1);
  62. }
  63. std::bitset<32> ecx1;
  64. std::bitset<32> edx1;
  65. if (nData >= 1) {
  66. ecx1 = cpuData[1][2];
  67. edx1 = cpuData[1][3];
  68. }
  69. avx = ecx1[28];
  70. sse2 = edx1[26];
  71. }