aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2018-12-14 13:30:51 +0000
committerPeter Maydell <peter.maydell@linaro.org>2018-12-14 13:30:51 +0000
commitc24323dd5f04d2a8c89f1d0d8daf0322b6fa6fc7 (patch)
tree20e944203c6731dbc6b5d7f1bdf9803774ddf8c4
parent36bde0911f7a1eec2ea0a9e1405d69b922d63f25 (diff)
hw/i386/pc.c: Don't use load_image()
The load_image() function is deprecated, as it does not let the caller specify how large the buffer to read the file into is. Use the glib g_file_get_contents() function instead, which does the whole "allocate memory for the file and read it in" operation. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Message-id: 20181130151712.2312-6-peter.maydell@linaro.org
-rw-r--r--hw/i386/pc.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index 4cd2fbca4d..115bc2825c 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -839,10 +839,9 @@ static void load_linux(PCMachineState *pcms,
{
uint16_t protocol;
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;
+ uint8_t header[8192], *setup, *kernel;
hwaddr real_addr, prot_addr, cmdline_addr, initrd_addr = 0;
FILE *f;
char *vmode;
@@ -965,27 +964,30 @@ static void load_linux(PCMachineState *pcms,
/* load initrd */
if (initrd_filename) {
+ gsize initrd_size;
+ gchar *initrd_data;
+ GError *gerr = NULL;
+
if (protocol < 0x200) {
fprintf(stderr, "qemu: linux kernel too old to load a ram disk\n");
exit(1);
}
- initrd_size = get_image_size(initrd_filename);
- if (initrd_size < 0) {
+ if (!g_file_get_contents(initrd_filename, &initrd_data,
+ &initrd_size, &gerr)) {
fprintf(stderr, "qemu: error reading initrd %s: %s\n",
- initrd_filename, strerror(errno));
+ initrd_filename, gerr->message);
exit(1);
- } else if (initrd_size >= initrd_max) {
+ }
+ if (initrd_size >= initrd_max) {
fprintf(stderr, "qemu: initrd is too large, cannot support."
- "(max: %"PRIu32", need %"PRId64")\n", initrd_max, initrd_size);
+ "(max: %"PRIu32", need %"PRId64")\n",
+ initrd_max, (uint64_t)initrd_size);
exit(1);
}
initrd_addr = (initrd_max-initrd_size) & ~4095;
- initrd_data = g_malloc(initrd_size);
- load_image(initrd_filename, initrd_data);
-
fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, initrd_addr);
fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size);
fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, initrd_data, initrd_size);