Revision 983fe826 target-arm/helper.c
b/target-arm/helper.c | ||
---|---|---|
8 | 8 |
#include "helpers.h" |
9 | 9 |
#include "qemu-common.h" |
10 | 10 |
#include "host-utils.h" |
11 |
#include "hw/loader.h" |
|
11 | 12 |
|
12 | 13 |
static uint32_t cortexa9_cp15_c0_c1[8] = |
13 | 14 |
{ 0x1031, 0x11, 0x000, 0, 0x00100103, 0x20000000, 0x01230000, 0x00002111 }; |
... | ... | |
204 | 205 |
#else |
205 | 206 |
/* SVC mode with interrupts disabled. */ |
206 | 207 |
env->uncached_cpsr = ARM_CPU_MODE_SVC | CPSR_A | CPSR_F | CPSR_I; |
208 |
env->regs[15] = 0; |
|
207 | 209 |
/* On ARMv7-M the CPSR_I is the value of the PRIMASK register, and is |
208 |
clear at reset. */ |
|
209 |
if (IS_M(env)) |
|
210 |
clear at reset. Initial SP and PC are loaded from ROM. */ |
|
211 |
if (IS_M(env)) { |
|
212 |
uint32_t pc; |
|
213 |
uint8_t *rom; |
|
210 | 214 |
env->uncached_cpsr &= ~CPSR_I; |
215 |
rom = rom_ptr(0); |
|
216 |
if (rom) { |
|
217 |
/* We should really use ldl_phys here, in case the guest |
|
218 |
modified flash and reset itself. However images |
|
219 |
loaded via -kenrel have not been copied yet, so load the |
|
220 |
values directly from there. */ |
|
221 |
env->regs[13] = ldl_p(rom); |
|
222 |
pc = ldl_p(rom + 4); |
|
223 |
env->thumb = pc & 1; |
|
224 |
env->regs[15] = pc & ~1; |
|
225 |
} |
|
226 |
} |
|
211 | 227 |
env->vfp.xregs[ARM_VFP_FPEXC] = 0; |
212 | 228 |
env->cp15.c2_base_mask = 0xffffc000u; |
213 | 229 |
#endif |
214 |
env->regs[15] = 0; |
|
215 | 230 |
tlb_flush(env, 1); |
216 | 231 |
} |
217 | 232 |
|
... | ... | |
624 | 639 |
|
625 | 640 |
type = env->regs[15]; |
626 | 641 |
if (env->v7m.exception != 0) |
627 |
armv7m_nvic_complete_irq(env->v7m.nvic, env->v7m.exception);
|
|
642 |
armv7m_nvic_complete_irq(env->nvic, env->v7m.exception); |
|
628 | 643 |
|
629 | 644 |
/* Switch to the target stack. */ |
630 | 645 |
switch_v7m_sp(env, (type & 4) != 0); |
... | ... | |
666 | 681 |
one we're raising. */ |
667 | 682 |
switch (env->exception_index) { |
668 | 683 |
case EXCP_UDEF: |
669 |
armv7m_nvic_set_pending(env->v7m.nvic, ARMV7M_EXCP_USAGE);
|
|
684 |
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_USAGE); |
|
670 | 685 |
return; |
671 | 686 |
case EXCP_SWI: |
672 | 687 |
env->regs[15] += 2; |
673 |
armv7m_nvic_set_pending(env->v7m.nvic, ARMV7M_EXCP_SVC);
|
|
688 |
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_SVC); |
|
674 | 689 |
return; |
675 | 690 |
case EXCP_PREFETCH_ABORT: |
676 | 691 |
case EXCP_DATA_ABORT: |
677 |
armv7m_nvic_set_pending(env->v7m.nvic, ARMV7M_EXCP_MEM);
|
|
692 |
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_MEM); |
|
678 | 693 |
return; |
679 | 694 |
case EXCP_BKPT: |
680 | 695 |
if (semihosting_enabled) { |
... | ... | |
686 | 701 |
return; |
687 | 702 |
} |
688 | 703 |
} |
689 |
armv7m_nvic_set_pending(env->v7m.nvic, ARMV7M_EXCP_DEBUG);
|
|
704 |
armv7m_nvic_set_pending(env->nvic, ARMV7M_EXCP_DEBUG); |
|
690 | 705 |
return; |
691 | 706 |
case EXCP_IRQ: |
692 |
env->v7m.exception = armv7m_nvic_acknowledge_irq(env->v7m.nvic);
|
|
707 |
env->v7m.exception = armv7m_nvic_acknowledge_irq(env->nvic); |
|
693 | 708 |
break; |
694 | 709 |
case EXCP_EXCEPTION_EXIT: |
695 | 710 |
do_v7m_exception_exit(env); |
Also available in: Unified diff