Revision 6ed221b6

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
}
b/hw/realview.c
104 104
    .smp_loader_start = SMP_BOOT_ADDR,
105 105
};
106 106

  
107
static void secondary_cpu_reset(void *opaque)
108
{
109
  CPUState *env = opaque;
110

  
111
  cpu_reset(env);
112
  /* Set entry point for secondary CPUs.  This assumes we're using
113
     the init code from arm_boot.c.  Real hardware resets all CPUs
114
     the same.  */
115
  env->regs[15] = SMP_BOOT_ADDR;
116
}
117

  
118 107
/* The following two lists must be consistent.  */
119 108
enum realview_board_type {
120 109
    BOARD_EB,
......
177 166
        }
178 167
        irqp = arm_pic_init_cpu(env);
179 168
        cpu_irq[n] = irqp[ARM_PIC_CPU_IRQ];
180
        if (n > 0) {
181
            qemu_register_reset(secondary_cpu_reset, env);
182
        }
183 169
    }
184 170
    if (arm_feature(env, ARM_FEATURE_V7)) {
185 171
        if (is_mpcore) {

Also available in: Unified diff