Skip to content

Commit a3b248e

Browse files
joevtdingusdev
authored andcommitted
ppcemu: Use ppc_off_reason setter.
Makes things slightly cleaner and helps debugging. Changes to ppc_off_reason can be logged.
1 parent db5ab5f commit a3b248e

7 files changed

Lines changed: 63 additions & 31 deletions

File tree

‎benchmark/bench1.cpp‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
2929

3030
#if defined(PPC_BENCHMARKS)
3131
void ppc_exception_handler(Except_Type exception_type, uint32_t srr1_bits) {
32-
power_on = false;
33-
power_off_reason = po_benchmark_exception;
32+
power_off(po_benchmark_exception);
3433
}
3534
#endif
3635

‎core/hostevents_sdl.cpp‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ void EventManager::poll_events() {
4444

4545
switch (event.type) {
4646
case SDL_QUIT:
47-
power_on = false;
48-
power_off_reason = po_quit;
47+
power_off(po_quit);
4948
break;
5049

5150
case SDL_WINDOWEVENT: {
@@ -138,8 +137,7 @@ void EventManager::poll_events() {
138137
// Control-D: debugger
139138
if (event.key.keysym.sym == SDLK_d && (event.key.keysym.mod & KMOD_ALL) == KMOD_LCTRL) {
140139
if (event.type == SDL_KEYUP) {
141-
power_on = false;
142-
power_off_reason = po_enter_debugger;
140+
power_off(po_enter_debugger);
143141
}
144142
return;
145143
}

‎cpu/ppc/ppcemu.h‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,11 @@ enum Po_Cause : int {
366366

367367
extern bool power_on;
368368
extern Po_Cause power_off_reason;
369+
void p_set_power_off_reason(const char* file, int line, Po_Cause new_reason);
370+
void p_power_off(const char* file, int line, Po_Cause new_reason);
371+
#define set_power_off_reason(r) p_set_power_off_reason(__FILE__, __LINE__, r)
372+
#define power_off(r) p_power_off(__FILE__, __LINE__, r)
373+
369374
extern bool int_pin;
370375
extern bool dec_exception_pending;
371376

‎cpu/ppc/ppcexec.cpp‎

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,43 @@ bool is_deterministic = false;
7373
bool power_on = false;
7474
Po_Cause power_off_reason = po_enter_debugger;
7575

76+
const char * get_po_name(Po_Cause reason) {
77+
#define onename(x) case x: return #x;
78+
switch (reason) {
79+
onename(po_none)
80+
onename(po_starting_up)
81+
onename(po_quit)
82+
onename(po_quitting)
83+
onename(po_shut_down)
84+
onename(po_shutting_down)
85+
onename(po_restart)
86+
onename(po_restarting)
87+
onename(po_disassemble_on)
88+
onename(po_disassemble_off)
89+
onename(po_enter_debugger)
90+
onename(po_entered_debugger)
91+
onename(po_signal_interrupt)
92+
onename(po_benchmark_exception)
93+
onename(po_endian_switch)
94+
default: return "unknown";
95+
}
96+
#undef onename
97+
}
98+
99+
void p_set_power_off_reason(const char* file, int line, Po_Cause new_reason) {
100+
if (new_reason != power_off_reason) {
101+
power_off_reason = new_reason;
102+
#if 1
103+
LOG_F(INFO, "power_off_reason changed to %s at \"%s\":%d", get_po_name(new_reason), file, line);
104+
#endif
105+
}
106+
}
107+
108+
void p_power_off(const char* file, int line, Po_Cause new_reason) {
109+
power_on = false;
110+
p_set_power_off_reason(file, line, new_reason);
111+
}
112+
76113
SetPRS ppc_state;
77114
#ifdef LOG_INSTRUCTIONS
78115
uint32_t pcp;
@@ -224,8 +261,7 @@ void ppc_msr_did_change(uint32_t old_msr_val, uint32_t new_msr_val, bool set_nex
224261
ppc_next_instruction_address = ppc_state.pc + 4;
225262
}
226263
#else
227-
power_on = false;
228-
power_off_reason = po_endian_switch;
264+
power_off(po_endian_switch);
229265
#endif
230266
}
231267
}
@@ -235,14 +271,12 @@ void ppc_change_endian(bool newLE) {
235271
if (ppc_state.is_LE != newLE) {
236272
LOG_F(INFO, "changed endian to %s", newLE ? "LE" : "BE");
237273
ppc_state.is_LE = newLE;
238-
power_on = false;
239-
power_off_reason = po_endian_switch;
274+
power_off(po_endian_switch);
240275
}
241276
#else
242277
if (newLE) {
243278
LOG_F(ERROR, "unsupported endian %s", newLE ? "LE" : "BE");
244-
power_on = false;
245-
power_off_reason = po_enter_debugger;
279+
power_off(po_enter_debugger);
246280
}
247281
#endif
248282
}

‎debugger/debugger.cpp‎

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -730,21 +730,21 @@ void DppcDebugger::enter_debugger() {
730730

731731
while (1) {
732732
if (power_off_reason == po_shut_down) {
733-
power_off_reason = po_shutting_down;
733+
set_power_off_reason(po_shutting_down);
734734
break;
735735
}
736736
if (power_off_reason == po_restart) {
737-
power_off_reason = po_restarting;
737+
set_power_off_reason(po_restarting);
738738
break;
739739
}
740740
if (power_off_reason == po_quit) {
741-
power_off_reason = po_quitting;
741+
set_power_off_reason(po_quitting);
742742
break;
743743
}
744744
power_on = true;
745745

746746
if (power_off_reason == po_starting_up) {
747-
power_off_reason = po_none;
747+
set_power_off_reason(po_none);
748748
cmd = "go";
749749
}
750750
else if (power_off_reason == po_disassemble_on) {
@@ -755,13 +755,13 @@ void DppcDebugger::enter_debugger() {
755755
ss >> cmd;
756756
}
757757
else if (power_off_reason == po_disassemble_off) {
758-
power_off_reason = po_none;
758+
set_power_off_reason(po_none);
759759
cmd = "go";
760760
}
761761
else
762762
{
763763
if (power_off_reason == po_enter_debugger) {
764-
power_off_reason = po_entered_debugger;
764+
set_power_off_reason(po_entered_debugger);
765765
}
766766
if (!did_message) {
767767
cout << endl;
@@ -798,7 +798,7 @@ void DppcDebugger::enter_debugger() {
798798
}
799799

800800
if (power_off_reason == po_signal_interrupt) {
801-
power_off_reason = po_enter_debugger;
801+
set_power_off_reason(po_enter_debugger);
802802
// ignore command if interrupt happens because the input line is probably incomplete.
803803
last_cmd = "";
804804
continue;
@@ -825,8 +825,7 @@ void DppcDebugger::enter_debugger() {
825825
break;
826826
} else if (cmd == "restart") {
827827
cmd = "";
828-
power_on = false;
829-
power_off_reason = po_restart;
828+
power_off(po_restart);
830829
} else if (cmd == "profile") {
831830
cmd = "";
832831
ss >> sub_cmd;

‎devices/common/viacuda.cpp‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -814,13 +814,11 @@ void ViaCuda::pseudo_command() {
814814
break;
815815
case CUDA_RESTART_SYSTEM:
816816
LOG_F(INFO, "Cuda: system restart");
817-
power_on = false;
818-
power_off_reason = po_restart;
817+
power_off(po_restart);
819818
break;
820819
case CUDA_POWER_DOWN:
821820
LOG_F(INFO, "Cuda: system shutdown");
822-
power_on = false;
823-
power_off_reason = po_shut_down;
821+
power_off(po_shut_down);
824822
break;
825823
case CUDA_SET_POWER_UPTIME: {
826824
uint32_t alarm_time = READ_DWORD_BE_U(&this->in_buf[2]);

‎main.cpp‎

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,7 @@ using namespace std;
5252
extern bool g_auto_grab_mouse;
5353

5454
static void sigint_handler(int signum) {
55-
power_on = false;
56-
power_off_reason = po_signal_interrupt;
55+
power_off(po_signal_interrupt);
5756
}
5857

5958
static void sigabrt_handler(int signum) {
@@ -297,7 +296,7 @@ int main(int argc, char** argv) {
297296
// Make sure the reason for the failure is visible (it may have been
298297
// sent to the logfile only).
299298
cerr << message.preamble << message.indentation << message.prefix << message.message << endl;
300-
power_off_reason = po_enter_debugger;
299+
set_power_off_reason(po_enter_debugger);
301300
DppcDebugger::get_instance()->enter_debugger();
302301

303302
// Ensure that NVRAM and other state is persisted before we terminate.
@@ -416,15 +415,15 @@ void run_machine(std::string machine_str, char* rom_data,
416415

417416
switch (execution_mode) {
418417
case interpreter:
419-
power_off_reason = po_starting_up;
418+
set_power_off_reason(po_starting_up);
420419
DppcDebugger::get_instance()->enter_debugger();
421420
break;
422421
case threaded_int:
423-
power_off_reason = po_starting_up;
422+
set_power_off_reason(po_starting_up);
424423
DppcDebugger::get_instance()->enter_debugger();
425424
break;
426425
case debugger:
427-
power_off_reason = po_enter_debugger;
426+
set_power_off_reason(po_enter_debugger);
428427
DppcDebugger::get_instance()->enter_debugger();
429428
break;
430429
default:

0 commit comments

Comments
 (0)