Esempio n. 1
0
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);
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
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;
}