ddb: Remove SOFTWARE_SSTEP support

It was needed for mips only, and only kinda sorta worked for mips. It
can be brought back if we grow another architecture that need it.

Sponsored by:		Netflix
This commit is contained in:
Warner Losh
2022-01-07 09:25:33 -07:00
parent 1d85ab6b86
commit d6c0538dae
3 changed files with 0 additions and 149 deletions
-35
View File
@@ -204,41 +204,6 @@ db_clear_breakpoints(void)
}
}
#ifdef SOFTWARE_SSTEP
/*
* Set a temporary breakpoint.
* The instruction is changed immediately,
* so the breakpoint does not have to be on the breakpoint list.
*/
db_breakpoint_t
db_set_temp_breakpoint(db_addr_t addr)
{
register db_breakpoint_t bkpt;
bkpt = db_breakpoint_alloc();
if (bkpt == 0) {
db_printf("Too many breakpoints.\n");
return 0;
}
bkpt->map = NULL;
bkpt->address = addr;
bkpt->flags = BKPT_TEMP;
bkpt->init_count = 1;
bkpt->count = 1;
BKPT_WRITE(bkpt->address, &bkpt->bkpt_inst);
return bkpt;
}
void
db_delete_temp_breakpoint(db_breakpoint_t bkpt)
{
BKPT_CLEAR(bkpt->address, &bkpt->bkpt_inst);
db_breakpoint_free(bkpt);
}
#endif /* SOFTWARE_SSTEP */
/*
* List breakpoints.
*/
-6
View File
@@ -57,13 +57,7 @@ struct db_breakpoint {
typedef struct db_breakpoint *db_breakpoint_t;
void db_clear_breakpoints(void);
#ifdef SOFTWARE_SSTEP
void db_delete_temp_breakpoint(db_breakpoint_t);
#endif
db_breakpoint_t db_find_breakpoint_here(db_addr_t addr);
void db_set_breakpoints(void);
#ifdef SOFTWARE_SSTEP
db_breakpoint_t db_set_temp_breakpoint(db_addr_t);
#endif
#endif /* !_DDB_DB_BREAK_H_ */
-108
View File
@@ -70,30 +70,6 @@ int db_inst_count;
int db_load_count;
int db_store_count;
#ifdef SOFTWARE_SSTEP
db_breakpoint_t db_not_taken_bkpt = 0;
db_breakpoint_t db_taken_bkpt = 0;
#endif
#ifndef db_set_single_step
void db_set_single_step(void);
#endif
#ifndef db_clear_single_step
void db_clear_single_step(void);
#endif
#ifndef db_pc_is_singlestep
static bool
db_pc_is_singlestep(db_addr_t pc)
{
#ifdef SOFTWARE_SSTEP
if ((db_not_taken_bkpt != 0 && pc == db_not_taken_bkpt->address)
|| (db_taken_bkpt != 0 && pc == db_taken_bkpt->address))
return (true);
#endif
return (false);
}
#endif
bool
db_stop_at_pc(int type, int code, bool *is_breakpoint, bool *is_watchpoint)
{
@@ -103,8 +79,6 @@ db_stop_at_pc(int type, int code, bool *is_breakpoint, bool *is_watchpoint)
*is_breakpoint = IS_BREAKPOINT_TRAP(type, code);
*is_watchpoint = IS_WATCHPOINT_TRAP(type, code);
pc = PC_REGS();
if (db_pc_is_singlestep(pc))
*is_breakpoint = false;
db_clear_single_step();
db_clear_breakpoints();
@@ -230,23 +204,10 @@ db_restart_at_pc(bool watchpt)
* We are about to execute this instruction,
* so count it now.
*/
#ifdef SOFTWARE_SSTEP
db_expr_t ins =
#endif
db_get_value(pc, sizeof(int), false);
db_inst_count++;
db_load_count += inst_load(ins);
db_store_count += inst_store(ins);
#ifdef SOFTWARE_SSTEP
/* XXX works on mips, but... */
if (inst_branch(ins) || inst_call(ins)) {
ins = db_get_value(next_instr_address(pc,1),
sizeof(int), false);
db_inst_count++;
db_load_count += inst_load(ins);
db_store_count += inst_store(ins);
}
#endif /* SOFTWARE_SSTEP */
}
if (db_run_mode == STEP_CONTINUE) {
@@ -265,75 +226,6 @@ db_restart_at_pc(bool watchpt)
}
}
#ifdef SOFTWARE_SSTEP
/*
* Software implementation of single-stepping.
* If your machine does not have a trace mode
* similar to the vax or sun ones you can use
* this implementation, done for the mips.
* Just define the above conditional and provide
* the functions/macros defined below.
*
* extern bool
* inst_branch(), returns true if the instruction might branch
* extern unsigned
* branch_taken(), return the address the instruction might
* branch to
* db_getreg_val(); return the value of a user register,
* as indicated in the hardware instruction
* encoding, e.g. 8 for r8
*
* next_instr_address(pc,bd) returns the address of the first
* instruction following the one at "pc",
* which is either in the taken path of
* the branch (bd==1) or not. This is
* for machines (mips) with branch delays.
*
* A single-step may involve at most 2 breakpoints -
* one for branch-not-taken and one for branch taken.
* If one of these addresses does not already have a breakpoint,
* we allocate a breakpoint and save it here.
* These breakpoints are deleted on return.
*/
void
db_set_single_step(void)
{
db_addr_t pc = PC_REGS(), brpc;
unsigned inst;
/*
* User was stopped at pc, e.g. the instruction
* at pc was not executed.
*/
inst = db_get_value(pc, sizeof(int), false);
if (inst_branch(inst) || inst_call(inst) || inst_return(inst)) {
brpc = branch_taken(inst, pc);
if (brpc != pc) { /* self-branches are hopeless */
db_taken_bkpt = db_set_temp_breakpoint(brpc);
}
pc = next_instr_address(pc, 1);
}
pc = next_instr_address(pc, 0);
db_not_taken_bkpt = db_set_temp_breakpoint(pc);
}
void
db_clear_single_step(void)
{
if (db_not_taken_bkpt != 0) {
db_delete_temp_breakpoint(db_not_taken_bkpt);
db_not_taken_bkpt = 0;
}
if (db_taken_bkpt != 0) {
db_delete_temp_breakpoint(db_taken_bkpt);
db_taken_bkpt = 0;
}
}
#endif /* SOFTWARE_SSTEP */
/* single-step */
/*ARGSUSED*/
void