Skip to content
Snippets Groups Projects
Verified Commit 5d2ab63a authored by Recolic Keghart's avatar Recolic Keghart
Browse files

> Manual commit: Fix silly makefile.git again. 'x' cmd done. Finishing pa1.

U201614531
recolic
Linux RECOLICPC 5.4.2-arch1-1 #1 SMP PREEMPT Thu, 05 Dec 2019 12:29:40 +0000 x86_64 GNU/Linux
 14:42:59 up 2 days, 22:01,  1 user,  load average: 0.88, 1.45, 1.51
674808a51506e2705694dac9fc217f1c65d0b40b
parent 2744c8fd
No related branches found
No related tags found
No related merge requests found
...@@ -3,7 +3,7 @@ STUNAME = 刘本嵩 ...@@ -3,7 +3,7 @@ STUNAME = 刘本嵩
# DO NOT modify the following code!!! # DO NOT modify the following code!!!
GITFLAGS = -q --author='tracer-ics2018 <tracer@njuics.org>' --no-verify --allow-empty GITFLAGS = -q
# prototype: git_commit(msg) # prototype: git_commit(msg)
define git_commit_origin define git_commit_origin
......
...@@ -7,6 +7,16 @@ ...@@ -7,6 +7,16 @@
#include <readline/readline.h> #include <readline/readline.h>
#include <readline/history.h> #include <readline/history.h>
#include <stdexcept>
#include <rlib/stdio.hpp>
using namespace rlib::literals;
using rlib::println;
using rlib::printfln;
using rlib::string;
#include <sstream>
#include <iomanip>
void cpu_exec(uint64_t); void cpu_exec(uint64_t);
/* We use the `readline' library to provide more flexibility to read from stdin. */ /* We use the `readline' library to provide more flexibility to read from stdin. */
...@@ -116,7 +126,12 @@ void ui_mainloop(int is_batch_mode) { ...@@ -116,7 +126,12 @@ void ui_mainloop(int is_batch_mode) {
int i; int i;
for (i = 0; i < NR_CMD; i ++) { for (i = 0; i < NR_CMD; i ++) {
if (strcmp(cmd, cmd_table[i].name) == 0) { if (strcmp(cmd, cmd_table[i].name) == 0) {
if (cmd_table[i].handler(args) < 0) { return; } try {
if (cmd_table[i].handler(args) < 0) { return; }
}
catch(std::exception &e) {
println("Exception caught:", e.what());
}
break; break;
} }
} }
...@@ -125,23 +140,25 @@ void ui_mainloop(int is_batch_mode) { ...@@ -125,23 +140,25 @@ void ui_mainloop(int is_batch_mode) {
} }
} }
#include <stdexcept>
#include <rlib/stdio.hpp>
using namespace rlib;
using namespace rlib::literals;
#include <sstream>
#include <iomanip>
auto dumpReg(uint32_t val) { auto dumpReg(uint32_t val) {
return string("{}{}[32b=0x{}{}, {}L16b=0x{}{}]").format(std::setfill('0'), std::setw(8), std::hex, val, std::setw(4), (uint16_t)val, std::dec); return string("{}{}[32b=0x{}{}, {}L16b=0x{}]").format(std::setfill('0'), std::setw(8), std::hex, val, std::setw(4), (uint16_t)val);
} }
auto dumpMem(uint32_t begin_addr, uint64_t size) {
static int cmd_info(char *args) { std::stringstream res;
if("r"_rs != args) { res << std::hex;
println("Error: only 'info r' is supported."); for(uint64_t cter = 0; cter < size; cter += 4) {
return 1; if(cter % 32 == 0) {
res << '\n';
res << "0x" << std::setfill('0') << std::setw(8) << begin_addr + cter << ": ";
}
res << std::setfill('0') << std::setw(8) << vaddr_read(begin_addr + cter, 4) << ' ';
} }
return res.str();
}
static int cmd_info(char *_args) {
if(_args == NULL || "r"_rs != string(_args).strip())
throw std::runtime_error("Error: only 'info r' is supported.");
println("Registers:"); println("Registers:");
printfln("%eax={}, %ebx={}, %ecx={}, %edx={}", dumpReg(cpu.eax), dumpReg(cpu.ebx), dumpReg(cpu.ecx), dumpReg(cpu.edx)); printfln("%eax={}, %ebx={}, %ecx={}, %edx={}", dumpReg(cpu.eax), dumpReg(cpu.ebx), dumpReg(cpu.ecx), dumpReg(cpu.edx));
printfln("%esp={}, %ebp={}, %esi={}, %edi={}", dumpReg(cpu.esp), dumpReg(cpu.ebp), dumpReg(cpu.esi), dumpReg(cpu.edi)); printfln("%esp={}, %ebp={}, %esi={}, %edi={}", dumpReg(cpu.esp), dumpReg(cpu.ebp), dumpReg(cpu.esi), dumpReg(cpu.edi));
...@@ -149,6 +166,14 @@ static int cmd_info(char *args) { ...@@ -149,6 +166,14 @@ static int cmd_info(char *args) {
return 0; return 0;
} }
static int cmd_x(char *args) { static int cmd_x(char *_args) {
if(_args == NULL)
throw std::runtime_error("Usage: x <size> <startAddr>");
auto args = string(_args).strip().split();
if(args.size() != 2)
throw std::runtime_error("Usage: x <size> <startAddr>");
printfln("Dumping {}{} bytes from {}{}{}:{}", std::dec, args[0], std::hex, args[1], std::dec, dumpMem(std::stoull(args[1], 0, 16), args[0].as<uint64_t>()));
return 0; return 0;
} }
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment