Revision e16ad5b0

b/hw/mips_malta.c
683 683
}
684 684

  
685 685
/* Kernel */
686
static int64_t load_kernel (CPUState *env)
686
static int64_t load_kernel (void)
687 687
{
688 688
    int64_t kernel_entry, kernel_low, kernel_high;
689 689
    int index = 0;
......
758 758
       location does not change. */
759 759
    if (loaderparams.kernel_filename) {
760 760
        env->CP0_Status &= ~((1 << CP0St_BEV) | (1 << CP0St_ERL));
761
        load_kernel (env);
762 761
    }
763 762
}
764 763

  
......
843 842
        loaderparams.kernel_filename = kernel_filename;
844 843
        loaderparams.kernel_cmdline = kernel_cmdline;
845 844
        loaderparams.initrd_filename = initrd_filename;
846
        kernel_entry = load_kernel(env);
847
        env->CP0_Status &= ~((1 << CP0St_BEV) | (1 << CP0St_ERL));
845
        kernel_entry = load_kernel();
848 846
        write_bootloader(env, qemu_get_ram_ptr(bios_offset), kernel_entry);
849 847
    } else {
850 848
        dinfo = drive_get(IF_PFLASH, 0, fl_idx);
b/hw/mips_mipssim.c
50 50
    const char *initrd_filename;
51 51
} loaderparams;
52 52

  
53
static void load_kernel (CPUState *env)
53
typedef struct ResetData {
54
    CPUState *env;
55
    uint64_t vector;
56
} ResetData;
57

  
58
static int64_t load_kernel(void)
54 59
{
55 60
    int64_t entry, kernel_low, kernel_high;
56 61
    long kernel_size;
......
70 75
    if (kernel_size >= 0) {
71 76
        if ((entry & ~0x7fffffffULL) == 0x80000000)
72 77
            entry = (int32_t)entry;
73
        env->active_tc.PC = entry;
74 78
    } else {
75 79
        fprintf(stderr, "qemu: could not load kernel '%s'\n",
76 80
                loaderparams.kernel_filename);
......
99 103
            exit(1);
100 104
        }
101 105
    }
106
    return entry;
102 107
}
103 108

  
104 109
static void main_cpu_reset(void *opaque)
105 110
{
106
    CPUState *env = opaque;
107
    cpu_reset(env);
111
    ResetData *s = (ResetData *)opaque;
112
    CPUState *env = s->env;
108 113

  
109
    if (loaderparams.kernel_filename)
110
        load_kernel (env);
114
    cpu_reset(env);
115
    env->active_tc.PC = s->vector;
111 116
}
112 117

  
113 118
static void
......
120 125
    ram_addr_t ram_offset;
121 126
    ram_addr_t bios_offset;
122 127
    CPUState *env;
128
    ResetData *reset_info;
123 129
    int bios_size;
124 130

  
125 131
    /* Init CPUs. */
......
135 141
        fprintf(stderr, "Unable to find CPU definition\n");
136 142
        exit(1);
137 143
    }
138
    qemu_register_reset(main_cpu_reset, env);
144
    reset_info = qemu_mallocz(sizeof(ResetData));
145
    reset_info->env = env;
146
    reset_info->vector = env->active_tc.PC;
147
    qemu_register_reset(main_cpu_reset, reset_info);
139 148

  
140 149
    /* Allocate RAM. */
141 150
    ram_offset = qemu_ram_alloc(ram_size);
......
172 181
        loaderparams.kernel_filename = kernel_filename;
173 182
        loaderparams.kernel_cmdline = kernel_cmdline;
174 183
        loaderparams.initrd_filename = initrd_filename;
175
        load_kernel(env);
184
        reset_info->vector = load_kernel();
176 185
    }
177 186

  
178 187
    /* Init CPU internal devices. */
b/hw/mips_r4k.c
70 70

  
71 71
static int mips_qemu_iomemtype = 0;
72 72

  
73
static void load_kernel (CPUState *env)
73
typedef struct ResetData {
74
    CPUState *env;
75
    uint64_t vector;
76
} ResetData;
77

  
78
static int64_t load_kernel(void)
74 79
{
75 80
    int64_t entry, kernel_low, kernel_high;
76 81
    long kernel_size, initrd_size;
......
89 94
    if (kernel_size >= 0) {
90 95
        if ((entry & ~0x7fffffffULL) == 0x80000000)
91 96
            entry = (int32_t)entry;
92
        env->active_tc.PC = entry;
93 97
    } else {
94 98
        fprintf(stderr, "qemu: could not load kernel '%s'\n",
95 99
                loaderparams.kernel_filename);
......
135 139

  
136 140
    stl_phys((16 << 20) - 260, 0x12345678);
137 141
    stl_phys((16 << 20) - 264, ram_size);
142
    return entry;
138 143
}
139 144

  
140 145
static void main_cpu_reset(void *opaque)
141 146
{
142
    CPUState *env = opaque;
143
    cpu_reset(env);
147
    ResetData *s = (ResetData *)opaque;
148
    CPUState *env = s->env;
144 149

  
145
    if (loaderparams.kernel_filename)
146
        load_kernel (env);
150
    cpu_reset(env);
151
    env->active_tc.PC = s->vector;
147 152
}
148 153

  
149 154
static const int sector_len = 32 * 1024;
......
158 163
    ram_addr_t bios_offset;
159 164
    int bios_size;
160 165
    CPUState *env;
166
    ResetData *reset_info;
161 167
    RTCState *rtc_state;
162 168
    int i;
163 169
    qemu_irq *i8259;
......
177 183
        fprintf(stderr, "Unable to find CPU definition\n");
178 184
        exit(1);
179 185
    }
180
    qemu_register_reset(main_cpu_reset, env);
186
    reset_info = qemu_mallocz(sizeof(ResetData));
187
    reset_info->env = env;
188
    reset_info->vector = env->active_tc.PC;
189
    qemu_register_reset(main_cpu_reset, reset_info);
181 190

  
182 191
    /* allocate RAM */
183 192
    if (ram_size > (256 << 20)) {
......
237 246
        loaderparams.kernel_filename = kernel_filename;
238 247
        loaderparams.kernel_cmdline = kernel_cmdline;
239 248
        loaderparams.initrd_filename = initrd_filename;
240
        load_kernel (env);
249
        reset_info->vector = load_kernel();
241 250
    }
242 251

  
243 252
    /* Init CPU internal devices */

Also available in: Unified diff