FRONTPANEL: Add breakpoint support to support a debugger using the API

This commit is contained in:
Mark Pizzolato 2016-02-11 16:42:25 -08:00
parent 5eb6750800
commit d497aea17e
3 changed files with 136 additions and 2 deletions

View file

@ -179,7 +179,7 @@ panel = sim_panel_start_simulator_debug (sim_path,
debug? "frontpanel.dbg" : NULL); debug? "frontpanel.dbg" : NULL);
if (!panel) { if (!panel) {
printf ("Error starting simulator: %s\n", sim_panel_get_error()); printf ("Error starting simulator %s with config %s: %s\n", sim_path, sim_config, sim_panel_get_error());
goto Done; goto Done;
} }
@ -335,6 +335,23 @@ if (sim_panel_dismount (panel, "RL0")) {
goto Done; goto Done;
} }
remove ("TEST-RL.DSK"); remove ("TEST-RL.DSK");
if (sim_panel_break_set (panel, "400")) {
printf ("Unexpected establishing a breakpoint: %s\n", sim_panel_get_error());
goto Done;
}
if (sim_panel_break_clear (panel, "400")) {
printf ("Unexpected clearing a breakpoint: %s\n", sim_panel_get_error());
goto Done;
}
if (sim_panel_break_output_set (panel, "\"32..31..30\"")) {
printf ("Unexpected establishing an output breakpoint: %s\n", sim_panel_get_error());
goto Done;
}
if (sim_panel_break_output_clear (panel, "\"32..31..30\"")) {
printf ("Unexpected clearing an output breakpoint: %s\n", sim_panel_get_error());
goto Done;
}
sim_panel_clear_error ();
while (1) { while (1) {
size_t i; size_t i;
char cmd[512]; char cmd[512];

View file

@ -1176,6 +1176,90 @@ panel->State = Run;
return 0; return 0;
} }
int
sim_panel_break_set (PANEL *panel, const char *condition)
{
if (!panel || (panel->State == Error)) {
sim_panel_set_error ("Invalid Panel");
return -1;
}
if (panel->parent) {
sim_panel_set_error ("Can't establish a breakpoint from device front panel");
return -1;
}
if (panel->State == Run) {
sim_panel_set_error ("Not Halted");
return -1;
}
if (_panel_sendf (panel, 1, NULL, "BREAK %s\r", condition))
return -1;
return 0;
}
int
sim_panel_break_clear (PANEL *panel, const char *condition)
{
if (!panel || (panel->State == Error)) {
sim_panel_set_error ("Invalid Panel");
return -1;
}
if (panel->parent) {
sim_panel_set_error ("Can't clear a breakpoint from device front panel");
return -1;
}
if (panel->State == Run) {
sim_panel_set_error ("Not Halted");
return -1;
}
if (_panel_sendf (panel, 1, NULL, "NOBREAK %s\r", condition))
return -1;
return 0;
}
int
sim_panel_break_output_set (PANEL *panel, const char *condition)
{
if (!panel || (panel->State == Error)) {
sim_panel_set_error ("Invalid Panel");
return -1;
}
if (panel->parent) {
sim_panel_set_error ("Can't establish an output breakpoint from device front panel");
return -1;
}
if (panel->State == Run) {
sim_panel_set_error ("Not Halted");
return -1;
}
if (_panel_sendf (panel, 1, NULL, "EXPECT %s\r", condition))
return -1;
return 0;
}
int
sim_panel_break_output_clear (PANEL *panel, const char *condition)
{
if (!panel || (panel->State == Error)) {
sim_panel_set_error ("Invalid Panel");
return -1;
}
if (panel->parent) {
sim_panel_set_error ("Can't clear an output breakpoint from device front panel");
return -1;
}
if (panel->State == Run) {
sim_panel_set_error ("Not Halted");
return -1;
}
if (_panel_sendf (panel, 1, NULL, "NOEXPECT %s\r", condition))
return -1;
return 0;
}
/** /**
sim_panel_gen_examine sim_panel_gen_examine

View file

@ -57,7 +57,7 @@ extern "C" {
#if !defined(__VAX) /* Unsupported platform */ #if !defined(__VAX) /* Unsupported platform */
#define SIM_FRONTPANEL_VERSION 1 #define SIM_FRONTPANEL_VERSION 2
/** /**
@ -232,6 +232,39 @@ sim_panel_exec_run (PANEL *panel);
int int
sim_panel_exec_step (PANEL *panel); sim_panel_exec_step (PANEL *panel);
/**
When a front panel application wants to describe conditions that
should stop instruction execution an execution or an output
should be used. To established or clear a breakpoint, one of
the following routines should be called:
sim_panel_break_set - Establish a simulation breakpoint
sim_panel_break_clear - Cancel/Delete a previously defined
breakpoint
sim_panel_break_output_set - Establish a simulator output
breakpoint
sim_panel_break_output_clear - Cancel/Delete a previously defined
output breakpoint
Note: Any breakpoint switches/flags must be located at the
beginning of the condition string
*/
int
sim_panel_break_set (PANEL *panel, const char *condition);
int
sim_panel_break_clear (PANEL *panel, const char *condition);
int
sim_panel_break_output_set (PANEL *panel, const char *condition);
int
sim_panel_break_output_clear (PANEL *panel, const char *condition);
/** /**
When a front panel application needs to change or access When a front panel application needs to change or access