summaryrefslogtreecommitdiff
path: root/Kernel/FileSystem/ProcFS.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel/FileSystem/ProcFS.cpp')
-rw-r--r--Kernel/FileSystem/ProcFS.cpp78
1 files changed, 21 insertions, 57 deletions
diff --git a/Kernel/FileSystem/ProcFS.cpp b/Kernel/FileSystem/ProcFS.cpp
index c06795aab5..1b46072390 100644
--- a/Kernel/FileSystem/ProcFS.cpp
+++ b/Kernel/FileSystem/ProcFS.cpp
@@ -29,6 +29,7 @@
#include <AK/JsonObjectSerializer.h>
#include <AK/JsonValue.h>
#include <Kernel/Arch/i386/CPU.h>
+#include <Kernel/Arch/i386/ProcessorInfo.h>
#include <Kernel/CommandLine.h>
#include <Kernel/Console.h>
#include <Kernel/Devices/BlockDevice.h>
@@ -758,63 +759,26 @@ Optional<KBuffer> procfs$df(InodeIdentifier)
Optional<KBuffer> procfs$cpuinfo(InodeIdentifier)
{
KBufferBuilder builder;
- {
- CPUID cpuid(0);
- builder.appendf("cpuid: ");
- auto emit_u32 = [&](u32 value) {
- builder.appendf("%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());
- builder.appendf("\n");
- }
- {
- CPUID cpuid(1);
- u32 stepping = cpuid.eax() & 0xf;
- u32 model = (cpuid.eax() >> 4) & 0xf;
- u32 family = (cpuid.eax() >> 8) & 0xf;
- u32 type = (cpuid.eax() >> 12) & 0x3;
- u32 extended_model = (cpuid.eax() >> 16) & 0xf;
- u32 extended_family = (cpuid.eax() >> 20) & 0xff;
- u32 display_model;
- u32 display_family;
- if (family == 15) {
- display_family = family + extended_family;
- display_model = model + (extended_model << 4);
- } else if (family == 6) {
- display_family = family;
- display_model = model + (extended_model << 4);
- } else {
- display_family = family;
- display_model = model;
- }
- builder.appendf("family: %u\n", display_family);
- builder.appendf("model: %u\n", display_model);
- builder.appendf("stepping: %u\n", stepping);
- builder.appendf("type: %u\n", type);
- }
- {
- // FIXME: Check first that this is supported by calling CPUID with eax=0x80000000
- // and verifying that the returned eax>=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);
- builder.appendf("brandstr: \"%s\"\n", buffer);
- }
+ bool first = true;
+
+ Processor::for_each(
+ [&](Processor& proc) -> IterationDecision
+ {
+ if (first)
+ first = false;
+ else
+ builder.append('\n');
+
+ auto& info = proc.info();
+ builder.appendf("processor: %u\n", proc.id());
+ builder.appendf("cpuid: %s\n", info.cpuid().characters());
+ builder.appendf("family: %u\n", info.display_family());
+ builder.appendf("model: %u\n", info.display_model());
+ builder.appendf("stepping: %u\n", info.stepping());
+ builder.appendf("type: %u\n", info.type());
+ builder.appendf("brandstr: \"%s\"\n", info.brandstr().characters());
+ return IterationDecision::Continue;
+ });
return builder.build();
}