change get_image_size return type to int64_t
Previously, if the size of initrd >=2G, qemu exits with error: root@haswell-OptiPlex-9020:/home/lizj# /home/lizhijian/lkp/qemu-colo/x86_64-softmmu/qemu-system-x86_64 -kernel ./vmlinuz-4.16.0-rc4 -initrd large.cgz -nographic qemu: error reading initrd large.cgz: No such file or directory root@haswell-OptiPlex-9020:/home/lizj# du -sh large.cgz 2.5G large.cgz this patch changes the caller side that use this function to calculate size of initrd file as well. v2: update error message and int64_t printing format Signed-off-by: Li Zhijian <lizhijian@cn.fujitsu.com> Message-Id: <1536833233-14121-1-git-send-email-lizhijian@cn.fujitsu.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
90a84d131c
commit
f3839fda57
@ -150,7 +150,8 @@ static void clipper_init(MachineState *machine)
|
||||
}
|
||||
|
||||
if (initrd_filename) {
|
||||
long initrd_base, initrd_size;
|
||||
long initrd_base;
|
||||
int64_t initrd_size;
|
||||
|
||||
initrd_size = get_image_size(initrd_filename);
|
||||
if (initrd_size < 0) {
|
||||
|
@ -61,9 +61,10 @@
|
||||
static int roms_loaded;
|
||||
|
||||
/* return the size or -1 if error */
|
||||
int get_image_size(const char *filename)
|
||||
int64_t get_image_size(const char *filename)
|
||||
{
|
||||
int fd, size;
|
||||
int fd;
|
||||
int64_t size;
|
||||
fd = open(filename, O_RDONLY | O_BINARY);
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
@ -191,7 +191,7 @@ static void machine_hppa_init(MachineState *machine)
|
||||
|
||||
if (initrd_filename) {
|
||||
ram_addr_t initrd_base;
|
||||
long initrd_size;
|
||||
int64_t initrd_size;
|
||||
|
||||
initrd_size = get_image_size(initrd_filename);
|
||||
if (initrd_size < 0) {
|
||||
|
@ -838,7 +838,8 @@ static void load_linux(PCMachineState *pcms,
|
||||
FWCfgState *fw_cfg)
|
||||
{
|
||||
uint16_t protocol;
|
||||
int setup_size, kernel_size, initrd_size = 0, cmdline_size;
|
||||
int setup_size, kernel_size, cmdline_size;
|
||||
int64_t initrd_size = 0;
|
||||
int dtb_size, setup_data_offset;
|
||||
uint32_t initrd_max;
|
||||
uint8_t header[8192], *setup, *kernel, *initrd_data;
|
||||
@ -974,6 +975,10 @@ static void load_linux(PCMachineState *pcms,
|
||||
fprintf(stderr, "qemu: error reading initrd %s: %s\n",
|
||||
initrd_filename, strerror(errno));
|
||||
exit(1);
|
||||
} else if (initrd_size >= initrd_max) {
|
||||
fprintf(stderr, "qemu: initrd is too large, cannot support."
|
||||
"(max: %"PRIu32", need %"PRId64")\n", initrd_max, initrd_size);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
initrd_addr = (initrd_max-initrd_size) & ~4095;
|
||||
|
@ -104,9 +104,9 @@ static void GCC_FMT_ATTR(3, 4) prom_set(uint32_t* prom_buf, int index,
|
||||
|
||||
static int64_t load_kernel (CPUMIPSState *env)
|
||||
{
|
||||
int64_t kernel_entry, kernel_low, kernel_high;
|
||||
int64_t kernel_entry, kernel_low, kernel_high, initrd_size;
|
||||
int index = 0;
|
||||
long kernel_size, initrd_size;
|
||||
long kernel_size;
|
||||
ram_addr_t initrd_offset;
|
||||
uint32_t *prom_buf;
|
||||
long prom_size;
|
||||
@ -150,7 +150,7 @@ static int64_t load_kernel (CPUMIPSState *env)
|
||||
|
||||
prom_set(prom_buf, index++, "%s", loaderparams.kernel_filename);
|
||||
if (initrd_size > 0) {
|
||||
prom_set(prom_buf, index++, "rd_start=0x%" PRIx64 " rd_size=%li %s",
|
||||
prom_set(prom_buf, index++, "rd_start=0x%" PRIx64 " rd_size=%" PRId64 " %s",
|
||||
cpu_mips_phys_to_kseg0(NULL, initrd_offset), initrd_size,
|
||||
loaderparams.kernel_cmdline);
|
||||
} else {
|
||||
|
@ -995,8 +995,8 @@ static void GCC_FMT_ATTR(3, 4) prom_set(uint32_t* prom_buf, int index,
|
||||
/* Kernel */
|
||||
static int64_t load_kernel (void)
|
||||
{
|
||||
int64_t kernel_entry, kernel_high;
|
||||
long kernel_size, initrd_size;
|
||||
int64_t kernel_entry, kernel_high, initrd_size;
|
||||
long kernel_size;
|
||||
ram_addr_t initrd_offset;
|
||||
int big_endian;
|
||||
uint32_t *prom_buf;
|
||||
@ -1070,7 +1070,7 @@ static int64_t load_kernel (void)
|
||||
|
||||
prom_set(prom_buf, prom_index++, "%s", loaderparams.kernel_filename);
|
||||
if (initrd_size > 0) {
|
||||
prom_set(prom_buf, prom_index++, "rd_start=0x%" PRIx64 " rd_size=%li %s",
|
||||
prom_set(prom_buf, prom_index++, "rd_start=0x%" PRIx64 " rd_size=%" PRId64 " %s",
|
||||
xlate_to_kseg0(NULL, initrd_offset), initrd_size,
|
||||
loaderparams.kernel_cmdline);
|
||||
} else {
|
||||
|
@ -58,9 +58,8 @@ typedef struct ResetData {
|
||||
|
||||
static int64_t load_kernel(void)
|
||||
{
|
||||
int64_t entry, kernel_high;
|
||||
int64_t entry, kernel_high, initrd_size;
|
||||
long kernel_size;
|
||||
long initrd_size;
|
||||
ram_addr_t initrd_offset;
|
||||
int big_endian;
|
||||
|
||||
|
@ -81,8 +81,8 @@ typedef struct ResetData {
|
||||
static int64_t load_kernel(void)
|
||||
{
|
||||
const size_t params_size = 264;
|
||||
int64_t entry, kernel_high;
|
||||
long kernel_size, initrd_size;
|
||||
int64_t entry, kernel_high, initrd_size;
|
||||
long kernel_size;
|
||||
ram_addr_t initrd_offset;
|
||||
uint32_t *params_buf;
|
||||
int big_endian;
|
||||
@ -136,7 +136,7 @@ static int64_t load_kernel(void)
|
||||
params_buf[1] = tswap32(0x12345678);
|
||||
|
||||
if (initrd_size > 0) {
|
||||
snprintf((char *)params_buf + 8, 256, "rd_start=0x%" PRIx64 " rd_size=%li %s",
|
||||
snprintf((char *)params_buf + 8, 256, "rd_start=0x%" PRIx64 " rd_size=%" PRId64 " %s",
|
||||
cpu_mips_phys_to_kseg0(NULL, initrd_offset),
|
||||
initrd_size, loaderparams.kernel_cmdline);
|
||||
} else {
|
||||
|
@ -54,8 +54,8 @@ typedef struct {
|
||||
static void load_kernel(MoxieCPU *cpu, LoaderParams *loader_params)
|
||||
{
|
||||
uint64_t entry, kernel_low, kernel_high;
|
||||
int64_t initrd_size;
|
||||
long kernel_size;
|
||||
long initrd_size;
|
||||
ram_addr_t initrd_offset;
|
||||
|
||||
kernel_size = load_elf(loader_params->kernel_filename, NULL, NULL,
|
||||
|
@ -10,7 +10,7 @@
|
||||
* Returns the size of the image file on success, -1 otherwise.
|
||||
* On error, errno is also set as appropriate.
|
||||
*/
|
||||
int get_image_size(const char *filename);
|
||||
int64_t get_image_size(const char *filename);
|
||||
int load_image(const char *filename, uint8_t *addr); /* deprecated */
|
||||
ssize_t load_image_size(const char *filename, void *addr, size_t size);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user