Introduce rom_copy
We have several rom helpers currently, but none of them can get us code that spans several roms into a pointer. This patch introduces a function that copies over rom contents. Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
ff06108b18
commit
235f86ef01
38
hw/loader.c
38
hw/loader.c
@ -708,6 +708,44 @@ static Rom *find_rom(target_phys_addr_t addr)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int rom_copy(uint8_t *dest, target_phys_addr_t addr, size_t size)
|
||||
{
|
||||
target_phys_addr_t end = addr + size;
|
||||
uint8_t *s, *d = dest;
|
||||
size_t l = 0;
|
||||
Rom *rom;
|
||||
|
||||
QTAILQ_FOREACH(rom, &roms, next) {
|
||||
if (rom->max)
|
||||
continue;
|
||||
if (rom->min > addr)
|
||||
continue;
|
||||
if (rom->min + rom->romsize < addr)
|
||||
continue;
|
||||
if (rom->min > end)
|
||||
break;
|
||||
if (!rom->data)
|
||||
continue;
|
||||
|
||||
d = dest + (rom->min - addr);
|
||||
s = rom->data;
|
||||
l = rom->romsize;
|
||||
|
||||
if (rom->min < addr) {
|
||||
d = dest;
|
||||
s += (addr - rom->min);
|
||||
l -= (addr - rom->min);
|
||||
}
|
||||
if ((d + l) > (dest + size)) {
|
||||
l = dest - d;
|
||||
}
|
||||
|
||||
memcpy(d, s, l);
|
||||
}
|
||||
|
||||
return (d + l) - dest;
|
||||
}
|
||||
|
||||
void *rom_ptr(target_phys_addr_t addr)
|
||||
{
|
||||
Rom *rom;
|
||||
|
@ -24,6 +24,7 @@ int rom_add_file(const char *file,
|
||||
int rom_add_blob(const char *name, const void *blob, size_t len,
|
||||
target_phys_addr_t min, target_phys_addr_t max, int align);
|
||||
int rom_load_all(void);
|
||||
int rom_copy(uint8_t *dest, target_phys_addr_t addr, size_t size);
|
||||
void *rom_ptr(target_phys_addr_t addr);
|
||||
void do_info_roms(Monitor *mon);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user