Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugene Tarassov2012-09-07 18:24:06 +0000
committerEugene Tarassov2012-09-07 18:24:06 +0000
commite96470966313d95498c74ceeda7c275abfcfc9ac (patch)
tree1a7f8108cd2c9fdf0e99f41761217ab455bc7e58
parentb518111e3b3b99e832e3861cd5f6fe70ca18b2b2 (diff)
downloadorg.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.c60
-rw-r--r--agent/tcf/framework/cpudefs.h5
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 */

Back to the top