Revision d87072ce hw/nvram/fw_cfg.c
b/hw/nvram/fw_cfg.c | ||
---|---|---|
42 | 42 |
uint8_t *data; |
43 | 43 |
void *callback_opaque; |
44 | 44 |
FWCfgCallback callback; |
45 |
FWCfgReadCallback read_callback; |
|
45 | 46 |
} FWCfgEntry; |
46 | 47 |
|
47 | 48 |
struct FWCfgState { |
... | ... | |
249 | 250 |
|
250 | 251 |
if (s->cur_entry == FW_CFG_INVALID || !e->data || s->cur_offset >= e->len) |
251 | 252 |
ret = 0; |
252 |
else |
|
253 |
else { |
|
254 |
if (e->read_callback) { |
|
255 |
e->read_callback(e->callback_opaque, s->cur_offset); |
|
256 |
} |
|
253 | 257 |
ret = e->data[s->cur_offset++]; |
258 |
} |
|
254 | 259 |
|
255 | 260 |
trace_fw_cfg_read(s, ret); |
256 | 261 |
return ret; |
... | ... | |
381 | 386 |
} |
382 | 387 |
}; |
383 | 388 |
|
384 |
void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len) |
|
389 |
static void fw_cfg_add_bytes_read_callback(FWCfgState *s, uint16_t key, |
|
390 |
FWCfgReadCallback callback, |
|
391 |
void *callback_opaque, |
|
392 |
void *data, size_t len) |
|
385 | 393 |
{ |
386 | 394 |
int arch = !!(key & FW_CFG_ARCH_LOCAL); |
387 | 395 |
|
... | ... | |
391 | 399 |
|
392 | 400 |
s->entries[arch][key].data = data; |
393 | 401 |
s->entries[arch][key].len = (uint32_t)len; |
402 |
s->entries[arch][key].read_callback = callback; |
|
403 |
s->entries[arch][key].callback_opaque = callback_opaque; |
|
404 |
} |
|
405 |
|
|
406 |
void fw_cfg_add_bytes(FWCfgState *s, uint16_t key, void *data, size_t len) |
|
407 |
{ |
|
408 |
fw_cfg_add_bytes_read_callback(s, key, NULL, NULL, data, len); |
|
394 | 409 |
} |
395 | 410 |
|
396 | 411 |
void fw_cfg_add_string(FWCfgState *s, uint16_t key, const char *value) |
... | ... | |
444 | 459 |
s->entries[arch][key].callback = callback; |
445 | 460 |
} |
446 | 461 |
|
447 |
void fw_cfg_add_file(FWCfgState *s, const char *filename, |
|
448 |
void *data, size_t len) |
|
462 |
void fw_cfg_add_file_callback(FWCfgState *s, const char *filename, |
|
463 |
FWCfgReadCallback callback, void *callback_opaque, |
|
464 |
void *data, size_t len) |
|
449 | 465 |
{ |
450 | 466 |
int i, index; |
451 | 467 |
size_t dsize; |
... | ... | |
459 | 475 |
index = be32_to_cpu(s->files->count); |
460 | 476 |
assert(index < FW_CFG_FILE_SLOTS); |
461 | 477 |
|
462 |
fw_cfg_add_bytes(s, FW_CFG_FILE_FIRST + index, data, len); |
|
478 |
fw_cfg_add_bytes_read_callback(s, FW_CFG_FILE_FIRST + index, |
|
479 |
callback, callback_opaque, data, len); |
|
463 | 480 |
|
464 | 481 |
pstrcpy(s->files->f[index].name, sizeof(s->files->f[index].name), |
465 | 482 |
filename); |
... | ... | |
477 | 494 |
s->files->count = cpu_to_be32(index+1); |
478 | 495 |
} |
479 | 496 |
|
497 |
void fw_cfg_add_file(FWCfgState *s, const char *filename, |
|
498 |
void *data, size_t len) |
|
499 |
{ |
|
500 |
fw_cfg_add_file_callback(s, filename, NULL, NULL, data, len); |
|
501 |
} |
|
502 |
|
|
480 | 503 |
static void fw_cfg_machine_ready(struct Notifier *n, void *data) |
481 | 504 |
{ |
482 | 505 |
size_t len; |
Also available in: Unified diff