Revision 44a99354 hw/sun4u.c

b/hw/sun4u.c
268 268

  
269 269
typedef struct ResetData {
270 270
    CPUState *env;
271
    uint64_t reset_addr;
271
    uint64_t prom_addr;
272 272
} ResetData;
273 273

  
274 274
static void main_cpu_reset(void *opaque)
275 275
{
276 276
    ResetData *s = (ResetData *)opaque;
277 277
    CPUState *env = s->env;
278
    static unsigned int nr_resets;
278 279

  
279 280
    cpu_reset(env);
280 281
    env->tick_cmpr = TICK_INT_DIS | 0;
......
289 290
    env->gregs[1] = 0; // Memory start
290 291
    env->gregs[2] = ram_size; // Memory size
291 292
    env->gregs[3] = 0; // Machine description XXX
292
    env->pc = s->reset_addr;
293
    if (nr_resets++ == 0) {
294
        /* Power on reset */
295
        env->pc = s->prom_addr + 0x20ULL;
296
    } else {
297
        env->pc = s->prom_addr + 0x40ULL;
298
    }
293 299
    env->npc = env->pc + 4;
294 300
}
295 301

  
......
544 550

  
545 551
    reset_info = qemu_mallocz(sizeof(ResetData));
546 552
    reset_info->env = env;
547
    reset_info->reset_addr = hwdef->prom_addr + 0x40ULL;
553
    reset_info->prom_addr = hwdef->prom_addr;
548 554
    qemu_register_reset(main_cpu_reset, reset_info);
549
    main_cpu_reset(reset_info);
550
    // Override warm reset address with cold start address
551
    env->pc = hwdef->prom_addr + 0x20ULL;
552
    env->npc = env->pc + 4;
553 555

  
554 556
    return env;
555 557
}

Also available in: Unified diff