mirror of
https://github.com/dingusdev/dingusppc.git
synced 2024-12-22 15:29:58 +00:00
debugger: some fixes and improvements.
This commit is contained in:
parent
2bac606365
commit
d8f7588693
@ -563,7 +563,6 @@ extern void ppc_exec_until(uint32_t goal_addr);
|
|||||||
extern void ppc_exec_dbg(uint32_t start_addr, uint32_t size);
|
extern void ppc_exec_dbg(uint32_t start_addr, uint32_t size);
|
||||||
|
|
||||||
/* debugging support API */
|
/* debugging support API */
|
||||||
void print_gprs(void); /* print content of the general purpose registers */
|
|
||||||
void print_fprs(void); /* print content of the floating-point registers */
|
void print_fprs(void); /* print content of the floating-point registers */
|
||||||
uint64_t get_reg(std::string& reg_name); /* get content of the register reg_name */
|
uint64_t get_reg(std::string& reg_name); /* get content of the register reg_name */
|
||||||
void set_reg(std::string& reg_name, uint64_t val); /* set reg_name to val */
|
void set_reg(std::string& reg_name, uint64_t val); /* set reg_name to val */
|
||||||
|
@ -757,18 +757,6 @@ void ppc_cpu_init(MemCtrlBase* mem_ctrl, uint32_t proc_version) {
|
|||||||
ppc_state.pc = 0xFFF00100;
|
ppc_state.pc = 0xFFF00100;
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_gprs() {
|
|
||||||
for (int i = 0; i < 32; i++)
|
|
||||||
cout << "GPR " << dec << i << " : " << uppercase << hex << ppc_state.gpr[i] << endl;
|
|
||||||
|
|
||||||
cout << "PC: " << uppercase << hex << ppc_state.pc << endl;
|
|
||||||
cout << "LR: " << uppercase << hex << ppc_state.spr[SPR::LR] << endl;
|
|
||||||
cout << "CR: " << uppercase << hex << ppc_state.cr << endl;
|
|
||||||
cout << "CTR: " << uppercase << hex << ppc_state.spr[SPR::CTR] << endl;
|
|
||||||
cout << "XER: " << uppercase << hex << ppc_state.spr[SPR::XER] << endl;
|
|
||||||
cout << "MSR: " << uppercase << hex << ppc_state.msr << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
void print_fprs() {
|
void print_fprs() {
|
||||||
for (int i = 0; i < 32; i++)
|
for (int i = 0; i < 32; i++)
|
||||||
cout << "FPR " << dec << i << " : " << ppc_state.fpr[i].dbl64_r << endl;
|
cout << "FPR " << dec << i << " : " << ppc_state.fpr[i].dbl64_r << endl;
|
||||||
|
@ -19,6 +19,7 @@ You should have received a copy of the GNU General Public License
|
|||||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <array>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
@ -55,8 +56,9 @@ static uint32_t str2num(string& num_str) {
|
|||||||
|
|
||||||
static void show_help() {
|
static void show_help() {
|
||||||
cout << "Debugger commands:" << endl;
|
cout << "Debugger commands:" << endl;
|
||||||
cout << " step -- execute single instruction" << endl;
|
cout << " step [N] -- execute single instruction" << endl;
|
||||||
cout << " si -- shortcut for step" << endl;
|
cout << " N is an optional step count" << endl;
|
||||||
|
cout << " si [N] -- shortcut for step" << endl;
|
||||||
cout << " next -- same as step but treats subroutine calls" << endl;
|
cout << " next -- same as step but treats subroutine calls" << endl;
|
||||||
cout << " as single instructions." << endl;
|
cout << " as single instructions." << endl;
|
||||||
cout << " ni -- shortcut for next" << endl;
|
cout << " ni -- shortcut for next" << endl;
|
||||||
@ -74,6 +76,7 @@ static void show_help() {
|
|||||||
cout << " disas N,X -- disassemble N instructions starting at address X" << endl;
|
cout << " disas N,X -- disassemble N instructions starting at address X" << endl;
|
||||||
cout << " X can be any number or a known register name" << endl;
|
cout << " X can be any number or a known register name" << endl;
|
||||||
cout << " disas with no arguments defaults to disas 1,pc" << endl;
|
cout << " disas with no arguments defaults to disas 1,pc" << endl;
|
||||||
|
cout << " da N,X -- shortcut for disas" << endl;
|
||||||
#ifdef ENABLE_68K_DEBUGGER
|
#ifdef ENABLE_68K_DEBUGGER
|
||||||
cout << " context X -- switch to the debugging context X." << endl;
|
cout << " context X -- switch to the debugging context X." << endl;
|
||||||
cout << " X can be either 'ppc' (default) or '68k'" << endl;
|
cout << " X can be either 'ppc' (default) or '68k'" << endl;
|
||||||
@ -328,6 +331,39 @@ static void disasm(uint32_t count, uint32_t address) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void print_gprs() {
|
||||||
|
string reg_name;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 32; i++) {
|
||||||
|
reg_name = "R" + to_string(i);
|
||||||
|
|
||||||
|
cout << right << std::setw(3) << setfill(' ') << reg_name << " : " <<
|
||||||
|
setw(8) << setfill('0') << right << uppercase << hex << get_reg(reg_name);
|
||||||
|
|
||||||
|
if (i & 1) {
|
||||||
|
cout << endl;
|
||||||
|
} else {
|
||||||
|
cout << "\t\t";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
array<string,6> sprs = {"PC", "LR", "CR", "CTR", "XER", "MSR"};
|
||||||
|
|
||||||
|
for (auto &spr : sprs) {
|
||||||
|
cout << right << std::setw(3) << setfill(' ') << spr << " : " <<
|
||||||
|
setw(8) << setfill('0') << uppercase << hex << get_reg(spr);
|
||||||
|
|
||||||
|
if (i & 1) {
|
||||||
|
cout << endl;
|
||||||
|
} else {
|
||||||
|
cout << "\t\t";
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void enter_debugger() {
|
void enter_debugger() {
|
||||||
string inp, cmd, addr_str, expr_str, reg_expr, last_cmd, reg_value_str, inst_string, inst_num_str;
|
string inp, cmd, addr_str, expr_str, reg_expr, last_cmd, reg_value_str, inst_string, inst_num_str;
|
||||||
uint32_t addr, inst_grab;
|
uint32_t addr, inst_grab;
|
||||||
@ -403,13 +439,32 @@ void enter_debugger() {
|
|||||||
cout << exc.what() << endl;
|
cout << exc.what() << endl;
|
||||||
}
|
}
|
||||||
} else if (cmd == "step" || cmd == "si") {
|
} else if (cmd == "step" || cmd == "si") {
|
||||||
|
int count;
|
||||||
|
|
||||||
|
expr_str = "";
|
||||||
|
ss >> expr_str;
|
||||||
|
if (expr_str.length() > 0) {
|
||||||
|
try {
|
||||||
|
count = str2num(expr_str);
|
||||||
|
} catch (invalid_argument& exc) {
|
||||||
|
cout << exc.what() << endl;
|
||||||
|
count = 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
count = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (context == 2) {
|
if (context == 2) {
|
||||||
#ifdef ENABLE_68K_DEBUGGER
|
#ifdef ENABLE_68K_DEBUGGER
|
||||||
|
for (; --count >= 0;) {
|
||||||
exec_single_68k();
|
exec_single_68k();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
for (; --count >= 0;) {
|
||||||
ppc_exec_single();
|
ppc_exec_single();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else if (cmd == "next" || cmd == "ni") {
|
} else if (cmd == "next" || cmd == "ni") {
|
||||||
addr_str = "PC";
|
addr_str = "PC";
|
||||||
addr = get_reg(addr_str) + 4;
|
addr = get_reg(addr_str) + 4;
|
||||||
@ -428,7 +483,7 @@ void enter_debugger() {
|
|||||||
} catch (invalid_argument& exc) {
|
} catch (invalid_argument& exc) {
|
||||||
cout << exc.what() << endl;
|
cout << exc.what() << endl;
|
||||||
}
|
}
|
||||||
} else if (cmd == "disas") {
|
} else if (cmd == "disas" || cmd == "da") {
|
||||||
expr_str = "";
|
expr_str = "";
|
||||||
ss >> expr_str;
|
ss >> expr_str;
|
||||||
if (expr_str.length() > 0) {
|
if (expr_str.length() > 0) {
|
||||||
@ -437,8 +492,15 @@ void enter_debugger() {
|
|||||||
cout << "disas: not enough arguments specified." << endl;
|
cout << "disas: not enough arguments specified." << endl;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
inst_num_str = expr_str.substr(0, expr_str.find_first_of(","));
|
inst_num_str = expr_str.substr(0, expr_str.find_first_of(","));
|
||||||
inst_grab = stol(inst_num_str, NULL, 0);
|
try {
|
||||||
|
inst_grab = str2num(inst_num_str);
|
||||||
|
} catch (invalid_argument& exc) {
|
||||||
|
cout << exc.what() << endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
addr_str = expr_str.substr(expr_str.find_first_of(",") + 1);
|
addr_str = expr_str.substr(expr_str.find_first_of(",") + 1);
|
||||||
try {
|
try {
|
||||||
addr = str2addr(addr_str);
|
addr = str2addr(addr_str);
|
||||||
|
Loading…
Reference in New Issue
Block a user