Profiler + Missing Instruction Added

This commit is contained in:
dingusdev 2020-01-14 20:50:01 -07:00
parent 3650b655d7
commit 6dd8d55577
6 changed files with 75 additions and 3 deletions

View File

@ -205,7 +205,7 @@ extern uint32_t ppc_real_address;
extern uint32_t ppc_next_instruction_address; extern uint32_t ppc_next_instruction_address;
//Profiling Stats //Profiling Stats
extern uint32_t mmu_operations_num; extern uint32_t mmu_translations_num;
extern uint32_t exceptions_performed; extern uint32_t exceptions_performed;
extern uint32_t supervisor_inst_num; extern uint32_t supervisor_inst_num;

View File

@ -9,6 +9,9 @@ jmp_buf exc_env; /* Global exception environment. */
uint32_t srr1_bits) uint32_t srr1_bits)
{ {
grab_exception = true; grab_exception = true;
#ifdef PROFILER
exceptions_performed++;
#endif
bb_kind = BB_end_kind::BB_EXCEPTION; bb_kind = BB_end_kind::BB_EXCEPTION;
switch(exception_type) { switch(exception_type) {

View File

@ -102,6 +102,7 @@ static std::unordered_map<uint16_t, PPCOpcode> SubOpcode31Grabber = {
{1070, &ppc_lfsx}, {1072, &ppc_srw}, {1073, &ppc_srwdot}, {1070, &ppc_lfsx}, {1072, &ppc_srw}, {1073, &ppc_srwdot},
{1074, &power_rrib}, {1075, &power_rribdot}, {1082, &power_maskir}, {1074, &power_rrib}, {1075, &power_rribdot}, {1082, &power_maskir},
{1083, &power_maskirdot}, {1104, &ppc_subfo}, {1105, &ppc_subfodot}, {1083, &power_maskirdot}, {1104, &ppc_subfo}, {1105, &ppc_subfodot},
{1105, &ppc_tlbsync},
{1134, &ppc_lfsux}, {1190, &ppc_mfsr}, {1194, &ppc_lswi}, {1134, &ppc_lfsux}, {1190, &ppc_mfsr}, {1194, &ppc_lswi},
{1196, &ppc_sync}, {1232, &ppc_nego}, {1233, &ppc_negodot}, {1196, &ppc_sync}, {1232, &ppc_nego}, {1233, &ppc_negodot},
{1238, &power_mulo}, {1239, &power_mulodot}, {1300, &ppc_addeo}, {1238, &power_mulo}, {1239, &power_mulodot}, {1300, &ppc_addeo},

View File

@ -312,6 +312,10 @@ static uint32_t ppc_mmu_instr_translate(uint32_t la)
/** PowerPC-style MMU data address translation. */ /** PowerPC-style MMU data address translation. */
static uint32_t ppc_mmu_addr_translate(uint32_t la, int is_write) static uint32_t ppc_mmu_addr_translate(uint32_t la, int is_write)
{ {
#if PROFILER
mmu_translations_num++;
#endif
uint32_t pa; /* translated physical address */ uint32_t pa; /* translated physical address */
bool bat_hit = false; bool bat_hit = false;

View File

@ -1241,6 +1241,9 @@ void ppc_mfcr(){
} }
void ppc_mtsr(){ void ppc_mtsr(){
#ifdef PROFILER
supervisor_inst_num++;
#endif
if ((ppc_state.ppc_msr & 0x4000) == 0){ if ((ppc_state.ppc_msr & 0x4000) == 0){
reg_s = (ppc_cur_instruction >> 21) & 31; reg_s = (ppc_cur_instruction >> 21) & 31;
grab_sr = (ppc_cur_instruction >> 16) & 15; grab_sr = (ppc_cur_instruction >> 16) & 15;
@ -1249,6 +1252,9 @@ void ppc_mtsr(){
} }
void ppc_mtsrin(){ void ppc_mtsrin(){
#ifdef PROFILER
supervisor_inst_num++;
#endif
if ((ppc_state.ppc_msr & 0x4000) == 0){ if ((ppc_state.ppc_msr & 0x4000) == 0){
ppc_grab_regssb(); ppc_grab_regssb();
grab_sr = ppc_result_b >> 28; grab_sr = ppc_result_b >> 28;
@ -1257,6 +1263,9 @@ void ppc_mtsrin(){
} }
void ppc_mfsr(){ void ppc_mfsr(){
#ifdef PROFILER
supervisor_inst_num++;
#endif
if ((ppc_state.ppc_msr & 0x4000) == 0){ if ((ppc_state.ppc_msr & 0x4000) == 0){
reg_d = (ppc_cur_instruction >> 21) & 31; reg_d = (ppc_cur_instruction >> 21) & 31;
grab_sr = (ppc_cur_instruction >> 16) & 15; grab_sr = (ppc_cur_instruction >> 16) & 15;
@ -1265,6 +1274,9 @@ void ppc_mfsr(){
} }
void ppc_mfsrin(){ void ppc_mfsrin(){
#ifdef PROFILER
supervisor_inst_num++;
#endif
if ((ppc_state.ppc_msr & 0x4000) == 0){ if ((ppc_state.ppc_msr & 0x4000) == 0){
ppc_grab_regssb(); ppc_grab_regssb();
grab_sr = ppc_result_b >> 28; grab_sr = ppc_result_b >> 28;
@ -1273,6 +1285,9 @@ void ppc_mfsrin(){
} }
void ppc_mfmsr(){ void ppc_mfmsr(){
#ifdef PROFILER
supervisor_inst_num++;
#endif
if (ppc_state.ppc_msr & 0x4000) { if (ppc_state.ppc_msr & 0x4000) {
ppc_exception_handler(Except_Type::EXC_PROGRAM, 0x00040000); ppc_exception_handler(Except_Type::EXC_PROGRAM, 0x00040000);
} }
@ -1281,6 +1296,9 @@ void ppc_mfmsr(){
} }
void ppc_mtmsr(){ void ppc_mtmsr(){
#ifdef PROFILER
supervisor_inst_num++;
#endif
if (ppc_state.ppc_msr & 0x4000) { if (ppc_state.ppc_msr & 0x4000) {
ppc_exception_handler(Except_Type::EXC_PROGRAM, 0x00040000); ppc_exception_handler(Except_Type::EXC_PROGRAM, 0x00040000);
} }
@ -1290,6 +1308,12 @@ void ppc_mtmsr(){
void ppc_mfspr(){ void ppc_mfspr(){
uint32_t ref_spr = (((ppc_cur_instruction >> 11) & 31) << 5) | ((ppc_cur_instruction >> 16) & 31); uint32_t ref_spr = (((ppc_cur_instruction >> 11) & 31) << 5) | ((ppc_cur_instruction >> 16) & 31);
#ifdef PROFILER
if (ref_spr > 31) {
supervisor_inst_num++;
}
#endif
reg_d = (ppc_cur_instruction >> 21) & 31; reg_d = (ppc_cur_instruction >> 21) & 31;
ppc_state.ppc_gpr[reg_d] = ppc_state.ppc_spr[ref_spr]; ppc_state.ppc_gpr[reg_d] = ppc_state.ppc_spr[ref_spr];
} }
@ -1298,6 +1322,12 @@ void ppc_mtspr(){
uint32_t ref_spr = (((ppc_cur_instruction >> 11) & 31) << 5) | ((ppc_cur_instruction >> 16) & 31); uint32_t ref_spr = (((ppc_cur_instruction >> 11) & 31) << 5) | ((ppc_cur_instruction >> 16) & 31);
reg_s = (ppc_cur_instruction >> 21) & 31; reg_s = (ppc_cur_instruction >> 21) & 31;
#ifdef PROFILER
if (ref_spr > 31) {
supervisor_inst_num++;
}
#endif
if (ref_spr != 287){ if (ref_spr != 287){
ppc_state.ppc_spr[ref_spr] = ppc_state.ppc_gpr[reg_s]; ppc_state.ppc_spr[ref_spr] = ppc_state.ppc_gpr[reg_s];
} }
@ -1734,6 +1764,9 @@ void ppc_crxor(){
//Processor MGMT Fns. //Processor MGMT Fns.
void ppc_rfi(){ void ppc_rfi(){
#ifdef PROFILER
supervisor_inst_num++;
#endif
uint32_t new_srr1_val = (ppc_state.ppc_spr[27] & 0x87C0FF73UL); uint32_t new_srr1_val = (ppc_state.ppc_spr[27] & 0x87C0FF73UL);
uint32_t new_msr_val = (ppc_state.ppc_msr & ~(0x87C0FF73UL)); uint32_t new_msr_val = (ppc_state.ppc_msr & ~(0x87C0FF73UL));
ppc_state.ppc_msr = (new_msr_val | new_srr1_val) & 0xFFFBFFFFUL; ppc_state.ppc_msr = (new_msr_val | new_srr1_val) & 0xFFFBFFFFUL;
@ -1794,6 +1827,9 @@ void ppc_dcbf(){
} }
void ppc_dcbi(){ void ppc_dcbi(){
#ifdef PROFILER
supervisor_inst_num++;
#endif
std::cout << "Oops. Placeholder for dcbi." << std::endl; std::cout << "Oops. Placeholder for dcbi." << std::endl;
} }
@ -2415,6 +2451,9 @@ void ppc_stswx(){
//TLB Instructions //TLB Instructions
void ppc_tlbie(){ void ppc_tlbie(){
#ifdef PROFILER
supervisor_inst_num++;
#endif
/** /**
reg_b = (ppc_cur_instruction >> 11) & 31; reg_b = (ppc_cur_instruction >> 11) & 31;
uint32_t vps = ppc_state.ppc_gpr[reg_b] & 0xFFFF000; uint32_t vps = ppc_state.ppc_gpr[reg_b] & 0xFFFF000;
@ -2423,13 +2462,29 @@ void ppc_tlbie(){
} }
void ppc_tlbia(){ void ppc_tlbia(){
#ifdef PROFILER
supervisor_inst_num++;
#endif
printf("Placeholder for tlbia \n"); printf("Placeholder for tlbia \n");
} }
void ppc_tlbld(){ void ppc_tlbld(){
#ifdef PROFILER
supervisor_inst_num++;
#endif
printf("Placeholder for tlbld - 603 only \n"); printf("Placeholder for tlbld - 603 only \n");
} }
void ppc_tlbli(){ void ppc_tlbli(){
#ifdef PROFILER
supervisor_inst_num++;
#endif
printf("Placeholder for tlbli - 603 only \n"); printf("Placeholder for tlbli - 603 only \n");
} }
void ppc_tlbsync() {
#ifdef PROFILER
supervisor_inst_num++;
#endif
printf("Placeholder for tlbsync \n");
}

View File

@ -24,6 +24,9 @@ void show_help()
cout << " until X -- execute until address X is reached" << endl; cout << " until X -- execute until address X is reached" << endl;
cout << " regs -- dump content of the GRPs" << endl; cout << " regs -- dump content of the GRPs" << endl;
cout << " memdump -- dump content of the system memory to memdump.bin" << endl; cout << " memdump -- dump content of the system memory to memdump.bin" << endl;
#ifdef PROFILER
cout << " profiler -- show stats related to the processor" << endl;
#endif
cout << " disas X,n -- disassemble N instructions starting at address X" << endl; cout << " disas X,n -- disassemble N instructions starting at address X" << endl;
cout << " quit -- quit the debugger" << endl << endl; cout << " quit -- quit the debugger" << endl << endl;
cout << "Pressing ENTER will repeat last command." << endl; cout << "Pressing ENTER will repeat last command." << endl;
@ -79,10 +82,16 @@ void enter_debugger()
show_help(); show_help();
} else if (cmd == "quit") { } else if (cmd == "quit") {
break; break;
} } else if (cmd == "memdump") {
else if (cmd == "memdump") {
dump_mem_file(); dump_mem_file();
} }
#ifdef PROFILER
else if (cmd == "profiler") {
cout << "Number of Supervisor Instructions Executed:" << supervisor_inst_num << endl;
cout << "Exception Handler Ran:" << exceptions_performed << endl;
cout << "Number of MMU Translations:" << mmu_translations_num << endl;
}
#endif
else if (cmd == "regs") { else if (cmd == "regs") {
dump_regs(); dump_regs();
} else if (cmd == "step") { } else if (cmd == "step") {