xref: /qemu/include/hw/loader.h (revision 76151cacfe956248a25b38b5e8429465584f47bb)
1ca20cf32SBlue Swirl #ifndef LOADER_H
2ca20cf32SBlue Swirl #define LOADER_H
384f2d0eaSWenchao Xia #include "qapi/qmp/qdict.h"
4a88b362cSLaszlo Ersek #include "hw/nvram/fw_cfg.h"
5ca20cf32SBlue Swirl 
6ca20cf32SBlue Swirl /* loader.c */
7a1483f88SMichael S. Tsirkin /**
8a1483f88SMichael S. Tsirkin  * get_image_size: retrieve size of an image file
9a1483f88SMichael S. Tsirkin  * @filename: Path to the image file
10a1483f88SMichael S. Tsirkin  *
11a1483f88SMichael S. Tsirkin  * Returns the size of the image file on success, -1 otherwise.
12a1483f88SMichael S. Tsirkin  * On error, errno is also set as appropriate.
13a1483f88SMichael S. Tsirkin  */
14ca20cf32SBlue Swirl int get_image_size(const char *filename);
15ca20cf32SBlue Swirl int load_image(const char *filename, uint8_t *addr); /* deprecated */
16ea87616dSBenjamin Herrenschmidt ssize_t load_image_size(const char *filename, void *addr, size_t size);
17a8170e5eSAvi Kivity int load_image_targphys(const char *filename, hwaddr,
1880a2ba3dSMark Langsdorf                         uint64_t max_sz);
19*76151cacSPeter Maydell /**
20*76151cacSPeter Maydell  * load_image_mr: load an image into a memory region
21*76151cacSPeter Maydell  * @filename: Path to the image file
22*76151cacSPeter Maydell  * @mr: Memory Region to load into
23*76151cacSPeter Maydell  *
24*76151cacSPeter Maydell  * Load the specified file into the memory region.
25*76151cacSPeter Maydell  * The file loaded is registered as a ROM, so its contents will be
26*76151cacSPeter Maydell  * reinstated whenever the system is reset.
27*76151cacSPeter Maydell  * If the file is larger than the memory region's size the call will fail.
28*76151cacSPeter Maydell  * Returns -1 on failure, or the size of the file.
29*76151cacSPeter Maydell  */
30*76151cacSPeter Maydell int load_image_mr(const char *filename, MemoryRegion *mr);
317d48a0f7SLaszlo Ersek 
327d48a0f7SLaszlo Ersek /* This is the limit on the maximum uncompressed image size that
337d48a0f7SLaszlo Ersek  * load_image_gzipped_buffer() and load_image_gzipped() will read. It prevents
347d48a0f7SLaszlo Ersek  * g_malloc() in those functions from allocating a huge amount of memory.
357d48a0f7SLaszlo Ersek  */
367d48a0f7SLaszlo Ersek #define LOAD_IMAGE_MAX_GUNZIP_BYTES (256 << 20)
377d48a0f7SLaszlo Ersek 
387d48a0f7SLaszlo Ersek int load_image_gzipped_buffer(const char *filename, uint64_t max_sz,
397d48a0f7SLaszlo Ersek                               uint8_t **buffer);
40235e74afSRichard W.M. Jones int load_image_gzipped(const char *filename, hwaddr addr, uint64_t max_sz);
4118674b26SAlexey Kardashevskiy 
4218674b26SAlexey Kardashevskiy #define ELF_LOAD_FAILED       -1
4318674b26SAlexey Kardashevskiy #define ELF_LOAD_NOT_ELF      -2
4418674b26SAlexey Kardashevskiy #define ELF_LOAD_WRONG_ARCH   -3
4518674b26SAlexey Kardashevskiy #define ELF_LOAD_WRONG_ENDIAN -4
4618674b26SAlexey Kardashevskiy const char *load_elf_strerror(int error);
47409dbce5SAurelien Jarno int load_elf(const char *filename, uint64_t (*translate_fn)(void *, uint64_t),
48409dbce5SAurelien Jarno              void *translate_opaque, uint64_t *pentry, uint64_t *lowaddr,
49409dbce5SAurelien Jarno              uint64_t *highaddr, int big_endian, int elf_machine,
50409dbce5SAurelien Jarno              int clear_lsb);
51a8170e5eSAvi Kivity int load_aout(const char *filename, hwaddr addr, int max_sz,
52a8170e5eSAvi Kivity               int bswap_needed, hwaddr target_page_size);
53a8170e5eSAvi Kivity int load_uimage(const char *filename, hwaddr *ep,
5425bda50aSMax Filippov                 hwaddr *loadaddr, int *is_linux,
5525bda50aSMax Filippov                 uint64_t (*translate_fn)(void *, uint64_t),
5625bda50aSMax Filippov                 void *translate_opaque);
57ca20cf32SBlue Swirl 
5884aee0deSSoren Brinkmann /**
5984aee0deSSoren Brinkmann  * load_ramdisk:
6084aee0deSSoren Brinkmann  * @filename: Path to the ramdisk image
6184aee0deSSoren Brinkmann  * @addr: Memory address to load the ramdisk to
6284aee0deSSoren Brinkmann  * @max_sz: Maximum allowed ramdisk size (for non-u-boot ramdisks)
6384aee0deSSoren Brinkmann  *
6484aee0deSSoren Brinkmann  * Load a ramdisk image with U-Boot header to the specified memory
6584aee0deSSoren Brinkmann  * address.
6684aee0deSSoren Brinkmann  *
6784aee0deSSoren Brinkmann  * Returns the size of the loaded image on success, -1 otherwise.
6884aee0deSSoren Brinkmann  */
6984aee0deSSoren Brinkmann int load_ramdisk(const char *filename, hwaddr addr, uint64_t max_sz);
7084aee0deSSoren Brinkmann 
71725e14e9SMarkus Armbruster ssize_t read_targphys(const char *name,
72a8170e5eSAvi Kivity                       int fd, hwaddr dst_addr, size_t nbytes);
733c178e72SGerd Hoffmann void pstrcpy_targphys(const char *name,
74a8170e5eSAvi Kivity                       hwaddr dest, int buf_size,
75ca20cf32SBlue Swirl                       const char *source);
7645a50b16SGerd Hoffmann 
77ac41881bSMichael S. Tsirkin extern bool option_rom_has_mr;
7898bc3ab0SMichael S. Tsirkin extern bool rom_file_has_mr;
79bdb5ee30SGerd Hoffmann 
80bdb5ee30SGerd Hoffmann int rom_add_file(const char *file, const char *fw_dir,
81ac41881bSMichael S. Tsirkin                  hwaddr addr, int32_t bootindex,
82*76151cacSPeter Maydell                  bool option_rom, MemoryRegion *mr);
83339240b5SPaolo Bonzini MemoryRegion *rom_add_blob(const char *name, const void *blob, size_t len,
84339240b5SPaolo Bonzini                            size_t max_len, hwaddr addr,
85339240b5SPaolo Bonzini                            const char *fw_file_name,
86339240b5SPaolo Bonzini                            FWCfgReadCallback fw_callback,
87339240b5SPaolo Bonzini                            void *callback_opaque);
88d60fa42eSFabien Chouteau int rom_add_elf_program(const char *name, void *data, size_t datasize,
89d60fa42eSFabien Chouteau                         size_t romsize, hwaddr addr);
906b3f7f63SEric Auger int rom_check_and_register_reset(void);
91a88b362cSLaszlo Ersek void rom_set_fw(FWCfgState *f);
92a8170e5eSAvi Kivity int rom_copy(uint8_t *dest, hwaddr addr, size_t size);
93a8170e5eSAvi Kivity void *rom_ptr(hwaddr addr);
941ce6be24SMarkus Armbruster void hmp_info_roms(Monitor *mon, const QDict *qdict);
9545a50b16SGerd Hoffmann 
962e55e842SGleb Natapov #define rom_add_file_fixed(_f, _a, _i)          \
97*76151cacSPeter Maydell     rom_add_file(_f, NULL, _a, _i, false, NULL)
9845a50b16SGerd Hoffmann #define rom_add_blob_fixed(_f, _b, _l, _a)      \
99a1666142SMichael S. Tsirkin     rom_add_blob(_f, _b, _l, _l, _a, NULL, NULL, NULL)
100*76151cacSPeter Maydell #define rom_add_file_mr(_f, _mr, _i)            \
101*76151cacSPeter Maydell     rom_add_file(_f, NULL, 0, _i, false, mr)
10245a50b16SGerd Hoffmann 
10345a50b16SGerd Hoffmann #define PC_ROM_MIN_VGA     0xc0000
10445a50b16SGerd Hoffmann #define PC_ROM_MIN_OPTION  0xc8000
10545a50b16SGerd Hoffmann #define PC_ROM_MAX         0xe0000
10645a50b16SGerd Hoffmann #define PC_ROM_ALIGN       0x800
10745a50b16SGerd Hoffmann #define PC_ROM_SIZE        (PC_ROM_MAX - PC_ROM_MIN_VGA)
10845a50b16SGerd Hoffmann 
109de2aff17SGerd Hoffmann int rom_add_vga(const char *file);
1102e55e842SGleb Natapov int rom_add_option(const char *file, int32_t bootindex);
11145a50b16SGerd Hoffmann 
112ca20cf32SBlue Swirl #endif
113