void set_regs_PC(Context * ctx, ContextAddress pc) { size_t i; uint8_t buf[8]; RegisterDefinition * def = get_PC_definition(ctx); if (def == NULL) return; assert(def->size <= sizeof(buf)); for (i = 0; i < def->size; i++) { buf[def->big_endian ? def->size - i - 1 : i] = (uint8_t)pc; pc = pc >> 8; } context_write_reg(ctx, def, 0, def->size, buf); }
static void command_setm_cache_client(void * x) { SetmArgs * args = (SetmArgs *)x; Channel * c = cache_channel(); int notify = 0; Trap trap; if (set_trap(&trap)) { unsigned locs_pos = 0; unsigned data_pos = 0; check_location_list(args->locs, args->locs_cnt, 1); while (locs_pos < args->locs_cnt) { Location * l = args->locs + locs_pos++; assert(l->frame_info == NULL); if (l->size > 0) { if (context_write_reg(l->ctx, l->reg_def, l->offs, l->size, args->data + data_pos) < 0) exception(errno); data_pos += l->size; l->notify = 1; notify = 1; } } clear_trap(&trap); } cache_exit(); if (notify) { unsigned locs_pos = 0; while (locs_pos < args->locs_cnt) { Location * l = args->locs + locs_pos++; if (l->notify) send_event_register_changed(l->id); } } write_stringz(&c->out, "R"); write_stringz(&c->out, args->token); write_errno(&c->out, trap.error); write_stream(&c->out, MARKER_EOM); loc_free(args->locs); loc_free(args->data); }
static void command_set_cache_client(void * x) { SetArgs * args = (SetArgs *)x; Channel * c = cache_channel(); int notify = 0; Trap trap; if (set_trap(&trap)) { int frame = 0; Context * ctx = NULL; RegisterDefinition * reg_def = NULL; if (id2register(args->id, &ctx, &frame, ®_def) < 0) exception(errno); if (frame >= 0 && !is_top_frame(ctx, frame)) exception(ERR_INV_CONTEXT); if (ctx->exited) exception(ERR_ALREADY_EXITED); if ((ctx->reg_access & REG_ACCESS_WR_STOP) != 0) { check_all_stopped(ctx); } if ((ctx->reg_access & REG_ACCESS_WR_RUNNING) == 0) { if (!ctx->stopped && context_has_state(ctx)) str_exception(ERR_IS_RUNNING, "Cannot write register if not stopped"); } if ((size_t)args->data_len > reg_def->size) exception(ERR_INV_DATA_SIZE); if (args->data_len > 0) { if (context_write_reg(ctx, reg_def, 0, args->data_len, args->data) < 0) exception(errno); notify = 1; } clear_trap(&trap); } cache_exit(); if (notify) send_event_register_changed(args->id); write_stringz(&c->out, "R"); write_stringz(&c->out, args->token); write_errno(&c->out, trap.error); write_stream(&c->out, MARKER_EOM); loc_free(args->data); }