This patch adds infrastructure to maintain memory regions which must be restored on reset. That includes roms (vga bios and option roms on pc), but is also used when loading linux kernels directly. Features: - loading files is supported. - passing blobs is supported. - target address range is supported (for optionrom area). - fixed target memory address is supported (linux kernel). New in v2: - writes to ROM are done only at initial boot. - also handle aout and uimage loaders. - drop unused fread_targphys() function. The final memory layout is created once all memory regions are registered. The option roms get addresses assigned and the registered regions are checked against overlaps. Finally all data is copyed to the guest memory. Advantages: (1) Filling memory on initial boot and on reset takes the same code path, making reset more robust. (2) The need to keep track of the option rom load address is gone. (3) Due to (2) option roms can be loaded outside pc_init(). This allows to move the pxe rom loading into the nic drivers for example. Additional bonus: There is a 'info roms' monitor command now. The patch also switches over pc.c and removes the option_rom_setup_reset() and load_option_rom() functions. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
45 lines
1.8 KiB
C
45 lines
1.8 KiB
C
#ifndef LOADER_H
|
|
#define LOADER_H
|
|
|
|
/* loader.c */
|
|
int get_image_size(const char *filename);
|
|
int load_image(const char *filename, uint8_t *addr); /* deprecated */
|
|
int load_image_targphys(const char *filename, target_phys_addr_t, int max_sz);
|
|
int load_elf(const char *filename, int64_t address_offset,
|
|
uint64_t *pentry, uint64_t *lowaddr, uint64_t *highaddr,
|
|
int big_endian, int elf_machine, int clear_lsb);
|
|
int load_aout(const char *filename, target_phys_addr_t addr, int max_sz,
|
|
int bswap_needed, target_phys_addr_t target_page_size);
|
|
int load_uimage(const char *filename, target_phys_addr_t *ep,
|
|
target_phys_addr_t *loadaddr, int *is_linux);
|
|
|
|
int read_targphys(const char *name,
|
|
int fd, target_phys_addr_t dst_addr, size_t nbytes);
|
|
void pstrcpy_targphys(target_phys_addr_t dest, int buf_size,
|
|
const char *source);
|
|
|
|
int rom_add_file(const char *file,
|
|
target_phys_addr_t min, target_phys_addr_t max, int align);
|
|
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);
|
|
void do_info_roms(Monitor *mon);
|
|
|
|
#define rom_add_file_fixed(_f, _a) \
|
|
rom_add_file(_f, _a, 0, 0)
|
|
#define rom_add_blob_fixed(_f, _b, _l, _a) \
|
|
rom_add_blob(_f, _b, _l, _a, 0, 0)
|
|
|
|
#define PC_ROM_MIN_VGA 0xc0000
|
|
#define PC_ROM_MIN_OPTION 0xc8000
|
|
#define PC_ROM_MAX 0xe0000
|
|
#define PC_ROM_ALIGN 0x800
|
|
#define PC_ROM_SIZE (PC_ROM_MAX - PC_ROM_MIN_VGA)
|
|
|
|
#define rom_add_vga(_f) \
|
|
rom_add_file(_f, PC_ROM_MIN_VGA, PC_ROM_MAX, PC_ROM_ALIGN)
|
|
#define rom_add_option(_f) \
|
|
rom_add_file(_f, PC_ROM_MIN_OPTION, PC_ROM_MAX, PC_ROM_ALIGN)
|
|
|
|
#endif
|