diff options
author | Andrew Kaster <akaster@serenityos.org> | 2021-10-17 19:10:47 -0600 |
---|---|---|
committer | Brian Gianforcaro <b.gianfo@gmail.com> | 2021-10-21 19:20:03 -0700 |
commit | 259ef765043caff5bbc1234c7b97270526bbb452 (patch) | |
tree | 0bf972c7d1c872eeae533c107a58d4d5dea37614 /Userland/Utilities/fdtdump.cpp | |
parent | 644928314a4f33ed37d9998f44f9b4a2776aaec8 (diff) | |
download | serenity-259ef765043caff5bbc1234c7b97270526bbb452.zip |
Utilities: Add fdtdump for dumping OpenFirmware Device Trees
Use the new LibDeviceTree to dump the contents of the device tree blob
(Flattened Device Tree) file passed on the command line.
Diffstat (limited to 'Userland/Utilities/fdtdump.cpp')
-rw-r--r-- | Userland/Utilities/fdtdump.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/Userland/Utilities/fdtdump.cpp b/Userland/Utilities/fdtdump.cpp new file mode 100644 index 0000000000..bc59de5543 --- /dev/null +++ b/Userland/Utilities/fdtdump.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2021, Andrew Kaster <akaster@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include <AK/MappedFile.h> +#include <AK/String.h> +#include <LibCore/ArgsParser.h> +#include <LibDeviceTree/Validation.h> +#include <serenity.h> + +int main(int argc, char* argv[]) +{ + if (pledge("stdio rpath", nullptr) < 0) { + perror("pledge"); + return 1; + } + + String filename; + + Core::ArgsParser args; + args.add_positional_argument(filename, "File to process", "file", Core::ArgsParser::Required::Yes); + args.parse(argc, argv); + + // FIXME: Figure out how to do this sanely from stdin + auto maybe_file = MappedFile::map(filename); + if (maybe_file.is_error()) { + warnln("Unable to dump device tree from file {}: {}", filename, maybe_file.error().string()); + return 1; + } + auto file = maybe_file.release_value(); + + if (file->size() < sizeof(DeviceTree::FlattenedDeviceTreeHeader)) { + warnln("Not enough data in {} to contain a device tree header!", filename); + return 1; + } + + auto* fdt_header = reinterpret_cast<DeviceTree::FlattenedDeviceTreeHeader const*>(file->data()); + + bool valid = DeviceTree::dump(*fdt_header, static_cast<u8 const*>(file->data()), file->size()); + + return valid ? 0 : 1; +} |