hw/core/loader: return image sizes as ssize_t
Various loader functions return an int which limits images to 2GB which is fine for things like a BIOS/kernel image, but if we want to be able to load memory images or large ramdisks then any file over 2GB would silently fail to load. Cc: Luc Michel <lmichel@kalray.eu> Signed-off-by: Jamie Iles <jamie@nuviainc.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Reviewed-by: Luc Michel <lmichel@kalray.eu> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-Id: <20211111141141.3295094-2-jamie@nuviainc.com> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
This commit is contained in:
parent
40244040a7
commit
af9751316e
@ -570,7 +570,7 @@ static void armv7m_reset(void *opaque)
|
|||||||
|
|
||||||
void armv7m_load_kernel(ARMCPU *cpu, const char *kernel_filename, int mem_size)
|
void armv7m_load_kernel(ARMCPU *cpu, const char *kernel_filename, int mem_size)
|
||||||
{
|
{
|
||||||
int image_size;
|
ssize_t image_size;
|
||||||
uint64_t entry;
|
uint64_t entry;
|
||||||
int big_endian;
|
int big_endian;
|
||||||
AddressSpace *as;
|
AddressSpace *as;
|
||||||
|
@ -881,7 +881,7 @@ static int do_arm_linux_init(Object *obj, void *opaque)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int64_t arm_load_elf(struct arm_boot_info *info, uint64_t *pentry,
|
static ssize_t arm_load_elf(struct arm_boot_info *info, uint64_t *pentry,
|
||||||
uint64_t *lowaddr, uint64_t *highaddr,
|
uint64_t *lowaddr, uint64_t *highaddr,
|
||||||
int elf_machine, AddressSpace *as)
|
int elf_machine, AddressSpace *as)
|
||||||
{
|
{
|
||||||
@ -892,7 +892,7 @@ static int64_t arm_load_elf(struct arm_boot_info *info, uint64_t *pentry,
|
|||||||
} elf_header;
|
} elf_header;
|
||||||
int data_swab = 0;
|
int data_swab = 0;
|
||||||
bool big_endian;
|
bool big_endian;
|
||||||
int64_t ret = -1;
|
ssize_t ret = -1;
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
|
|
||||||
|
|
||||||
@ -1014,7 +1014,7 @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
|
|||||||
/* Set up for a direct boot of a kernel image file. */
|
/* Set up for a direct boot of a kernel image file. */
|
||||||
CPUState *cs;
|
CPUState *cs;
|
||||||
AddressSpace *as = arm_boot_address_space(cpu, info);
|
AddressSpace *as = arm_boot_address_space(cpu, info);
|
||||||
int kernel_size;
|
ssize_t kernel_size;
|
||||||
int initrd_size;
|
int initrd_size;
|
||||||
int is_linux = 0;
|
int is_linux = 0;
|
||||||
uint64_t elf_entry;
|
uint64_t elf_entry;
|
||||||
@ -1093,7 +1093,7 @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
|
|||||||
|
|
||||||
if (kernel_size > info->ram_size) {
|
if (kernel_size > info->ram_size) {
|
||||||
error_report("kernel '%s' is too large to fit in RAM "
|
error_report("kernel '%s' is too large to fit in RAM "
|
||||||
"(kernel size %d, RAM size %" PRId64 ")",
|
"(kernel size %zd, RAM size %" PRId64 ")",
|
||||||
info->kernel_filename, kernel_size, info->ram_size);
|
info->kernel_filename, kernel_size, info->ram_size);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
@ -67,7 +67,7 @@ static void generic_loader_realize(DeviceState *dev, Error **errp)
|
|||||||
GenericLoaderState *s = GENERIC_LOADER(dev);
|
GenericLoaderState *s = GENERIC_LOADER(dev);
|
||||||
hwaddr entry;
|
hwaddr entry;
|
||||||
int big_endian;
|
int big_endian;
|
||||||
int size = 0;
|
ssize_t size = 0;
|
||||||
|
|
||||||
s->set_pc = false;
|
s->set_pc = false;
|
||||||
|
|
||||||
|
@ -114,17 +114,17 @@ ssize_t read_targphys(const char *name,
|
|||||||
return did;
|
return did;
|
||||||
}
|
}
|
||||||
|
|
||||||
int load_image_targphys(const char *filename,
|
ssize_t load_image_targphys(const char *filename,
|
||||||
hwaddr addr, uint64_t max_sz)
|
hwaddr addr, uint64_t max_sz)
|
||||||
{
|
{
|
||||||
return load_image_targphys_as(filename, addr, max_sz, NULL);
|
return load_image_targphys_as(filename, addr, max_sz, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* return the size or -1 if error */
|
/* return the size or -1 if error */
|
||||||
int load_image_targphys_as(const char *filename,
|
ssize_t load_image_targphys_as(const char *filename,
|
||||||
hwaddr addr, uint64_t max_sz, AddressSpace *as)
|
hwaddr addr, uint64_t max_sz, AddressSpace *as)
|
||||||
{
|
{
|
||||||
int size;
|
ssize_t size;
|
||||||
|
|
||||||
size = get_image_size(filename);
|
size = get_image_size(filename);
|
||||||
if (size < 0 || size > max_sz) {
|
if (size < 0 || size > max_sz) {
|
||||||
@ -138,9 +138,9 @@ int load_image_targphys_as(const char *filename,
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
int load_image_mr(const char *filename, MemoryRegion *mr)
|
ssize_t load_image_mr(const char *filename, MemoryRegion *mr)
|
||||||
{
|
{
|
||||||
int size;
|
ssize_t size;
|
||||||
|
|
||||||
if (!memory_access_is_direct(mr, false)) {
|
if (!memory_access_is_direct(mr, false)) {
|
||||||
/* Can only load an image into RAM or ROM */
|
/* Can only load an image into RAM or ROM */
|
||||||
@ -222,8 +222,8 @@ static void bswap_ahdr(struct exec *e)
|
|||||||
: (_N_SEGMENT_ROUND (_N_TXTENDADDR(x, target_page_size), target_page_size)))
|
: (_N_SEGMENT_ROUND (_N_TXTENDADDR(x, target_page_size), target_page_size)))
|
||||||
|
|
||||||
|
|
||||||
int load_aout(const char *filename, hwaddr addr, int max_sz,
|
ssize_t load_aout(const char *filename, hwaddr addr, int max_sz,
|
||||||
int bswap_needed, hwaddr target_page_size)
|
int bswap_needed, hwaddr target_page_size)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
ssize_t size, ret;
|
ssize_t size, ret;
|
||||||
@ -617,13 +617,14 @@ toosmall:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Load a U-Boot image. */
|
/* Load a U-Boot image. */
|
||||||
static int load_uboot_image(const char *filename, hwaddr *ep, hwaddr *loadaddr,
|
static ssize_t load_uboot_image(const char *filename, hwaddr *ep,
|
||||||
int *is_linux, uint8_t image_type,
|
hwaddr *loadaddr, int *is_linux,
|
||||||
uint64_t (*translate_fn)(void *, uint64_t),
|
uint8_t image_type,
|
||||||
void *translate_opaque, AddressSpace *as)
|
uint64_t (*translate_fn)(void *, uint64_t),
|
||||||
|
void *translate_opaque, AddressSpace *as)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
int size;
|
ssize_t size;
|
||||||
hwaddr address;
|
hwaddr address;
|
||||||
uboot_image_header_t h;
|
uboot_image_header_t h;
|
||||||
uboot_image_header_t *hdr = &h;
|
uboot_image_header_t *hdr = &h;
|
||||||
@ -760,40 +761,40 @@ out:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int load_uimage(const char *filename, hwaddr *ep, hwaddr *loadaddr,
|
ssize_t load_uimage(const char *filename, hwaddr *ep, hwaddr *loadaddr,
|
||||||
int *is_linux,
|
int *is_linux,
|
||||||
uint64_t (*translate_fn)(void *, uint64_t),
|
uint64_t (*translate_fn)(void *, uint64_t),
|
||||||
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, NULL);
|
translate_fn, translate_opaque, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int load_uimage_as(const char *filename, hwaddr *ep, hwaddr *loadaddr,
|
ssize_t load_uimage_as(const char *filename, hwaddr *ep, hwaddr *loadaddr,
|
||||||
int *is_linux,
|
int *is_linux,
|
||||||
uint64_t (*translate_fn)(void *, uint64_t),
|
uint64_t (*translate_fn)(void *, uint64_t),
|
||||||
void *translate_opaque, AddressSpace *as)
|
void *translate_opaque, AddressSpace *as)
|
||||||
{
|
{
|
||||||
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, as);
|
translate_fn, translate_opaque, as);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load a ramdisk. */
|
/* Load a ramdisk. */
|
||||||
int load_ramdisk(const char *filename, hwaddr addr, uint64_t max_sz)
|
ssize_t load_ramdisk(const char *filename, hwaddr addr, uint64_t max_sz)
|
||||||
{
|
{
|
||||||
return load_ramdisk_as(filename, addr, max_sz, NULL);
|
return load_ramdisk_as(filename, addr, max_sz, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int load_ramdisk_as(const char *filename, hwaddr addr, uint64_t max_sz,
|
ssize_t load_ramdisk_as(const char *filename, hwaddr addr, uint64_t max_sz,
|
||||||
AddressSpace *as)
|
AddressSpace *as)
|
||||||
{
|
{
|
||||||
return load_uboot_image(filename, NULL, &addr, NULL, IH_TYPE_RAMDISK,
|
return load_uboot_image(filename, NULL, &addr, NULL, IH_TYPE_RAMDISK,
|
||||||
NULL, NULL, as);
|
NULL, NULL, as);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Load a gzip-compressed kernel to a dynamically allocated buffer. */
|
/* Load a gzip-compressed kernel to a dynamically allocated buffer. */
|
||||||
int load_image_gzipped_buffer(const char *filename, uint64_t max_sz,
|
ssize_t load_image_gzipped_buffer(const char *filename, uint64_t max_sz,
|
||||||
uint8_t **buffer)
|
uint8_t **buffer)
|
||||||
{
|
{
|
||||||
uint8_t *compressed_data = NULL;
|
uint8_t *compressed_data = NULL;
|
||||||
uint8_t *data = NULL;
|
uint8_t *data = NULL;
|
||||||
@ -838,9 +839,9 @@ int load_image_gzipped_buffer(const char *filename, uint64_t max_sz,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Load a gzip-compressed kernel. */
|
/* Load a gzip-compressed kernel. */
|
||||||
int load_image_gzipped(const char *filename, hwaddr addr, uint64_t max_sz)
|
ssize_t load_image_gzipped(const char *filename, hwaddr addr, uint64_t max_sz)
|
||||||
{
|
{
|
||||||
int bytes;
|
ssize_t bytes;
|
||||||
uint8_t *data;
|
uint8_t *data;
|
||||||
|
|
||||||
bytes = load_image_gzipped_buffer(filename, max_sz, &data);
|
bytes = load_image_gzipped_buffer(filename, max_sz, &data);
|
||||||
@ -970,14 +971,15 @@ static void *rom_set_mr(Rom *rom, Object *owner, const char *name, bool ro)
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rom_add_file(const char *file, const char *fw_dir,
|
ssize_t rom_add_file(const char *file, const char *fw_dir,
|
||||||
hwaddr addr, int32_t bootindex,
|
hwaddr addr, int32_t bootindex,
|
||||||
bool option_rom, MemoryRegion *mr,
|
bool option_rom, MemoryRegion *mr,
|
||||||
AddressSpace *as)
|
AddressSpace *as)
|
||||||
{
|
{
|
||||||
MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
|
MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine());
|
||||||
Rom *rom;
|
Rom *rom;
|
||||||
int rc, fd = -1;
|
ssize_t rc;
|
||||||
|
int fd = -1;
|
||||||
char devpath[100];
|
char devpath[100];
|
||||||
|
|
||||||
if (as && mr) {
|
if (as && mr) {
|
||||||
@ -1019,7 +1021,7 @@ int rom_add_file(const char *file, const char *fw_dir,
|
|||||||
lseek(fd, 0, SEEK_SET);
|
lseek(fd, 0, SEEK_SET);
|
||||||
rc = read(fd, rom->data, rom->datasize);
|
rc = read(fd, rom->data, rom->datasize);
|
||||||
if (rc != rom->datasize) {
|
if (rc != rom->datasize) {
|
||||||
fprintf(stderr, "rom: file %-20s: read error: rc=%d (expected %zd)\n",
|
fprintf(stderr, "rom: file %-20s: read error: rc=%zd (expected %zd)\n",
|
||||||
rom->name, rc, rom->datasize);
|
rom->name, rc, rom->datasize);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
@ -1138,12 +1140,12 @@ int rom_add_elf_program(const char *name, GMappedFile *mapped_file, void *data,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rom_add_vga(const char *file)
|
ssize_t rom_add_vga(const char *file)
|
||||||
{
|
{
|
||||||
return rom_add_file(file, "vgaroms", 0, -1, true, NULL, NULL);
|
return rom_add_file(file, "vgaroms", 0, -1, true, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int rom_add_option(const char *file, int32_t bootindex)
|
ssize_t rom_add_option(const char *file, int32_t bootindex)
|
||||||
{
|
{
|
||||||
return rom_add_file(file, "genroms", 0, bootindex, true, NULL, NULL);
|
return rom_add_file(file, "genroms", 0, bootindex, true, NULL, NULL);
|
||||||
}
|
}
|
||||||
@ -1846,11 +1848,12 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* return size or -1 if error */
|
/* return size or -1 if error */
|
||||||
int load_targphys_hex_as(const char *filename, hwaddr *entry, AddressSpace *as)
|
ssize_t load_targphys_hex_as(const char *filename, hwaddr *entry,
|
||||||
|
AddressSpace *as)
|
||||||
{
|
{
|
||||||
gsize hex_blob_size;
|
gsize hex_blob_size;
|
||||||
gchar *hex_blob;
|
gchar *hex_blob;
|
||||||
int total_size = 0;
|
ssize_t total_size = 0;
|
||||||
|
|
||||||
if (!g_file_get_contents(filename, &hex_blob, &hex_blob_size, NULL)) {
|
if (!g_file_get_contents(filename, &hex_blob, &hex_blob_size, NULL)) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1115,7 +1115,7 @@ void x86_bios_rom_init(MachineState *ms, const char *default_firmware,
|
|||||||
char *filename;
|
char *filename;
|
||||||
MemoryRegion *bios, *isa_bios;
|
MemoryRegion *bios, *isa_bios;
|
||||||
int bios_size, isa_bios_size;
|
int bios_size, isa_bios_size;
|
||||||
int ret;
|
ssize_t ret;
|
||||||
|
|
||||||
/* BIOS load */
|
/* BIOS load */
|
||||||
bios_name = ms->firmware ?: default_firmware;
|
bios_name = ms->firmware ?: default_firmware;
|
||||||
|
@ -129,7 +129,8 @@ target_ulong riscv_load_firmware(const char *firmware_filename,
|
|||||||
hwaddr firmware_load_addr,
|
hwaddr firmware_load_addr,
|
||||||
symbol_fn_t sym_cb)
|
symbol_fn_t sym_cb)
|
||||||
{
|
{
|
||||||
uint64_t firmware_entry, firmware_size, firmware_end;
|
uint64_t firmware_entry, firmware_end;
|
||||||
|
ssize_t firmware_size;
|
||||||
|
|
||||||
if (load_elf_ram_sym(firmware_filename, NULL, NULL, NULL,
|
if (load_elf_ram_sym(firmware_filename, NULL, NULL, NULL,
|
||||||
&firmware_entry, NULL, &firmware_end, NULL,
|
&firmware_entry, NULL, &firmware_end, NULL,
|
||||||
@ -185,7 +186,7 @@ target_ulong riscv_load_kernel(const char *kernel_filename,
|
|||||||
hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size,
|
hwaddr riscv_load_initrd(const char *filename, uint64_t mem_size,
|
||||||
uint64_t kernel_entry, hwaddr *start)
|
uint64_t kernel_entry, hwaddr *start)
|
||||||
{
|
{
|
||||||
int size;
|
ssize_t size;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We want to put the initrd far enough into RAM that when the
|
* We want to put the initrd far enough into RAM that when the
|
||||||
|
@ -40,8 +40,8 @@ ssize_t load_image_size(const char *filename, void *addr, size_t size);
|
|||||||
*
|
*
|
||||||
* Returns the size of the loaded image on success, -1 otherwise.
|
* Returns the size of the loaded image on success, -1 otherwise.
|
||||||
*/
|
*/
|
||||||
int load_image_targphys_as(const char *filename,
|
ssize_t load_image_targphys_as(const char *filename,
|
||||||
hwaddr addr, uint64_t max_sz, AddressSpace *as);
|
hwaddr addr, uint64_t max_sz, AddressSpace *as);
|
||||||
|
|
||||||
/**load_targphys_hex_as:
|
/**load_targphys_hex_as:
|
||||||
* @filename: Path to the .hex file
|
* @filename: Path to the .hex file
|
||||||
@ -53,14 +53,15 @@ int load_image_targphys_as(const char *filename,
|
|||||||
*
|
*
|
||||||
* Returns the size of the loaded .hex file on success, -1 otherwise.
|
* Returns the size of the loaded .hex file on success, -1 otherwise.
|
||||||
*/
|
*/
|
||||||
int load_targphys_hex_as(const char *filename, hwaddr *entry, AddressSpace *as);
|
ssize_t load_targphys_hex_as(const char *filename, hwaddr *entry,
|
||||||
|
AddressSpace *as);
|
||||||
|
|
||||||
/** load_image_targphys:
|
/** load_image_targphys:
|
||||||
* Same as load_image_targphys_as(), but doesn't allow the caller to specify
|
* Same as load_image_targphys_as(), but doesn't allow the caller to specify
|
||||||
* an AddressSpace.
|
* an AddressSpace.
|
||||||
*/
|
*/
|
||||||
int load_image_targphys(const char *filename, hwaddr,
|
ssize_t load_image_targphys(const char *filename, hwaddr,
|
||||||
uint64_t max_sz);
|
uint64_t max_sz);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* load_image_mr: load an image into a memory region
|
* load_image_mr: load an image into a memory region
|
||||||
@ -73,7 +74,7 @@ int load_image_targphys(const char *filename, hwaddr,
|
|||||||
* If the file is larger than the memory region's size the call will fail.
|
* If the file is larger than the memory region's size the call will fail.
|
||||||
* Returns -1 on failure, or the size of the file.
|
* Returns -1 on failure, or the size of the file.
|
||||||
*/
|
*/
|
||||||
int load_image_mr(const char *filename, MemoryRegion *mr);
|
ssize_t load_image_mr(const char *filename, MemoryRegion *mr);
|
||||||
|
|
||||||
/* This is the limit on the maximum uncompressed image size that
|
/* This is the limit on the maximum uncompressed image size that
|
||||||
* load_image_gzipped_buffer() and load_image_gzipped() will read. It prevents
|
* load_image_gzipped_buffer() and load_image_gzipped() will read. It prevents
|
||||||
@ -81,9 +82,9 @@ int load_image_mr(const char *filename, MemoryRegion *mr);
|
|||||||
*/
|
*/
|
||||||
#define LOAD_IMAGE_MAX_GUNZIP_BYTES (256 << 20)
|
#define LOAD_IMAGE_MAX_GUNZIP_BYTES (256 << 20)
|
||||||
|
|
||||||
int load_image_gzipped_buffer(const char *filename, uint64_t max_sz,
|
ssize_t load_image_gzipped_buffer(const char *filename, uint64_t max_sz,
|
||||||
uint8_t **buffer);
|
uint8_t **buffer);
|
||||||
int load_image_gzipped(const char *filename, hwaddr addr, uint64_t max_sz);
|
ssize_t load_image_gzipped(const char *filename, hwaddr addr, uint64_t max_sz);
|
||||||
|
|
||||||
#define ELF_LOAD_FAILED -1
|
#define ELF_LOAD_FAILED -1
|
||||||
#define ELF_LOAD_NOT_ELF -2
|
#define ELF_LOAD_NOT_ELF -2
|
||||||
@ -183,8 +184,8 @@ ssize_t load_elf(const char *filename,
|
|||||||
*/
|
*/
|
||||||
void load_elf_hdr(const char *filename, void *hdr, bool *is64, Error **errp);
|
void load_elf_hdr(const char *filename, void *hdr, bool *is64, Error **errp);
|
||||||
|
|
||||||
int load_aout(const char *filename, hwaddr addr, int max_sz,
|
ssize_t load_aout(const char *filename, hwaddr addr, int max_sz,
|
||||||
int bswap_needed, hwaddr target_page_size);
|
int bswap_needed, hwaddr target_page_size);
|
||||||
|
|
||||||
#define LOAD_UIMAGE_LOADADDR_INVALID (-1)
|
#define LOAD_UIMAGE_LOADADDR_INVALID (-1)
|
||||||
|
|
||||||
@ -205,19 +206,19 @@ int load_aout(const char *filename, hwaddr addr, int max_sz,
|
|||||||
*
|
*
|
||||||
* Returns the size of the loaded image on success, -1 otherwise.
|
* Returns the size of the loaded image on success, -1 otherwise.
|
||||||
*/
|
*/
|
||||||
int load_uimage_as(const char *filename, hwaddr *ep,
|
ssize_t load_uimage_as(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),
|
||||||
void *translate_opaque, AddressSpace *as);
|
void *translate_opaque, AddressSpace *as);
|
||||||
|
|
||||||
/** load_uimage:
|
/** load_uimage:
|
||||||
* Same as load_uimage_as(), but doesn't allow the caller to specify an
|
* Same as load_uimage_as(), but doesn't allow the caller to specify an
|
||||||
* AddressSpace.
|
* AddressSpace.
|
||||||
*/
|
*/
|
||||||
int load_uimage(const char *filename, hwaddr *ep,
|
ssize_t 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),
|
||||||
void *translate_opaque);
|
void *translate_opaque);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* load_ramdisk_as:
|
* load_ramdisk_as:
|
||||||
@ -232,15 +233,15 @@ int load_uimage(const char *filename, hwaddr *ep,
|
|||||||
*
|
*
|
||||||
* Returns the size of the loaded image on success, -1 otherwise.
|
* Returns the size of the loaded image on success, -1 otherwise.
|
||||||
*/
|
*/
|
||||||
int load_ramdisk_as(const char *filename, hwaddr addr, uint64_t max_sz,
|
ssize_t load_ramdisk_as(const char *filename, hwaddr addr, uint64_t max_sz,
|
||||||
AddressSpace *as);
|
AddressSpace *as);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* load_ramdisk:
|
* load_ramdisk:
|
||||||
* Same as load_ramdisk_as(), but doesn't allow the caller to specify
|
* Same as load_ramdisk_as(), but doesn't allow the caller to specify
|
||||||
* an AddressSpace.
|
* an AddressSpace.
|
||||||
*/
|
*/
|
||||||
int load_ramdisk(const char *filename, hwaddr addr, uint64_t max_sz);
|
ssize_t load_ramdisk(const char *filename, hwaddr addr, uint64_t max_sz);
|
||||||
|
|
||||||
ssize_t gunzip(void *dst, size_t dstlen, uint8_t *src, size_t srclen);
|
ssize_t gunzip(void *dst, size_t dstlen, uint8_t *src, size_t srclen);
|
||||||
|
|
||||||
@ -253,9 +254,9 @@ void pstrcpy_targphys(const char *name,
|
|||||||
extern bool option_rom_has_mr;
|
extern bool option_rom_has_mr;
|
||||||
extern bool rom_file_has_mr;
|
extern bool rom_file_has_mr;
|
||||||
|
|
||||||
int rom_add_file(const char *file, const char *fw_dir,
|
ssize_t rom_add_file(const char *file, const char *fw_dir,
|
||||||
hwaddr addr, int32_t bootindex,
|
hwaddr addr, int32_t bootindex,
|
||||||
bool option_rom, MemoryRegion *mr, AddressSpace *as);
|
bool option_rom, MemoryRegion *mr, AddressSpace *as);
|
||||||
MemoryRegion *rom_add_blob(const char *name, const void *blob, size_t len,
|
MemoryRegion *rom_add_blob(const char *name, const void *blob, size_t len,
|
||||||
size_t max_len, hwaddr addr,
|
size_t max_len, hwaddr addr,
|
||||||
const char *fw_file_name,
|
const char *fw_file_name,
|
||||||
@ -336,8 +337,8 @@ void hmp_info_roms(Monitor *mon, const QDict *qdict);
|
|||||||
#define rom_add_blob_fixed_as(_f, _b, _l, _a, _as) \
|
#define rom_add_blob_fixed_as(_f, _b, _l, _a, _as) \
|
||||||
rom_add_blob(_f, _b, _l, _l, _a, NULL, NULL, NULL, _as, true)
|
rom_add_blob(_f, _b, _l, _l, _a, NULL, NULL, NULL, _as, true)
|
||||||
|
|
||||||
int rom_add_vga(const char *file);
|
ssize_t rom_add_vga(const char *file);
|
||||||
int rom_add_option(const char *file, int32_t bootindex);
|
ssize_t rom_add_option(const char *file, int32_t bootindex);
|
||||||
|
|
||||||
/* This is the usual maximum in uboot, so if a uImage overflows this, it would
|
/* This is the usual maximum in uboot, so if a uImage overflows this, it would
|
||||||
* overflow on real hardware too. */
|
* overflow on real hardware too. */
|
||||||
|
Loading…
Reference in New Issue
Block a user