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 = 刘本嵩
# DO NOT modify the following code!!!
GITFLAGS = -q --author='tracer-ics2018 <tracer@njuics.org>' --no-verify --allow-empty
GITFLAGS = -q
# prototype: git_commit(msg)
define git_commit_origin
......
......@@ -7,6 +7,16 @@
#include <readline/readline.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);
/* We use the `readline' library to provide more flexibility to read from stdin. */
......@@ -116,7 +126,12 @@ void ui_mainloop(int is_batch_mode) {
int i;
for (i = 0; i < NR_CMD; i ++) {
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;
}
}
......@@ -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) {
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);
}
static int cmd_info(char *args) {
if("r"_rs != args) {
println("Error: only 'info r' is supported.");
return 1;
auto dumpMem(uint32_t begin_addr, uint64_t size) {
std::stringstream res;
res << std::hex;
for(uint64_t cter = 0; cter < size; cter += 4) {
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:");
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));
......@@ -149,6 +166,14 @@ static int cmd_info(char *args) {
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;
}
\ 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