static retval_t cmd_mem_write(const subsystem_t *self, frame_t * iframe, frame_t * oframe) { void *dst=0; uint8_t len; if (RV_SUCCESS != frame_get_u32(iframe, (uint32_t*)&dst)) return RV_NOSPACE; if (RV_SUCCESS != frame_get_u8(iframe, &len)) return RV_NOSPACE; return frame_get_data(iframe, dst, len); }
static int hook(Quark *q, void *udata, QTraverseClosure *closure) { frame *f; view v; DObject *o; AText *at; ext_xy_t *ext_xy = (ext_xy_t *) udata; switch (quark_fid_get(q)) { case QFlavorFrame: f = frame_get_data(q); frame_get_view(q, &v); v.xv1 *= ext_xy->x; v.xv2 *= ext_xy->x; v.yv1 *= ext_xy->y; v.yv2 *= ext_xy->y; frame_set_view(q, &v); f->l.offset.x *= ext_xy->x; f->l.offset.y *= ext_xy->y; /* TODO: tickmark offsets */ quark_dirtystate_set(q, TRUE); break; case QFlavorDObject: o = object_get_data(q); if (object_get_loctype(q) == COORD_VIEW) { o->ap.x *= ext_xy->x; o->ap.y *= ext_xy->y; o->offset.x *= ext_xy->x; o->offset.y *= ext_xy->y; quark_dirtystate_set(q, TRUE); } break; case QFlavorAText: at = atext_get_data(q); if (object_get_loctype(q) == COORD_VIEW) { at->ap.x *= ext_xy->x; at->ap.y *= ext_xy->y; at->offset.x *= ext_xy->x; at->offset.y *= ext_xy->y; quark_dirtystate_set(q, TRUE); } break; } return TRUE; }
static retval_t cmd_nvram_patch(const subsystem_t *self, frame_t * iframe, frame_t * oframe) { uint8_t *dst = 0; uint32_t offset; uint8_t size; if (RV_SUCCESS != frame_get_u32(iframe, &offset)) return RV_NOSPACE; if (RV_SUCCESS != frame_get_u8(iframe, &size)) return RV_NOSPACE; dst = ((uint8_t*)&nvram) + offset; (void)frame_put_u8(oframe, size); (void)frame_put_data(oframe, dst, size); /* send previous data */ return frame_get_data(iframe, dst, size); }
static retval_t cmd_flash_sector_write_mem(const subsystem_t *self, frame_t * iframe, frame_t * oframe) { MD5_CTX ctx; uint32_t len; void *dst=0, *src=0; uint8_t md5[sizeof(ctx.digest)]; int rv; (void /* once is enough */)frame_get_u32(iframe, (uint32_t*)&src); (void /* once is enough */)frame_get_u32(iframe, (uint32_t*)&dst); (void /* once is enough */)frame_get_u32(iframe, &len); if (RV_SUCCESS != frame_get_data(iframe, &md5, sizeof(md5))) return RV_NOSPACE; MD5Init(&ctx); MD5Update(&ctx, src, len); MD5Final(&ctx); if (memcmp(ctx.digest, md5, sizeof(md5))) { log_report_fmt(LOG_SS_MEMORY, "invalid memory MD5: " "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", ctx.digest[0], ctx.digest[1], ctx.digest[2], ctx.digest[3], ctx.digest[4], ctx.digest[5], ctx.digest[6], ctx.digest[7], ctx.digest[8], ctx.digest[9], ctx.digest[10], ctx.digest[11], ctx.digest[12], ctx.digest[13], ctx.digest[14], ctx.digest[15]); frame_put_u8(oframe, RV_ILLEGAL); frame_put_data(oframe, ctx.digest, sizeof(ctx.digest)); return RV_ILLEGAL; } if (FLASH_ERR_OK != (rv = flash_erase(dst, len))) { log_report_fmt(LOG_SS_MEMORY, "flash_erase(0x%08x, %d) FAILED! (%d)\n", dst, len, rv); frame_put_u8(oframe, RV_ERROR); return RV_ERROR; } log_report_fmt(LOG_SS_MEMORY_VERBOSE, "flash_erase(0x%08x, %d) success!\n", dst, len); if (FLASH_ERR_OK != (rv = flash_write(dst, src, len))) { log_report_fmt(LOG_SS_MEMORY, "_flash_write(0x%08x, 0x%08x, %d) failed! (%d)\n", dst, src, len, rv); frame_put_u8(oframe, RV_PARTIAL); return RV_ERROR; } log_report_fmt(LOG_SS_MEMORY_VERBOSE, "flash_write_mem(0x%08x, 0x%08x, %d) success!\n", dst, src, len); frame_put_u8(oframe, RV_SUCCESS); return RV_SUCCESS; }