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