The Pedigree Project 0.1
ModulesCommand.cc
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY,
15 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include "pedigree/kernel/debugger/commands/ModulesCommand.h"
20#include "pedigree/kernel/linker/KernelElf.h"
21
22namespace {
23const char* statusName(Module::ModuleStatus status) {
24 switch (status) {
25 case Module::Preloaded:
26 return "pending";
27 case Module::Executing:
28 return "executing";
29 case Module::Active:
30 return "active";
31 case Module::Failed:
32 return "failed";
33 case Module::Unloading:
34 return "unloading";
35 case Module::Unloaded:
36 return "unloaded";
37 case Module::Unknown:
38 return "unknown";
39 }
40 return "unknown";
41}
42
43void drawFooter(DebuggerIO* screen) {
44 NormalStaticString footer("j: up k: down backspace: page up space: page down q: quit");
45 footer.truncate(screen->getWidth());
46 screen->drawString(footer, screen->getHeight() - 1, 0, DebuggerIO::White, DebuggerIO::Green);
47}
48} // namespace
49
50ModulesCommand::ModulesCommand() : DebuggerCommand(), Scrollable(), m_Line() {}
51
52ModulesCommand::~ModulesCommand() {}
53
55
57 InterruptState& state, DebuggerIO* screen) {
58 screen->disableCli();
59 move(0, 1);
60 resize(screen->getWidth(), screen->getHeight() - 2);
61 setScrollKeys('j', 'k');
62
63 screen->drawHorizontalLine(' ', 0, 0, screen->getWidth() - 1, DebuggerIO::White,
64 DebuggerIO::Green);
65 screen->drawString("Pedigree debugger - Modules", 0, 0, DebuggerIO::White, DebuggerIO::Green);
66 screen->drawHorizontalLine(' ', screen->getHeight() - 1, 0, screen->getWidth() - 1,
67 DebuggerIO::White, DebuggerIO::Green);
68 drawFooter(screen);
69
70 bool stop = false;
71 while (!stop) {
72 refresh(screen);
73 char c = 0;
74 while (!(c = screen->getChar()))
75 ;
76
77 if (c == 'j')
78 scroll(-1);
79 else if (c == 'k')
80 scroll(1);
81 else if (c == ' ')
82 scroll(static_cast<ssize_t>(height()));
83 else if (c == 0x08)
84 scroll(-static_cast<ssize_t>(height()));
85 else if (c == 'q')
86 stop = true;
87 }
88
89 screen->drawString(" ", 1, 0, DebuggerIO::White, DebuggerIO::Black);
90 screen->enableCli();
91 return true;
92}
93
97
98const char* ModulesCommand::getLine1(size_t index, DebuggerIO::Colour& colour,
99 DebuggerIO::Colour& bgColour) {
100 const Module* module = KernelElf::instance().getModule(index);
101 m_Line.clear();
102 if (!module) {
103 return nullptr;
104 }
105
106 m_Line += "[";
107 m_Line += statusName(module->status);
108 m_Line += "] ";
109 m_Line += module->name;
110 m_Line += " ";
111 m_Line.append(module->loadBase, 16);
112 m_Line += "-";
113 m_Line.append(module->loadBase + module->loadSize, 16);
114 m_Line += " ";
115 m_Line += module->unloadable ? "unloadable" : "pinned";
116 if (!module->runtimeUnloadable) {
117 m_Line += ", runtime-pinned";
118 }
119
120 colour = module->isFailed() ? DebuggerIO::LightRed : DebuggerIO::White;
121 bgColour = DebuggerIO::Black;
122 return m_Line;
123}
124
125const char* ModulesCommand::getLine2(size_t index, size_t& colOffset, DebuggerIO::Colour& colour,
126 DebuggerIO::Colour& bgColour) {
127 colOffset = 0;
128 colour = DebuggerIO::Black;
129 bgColour = DebuggerIO::Black;
130 return "";
131}
132
133size_t ModulesCommand::getLineCount() {
135}
virtual void enableCli()=0
virtual void drawString(const char *str, size_t row, size_t col, Colour foreColour, Colour backColour)=0
virtual size_t getWidth()=0
virtual void drawHorizontalLine(char c, size_t row, size_t colStart, size_t colEnd, Colour foreColour, Colour backColour)=0
virtual char getChar()=0
static KernelElf & instance()
Definition KernelElf.h:135
size_t getModuleCount()
const NormalStaticString getString()
void autocomplete(const HugeStaticString &input, HugeStaticString &output)
bool execute(const HugeStaticString &input, HugeStaticString &output, InterruptState &state, DebuggerIO *screen)