1858d1aafSDhruvaraj Subhashchandran #include "sbe_consts.hpp"
2858d1aafSDhruvaraj Subhashchandran #include "sbe_dump_collector.hpp"
3858d1aafSDhruvaraj Subhashchandran
462881c53SDhruvaraj Subhashchandran #include <libphal.H>
562881c53SDhruvaraj Subhashchandran
6858d1aafSDhruvaraj Subhashchandran #include <CLI/App.hpp>
7858d1aafSDhruvaraj Subhashchandran #include <CLI/Config.hpp>
8858d1aafSDhruvaraj Subhashchandran #include <CLI/Formatter.hpp>
9858d1aafSDhruvaraj Subhashchandran
10858d1aafSDhruvaraj Subhashchandran #include <filesystem>
11858d1aafSDhruvaraj Subhashchandran #include <iostream>
12858d1aafSDhruvaraj Subhashchandran
main(int argc,char ** argv)13858d1aafSDhruvaraj Subhashchandran int main(int argc, char** argv)
14858d1aafSDhruvaraj Subhashchandran {
15858d1aafSDhruvaraj Subhashchandran using namespace openpower::dump::sbe_chipop;
16858d1aafSDhruvaraj Subhashchandran using std::filesystem::path;
17858d1aafSDhruvaraj Subhashchandran using namespace openpower::dump::SBE;
1862881c53SDhruvaraj Subhashchandran using namespace openpower::phal::dump;
19858d1aafSDhruvaraj Subhashchandran
20858d1aafSDhruvaraj Subhashchandran CLI::App app{"Dump Collector Application", "dump-collect"};
21858d1aafSDhruvaraj Subhashchandran app.description(
22858d1aafSDhruvaraj Subhashchandran "Collects dumps from the Self Boot Engine (SBE) based on "
23858d1aafSDhruvaraj Subhashchandran "provided parameters.\nSupports different types of dumps and requires "
24858d1aafSDhruvaraj Subhashchandran "specific options based on the dump type.");
25858d1aafSDhruvaraj Subhashchandran
26858d1aafSDhruvaraj Subhashchandran int type = 0;
27858d1aafSDhruvaraj Subhashchandran uint32_t id;
28858d1aafSDhruvaraj Subhashchandran std::string pathStr;
29858d1aafSDhruvaraj Subhashchandran std::optional<uint64_t> failingUnit;
30858d1aafSDhruvaraj Subhashchandran
31858d1aafSDhruvaraj Subhashchandran app.add_option("--type, -t", type, "Type of the dump")
32858d1aafSDhruvaraj Subhashchandran ->required()
33*540521edSPatrick Williams ->check(CLI::IsMember(
34*540521edSPatrick Williams {SBE_DUMP_TYPE_HARDWARE, SBE_DUMP_TYPE_HOSTBOOT, SBE_DUMP_TYPE_SBE,
35*540521edSPatrick Williams SBE_DUMP_TYPE_PERFORMANCE, SBE_DUMP_TYPE_MSBE}));
36858d1aafSDhruvaraj Subhashchandran
37858d1aafSDhruvaraj Subhashchandran app.add_option("--id, -i", id, "ID of the dump")->required();
38858d1aafSDhruvaraj Subhashchandran
39858d1aafSDhruvaraj Subhashchandran app.add_option("--path, -p", pathStr,
40858d1aafSDhruvaraj Subhashchandran "Path to store the collected dump files")
41858d1aafSDhruvaraj Subhashchandran ->required();
42858d1aafSDhruvaraj Subhashchandran
43858d1aafSDhruvaraj Subhashchandran app.add_option("--failingunit, -f", failingUnit, "ID of the failing unit");
44858d1aafSDhruvaraj Subhashchandran
45858d1aafSDhruvaraj Subhashchandran try
46858d1aafSDhruvaraj Subhashchandran {
47858d1aafSDhruvaraj Subhashchandran CLI11_PARSE(app, argc, argv);
48858d1aafSDhruvaraj Subhashchandran }
49858d1aafSDhruvaraj Subhashchandran catch (const CLI::ParseError& e)
50858d1aafSDhruvaraj Subhashchandran {
51858d1aafSDhruvaraj Subhashchandran return app.exit(e);
52858d1aafSDhruvaraj Subhashchandran }
53858d1aafSDhruvaraj Subhashchandran
546f1be979SDhruvaraj Subhashchandran if (((type == SBE_DUMP_TYPE_HARDWARE) || (type == SBE_DUMP_TYPE_SBE) ||
556f1be979SDhruvaraj Subhashchandran (type == SBE_DUMP_TYPE_MSBE)) &&
5662881c53SDhruvaraj Subhashchandran !failingUnit.has_value())
57858d1aafSDhruvaraj Subhashchandran {
5862881c53SDhruvaraj Subhashchandran std::cerr
5962881c53SDhruvaraj Subhashchandran << "Failing unit ID is required for Hardware and SBE type dumps\n";
60858d1aafSDhruvaraj Subhashchandran return EXIT_FAILURE;
61858d1aafSDhruvaraj Subhashchandran }
62858d1aafSDhruvaraj Subhashchandran
63858d1aafSDhruvaraj Subhashchandran // Directory creation should happen here, after successful parsing
64858d1aafSDhruvaraj Subhashchandran std::filesystem::path dirPath{pathStr};
65858d1aafSDhruvaraj Subhashchandran if (!std::filesystem::exists(dirPath))
66858d1aafSDhruvaraj Subhashchandran {
67858d1aafSDhruvaraj Subhashchandran std::filesystem::create_directories(dirPath);
68858d1aafSDhruvaraj Subhashchandran }
69858d1aafSDhruvaraj Subhashchandran
70858d1aafSDhruvaraj Subhashchandran SbeDumpCollector dumpCollector;
71858d1aafSDhruvaraj Subhashchandran
72858d1aafSDhruvaraj Subhashchandran auto failingUnitId = 0xFFFFFF; // Default or unspecified value
73858d1aafSDhruvaraj Subhashchandran if (failingUnit.has_value())
74858d1aafSDhruvaraj Subhashchandran {
75858d1aafSDhruvaraj Subhashchandran failingUnitId = failingUnit.value();
76858d1aafSDhruvaraj Subhashchandran }
77858d1aafSDhruvaraj Subhashchandran
78858d1aafSDhruvaraj Subhashchandran try
79858d1aafSDhruvaraj Subhashchandran {
806f1be979SDhruvaraj Subhashchandran if ((type == SBE_DUMP_TYPE_SBE) || (type == SBE_DUMP_TYPE_MSBE))
8162881c53SDhruvaraj Subhashchandran {
8262881c53SDhruvaraj Subhashchandran collectSBEDump(id, failingUnitId, pathStr, type);
8362881c53SDhruvaraj Subhashchandran }
8462881c53SDhruvaraj Subhashchandran else
8562881c53SDhruvaraj Subhashchandran {
86858d1aafSDhruvaraj Subhashchandran dumpCollector.collectDump(type, id, failingUnitId, pathStr);
87858d1aafSDhruvaraj Subhashchandran }
8862881c53SDhruvaraj Subhashchandran }
89858d1aafSDhruvaraj Subhashchandran catch (const std::exception& e)
90858d1aafSDhruvaraj Subhashchandran {
91858d1aafSDhruvaraj Subhashchandran std::cerr << "Failed to collect dump: " << e.what() << std::endl;
92858d1aafSDhruvaraj Subhashchandran std::exit(EXIT_FAILURE);
93858d1aafSDhruvaraj Subhashchandran }
94858d1aafSDhruvaraj Subhashchandran
95858d1aafSDhruvaraj Subhashchandran return 0;
96858d1aafSDhruvaraj Subhashchandran }
97