Revision 6ed221b6 hw/arm_boot.c

b/hw/arm_boot.c
175 175
    }
176 176
}
177 177

  
178
static void main_cpu_reset(void *opaque)
178
static void do_cpu_reset(void *opaque)
179 179
{
180 180
    CPUState *env = opaque;
181 181
    struct arm_boot_info *info = env->boot_info;
......
187 187
            env->regs[15] = info->entry & 0xfffffffe;
188 188
            env->thumb = info->entry & 1;
189 189
        } else {
190
            env->regs[15] = info->loader_start;
191
            if (old_param) {
192
                set_kernel_args_old(info, info->initrd_size,
190
            if (env == first_cpu) {
191
                env->regs[15] = info->loader_start;
192
                if (old_param) {
193
                    set_kernel_args_old(info, info->initrd_size,
194
                                        info->loader_start);
195
                } else {
196
                    set_kernel_args(info, info->initrd_size,
193 197
                                    info->loader_start);
198
                }
194 199
            } else {
195
                set_kernel_args(info, info->initrd_size, info->loader_start);
200
                env->regs[15] = info->smp_loader_start;
196 201
            }
197 202
        }
198 203
    }
199
    /* TODO:  Reset secondary CPUs.  */
200 204
}
201 205

  
202 206
void arm_load_kernel(CPUState *env, struct arm_boot_info *info)
......
217 221

  
218 222
    if (info->nb_cpus == 0)
219 223
        info->nb_cpus = 1;
220
    env->boot_info = info;
221 224

  
222 225
#ifdef TARGET_WORDS_BIGENDIAN
223 226
    big_endian = 1;
......
279 282
        info->initrd_size = initrd_size;
280 283
    }
281 284
    info->is_linux = is_linux;
282
    qemu_register_reset(main_cpu_reset, env);
285

  
286
    for (; env; env = env->next_cpu) {
287
        env->boot_info = info;
288
        qemu_register_reset(do_cpu_reset, env);
289
    }
283 290
}

Also available in: Unified diff