diff options
author | Idan Horowitz <idan.horowitz@gmail.com> | 2022-01-11 20:58:08 +0200 |
---|---|---|
committer | Idan Horowitz <idan.horowitz@gmail.com> | 2022-01-12 16:09:09 +0200 |
commit | 809870d5190b5ec161cff82d2619dd3f9e643324 (patch) | |
tree | 5287fade81f306b4fa429aad066e8876c26a0e2a /Kernel/Arch | |
parent | b4ce1e2e62242279b312471f06d6ebc0a7f3ac0d (diff) | |
download | serenity-809870d5190b5ec161cff82d2619dd3f9e643324.zip |
Kernel: Convert ProcessorInfo to KString
Diffstat (limited to 'Kernel/Arch')
-rw-r--r-- | Kernel/Arch/x86/ProcessorInfo.h | 22 | ||||
-rw-r--r-- | Kernel/Arch/x86/common/ProcessorInfo.cpp | 107 |
2 files changed, 67 insertions, 62 deletions
diff --git a/Kernel/Arch/x86/ProcessorInfo.h b/Kernel/Arch/x86/ProcessorInfo.h index e6c3514aea..02c53e8a15 100644 --- a/Kernel/Arch/x86/ProcessorInfo.h +++ b/Kernel/Arch/x86/ProcessorInfo.h @@ -6,7 +6,6 @@ #pragma once -#include <AK/String.h> #include <AK/Types.h> #include <Kernel/KString.h> @@ -18,20 +17,23 @@ namespace Kernel { class Processor; class ProcessorInfo { - String m_cpuid; - String m_brand; + NonnullOwnPtr<KString> m_cpuid; + NonnullOwnPtr<KString> m_brand; NonnullOwnPtr<KString> m_features; - u32 m_display_model; - u32 m_display_family; - u32 m_stepping; - u32 m_type; - u32 m_apic_id; + u32 m_display_model { 0 }; + u32 m_display_family { 0 }; + u32 m_stepping { 0 }; + u32 m_type { 0 }; + u32 m_apic_id { 0 }; public: ProcessorInfo(Processor const& processor); - const String& cpuid() const { return m_cpuid; } - const String& brand() const { return m_brand; } + static NonnullOwnPtr<KString> query_processor_cpuid(); + static NonnullOwnPtr<KString> query_processor_brand(); + + StringView cpuid() const { return m_cpuid->view(); } + StringView brand() const { return m_brand->view(); } StringView features() const { return m_features->view(); } u32 display_model() const { return m_display_model; } u32 display_family() const { return m_display_family; } diff --git a/Kernel/Arch/x86/common/ProcessorInfo.cpp b/Kernel/Arch/x86/common/ProcessorInfo.cpp index 19fc973f74..ef5ebbed6a 100644 --- a/Kernel/Arch/x86/common/ProcessorInfo.cpp +++ b/Kernel/Arch/x86/common/ProcessorInfo.cpp @@ -13,63 +13,66 @@ namespace Kernel { ProcessorInfo::ProcessorInfo(Processor const& processor) - : m_features(processor.features_string()) + : m_cpuid(query_processor_cpuid()) + , m_brand(query_processor_brand()) + , m_features(processor.features_string()) { - u32 max_leaf; - { - CPUID cpuid(0); - StringBuilder builder; - auto emit_u32 = [&](u32 value) { - builder.appendff("{:c}{:c}{:c}{:c}", - value & 0xff, - (value >> 8) & 0xff, - (value >> 16) & 0xff, - (value >> 24) & 0xff); - }; - max_leaf = cpuid.eax(); - emit_u32(cpuid.ebx()); - emit_u32(cpuid.edx()); - emit_u32(cpuid.ecx()); - m_cpuid = builder.build(); - } - { - VERIFY(max_leaf >= 1); - CPUID cpuid(1); - m_stepping = cpuid.eax() & 0xf; - u32 model = (cpuid.eax() >> 4) & 0xf; - u32 family = (cpuid.eax() >> 8) & 0xf; - m_type = (cpuid.eax() >> 12) & 0x3; - u32 extended_model = (cpuid.eax() >> 16) & 0xf; - u32 extended_family = (cpuid.eax() >> 20) & 0xff; - if (family == 15) { - m_display_family = family + extended_family; - m_display_model = model + (extended_model << 4); - } else if (family == 6) { - m_display_family = family; - m_display_model = model + (extended_model << 4); - } else { - m_display_family = family; - m_display_model = model; - } + CPUID cpuid(1); + m_stepping = cpuid.eax() & 0xf; + u32 model = (cpuid.eax() >> 4) & 0xf; + u32 family = (cpuid.eax() >> 8) & 0xf; + m_type = (cpuid.eax() >> 12) & 0x3; + u32 extended_model = (cpuid.eax() >> 16) & 0xf; + u32 extended_family = (cpuid.eax() >> 20) & 0xff; + if (family == 15) { + m_display_family = family + extended_family; + m_display_model = model + (extended_model << 4); + } else if (family == 6) { + m_display_family = family; + m_display_model = model + (extended_model << 4); + } else { + m_display_family = family; + m_display_model = model; } +} + +NonnullOwnPtr<KString> ProcessorInfo::query_processor_cpuid() +{ + CPUID cpuid(0); + StringBuilder builder; + auto emit_u32 = [&](u32 value) { + builder.appendff("{:c}{:c}{:c}{:c}", + value & 0xff, + (value >> 8) & 0xff, + (value >> 16) & 0xff, + (value >> 24) & 0xff); + }; + emit_u32(cpuid.ebx()); + emit_u32(cpuid.edx()); + emit_u32(cpuid.ecx()); + return KString::must_create(builder.string_view()); +} +NonnullOwnPtr<KString> ProcessorInfo::query_processor_brand() +{ u32 max_extended_leaf = CPUID(0x80000000).eax(); - if (max_extended_leaf >= 0x80000004) { - alignas(u32) char buffer[48]; - u32* bufptr = reinterpret_cast<u32*>(buffer); - auto copy_brand_string_part_to_buffer = [&](u32 i) { - CPUID cpuid(0x80000002 + i); - *bufptr++ = cpuid.eax(); - *bufptr++ = cpuid.ebx(); - *bufptr++ = cpuid.ecx(); - *bufptr++ = cpuid.edx(); - }; - copy_brand_string_part_to_buffer(0); - copy_brand_string_part_to_buffer(1); - copy_brand_string_part_to_buffer(2); - m_brand = buffer; - } + if (max_extended_leaf < 0x80000004) + return KString::must_create({}); + + alignas(u32) char buffer[48]; + u32* bufptr = reinterpret_cast<u32*>(buffer); + auto copy_brand_string_part_to_buffer = [&](u32 i) { + CPUID cpuid(0x80000002 + i); + *bufptr++ = cpuid.eax(); + *bufptr++ = cpuid.ebx(); + *bufptr++ = cpuid.ecx(); + *bufptr++ = cpuid.edx(); + }; + copy_brand_string_part_to_buffer(0); + copy_brand_string_part_to_buffer(1); + copy_brand_string_part_to_buffer(2); + return KString::must_create(buffer); } } |