diff options
author | Eugene Tarassov | 2012-09-07 18:24:06 +0000 |
---|---|---|
committer | Eugene Tarassov | 2012-09-07 18:24:06 +0000 |
commit | e96470966313d95498c74ceeda7c275abfcfc9ac (patch) | |
tree | 1a7f8108cd2c9fdf0e99f41761217ab455bc7e58 | |
parent | b518111e3b3b99e832e3861cd5f6fe70ca18b2b2 (diff) | |
download | org.eclipse.tcf.agent-e96470966313d95498c74ceeda7c275abfcfc9ac.tar.gz org.eclipse.tcf.agent-e96470966313d95498c74ceeda7c275abfcfc9ac.tar.xz org.eclipse.tcf.agent-e96470966313d95498c74ceeda7c275abfcfc9ac.zip |
TCF Agent: new utility function: write_location_peices()
-rw-r--r-- | agent/tcf/framework/cpudefs.c | 60 | ||||
-rw-r--r-- | agent/tcf/framework/cpudefs.h | 5 |
2 files changed, 62 insertions, 3 deletions
diff --git a/agent/tcf/framework/cpudefs.c b/agent/tcf/framework/cpudefs.c index 42e51837..5db83b9a 100644 --- a/agent/tcf/framework/cpudefs.c +++ b/agent/tcf/framework/cpudefs.c @@ -399,12 +399,12 @@ LocationExpressionState * evaluate_location_expression(Context * ctx, StackFrame piece->reg = cmd->args.piece.reg; piece->value = cmd->args.piece.value; } - else if (state->stk_pos == 0) { + else if (stk_pos == 0) { location_expression_error(); } else { - state->stk_pos--; - piece->addr = (ContextAddress)state->stk[state->stk_pos]; + stk_pos--; + piece->addr = (ContextAddress)stk[stk_pos]; } } break; @@ -482,6 +482,60 @@ void read_location_peices(Context * ctx, StackFrame * frame, *size = bf_offs / 8; } +void write_location_peices(Context * ctx, StackFrame * frame, + LocationPiece * pieces, unsigned pieces_cnt, int big_endian, + void * value, size_t size) { + unsigned n = 0; + unsigned bf_offs = 0; + uint8_t * bf = (uint8_t *)value; + while (n < pieces_cnt) { + unsigned i; + LocationPiece * piece = pieces + n++; + unsigned piece_size = piece->size ? piece->size : (piece->bit_offs + piece->bit_size + 7) / 8; + unsigned piece_bits = piece->bit_size ? piece->bit_size : piece->size * 8; + uint8_t * pbf = NULL; + if (piece->reg) { + if (piece->reg->size < piece_size) { + pbf = (uint8_t *)tmp_alloc_zero(piece_size); + } + else { + pbf = (uint8_t *)tmp_alloc(piece->reg->size); + } + if (read_reg_bytes(frame, piece->reg, 0, piece->reg->size, pbf) < 0) exception(errno); + if (!piece->reg->big_endian != !big_endian) swap_bytes(pbf, piece->reg->size); + } + else if (piece->value) { + str_exception(ERR_OTHER, "Cannot write to a constant value"); + } + else { + pbf = (uint8_t *)tmp_alloc(piece_size); + if (context_read_mem(ctx, piece->addr, pbf, piece_size) < 0) exception(errno); + } + for (i = piece->bit_offs; i < piece->bit_offs + piece_bits; i++) { + if (bf_offs / 8 >= size) { + /* Leave unchanged */ + } + else if (bf[bf_offs / 8] & (1u << (bf_offs % 8))) { + pbf[i / 8] |= (1u << (i % 8)); + } + else { + pbf[i / 8] &= ~(1u << (i % 8)); + } + bf_offs++; + } + if (piece->reg) { + if (!piece->reg->big_endian != !big_endian) swap_bytes(pbf, piece->reg->size); + if (write_reg_bytes(frame, piece->reg, 0, piece->reg->size, pbf) < 0) exception(errno); + } + else if (piece->value) { + assert(0); + } + else { + if (context_write_mem(ctx, piece->addr, pbf, piece_size) < 0) exception(errno); + } + } +} + #if !defined(ENABLE_HardwareBreakpoints) || !ENABLE_HardwareBreakpoints int cpu_bp_get_capabilities(Context * ctx) { return 0; diff --git a/agent/tcf/framework/cpudefs.h b/agent/tcf/framework/cpudefs.h index 2a4332a4..9bd25c4f 100644 --- a/agent/tcf/framework/cpudefs.h +++ b/agent/tcf/framework/cpudefs.h @@ -263,6 +263,11 @@ extern void read_location_peices( LocationPiece * pieces, unsigned pieces_cnt, int big_endian, void ** value, size_t * size); +extern void write_location_peices( + Context * ctx, StackFrame * frame, + LocationPiece * pieces, unsigned pieces_cnt, int big_endian, + void * value, size_t size); + /*** CPU hardware breakpoints API ***/ /* Get supported memory access modes */ |