diff --git a/Userland/Utilities/CMakeLists.txt b/Userland/Utilities/CMakeLists.txt index c0708f289a..d9582b6eac 100644 --- a/Userland/Utilities/CMakeLists.txt +++ b/Userland/Utilities/CMakeLists.txt @@ -126,6 +126,7 @@ target_link_libraries(less LibMain) target_link_libraries(ln LibMain) target_link_libraries(logout LibMain) target_link_libraries(ls LibMain) +target_link_libraries(lscpu LibMain) target_link_libraries(lsirq LibMain) target_link_libraries(lsof LibMain) target_link_libraries(lspci LibPCIDB LibMain) diff --git a/Userland/Utilities/lscpu.cpp b/Userland/Utilities/lscpu.cpp new file mode 100644 index 0000000000..a8f69df42b --- /dev/null +++ b/Userland/Utilities/lscpu.cpp @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2022, Undefine . + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include +#include + +static void print_cpu_info(JsonObject const& value) +{ + outln("CPU {}:", value.get("processor").as_u32()); + outln("\tVendor ID: {}", value.get("cpuid").as_string()); + outln("\tModel: {}", value.get("brand").as_string()); + outln("\tFamily: {}", value.get("family").as_u32()); + outln("\tModel: {}", value.get("model").as_u32()); + outln("\tStepping: {}", value.get("stepping").as_u32()); + outln("\tType: {}", value.get("type").as_u32()); + out("\tFeatures: "); + + auto& features = value.get("features").as_array(); + + for (auto const& feature : features.values()) + out("{} ", feature.as_string()); + + outln(); +} + +ErrorOr serenity_main(Main::Arguments) +{ + TRY(Core::System::pledge("stdio rpath")); + + TRY(Core::System::unveil("/proc/cpuinfo", "r")); + TRY(Core::System::unveil(nullptr, nullptr)); + + auto file = TRY(Core::File::open("/proc/cpuinfo", Core::OpenMode::ReadOnly)); + auto json = TRY(JsonValue::from_string(file->read_all())); + auto& array = json.as_array(); + + for (size_t i = 0; i < array.size(); i++) { + print_cpu_info(array.at(i).as_object()); + if (i != array.size() - 1) + outln(); + } + + return 0; +}