Revision 1c7b3754 hw/arm_boot.c

b/hw/arm_boot.c
71 71
    int kernel_size;
72 72
    int initrd_size;
73 73
    int n;
74
    uint64_t entry;
74
    int is_linux = 0;
75
    uint64_t elf_entry;
76
    target_ulong entry;
75 77

  
76 78
    /* Load the kernel.  */
77 79
    if (!kernel_filename) {
......
79 81
        exit(1);
80 82
    }
81 83

  
82
    kernel_size = load_elf(kernel_filename, 0, &entry);
83
    if (kernel_size >= 0) {
84
        /* An ELF image.  Jump to the entry point.  */
84
    /* Assume that raw images are linux kernels, and ELF images are not.  */
85
    kernel_size = load_elf(kernel_filename, 0, &elf_entry);
86
    entry = elf_entry;
87
    if (kernel_size < 0) {
88
        kernel_size = load_uboot(kernel_filename, &entry, &is_linux);
89
    }
90
    if (kernel_size < 0) {
91
        kernel_size = load_image(kernel_filename,
92
                                 phys_ram_base + KERNEL_LOAD_ADDR);
93
        entry = KERNEL_LOAD_ADDR;
94
        is_linux = 1;
95
    }
96
    if (kernel_size < 0) {
97
        fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename);
98
        exit(1);
99
    }
100
    if (!is_linux) {
101
        /* Jump to the entry point.  */
85 102
        env->regs[15] = entry & 0xfffffffe;
86 103
        env->thumb = entry & 1;
87 104
    } else {
88
        /* Raw binary image. Assume it is a Linux zImage.  */
89
        kernel_size = load_image(kernel_filename,
90
                                 phys_ram_base + KERNEL_LOAD_ADDR);
91
        if (kernel_size < 0) {
92
            fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename);
93
            exit(1);
94
        }
95 105
        if (initrd_filename) {
96 106
            initrd_size = load_image(initrd_filename,
97 107
                                     phys_ram_base + INITRD_LOAD_ADDR);
......
106 116
        bootloader[1] |= board_id & 0xff;
107 117
        bootloader[2] |= (board_id >> 8) & 0xff;
108 118
        bootloader[5] = KERNEL_ARGS_ADDR;
109
        bootloader[6] = KERNEL_LOAD_ADDR;
119
        bootloader[6] = entry;
110 120
        for (n = 0; n < sizeof(bootloader) / 4; n++)
111 121
            stl_raw(phys_ram_base + (n * 4), bootloader[n]);
112 122
        set_kernel_args(ram_size, initrd_size, kernel_cmdline);

Also available in: Unified diff