mirror of https://github.com/xemu-project/xemu.git
loader: Add AddressSpace loading support to uImages
Add a new function load_uimage_as() that allows the caller to specify an AddressSpace to use when loading the uImage. The original load_uimage() function doesn't have any change in functionality. Signed-off-by: Alistair Francis <alistair.francis@xilinx.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 1254092e6b80d3cd3cfabafe165d56a96c54c0b5.1474331683.git.alistair.francis@xilinx.com Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
70bb1d16f4
commit
5e774eb3bd
|
@ -581,7 +581,7 @@ static ssize_t gunzip(void *dst, size_t dstlen, uint8_t *src,
|
||||||
static int load_uboot_image(const char *filename, hwaddr *ep, hwaddr *loadaddr,
|
static int load_uboot_image(const char *filename, hwaddr *ep, hwaddr *loadaddr,
|
||||||
int *is_linux, uint8_t image_type,
|
int *is_linux, uint8_t image_type,
|
||||||
uint64_t (*translate_fn)(void *, uint64_t),
|
uint64_t (*translate_fn)(void *, uint64_t),
|
||||||
void *translate_opaque)
|
void *translate_opaque, AddressSpace *as)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
int size;
|
int size;
|
||||||
|
@ -682,7 +682,7 @@ static int load_uboot_image(const char *filename, hwaddr *ep, hwaddr *loadaddr,
|
||||||
hdr->ih_size = bytes;
|
hdr->ih_size = bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
rom_add_blob_fixed(filename, data, hdr->ih_size, address);
|
rom_add_blob_fixed_as(filename, data, hdr->ih_size, address, as);
|
||||||
|
|
||||||
ret = hdr->ih_size;
|
ret = hdr->ih_size;
|
||||||
|
|
||||||
|
@ -698,14 +698,23 @@ int load_uimage(const char *filename, hwaddr *ep, hwaddr *loadaddr,
|
||||||
void *translate_opaque)
|
void *translate_opaque)
|
||||||
{
|
{
|
||||||
return load_uboot_image(filename, ep, loadaddr, is_linux, IH_TYPE_KERNEL,
|
return load_uboot_image(filename, ep, loadaddr, is_linux, IH_TYPE_KERNEL,
|
||||||
translate_fn, translate_opaque);
|
translate_fn, translate_opaque, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
int load_uimage_as(const char *filename, hwaddr *ep, hwaddr *loadaddr,
|
||||||
|
int *is_linux,
|
||||||
|
uint64_t (*translate_fn)(void *, uint64_t),
|
||||||
|
void *translate_opaque, AddressSpace *as)
|
||||||
|
{
|
||||||
|
return load_uboot_image(filename, ep, loadaddr, is_linux, IH_TYPE_KERNEL,
|
||||||
|
translate_fn, translate_opaque, as);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load a ramdisk. */
|
/* Load a ramdisk. */
|
||||||
int load_ramdisk(const char *filename, hwaddr addr, uint64_t max_sz)
|
int load_ramdisk(const char *filename, hwaddr addr, uint64_t max_sz)
|
||||||
{
|
{
|
||||||
return load_uboot_image(filename, NULL, &addr, NULL, IH_TYPE_RAMDISK,
|
return load_uboot_image(filename, NULL, &addr, NULL, IH_TYPE_RAMDISK,
|
||||||
NULL, NULL);
|
NULL, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load a gzip-compressed kernel to a dynamically allocated buffer. */
|
/* Load a gzip-compressed kernel to a dynamically allocated buffer. */
|
||||||
|
|
|
@ -102,6 +102,30 @@ void load_elf_hdr(const char *filename, void *hdr, bool *is64, Error **errp);
|
||||||
|
|
||||||
int load_aout(const char *filename, hwaddr addr, int max_sz,
|
int load_aout(const char *filename, hwaddr addr, int max_sz,
|
||||||
int bswap_needed, hwaddr target_page_size);
|
int bswap_needed, hwaddr target_page_size);
|
||||||
|
|
||||||
|
/** load_uimage_as:
|
||||||
|
* @filename: Path of uimage file
|
||||||
|
* @ep: Populated with program entry point. Ignored if NULL.
|
||||||
|
* @loadaddr: Populated with the load address. Ignored if NULL.
|
||||||
|
* @is_linux: Is set to true if the image loaded is Linux. Ignored if NULL.
|
||||||
|
* @translate_fn: optional function to translate load addresses
|
||||||
|
* @translate_opaque: opaque data passed to @translate_fn
|
||||||
|
* @as: The AddressSpace to load the ELF to. The value of address_space_memory
|
||||||
|
* is used if nothing is supplied here.
|
||||||
|
*
|
||||||
|
* Loads a u-boot image into memory.
|
||||||
|
*
|
||||||
|
* Returns the size of the loaded image on success, -1 otherwise.
|
||||||
|
*/
|
||||||
|
int load_uimage_as(const char *filename, hwaddr *ep,
|
||||||
|
hwaddr *loadaddr, int *is_linux,
|
||||||
|
uint64_t (*translate_fn)(void *, uint64_t),
|
||||||
|
void *translate_opaque, AddressSpace *as);
|
||||||
|
|
||||||
|
/** load_uimage:
|
||||||
|
* Same as load_uimage_as(), but doesn't allow the caller to specify an
|
||||||
|
* AddressSpace.
|
||||||
|
*/
|
||||||
int load_uimage(const char *filename, hwaddr *ep,
|
int load_uimage(const char *filename, hwaddr *ep,
|
||||||
hwaddr *loadaddr, int *is_linux,
|
hwaddr *loadaddr, int *is_linux,
|
||||||
uint64_t (*translate_fn)(void *, uint64_t),
|
uint64_t (*translate_fn)(void *, uint64_t),
|
||||||
|
@ -155,6 +179,8 @@ void hmp_info_roms(Monitor *mon, const QDict *qdict);
|
||||||
rom_add_file(_f, NULL, 0, _i, false, _mr, NULL)
|
rom_add_file(_f, NULL, 0, _i, false, _mr, NULL)
|
||||||
#define rom_add_file_as(_f, _as, _i) \
|
#define rom_add_file_as(_f, _as, _i) \
|
||||||
rom_add_file(_f, NULL, 0, _i, false, NULL, _as)
|
rom_add_file(_f, NULL, 0, _i, false, NULL, _as)
|
||||||
|
#define rom_add_blob_fixed_as(_f, _b, _l, _a, _as) \
|
||||||
|
rom_add_blob(_f, _b, _l, _l, _a, NULL, NULL, _as)
|
||||||
|
|
||||||
#define PC_ROM_MIN_VGA 0xc0000
|
#define PC_ROM_MIN_VGA 0xc0000
|
||||||
#define PC_ROM_MIN_OPTION 0xc8000
|
#define PC_ROM_MIN_OPTION 0xc8000
|
||||||
|
|
Loading…
Reference in New Issue