X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=sim%2Fucsim%2Fsim.src%2Fbrk.cc;h=12b87d6c034adb7d8ecbb078ffe61ed92dabe5c6;hb=34d14506fd0c12ee5434fec0f9dec27753e1aab5;hp=ab50bc157cf4c6969c4f6fb18179ea558d5af2ee;hpb=0ac34444ce2ccdcaa5fe722e2420f96c46224039;p=fw%2Fsdcc diff --git a/sim/ucsim/sim.src/brk.cc b/sim/ucsim/sim.src/brk.cc index ab50bc15..12b87d6c 100644 --- a/sim/ucsim/sim.src/brk.cc +++ b/sim/ucsim/sim.src/brk.cc @@ -28,6 +28,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "ddconfig.h" #include +#include #include "pobjcl.h" #include "brkcl.h" @@ -37,9 +38,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA * Base object of breakpoints */ -cl_brk::cl_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit): +cl_brk::cl_brk(class cl_address_space *imem, int inr, t_addr iaddr, + enum brk_perm iperm, int ihit): cl_base() { + mem = imem; nr = inr; addr = iaddr; perm = iperm; @@ -50,6 +53,20 @@ cl_brk::cl_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit): cl_brk::~cl_brk(void) {} +void +cl_brk::activate(void) +{ + if (mem) + mem->set_brk(addr, this); +} + +void +cl_brk::inactivate(void) +{ + if (mem) + mem->del_brk(addr, this); +} + bool cl_brk::do_hit(void) { @@ -67,8 +84,9 @@ cl_brk::do_hit(void) * FETCH type of breakpoint */ -cl_fetch_brk::cl_fetch_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit): - cl_brk(inr, iaddr, iperm, ihit) +cl_fetch_brk::cl_fetch_brk(class cl_address_space *imem, int inr, t_addr iaddr, + enum brk_perm iperm, int ihit): + cl_brk(imem, inr, iaddr, iperm, ihit) { code = 0; } @@ -84,12 +102,36 @@ cl_fetch_brk::type(void) * Base of EVENT type of breakpoints */ -cl_ev_brk::cl_ev_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit, +cl_ev_brk::cl_ev_brk(class cl_address_space *imem, int inr, t_addr iaddr, + enum brk_perm iperm, int ihit, enum brk_event ievent, const char *iid): - cl_brk(inr, iaddr, iperm, ihit) + cl_brk(imem, inr, iaddr, iperm, ihit) { event= ievent; id = iid; + mem = imem; +} + +cl_ev_brk::cl_ev_brk(class cl_address_space *imem, int inr, t_addr iaddr, + enum brk_perm iperm, int ihit, char op): + cl_brk(imem, inr, iaddr, iperm, ihit) +{ + mem = imem; + if ((op= toupper(op)) == 'R') + { + event= brkREAD; + id= "read"; + } + else if (op == 'W') + { + event= brkWRITE; + id= "write"; + } + else + { + event= brkACCESS; + id= "access"; + } } enum brk_type @@ -101,112 +143,7 @@ cl_ev_brk::type(void) bool cl_ev_brk::match(struct event_rec *ev) { - return(FALSE); -} - - -/* - * WRITE IRAM type of EVENT breakpoints - */ - -cl_wi_brk::cl_wi_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit): - cl_ev_brk(inr, iaddr, iperm, ihit, brkWIRAM, "wi") -{} - -bool -cl_wi_brk::match(struct event_rec *ev) -{ - return(ev->wi == addr); -} - - -/* - * READ IRAM type of EVENT breakpoints - */ - -cl_ri_brk::cl_ri_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit): - cl_ev_brk(inr, iaddr, iperm, ihit, brkRIRAM, "ri") -{} - -bool -cl_ri_brk::match(struct event_rec *ev) -{ - return(ev->ri == addr); -} - - -/* - * WRITE XRAM type of EVENT breakpoints - */ - -cl_wx_brk::cl_wx_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit): - cl_ev_brk(inr, iaddr, iperm, ihit, brkWXRAM, "wx") -{} - -bool -cl_wx_brk::match(struct event_rec *ev) -{ - return(ev->wx == addr); -} - - -/* - * READ XRAM type of EVENT breakpoints - */ - -cl_rx_brk::cl_rx_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit): - cl_ev_brk(inr, iaddr, iperm, ihit, brkRXRAM, "rx") -{} - -bool -cl_rx_brk::match(struct event_rec *ev) -{ - return(ev->rx == addr); -} - - -/* - * WRITE SFR type of EVENT breakpoints - */ - -cl_ws_brk::cl_ws_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit): - cl_ev_brk(inr, iaddr, iperm, ihit, brkWSFR, "ws") -{} - -bool -cl_ws_brk::match(struct event_rec *ev) -{ - return(ev->ws == addr); -} - - -/* - * READ SFR type of EVENT breakpoints - */ - -cl_rs_brk::cl_rs_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit): - cl_ev_brk(inr, iaddr, iperm, ihit, brkRSFR, "rs") -{} - -bool -cl_rs_brk::match(struct event_rec *ev) -{ - return(ev->rs == addr); -} - - -/* - * READ CODE type of EVENT breakpoints - */ - -cl_rc_brk::cl_rc_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit): - cl_ev_brk(inr, iaddr, iperm, ihit, brkRCODE, "rc") -{} - -bool -cl_rc_brk::match(struct event_rec *ev) -{ - return(ev->rc == addr); + return(DD_FALSE); } @@ -216,13 +153,14 @@ cl_rc_brk::match(struct event_rec *ev) * This is a sorted collection, sorted by nr field of brk items. */ -brk_coll::brk_coll(t_index alimit, t_index adelta, class cl_rom *arom): - cl_sorted_list(alimit, adelta) +brk_coll::brk_coll(t_index alimit, t_index adelta, + class cl_address_space *arom): + cl_sorted_list(alimit, adelta, "breakpoints") { rom= arom; } -void * +const void * brk_coll::key_of(void *item) { return((void *)&(((class cl_brk *)(item))->nr)); @@ -230,7 +168,7 @@ brk_coll::key_of(void *item) int -brk_coll::compare(void *key1, void *key2) +brk_coll::compare(const void *key1, const void *key2) { int k1, k2; @@ -262,47 +200,71 @@ brk_coll::there_is_event(enum brk_event ev) b= (class cl_brk *)at(i); if (b->type() == brkEVENT && ((class cl_ev_brk *)b)->event == ev) - return(TRUE); + return(DD_TRUE); } - return(FALSE); + return(DD_FALSE); } -int +/*int brk_coll::make_new_nr(void) { if (count == 0) return(1); class cl_brk *b= (class cl_brk *)(at(count-1)); return(b->nr+1); -} +}*/ void brk_coll::add_bp(class cl_brk *bp) { add(bp); - if (rom && + bp->activate(); + return; + /*if (rom && bp->addr < rom->size) - rom->bp_map->set(bp->addr); + / *rom->bp_map->set(bp->addr)* /rom->set_brk(bp->addr, bp);*/ } void brk_coll::del_bp(t_addr addr) { int idx; + class cl_brk *bp; - if (get_bp(addr, &idx)) - free_at(idx); - if (rom && + if ((bp= get_bp(addr, &idx))) + { + bp->inactivate(); + free_at(idx); + } + return; + /*if (rom && addr < rom->size) - rom->bp_map->clear(addr); + { + fprintf(stderr, "brk_coll::del_bp(0x%"_A_"x\n", addr);//FIXME + //rom->bp_map->clear(addr); + }*/ +} + +void +brk_coll::del_bp(t_index idx, int /*dummy*/) +{ + class cl_brk *bp; + + if (idx >= count) + return; + bp= (class cl_brk *)(at(idx)); + if (!bp) + return; + bp->inactivate(); + free_at(idx); } class cl_brk * brk_coll::get_bp(t_addr addr, int *idx) { if (rom && - addr < rom->size && - rom->bp_map->get(addr)) + rom->valid_address(addr) && + rom->get_cell_flag(addr, CELL_FETCH_BRK)) { for (*idx= 0; *idx < count; (*idx)++) { @@ -314,12 +276,26 @@ brk_coll::get_bp(t_addr addr, int *idx) return(0); } +class cl_brk * +brk_coll::get_bp(int nr) +{ + int i; + + for (i= 0; i < count; i++) + { + class cl_brk *bp= (class cl_brk *)(at(i)); + if (bp->nr == nr) + return(bp); + } + return(0); +} + bool brk_coll::bp_at(t_addr addr) { return(rom && - addr < rom->size && - rom->bp_map->get(addr)); + rom->valid_address(addr) && + rom->get_cell_flag(addr, CELL_FETCH_BRK)); }