diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2009-10-01 16:42:33 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-10-06 14:36:08 -0500 |
commit | 45a50b1668822c23afc2a89f724654e176518bc4 (patch) | |
tree | 0dc2589b1b21401e50f54666c70e42df29c245eb /hw/loader.h | |
parent | dbbaaff6867af255d2cc84dbade4f9b58d823397 (diff) | |
download | qemu-45a50b1668822c23afc2a89f724654e176518bc4.tar.gz qemu-45a50b1668822c23afc2a89f724654e176518bc4.tar.bz2 qemu-45a50b1668822c23afc2a89f724654e176518bc4.zip |
Reorganize option rom (+linux kernel) loading.
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>
Diffstat (limited to 'hw/loader.h')
-rw-r--r-- | hw/loader.h | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/hw/loader.h b/hw/loader.h index 3632008928..031e6adabb 100644 --- a/hw/loader.h +++ b/hw/loader.h @@ -13,9 +13,32 @@ int load_aout(const char *filename, target_phys_addr_t addr, int max_sz, int load_uimage(const char *filename, target_phys_addr_t *ep, target_phys_addr_t *loadaddr, int *is_linux); -int fread_targphys(target_phys_addr_t dst_addr, size_t nbytes, FILE *f); -int fread_targphys_ok(target_phys_addr_t dst_addr, size_t nbytes, FILE *f); -int read_targphys(int fd, target_phys_addr_t dst_addr, size_t nbytes); +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 |