target-arm queue:
* break TBs after ISB instructions * more support code for future implementation of EL2 and 64-bit EL3 * tell guest if KVM is enabled in SMBIOS version string * implement OSLAR/OSLSR system registers * provide better help text for Sharp PDA machine names * rename imx25_pdk to imx25-pdk (since it has never been released with the underscore-version name) * fix MMIO writes in zynq_slcr * implement MDCR_EL2 * virt: allow the guest to configure PCI BARs with zero PCI addresses * fix breakpoint handling code -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABCAAGBQJWIQH/AAoJEDwlJe0UNgze6AkQAJ1Q1eCG7ryy5UnQ/xBItfBz StUgoWto+clOOaq5ljHJg8CLfNL9NN7eDsTCGDtBiMa0GTW8pjb8cF6EF2fUWz1m VuKtx6mmF7+tHf/sBfJovbSYQ3H9e74QioAgIp+XZsjgRNOhQ03HOTWfz1X40rVq GNLBEC4XgyKhZvR1YS+AMOJi+uGOwbG9/snhf5N1qKzo+pX+X/qsyeAxUPTjbR1x B7obH92zgdpuC8xGM6LdDPrlE85mVslGivsTTPeh9cw771IJZb6b4n5AXMGDZNsD pGUMSAqk6Zg8FoEiJIAPpvfhuN7VQ5PRmO4CYJB5ToIZpe0jAIZTBVuUjPbAXd6W rXnjuu88GbuiAWv/IeGS9r+R3yoLNH4VFbjeFfe7nKra4EuZ1xE7bsT5hJd/Pt/c 53dODlnAZ4wVxTLvfOXaOzCfKH5cEn7mAJiLgGPGbhwNdVbUIFthrPLnCOOa0Tpx kSTvE1qQ1FsIjEuppyJd9lTdvbo04xrleX3Zfqi124AlH+bRG3dC50jr1F/WG232 mj2gz/KIaVJJbs56+6YYaX9dyc5+CYzpKjiTobH4pcdB4+1FBb+3Dem7p29Nuagr 0jnM1LsmFw2GxA3VCGvUOUSQsRaDHErrkRW1cqgGvZTDEg39iuk4ngyKo6lHHAB1 esl9EkhWsJ7XxHr7JYAW =nXtn -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20151016' into staging target-arm queue: * break TBs after ISB instructions * more support code for future implementation of EL2 and 64-bit EL3 * tell guest if KVM is enabled in SMBIOS version string * implement OSLAR/OSLSR system registers * provide better help text for Sharp PDA machine names * rename imx25_pdk to imx25-pdk (since it has never been released with the underscore-version name) * fix MMIO writes in zynq_slcr * implement MDCR_EL2 * virt: allow the guest to configure PCI BARs with zero PCI addresses * fix breakpoint handling code # gpg: Signature made Fri 16 Oct 2015 14:56:15 BST using RSA key ID 14360CDE # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" # gpg: aka "Peter Maydell <pmaydell@gmail.com>" # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" * remotes/pmaydell/tags/pull-target-arm-20151016: target-arm: Fix CPU breakpoint handling target-arm: Fix GDB breakpoint handling target-arm: implement arm_debug_target_el() hw/arm/virt: Allow zero address for PCI IO space target-arm: Add MDCR_EL2 misc: zynq_slcr: Fix MMIO writes arm: imx25-pdk: Fix machine name target-arm: Provide model numbers for Sharp PDAs target-arm: Implement AArch64 OSLAR/OSLSR_EL1 sysregs hw/arm/virt: smbios: inform guest of kvm target-arm: Avoid calling arm_el_is_aa64() function for unimplemented EL target-arm: Break the TB after ISB to execute self-modified code correctly target-arm: Add missing 'static' attribute Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
6d57410a79
@ -60,7 +60,7 @@ static void collie_init(MachineState *machine)
|
||||
|
||||
static void collie_machine_init(MachineClass *mc)
|
||||
{
|
||||
mc->desc = "Collie PDA (SA-1110)";
|
||||
mc->desc = "Sharp SL-5500 (Collie) PDA (SA-1110)";
|
||||
mc->init = collie_init;
|
||||
}
|
||||
|
||||
|
@ -151,4 +151,4 @@ static void imx25_pdk_machine_init(MachineClass *mc)
|
||||
mc->init = imx25_pdk_init;
|
||||
}
|
||||
|
||||
DEFINE_MACHINE("imx25_pdk", imx25_pdk_machine_init)
|
||||
DEFINE_MACHINE("imx25-pdk", imx25_pdk_machine_init)
|
||||
|
@ -976,7 +976,7 @@ static void akitapda_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
|
||||
mc->desc = "Akita PDA (PXA270)";
|
||||
mc->desc = "Sharp SL-C1000 (Akita) PDA (PXA270)";
|
||||
mc->init = akita_init;
|
||||
}
|
||||
|
||||
@ -990,7 +990,7 @@ static void spitzpda_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
|
||||
mc->desc = "Spitz PDA (PXA270)";
|
||||
mc->desc = "Sharp SL-C3000 (Spitz) PDA (PXA270)";
|
||||
mc->init = spitz_init;
|
||||
}
|
||||
|
||||
@ -1004,7 +1004,7 @@ static void borzoipda_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
|
||||
mc->desc = "Borzoi PDA (PXA270)";
|
||||
mc->desc = "Sharp SL-C3100 (Borzoi) PDA (PXA270)";
|
||||
mc->init = borzoi_init;
|
||||
}
|
||||
|
||||
@ -1018,7 +1018,7 @@ static void terrierpda_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
|
||||
mc->desc = "Terrier PDA (PXA270)";
|
||||
mc->desc = "Sharp SL-C3200 (Terrier) PDA (PXA270)";
|
||||
mc->init = terrier_init;
|
||||
}
|
||||
|
||||
|
@ -254,7 +254,7 @@ static void tosa_init(MachineState *machine)
|
||||
|
||||
static void tosapda_machine_init(MachineClass *mc)
|
||||
{
|
||||
mc->desc = "Tosa PDA (PXA255)";
|
||||
mc->desc = "Sharp SL-6000 (Tosa) PDA (PXA255)";
|
||||
mc->init = tosa_init;
|
||||
}
|
||||
|
||||
|
@ -884,12 +884,17 @@ static void virt_build_smbios(VirtGuestInfo *guest_info)
|
||||
FWCfgState *fw_cfg = guest_info->fw_cfg;
|
||||
uint8_t *smbios_tables, *smbios_anchor;
|
||||
size_t smbios_tables_len, smbios_anchor_len;
|
||||
const char *product = "QEMU Virtual Machine";
|
||||
|
||||
if (!fw_cfg) {
|
||||
return;
|
||||
}
|
||||
|
||||
smbios_set_defaults("QEMU", "QEMU Virtual Machine",
|
||||
if (kvm_enabled()) {
|
||||
product = "KVM Virtual Machine";
|
||||
}
|
||||
|
||||
smbios_set_defaults("QEMU", product,
|
||||
"1.0", false, true, SMBIOS_ENTRY_POINT_30);
|
||||
|
||||
smbios_get_tables(NULL, 0, &smbios_tables, &smbios_tables_len,
|
||||
@ -1157,6 +1162,7 @@ static void virt_class_init(ObjectClass *oc, void *data)
|
||||
mc->has_dynamic_sysbus = true;
|
||||
mc->block_default_type = IF_VIRTIO;
|
||||
mc->no_cdrom = 1;
|
||||
mc->pci_allow_0_address = true;
|
||||
}
|
||||
|
||||
static const TypeInfo machvirt_info = {
|
||||
|
@ -393,12 +393,12 @@ static void zynq_slcr_write(void *opaque, hwaddr offset,
|
||||
return;
|
||||
}
|
||||
|
||||
if (!s->regs[LOCKSTA]) {
|
||||
s->regs[offset / 4] = val;
|
||||
} else {
|
||||
DB_PRINT("SCLR registers are locked. Unlock them first\n");
|
||||
if (s->regs[LOCKSTA]) {
|
||||
qemu_log_mask(LOG_GUEST_ERROR,
|
||||
"SCLR registers are locked. Unlock them first\n");
|
||||
return;
|
||||
}
|
||||
s->regs[offset] = val;
|
||||
|
||||
switch (offset) {
|
||||
case PSS_RST_CTRL:
|
||||
|
@ -379,6 +379,8 @@ typedef struct CPUARMState {
|
||||
uint64_t dbgwvr[16]; /* watchpoint value registers */
|
||||
uint64_t dbgwcr[16]; /* watchpoint control registers */
|
||||
uint64_t mdscr_el1;
|
||||
uint64_t oslsr_el1; /* OS Lock Status */
|
||||
uint64_t mdcr_el2;
|
||||
/* If the counter is enabled, this stores the last time the counter
|
||||
* was reset. Otherwise it stores the counter value
|
||||
*/
|
||||
@ -1016,11 +1018,11 @@ static inline bool access_secure_reg(CPUARMState *env)
|
||||
*/
|
||||
#define A32_BANKED_CURRENT_REG_GET(_env, _regname) \
|
||||
A32_BANKED_REG_GET((_env), _regname, \
|
||||
((!arm_el_is_aa64((_env), 3) && arm_is_secure(_env))))
|
||||
(arm_is_secure(_env) && !arm_el_is_aa64((_env), 3)))
|
||||
|
||||
#define A32_BANKED_CURRENT_REG_SET(_env, _regname, _val) \
|
||||
A32_BANKED_REG_SET((_env), _regname, \
|
||||
((!arm_el_is_aa64((_env), 3) && arm_is_secure(_env))), \
|
||||
(arm_is_secure(_env) && !arm_el_is_aa64((_env), 3)), \
|
||||
(_val))
|
||||
|
||||
void arm_cpu_list(FILE *f, fprintf_function cpu_fprintf);
|
||||
@ -1587,7 +1589,12 @@ static inline bool arm_excp_unmasked(CPUState *cs, unsigned int excp_idx,
|
||||
* interrupt.
|
||||
*/
|
||||
if ((target_el > cur_el) && (target_el != 1)) {
|
||||
if (arm_el_is_aa64(env, 3) || ((scr || hcr) && (!secure))) {
|
||||
/* ARM_FEATURE_AARCH64 enabled means the highest EL is AArch64.
|
||||
* This code currently assumes that EL2 is not implemented
|
||||
* (and so that highest EL will be 3 and the target_el also 3).
|
||||
*/
|
||||
if (arm_feature(env, ARM_FEATURE_AARCH64) ||
|
||||
((scr || hcr) && (!secure))) {
|
||||
unmasked = 1;
|
||||
}
|
||||
}
|
||||
@ -1695,7 +1702,22 @@ static inline int cpu_mmu_index(CPUARMState *env, bool ifetch)
|
||||
*/
|
||||
static inline int arm_debug_target_el(CPUARMState *env)
|
||||
{
|
||||
return 1;
|
||||
bool secure = arm_is_secure(env);
|
||||
bool route_to_el2 = false;
|
||||
|
||||
if (arm_feature(env, ARM_FEATURE_EL2) && !secure) {
|
||||
route_to_el2 = env->cp15.hcr_el2 & HCR_TGE ||
|
||||
env->cp15.mdcr_el2 & (1 << 8);
|
||||
}
|
||||
|
||||
if (route_to_el2) {
|
||||
return 2;
|
||||
} else if (arm_feature(env, ARM_FEATURE_EL3) &&
|
||||
!arm_el_is_aa64(env, 3) && secure) {
|
||||
return 3;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static inline bool aa64_generate_debug_exceptions(CPUARMState *env)
|
||||
|
@ -657,8 +657,12 @@ static const ARMCPRegInfo v6_cp_reginfo[] = {
|
||||
{ .name = "MVA_prefetch",
|
||||
.cp = 15, .crn = 7, .crm = 13, .opc1 = 0, .opc2 = 1,
|
||||
.access = PL1_W, .type = ARM_CP_NOP },
|
||||
/* We need to break the TB after ISB to execute self-modifying code
|
||||
* correctly and also to take any pending interrupts immediately.
|
||||
* So use arm_cp_write_ignore() function instead of ARM_CP_NOP flag.
|
||||
*/
|
||||
{ .name = "ISB", .cp = 15, .crn = 7, .crm = 5, .opc1 = 0, .opc2 = 4,
|
||||
.access = PL0_W, .type = ARM_CP_NOP },
|
||||
.access = PL0_W, .type = ARM_CP_NO_RAW, .writefn = arm_cp_write_ignore },
|
||||
{ .name = "DSB", .cp = 15, .crn = 7, .crm = 10, .opc1 = 0, .opc2 = 4,
|
||||
.access = PL0_W, .type = ARM_CP_NOP },
|
||||
{ .name = "DMB", .cp = 15, .crn = 7, .crm = 10, .opc1 = 0, .opc2 = 5,
|
||||
@ -3223,6 +3227,9 @@ static const ARMCPRegInfo el3_no_el2_cp_reginfo[] = {
|
||||
{ .name = "CNTHP_CTL_EL2", .state = ARM_CP_STATE_BOTH,
|
||||
.opc0 = 3, .opc1 = 4, .crn = 14, .crm = 2, .opc2 = 1,
|
||||
.access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
||||
{ .name = "MDCR_EL2", .state = ARM_CP_STATE_BOTH,
|
||||
.opc0 = 3, .opc1 = 4, .crn = 1, .crm = 1, .opc2 = 1,
|
||||
.access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
|
||||
REGINFO_SENTINEL
|
||||
};
|
||||
|
||||
@ -3444,6 +3451,15 @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
|
||||
.resetvalue = 0,
|
||||
.writefn = gt_hyp_ctl_write, .raw_writefn = raw_write },
|
||||
#endif
|
||||
/* The only field of MDCR_EL2 that has a defined architectural reset value
|
||||
* is MDCR_EL2.HPMN which should reset to the value of PMCR_EL0.N; but we
|
||||
* don't impelment any PMU event counters, so using zero as a reset
|
||||
* value for MDCR_EL2 is okay
|
||||
*/
|
||||
{ .name = "MDCR_EL2", .state = ARM_CP_STATE_BOTH,
|
||||
.opc0 = 3, .opc1 = 4, .crn = 1, .crm = 1, .opc2 = 1,
|
||||
.access = PL2_RW, .resetvalue = 0,
|
||||
.fieldoffset = offsetof(CPUARMState, cp15.mdcr_el2), },
|
||||
REGINFO_SENTINEL
|
||||
};
|
||||
|
||||
@ -3564,6 +3580,23 @@ static CPAccessResult ctr_el0_access(CPUARMState *env, const ARMCPRegInfo *ri)
|
||||
return CP_ACCESS_OK;
|
||||
}
|
||||
|
||||
static void oslar_write(CPUARMState *env, const ARMCPRegInfo *ri,
|
||||
uint64_t value)
|
||||
{
|
||||
/* Writes to OSLAR_EL1 may update the OS lock status, which can be
|
||||
* read via a bit in OSLSR_EL1.
|
||||
*/
|
||||
int oslock;
|
||||
|
||||
if (ri->state == ARM_CP_STATE_AA32) {
|
||||
oslock = (value == 0xC5ACCE55);
|
||||
} else {
|
||||
oslock = value & 1;
|
||||
}
|
||||
|
||||
env->cp15.oslsr_el1 = deposit32(env->cp15.oslsr_el1, 1, 1, oslock);
|
||||
}
|
||||
|
||||
static const ARMCPRegInfo debug_cp_reginfo[] = {
|
||||
/* DBGDRAR, DBGDSAR: always RAZ since we don't implement memory mapped
|
||||
* debug components. The AArch64 version of DBGDRAR is named MDRAR_EL1;
|
||||
@ -3592,10 +3625,14 @@ static const ARMCPRegInfo debug_cp_reginfo[] = {
|
||||
.type = ARM_CP_ALIAS,
|
||||
.access = PL1_R,
|
||||
.fieldoffset = offsetof(CPUARMState, cp15.mdscr_el1), },
|
||||
/* We define a dummy WI OSLAR_EL1, because Linux writes to it. */
|
||||
{ .name = "OSLAR_EL1", .state = ARM_CP_STATE_BOTH,
|
||||
.cp = 14, .opc0 = 2, .opc1 = 0, .crn = 1, .crm = 0, .opc2 = 4,
|
||||
.access = PL1_W, .type = ARM_CP_NOP },
|
||||
.access = PL1_W, .type = ARM_CP_NO_RAW,
|
||||
.writefn = oslar_write },
|
||||
{ .name = "OSLSR_EL1", .state = ARM_CP_STATE_BOTH,
|
||||
.cp = 14, .opc0 = 2, .opc1 = 0, .crn = 1, .crm = 1, .opc2 = 4,
|
||||
.access = PL1_R, .resetvalue = 10,
|
||||
.fieldoffset = offsetof(CPUARMState, cp15.oslsr_el1) },
|
||||
/* Dummy OSDLR_EL1: 32-bit Linux will read this */
|
||||
{ .name = "OSDLR_EL1", .state = ARM_CP_STATE_BOTH,
|
||||
.cp = 14, .opc0 = 2, .opc1 = 0, .crn = 1, .crm = 3, .opc2 = 4,
|
||||
@ -5194,7 +5231,7 @@ void switch_mode(CPUARMState *env, int mode)
|
||||
* BIT IRQ IMO Non-secure Secure
|
||||
* EL3 FIQ RW FMO EL0 EL1 EL2 EL3 EL0 EL1 EL2 EL3
|
||||
*/
|
||||
const int8_t target_el_table[2][2][2][2][2][4] = {
|
||||
static const int8_t target_el_table[2][2][2][2][2][4] = {
|
||||
{{{{/* 0 0 0 0 */{ 1, 1, 2, -1 },{ 3, -1, -1, 3 },},
|
||||
{/* 0 0 0 1 */{ 2, 2, 2, -1 },{ 3, -1, -1, 3 },},},
|
||||
{{/* 0 0 1 0 */{ 1, 1, 2, -1 },{ 3, -1, -1, 3 },},
|
||||
@ -5220,11 +5257,22 @@ uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
|
||||
uint32_t cur_el, bool secure)
|
||||
{
|
||||
CPUARMState *env = cs->env_ptr;
|
||||
int rw = ((env->cp15.scr_el3 & SCR_RW) == SCR_RW);
|
||||
int rw;
|
||||
int scr;
|
||||
int hcr;
|
||||
int target_el;
|
||||
int is64 = arm_el_is_aa64(env, 3);
|
||||
/* Is the highest EL AArch64? */
|
||||
int is64 = arm_feature(env, ARM_FEATURE_AARCH64);
|
||||
|
||||
if (arm_feature(env, ARM_FEATURE_EL3)) {
|
||||
rw = ((env->cp15.scr_el3 & SCR_RW) == SCR_RW);
|
||||
} else {
|
||||
/* Either EL2 is the highest EL (and so the EL2 register width
|
||||
* is given by is64); or there is no EL2 or EL3, in which case
|
||||
* the value of 'rw' does not affect the table lookup anyway.
|
||||
*/
|
||||
rw = is64;
|
||||
}
|
||||
|
||||
switch (excp_idx) {
|
||||
case EXCP_IRQ:
|
||||
|
@ -54,6 +54,8 @@ DEF_HELPER_1(yield, void, env)
|
||||
DEF_HELPER_1(pre_hvc, void, env)
|
||||
DEF_HELPER_2(pre_smc, void, env, i32)
|
||||
|
||||
DEF_HELPER_1(check_breakpoints, void, env)
|
||||
|
||||
DEF_HELPER_3(cpsr_write, void, env, i32, i32)
|
||||
DEF_HELPER_1(cpsr_read, i32, env)
|
||||
|
||||
|
@ -867,6 +867,15 @@ static bool check_breakpoints(ARMCPU *cpu)
|
||||
return false;
|
||||
}
|
||||
|
||||
void HELPER(check_breakpoints)(CPUARMState *env)
|
||||
{
|
||||
ARMCPU *cpu = arm_env_get_cpu(env);
|
||||
|
||||
if (check_breakpoints(cpu)) {
|
||||
HELPER(exception_internal(env, EXCP_DEBUG));
|
||||
}
|
||||
}
|
||||
|
||||
void arm_debug_excp_handler(CPUState *cs)
|
||||
{
|
||||
/* Called by core code when a watchpoint or breakpoint fires;
|
||||
@ -897,18 +906,22 @@ void arm_debug_excp_handler(CPUState *cs)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (check_breakpoints(cpu)) {
|
||||
bool same_el = (arm_debug_target_el(env) == arm_current_el(env));
|
||||
if (extended_addresses_enabled(env)) {
|
||||
env->exception.fsr = (1 << 9) | 0x22;
|
||||
} else {
|
||||
env->exception.fsr = 0x2;
|
||||
}
|
||||
/* FAR is UNKNOWN, so doesn't need setting */
|
||||
raise_exception(env, EXCP_PREFETCH_ABORT,
|
||||
syn_breakpoint(same_el),
|
||||
arm_debug_target_el(env));
|
||||
uint64_t pc = is_a64(env) ? env->pc : env->regs[15];
|
||||
bool same_el = (arm_debug_target_el(env) == arm_current_el(env));
|
||||
|
||||
if (cpu_breakpoint_test(cs, pc, BP_GDB)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (extended_addresses_enabled(env)) {
|
||||
env->exception.fsr = (1 << 9) | 0x22;
|
||||
} else {
|
||||
env->exception.fsr = 0x2;
|
||||
}
|
||||
/* FAR is UNKNOWN, so doesn't need setting */
|
||||
raise_exception(env, EXCP_PREFETCH_ABORT,
|
||||
syn_breakpoint(same_el),
|
||||
arm_debug_target_el(env));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1230,9 +1230,15 @@ static void handle_sync(DisasContext *s, uint32_t insn,
|
||||
return;
|
||||
case 4: /* DSB */
|
||||
case 5: /* DMB */
|
||||
case 6: /* ISB */
|
||||
/* We don't emulate caches so barriers are no-ops */
|
||||
return;
|
||||
case 6: /* ISB */
|
||||
/* We need to break the TB after this insn to execute
|
||||
* a self-modified code correctly and also to take
|
||||
* any pending interrupts immediately.
|
||||
*/
|
||||
s->is_jmp = DISAS_UPDATE;
|
||||
return;
|
||||
default:
|
||||
unallocated_encoding(s);
|
||||
return;
|
||||
@ -11084,11 +11090,18 @@ void gen_intermediate_code_a64(ARMCPU *cpu, TranslationBlock *tb)
|
||||
CPUBreakpoint *bp;
|
||||
QTAILQ_FOREACH(bp, &cs->breakpoints, entry) {
|
||||
if (bp->pc == dc->pc) {
|
||||
gen_exception_internal_insn(dc, 0, EXCP_DEBUG);
|
||||
/* Advance PC so that clearing the breakpoint will
|
||||
invalidate this TB. */
|
||||
dc->pc += 2;
|
||||
goto done_generating;
|
||||
if (bp->flags & BP_CPU) {
|
||||
gen_helper_check_breakpoints(cpu_env);
|
||||
/* End the TB early; it likely won't be executed */
|
||||
dc->is_jmp = DISAS_UPDATE;
|
||||
} else {
|
||||
gen_exception_internal_insn(dc, 0, EXCP_DEBUG);
|
||||
/* Advance PC so that clearing the breakpoint will
|
||||
invalidate this TB. */
|
||||
dc->pc += 4;
|
||||
goto done_generating;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7720,10 +7720,16 @@ static void disas_arm_insn(DisasContext *s, unsigned int insn)
|
||||
return;
|
||||
case 4: /* dsb */
|
||||
case 5: /* dmb */
|
||||
case 6: /* isb */
|
||||
ARCH(7);
|
||||
/* We don't emulate caches so these are a no-op. */
|
||||
return;
|
||||
case 6: /* isb */
|
||||
/* We need to break the TB after this insn to execute
|
||||
* self-modifying code correctly and also to take
|
||||
* any pending interrupts immediately.
|
||||
*/
|
||||
gen_lookup_tb(s);
|
||||
return;
|
||||
default:
|
||||
goto illegal_op;
|
||||
}
|
||||
@ -10030,9 +10036,16 @@ static int disas_thumb2_insn(CPUARMState *env, DisasContext *s, uint16_t insn_hw
|
||||
break;
|
||||
case 4: /* dsb */
|
||||
case 5: /* dmb */
|
||||
case 6: /* isb */
|
||||
/* These execute as NOPs. */
|
||||
break;
|
||||
case 6: /* isb */
|
||||
/* We need to break the TB after this insn
|
||||
* to execute self-modifying code correctly
|
||||
* and also to take any pending interrupts
|
||||
* immediately.
|
||||
*/
|
||||
gen_lookup_tb(s);
|
||||
break;
|
||||
default:
|
||||
goto illegal_op;
|
||||
}
|
||||
@ -11329,11 +11342,20 @@ void gen_intermediate_code(CPUARMState *env, TranslationBlock *tb)
|
||||
CPUBreakpoint *bp;
|
||||
QTAILQ_FOREACH(bp, &cs->breakpoints, entry) {
|
||||
if (bp->pc == dc->pc) {
|
||||
gen_exception_internal_insn(dc, 0, EXCP_DEBUG);
|
||||
/* Advance PC so that clearing the breakpoint will
|
||||
invalidate this TB. */
|
||||
dc->pc += 2;
|
||||
goto done_generating;
|
||||
if (bp->flags & BP_CPU) {
|
||||
gen_helper_check_breakpoints(cpu_env);
|
||||
/* End the TB early; it's likely not going to be executed */
|
||||
dc->is_jmp = DISAS_UPDATE;
|
||||
} else {
|
||||
gen_exception_internal_insn(dc, 0, EXCP_DEBUG);
|
||||
/* Advance PC so that clearing the breakpoint will
|
||||
invalidate this TB. */
|
||||
/* TODO: Advance PC by correct instruction length to
|
||||
* avoid disassembler error messages */
|
||||
dc->pc += 2;
|
||||
goto done_generating;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ int main(int argc, char **argv)
|
||||
|
||||
g_test_init(&argc, &argv, NULL);
|
||||
|
||||
s = qtest_start("-display none -machine imx25_pdk");
|
||||
s = qtest_start("-display none -machine imx25-pdk");
|
||||
i2c = imx_i2c_create(IMX25_I2C_0_BASE);
|
||||
addr = DS1338_ADDR;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user