diff options
author | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-01-16 18:54:31 +0000 |
---|---|---|
committer | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-01-16 18:54:31 +0000 |
commit | daf90626beeb5f20504c593f01604a554f7ef232 (patch) | |
tree | ed90b628069d3f453d42c49dead8d7a5f8773638 /hw/arm_boot.c | |
parent | 5856de800df5789b8641c47be5399afff7773910 (diff) |
ARM ELF loader.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2320 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw/arm_boot.c')
-rw-r--r-- | hw/arm_boot.c | 54 |
1 files changed, 32 insertions, 22 deletions
diff --git a/hw/arm_boot.c b/hw/arm_boot.c index 0e28d4a07a..f62f0f6fab 100644 --- a/hw/arm_boot.c +++ b/hw/arm_boot.c @@ -64,42 +64,52 @@ static void set_kernel_args(uint32_t ram_size, int initrd_size, stl_raw(p++, 0); } -void arm_load_kernel(int ram_size, const char *kernel_filename, +void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, int board_id) { int kernel_size; int initrd_size; int n; + uint64_t entry; /* Load the kernel. */ if (!kernel_filename) { fprintf(stderr, "Kernel image must be specified\n"); exit(1); } - kernel_size = load_image(kernel_filename, - phys_ram_base + KERNEL_LOAD_ADDR); - if (kernel_size < 0) { - fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename); - exit(1); - } - if (initrd_filename) { - initrd_size = load_image(initrd_filename, - phys_ram_base + INITRD_LOAD_ADDR); - if (initrd_size < 0) { - fprintf(stderr, "qemu: could not load initrd '%s'\n", - initrd_filename); + + kernel_size = load_elf(kernel_filename, 0, &entry); + if (kernel_size) { + /* An ELF image. Jump to the entry point. */ + env->regs[15] = entry & 0xfffffffe; + env->thumb = entry & 1; + } else { + /* Raw binary image. Assume it is a Limux zImage. */ + kernel_size = load_image(kernel_filename, + phys_ram_base + KERNEL_LOAD_ADDR); + if (kernel_size < 0) { + fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename); exit(1); } - } else { - initrd_size = 0; + if (initrd_filename) { + initrd_size = load_image(initrd_filename, + phys_ram_base + INITRD_LOAD_ADDR); + if (initrd_size < 0) { + fprintf(stderr, "qemu: could not load initrd '%s'\n", + initrd_filename); + exit(1); + } + } else { + initrd_size = 0; + } + bootloader[1] |= board_id & 0xff; + bootloader[2] |= (board_id >> 8) & 0xff; + bootloader[5] = KERNEL_ARGS_ADDR; + bootloader[6] = KERNEL_LOAD_ADDR; + for (n = 0; n < sizeof(bootloader) / 4; n++) + stl_raw(phys_ram_base + (n * 4), bootloader[n]); + set_kernel_args(ram_size, initrd_size, kernel_cmdline); } - bootloader[1] |= board_id & 0xff; - bootloader[2] |= (board_id >> 8) & 0xff; - bootloader[5] = KERNEL_ARGS_ADDR; - bootloader[6] = KERNEL_LOAD_ADDR; - for (n = 0; n < sizeof(bootloader) / 4; n++) - stl_raw(phys_ram_base + (n * 4), bootloader[n]); - set_kernel_args(ram_size, initrd_size, kernel_cmdline); } |