diff --git a/Tests/Kernels/ProcessorTests/Kernel.cs b/Tests/Kernels/ProcessorTests/Kernel.cs
index 93f9588cc..9ef432177 100644
--- a/Tests/Kernels/ProcessorTests/Kernel.cs
+++ b/Tests/Kernels/ProcessorTests/Kernel.cs
@@ -36,6 +36,14 @@ namespace ProcessorTests
}
}
+ public void TestBrandStringBlank()
+ {
+ string brandString = CPU.GetCPUBrandString();
+ mDebugger.Send("Brand String: " + brandString);
+ bool isBrandStringBlank = string.IsNullOrWhiteSpace(brandString);
+ Assert.IsFalse(isBrandStringBlank, "Processor brand string is blank.");
+ }
+
public void TestVendorNameIsNotBlank()
{
string vendorName = CPU.GetCPUVendorName();
diff --git a/source/Cosmos.Core/CPU.cs b/source/Cosmos.Core/CPU.cs
index cda877076..a2618bcf7 100644
--- a/source/Cosmos.Core/CPU.cs
+++ b/source/Cosmos.Core/CPU.cs
@@ -110,6 +110,8 @@ namespace Cosmos.Core
return xResult;
}
+
+
///
/// Get CPU vendor name.
///
@@ -179,15 +181,15 @@ namespace Cosmos.Core
{
ReadCPUID(0x80000002 + i, ref eax, ref ebx, ref ecx, ref edx);
s += (char)(ebx % 256);
- s += (char)((ebx >> 8) % 256);
- s += (char)((ebx>> 16) % 256);
- s += (char)((ebx >> 24) % 256);
+ s += (char)((ebx >> 8) % 256);
+ s += (char)((ebx >> 16) % 256);
+ s += (char)((ebx >> 24) % 256);
s += (char)(edx % 256);
- s += (char)((edx >> 8) % 256);
- s += (char)((edx >> 16) % 256);
- s += (char)((edx >> 24) % 256);
+ s += (char)((edx >> 8) % 256);
+ s += (char)((edx >> 16) % 256);
+ s += (char)((edx >> 24) % 256);
s += (char)(ecx % 256);
- s += (char)((ecx >> 8) % 256);
+ s += (char)((ecx >> 8) % 256);
s += (char)((ecx >> 16) % 256);
s += (char)((ecx >> 24) % 256);
}
@@ -247,6 +249,67 @@ namespace Cosmos.Core
throw new NotSupportedException();
}
+ ///
+ /// Get CPU cycle speed.
+ ///
+ /// long value.
+ /// Thrown on fatal error, contact support.
+ /// Thrown if can not read CPU ID.
+ public static string GetCPUBrandString()
+ {
+ if (CanReadCPUID() != 0)
+ {
+ // See https://c9x.me/x86/html/file_module_x86_id_45.html
+
+ int eax = 0;
+ int ebx = 0;
+ int ecx = 0;
+ int edx = 0;
+ int[] s = new int[64];
+ string rs = "";
+
+ for (uint i = 0; i < 3; i++)
+ {
+ ReadCPUID(0x80000002 + i, ref eax, ref ebx, ref ecx, ref edx);
+ s[(i * 16) + 0] = (eax % 256);
+ s[(i * 16) + 1] = ((eax >> 8) % 256);
+ s[(i * 16) + 2] = ((eax >> 16) % 256);
+ s[(i * 16) + 3] = ((eax >> 24) % 256);
+ s[(i * 16) + 4] = (ebx % 256);
+ s[(i * 16) + 5] = ((ebx >> 8) % 256);
+ s[(i * 16) + 6] = ((ebx >> 16) % 256);
+ s[(i * 16) + 7] = ((ebx >> 24) % 256);
+ s[(i * 16) + 8] = (ecx % 256);
+ s[(i * 16) + 9] = ((ecx >> 8) % 256);
+ s[(i * 16) + 10] = ((ecx >> 16) % 256);
+ s[(i * 16) + 11] = ((ecx >> 24) % 256);
+ s[(i * 16) + 12] = (edx % 256);
+ s[(i * 16) + 13] = ((edx >> 8) % 256);
+ s[(i * 16) + 14] = ((edx >> 16) % 256);
+ s[(i * 16) + 15] = ((edx >> 24) % 256);
+ }
+ for (int i = 0; i < s.Length; i++)
+ {
+ if (s[i] == 0x00)
+ {
+ continue;
+ }
+ rs += (char)s[i];
+ }
+
+ if (!(rs == ""))
+ {
+ return rs;
+ } else
+ {
+ throw new NotSupportedException();
+ }
+ }
+ throw new NotSupportedException();
+ }
+
+
+
///
/// Check if can read CPU ID. Plugged.
///