Revision 983fe826 hw/armv7m.c
b/hw/armv7m.c | ||
---|---|---|
151 | 151 |
} |
152 | 152 |
|
153 | 153 |
/* Board init. */ |
154 |
|
|
155 |
static void armv7m_reset(void *opaque) |
|
156 |
{ |
|
157 |
cpu_reset((CPUState *)opaque); |
|
158 |
} |
|
159 |
|
|
154 | 160 |
/* Init CPU and memory for a v7-M based board. |
155 | 161 |
flash_size and sram_size are in kb. |
156 | 162 |
Returns the NVIC array. */ |
... | ... | |
163 | 169 |
/* FIXME: make this local state. */ |
164 | 170 |
static qemu_irq pic[64]; |
165 | 171 |
qemu_irq *cpu_pic; |
166 |
uint32_t pc; |
|
167 | 172 |
int image_size; |
168 | 173 |
uint64_t entry; |
169 | 174 |
uint64_t lowaddr; |
... | ... | |
201 | 206 |
armv7m_bitband_init(); |
202 | 207 |
|
203 | 208 |
nvic = qdev_create(NULL, "armv7m_nvic"); |
204 |
env->v7m.nvic = nvic;
|
|
209 |
env->nvic = nvic; |
|
205 | 210 |
qdev_init_nofail(nvic); |
206 | 211 |
cpu_pic = arm_pic_init_cpu(env); |
207 | 212 |
sysbus_connect_irq(sysbus_from_qdev(nvic), 0, cpu_pic[ARM_PIC_CPU_IRQ]); |
... | ... | |
227 | 232 |
exit(1); |
228 | 233 |
} |
229 | 234 |
|
230 |
/* If the image was loaded at address zero then assume it is a |
|
231 |
regular ROM image and perform the normal CPU reset sequence. |
|
232 |
Otherwise jump directly to the entry point. */ |
|
233 |
if (lowaddr == 0) { |
|
234 |
env->regs[13] = ldl_phys(0); |
|
235 |
pc = ldl_phys(4); |
|
236 |
} else { |
|
237 |
pc = entry; |
|
238 |
} |
|
239 |
env->thumb = pc & 1; |
|
240 |
env->regs[15] = pc & ~1; |
|
241 |
|
|
242 | 235 |
/* Hack to map an additional page of ram at the top of the address |
243 | 236 |
space. This stops qemu complaining about executing code outside RAM |
244 | 237 |
when returning from an exception. */ |
245 | 238 |
cpu_register_physical_memory(0xfffff000, 0x1000, |
246 | 239 |
qemu_ram_alloc(0x1000) | IO_MEM_RAM); |
247 | 240 |
|
241 |
qemu_register_reset(armv7m_reset, env); |
|
248 | 242 |
return pic; |
249 | 243 |
} |
250 | 244 |
|
Also available in: Unified diff