Exemple #1
0
void fw_cfg_add_file_callback(FWCfgState *s,  const char *filename,
                              FWCfgReadCallback callback, void *callback_opaque,
                              void *data, size_t len)
{
    int i, index;
    size_t dsize;

    if (!s->files) {
        dsize = sizeof(uint32_t) + sizeof(FWCfgFile) * FW_CFG_FILE_SLOTS;
        s->files = g_malloc0(dsize);
        fw_cfg_add_bytes(s, FW_CFG_FILE_DIR, s->files, dsize);
    }

    index = be32_to_cpu(s->files->count);
    assert(index < FW_CFG_FILE_SLOTS);

    fw_cfg_add_bytes_read_callback(s, FW_CFG_FILE_FIRST + index,
                                   callback, callback_opaque, data, len);

    pstrcpy(s->files->f[index].name, sizeof(s->files->f[index].name),
            filename);
    for (i = 0; i < index; i++) {
        if (strcmp(s->files->f[index].name, s->files->f[i].name) == 0) {
            trace_fw_cfg_add_file_dupe(s, s->files->f[index].name);
            return;
        }
    }

    s->files->f[index].size   = cpu_to_be32(len);
    s->files->f[index].select = cpu_to_be16(FW_CFG_FILE_FIRST + index);
    trace_fw_cfg_add_file(s, index, s->files->f[index].name, len);

    s->files->count = cpu_to_be32(index+1);
}
Exemple #2
0
int fw_cfg_add_file_callback(fw_cfg_state_t *s,  const char *filename,
			     FWCfgReadCallback callback, void *callback_opaque,
			     void *data, size_t len)
{
	int i, index;
	size_t dsize;

	if (!s->files) {
		dsize = sizeof(u32) + sizeof(fw_cfg_file_t) * FW_CFG_FILE_SLOTS;
		s->files = vmm_zalloc(dsize);
		fw_cfg_add_bytes(s, FW_CFG_FILE_DIR, s->files, dsize);
	}

	index = vmm_be32_to_cpu(s->files->count);
	if (index >= FW_CFG_FILE_SLOTS)
		return VMM_EFAIL;

	fw_cfg_add_bytes_read_callback(s, FW_CFG_FILE_FIRST + index,
				       callback, callback_opaque, data, len);

	strcpy(s->files->f[index].name, filename);

	for (i = 0; i < index; i++) {
		if (strcmp(s->files->f[index].name, s->files->f[i].name) == 0) {
			vmm_printf("%s: Duplicate entry\n", __func__);
			return VMM_OK;
		}
	}

	s->files->f[index].size   = vmm_cpu_to_be32(len);
	s->files->f[index].select = vmm_cpu_to_be16(FW_CFG_FILE_FIRST + index);

	s->files->count = vmm_cpu_to_be32(index+1);

	return VMM_OK;
}
Exemple #3
0
int fw_cfg_add_bytes(fw_cfg_state_t *s, u16 key, void *data, size_t len)
{
	return fw_cfg_add_bytes_read_callback(s, key, NULL, NULL, data, len);
}
Exemple #4
0
void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len)
{
    fw_cfg_add_bytes_read_callback(s, key, NULL, NULL, data, len);
}