cpu.c 70.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/*
 * QEMU ARM CPU
 *
 * Copyright (c) 2012 SUSE LINUX Products GmbH
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, see
 * <http://www.gnu.org/licenses/gpl-2.0.html>
 */

P
Peter Maydell 已提交
21
#include "qemu/osdep.h"
22
#include "target/arm/idau.h"
23
#include "qemu/error-report.h"
24
#include "qapi/error.h"
25
#include "cpu.h"
26
#include "internals.h"
27
#include "qemu-common.h"
28
#include "exec/exec-all.h"
29
#include "hw/qdev-properties.h"
30 31 32
#if !defined(CONFIG_USER_ONLY)
#include "hw/loader.h"
#endif
33
#include "hw/arm/arm.h"
34
#include "sysemu/sysemu.h"
35
#include "sysemu/hw_accel.h"
36
#include "kvm_arm.h"
37
#include "disas/capstone.h"
38
#include "fpu/softfloat.h"
39

40 41 42 43 44 45 46
static void arm_cpu_set_pc(CPUState *cs, vaddr value)
{
    ARMCPU *cpu = ARM_CPU(cs);

    cpu->env.regs[15] = value;
}

47 48
static bool arm_cpu_has_work(CPUState *cs)
{
49 50
    ARMCPU *cpu = ARM_CPU(cs);

51
    return (cpu->power_state != PSCI_OFF)
52
        && cs->interrupt_request &
53 54 55
        (CPU_INTERRUPT_FIQ | CPU_INTERRUPT_HARD
         | CPU_INTERRUPT_VFIQ | CPU_INTERRUPT_VIRQ
         | CPU_INTERRUPT_EXITTB);
56 57
}

58 59 60 61 62 63 64 65 66 67 68
void arm_register_pre_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook,
                                 void *opaque)
{
    ARMELChangeHook *entry = g_new0(ARMELChangeHook, 1);

    entry->hook = hook;
    entry->opaque = opaque;

    QLIST_INSERT_HEAD(&cpu->pre_el_change_hooks, entry, node);
}

69
void arm_register_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook,
70 71
                                 void *opaque)
{
72 73 74 75 76 77
    ARMELChangeHook *entry = g_new0(ARMELChangeHook, 1);

    entry->hook = hook;
    entry->opaque = opaque;

    QLIST_INSERT_HEAD(&cpu->el_change_hooks, entry, node);
78 79
}

80 81 82 83 84 85
static void cp_reg_reset(gpointer key, gpointer value, gpointer opaque)
{
    /* Reset a single ARMCPRegInfo register */
    ARMCPRegInfo *ri = value;
    ARMCPU *cpu = opaque;

86
    if (ri->type & (ARM_CP_SPECIAL | ARM_CP_ALIAS)) {
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
        return;
    }

    if (ri->resetfn) {
        ri->resetfn(&cpu->env, ri);
        return;
    }

    /* A zero offset is never possible as it would be regs[0]
     * so we use it to indicate that reset is being handled elsewhere.
     * This is basically only used for fields in non-core coprocessors
     * (like the pxa2xx ones).
     */
    if (!ri->fieldoffset) {
        return;
    }

104
    if (cpreg_field_is_64bit(ri)) {
105 106 107 108 109 110
        CPREG_FIELD64(&cpu->env, ri) = ri->resetvalue;
    } else {
        CPREG_FIELD32(&cpu->env, ri) = ri->resetvalue;
    }
}

111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
static void cp_reg_check_reset(gpointer key, gpointer value,  gpointer opaque)
{
    /* Purely an assertion check: we've already done reset once,
     * so now check that running the reset for the cpreg doesn't
     * change its value. This traps bugs where two different cpregs
     * both try to reset the same state field but to different values.
     */
    ARMCPRegInfo *ri = value;
    ARMCPU *cpu = opaque;
    uint64_t oldvalue, newvalue;

    if (ri->type & (ARM_CP_SPECIAL | ARM_CP_ALIAS | ARM_CP_NO_RAW)) {
        return;
    }

    oldvalue = read_raw_cp_reg(&cpu->env, ri);
    cp_reg_reset(key, value, opaque);
    newvalue = read_raw_cp_reg(&cpu->env, ri);
    assert(oldvalue == newvalue);
}

132 133 134 135 136
/* CPUClass::reset() */
static void arm_cpu_reset(CPUState *s)
{
    ARMCPU *cpu = ARM_CPU(s);
    ARMCPUClass *acc = ARM_CPU_GET_CLASS(cpu);
137 138
    CPUARMState *env = &cpu->env;

139 140
    acc->parent_reset(s);

141 142
    memset(env, 0, offsetof(CPUARMState, end_reset_fields));

143
    g_hash_table_foreach(cpu->cp_regs, cp_reg_reset, cpu);
144 145
    g_hash_table_foreach(cpu->cp_regs, cp_reg_check_reset, cpu);

146
    env->vfp.xregs[ARM_VFP_FPSID] = cpu->reset_fpsid;
147 148 149
    env->vfp.xregs[ARM_VFP_MVFR0] = cpu->isar.mvfr0;
    env->vfp.xregs[ARM_VFP_MVFR1] = cpu->isar.mvfr1;
    env->vfp.xregs[ARM_VFP_MVFR2] = cpu->isar.mvfr2;
150

151
    cpu->power_state = cpu->start_powered_off ? PSCI_OFF : PSCI_ON;
152 153
    s->halted = cpu->start_powered_off;

154 155 156 157
    if (arm_feature(env, ARM_FEATURE_IWMMXT)) {
        env->iwmmxt.cregs[ARM_IWMMXT_wCID] = 0x69051000 | 'Q';
    }

158 159 160
    if (arm_feature(env, ARM_FEATURE_AARCH64)) {
        /* 64 bit CPUs always start in 64 bit mode */
        env->aarch64 = 1;
161 162
#if defined(CONFIG_USER_ONLY)
        env->pstate = PSTATE_MODE_EL0t;
163
        /* Userspace expects access to DC ZVA, CTL_EL0 and the cache ops */
164
        env->cp15.sctlr_el[1] |= SCTLR_UCT | SCTLR_UCI | SCTLR_DZE;
165
        /* and to the FP/Neon instructions */
166
        env->cp15.cpacr_el1 = deposit64(env->cp15.cpacr_el1, 20, 2, 3);
167 168 169 170
        /* and to the SVE instructions */
        env->cp15.cpacr_el1 = deposit64(env->cp15.cpacr_el1, 16, 2, 3);
        env->cp15.cptr_el[3] |= CPTR_EZ;
        /* with maximum vector length */
171 172 173
        env->vfp.zcr_el[1] = cpu->sve_max_vq - 1;
        env->vfp.zcr_el[2] = env->vfp.zcr_el[1];
        env->vfp.zcr_el[3] = env->vfp.zcr_el[1];
174
#else
175 176 177 178 179 180 181 182
        /* Reset into the highest available EL */
        if (arm_feature(env, ARM_FEATURE_EL3)) {
            env->pstate = PSTATE_MODE_EL3h;
        } else if (arm_feature(env, ARM_FEATURE_EL2)) {
            env->pstate = PSTATE_MODE_EL2h;
        } else {
            env->pstate = PSTATE_MODE_EL1h;
        }
183
        env->pc = cpu->rvbar;
184 185 186 187
#endif
    } else {
#if defined(CONFIG_USER_ONLY)
        /* Userspace expects access to cp10 and cp11 for FP/Neon */
188
        env->cp15.cpacr_el1 = deposit64(env->cp15.cpacr_el1, 20, 4, 0xf);
189
#endif
190 191
    }

192 193 194 195 196 197 198 199 200 201
#if defined(CONFIG_USER_ONLY)
    env->uncached_cpsr = ARM_CPU_MODE_USR;
    /* For user mode we must enable access to coprocessors */
    env->vfp.xregs[ARM_VFP_FPEXC] = 1 << 30;
    if (arm_feature(env, ARM_FEATURE_IWMMXT)) {
        env->cp15.c15_cpar = 3;
    } else if (arm_feature(env, ARM_FEATURE_XSCALE)) {
        env->cp15.c15_cpar = 1;
    }
#else
202 203 204 205 206 207 208 209 210 211 212 213

    /*
     * If the highest available EL is EL2, AArch32 will start in Hyp
     * mode; otherwise it starts in SVC. Note that if we start in
     * AArch64 then these values in the uncached_cpsr will be ignored.
     */
    if (arm_feature(env, ARM_FEATURE_EL2) &&
        !arm_feature(env, ARM_FEATURE_EL3)) {
        env->uncached_cpsr = ARM_CPU_MODE_HYP;
    } else {
        env->uncached_cpsr = ARM_CPU_MODE_SVC;
    }
214
    env->daif = PSTATE_D | PSTATE_A | PSTATE_I | PSTATE_F;
215

P
Peter Maydell 已提交
216
    if (arm_feature(env, ARM_FEATURE_M)) {
217 218
        uint32_t initial_msp; /* Loaded from 0x0 */
        uint32_t initial_pc; /* Loaded from 0x4 */
219
        uint8_t *rom;
220
        uint32_t vecbase;
221

222 223
        if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
            env->v7m.secure = true;
224 225 226 227 228 229 230
        } else {
            /* This bit resets to 0 if security is supported, but 1 if
             * it is not. The bit is not present in v7M, but we set it
             * here so we can avoid having to make checks on it conditional
             * on ARM_FEATURE_V8 (we don't let the guest see the bit).
             */
            env->v7m.aircr = R_V7M_AIRCR_BFHFNMINS_MASK;
231 232
        }

233
        /* In v7M the reset value of this bit is IMPDEF, but ARM recommends
234
         * that it resets to 1, so QEMU always does that rather than making
235
         * it dependent on CPU model. In v8M it is RES1.
236
         */
237 238 239 240 241 242 243
        env->v7m.ccr[M_REG_NS] = R_V7M_CCR_STKALIGN_MASK;
        env->v7m.ccr[M_REG_S] = R_V7M_CCR_STKALIGN_MASK;
        if (arm_feature(env, ARM_FEATURE_V8)) {
            /* in v8M the NONBASETHRDENA bit [0] is RES1 */
            env->v7m.ccr[M_REG_NS] |= R_V7M_CCR_NONBASETHRDENA_MASK;
            env->v7m.ccr[M_REG_S] |= R_V7M_CCR_NONBASETHRDENA_MASK;
        }
244 245 246 247
        if (!arm_feature(env, ARM_FEATURE_M_MAIN)) {
            env->v7m.ccr[M_REG_NS] |= R_V7M_CCR_UNALIGN_TRP_MASK;
            env->v7m.ccr[M_REG_S] |= R_V7M_CCR_UNALIGN_TRP_MASK;
        }
248

249 250 251
        /* Unlike A/R profile, M profile defines the reset LR value */
        env->regs[14] = 0xffffffff;

252 253 254 255
        env->v7m.vecbase[M_REG_S] = cpu->init_svtor & 0xffffff80;

        /* Load the initial SP and PC from offset 0 and 4 in the vector table */
        vecbase = env->v7m.vecbase[env->v7m.secure];
256
        rom = rom_ptr(vecbase, 8);
257
        if (rom) {
258 259 260 261 262 263 264 265 266 267 268
            /* Address zero is covered by ROM which hasn't yet been
             * copied into physical memory.
             */
            initial_msp = ldl_p(rom);
            initial_pc = ldl_p(rom + 4);
        } else {
            /* Address zero not covered by a ROM blob, or the ROM blob
             * is in non-modifiable memory and this is a second reset after
             * it got copied into memory. In the latter case, rom_ptr
             * will return a NULL pointer and we should use ldl_phys instead.
             */
269 270
            initial_msp = ldl_phys(s->as, vecbase);
            initial_pc = ldl_phys(s->as, vecbase + 4);
271
        }
272 273 274 275

        env->regs[13] = initial_msp & 0xFFFFFFFC;
        env->regs[15] = initial_pc & ~1;
        env->thumb = initial_pc & 1;
276
    }
277

278 279 280 281 282
    /* AArch32 has a hard highvec setting of 0xFFFF0000.  If we are currently
     * executing as AArch32 then check if highvecs are enabled and
     * adjust the PC accordingly.
     */
    if (A32_BANKED_CURRENT_REG_GET(env, sctlr) & SCTLR_V) {
283
        env->regs[15] = 0xFFFF0000;
284 285
    }

286 287 288 289 290 291
    /* M profile requires that reset clears the exclusive monitor;
     * A profile does not, but clearing it makes more sense than having it
     * set with an exclusive access on address zero.
     */
    arm_clear_exclusive(env);

292 293
    env->vfp.xregs[ARM_VFP_FPEXC] = 0;
#endif
294

295
    if (arm_feature(env, ARM_FEATURE_PMSA)) {
296
        if (cpu->pmsav7_dregion > 0) {
297
            if (arm_feature(env, ARM_FEATURE_V8)) {
298 299 300 301 302 303 304 305 306 307 308 309 310 311
                memset(env->pmsav8.rbar[M_REG_NS], 0,
                       sizeof(*env->pmsav8.rbar[M_REG_NS])
                       * cpu->pmsav7_dregion);
                memset(env->pmsav8.rlar[M_REG_NS], 0,
                       sizeof(*env->pmsav8.rlar[M_REG_NS])
                       * cpu->pmsav7_dregion);
                if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
                    memset(env->pmsav8.rbar[M_REG_S], 0,
                           sizeof(*env->pmsav8.rbar[M_REG_S])
                           * cpu->pmsav7_dregion);
                    memset(env->pmsav8.rlar[M_REG_S], 0,
                           sizeof(*env->pmsav8.rlar[M_REG_S])
                           * cpu->pmsav7_dregion);
                }
312 313 314 315 316 317 318 319
            } else if (arm_feature(env, ARM_FEATURE_V7)) {
                memset(env->pmsav7.drbar, 0,
                       sizeof(*env->pmsav7.drbar) * cpu->pmsav7_dregion);
                memset(env->pmsav7.drsr, 0,
                       sizeof(*env->pmsav7.drsr) * cpu->pmsav7_dregion);
                memset(env->pmsav7.dracr, 0,
                       sizeof(*env->pmsav7.dracr) * cpu->pmsav7_dregion);
            }
320
        }
321 322
        env->pmsav7.rnr[M_REG_NS] = 0;
        env->pmsav7.rnr[M_REG_S] = 0;
323 324 325 326
        env->pmsav8.mair0[M_REG_NS] = 0;
        env->pmsav8.mair0[M_REG_S] = 0;
        env->pmsav8.mair1[M_REG_NS] = 0;
        env->pmsav8.mair1[M_REG_S] = 0;
327 328
    }

329 330 331 332 333 334 335 336 337 338 339 340
    if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
        if (cpu->sau_sregion > 0) {
            memset(env->sau.rbar, 0, sizeof(*env->sau.rbar) * cpu->sau_sregion);
            memset(env->sau.rlar, 0, sizeof(*env->sau.rlar) * cpu->sau_sregion);
        }
        env->sau.rnr = 0;
        /* SAU_CTRL reset value is IMPDEF; we choose 0, which is what
         * the Cortex-M33 does.
         */
        env->sau.ctrl = 0;
    }

341 342 343 344 345 346 347
    set_flush_to_zero(1, &env->vfp.standard_fp_status);
    set_flush_inputs_to_zero(1, &env->vfp.standard_fp_status);
    set_default_nan_mode(1, &env->vfp.standard_fp_status);
    set_float_detect_tininess(float_tininess_before_rounding,
                              &env->vfp.fp_status);
    set_float_detect_tininess(float_tininess_before_rounding,
                              &env->vfp.standard_fp_status);
348 349
    set_float_detect_tininess(float_tininess_before_rounding,
                              &env->vfp.fp_status_f16);
350 351 352 353 354
#ifndef CONFIG_USER_ONLY
    if (kvm_enabled()) {
        kvm_arm_reset_vcpu(cpu);
    }
#endif
355

356
    hw_breakpoint_update_all(cpu);
357
    hw_watchpoint_update_all(cpu);
358 359
}

360 361 362
bool arm_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
{
    CPUClass *cc = CPU_GET_CLASS(cs);
363 364 365 366 367
    CPUARMState *env = cs->env_ptr;
    uint32_t cur_el = arm_current_el(env);
    bool secure = arm_is_secure(env);
    uint32_t target_el;
    uint32_t excp_idx;
368 369
    bool ret = false;

370 371 372 373 374 375 376 377 378
    if (interrupt_request & CPU_INTERRUPT_FIQ) {
        excp_idx = EXCP_FIQ;
        target_el = arm_phys_excp_target_el(cs, excp_idx, cur_el, secure);
        if (arm_excp_unmasked(cs, excp_idx, target_el)) {
            cs->exception_index = excp_idx;
            env->exception.target_el = target_el;
            cc->do_interrupt(cs);
            ret = true;
        }
379
    }
380 381 382 383 384 385 386 387 388
    if (interrupt_request & CPU_INTERRUPT_HARD) {
        excp_idx = EXCP_IRQ;
        target_el = arm_phys_excp_target_el(cs, excp_idx, cur_el, secure);
        if (arm_excp_unmasked(cs, excp_idx, target_el)) {
            cs->exception_index = excp_idx;
            env->exception.target_el = target_el;
            cc->do_interrupt(cs);
            ret = true;
        }
389
    }
390 391 392 393 394 395 396 397 398
    if (interrupt_request & CPU_INTERRUPT_VIRQ) {
        excp_idx = EXCP_VIRQ;
        target_el = 1;
        if (arm_excp_unmasked(cs, excp_idx, target_el)) {
            cs->exception_index = excp_idx;
            env->exception.target_el = target_el;
            cc->do_interrupt(cs);
            ret = true;
        }
399
    }
400 401 402 403 404 405 406 407 408
    if (interrupt_request & CPU_INTERRUPT_VFIQ) {
        excp_idx = EXCP_VFIQ;
        target_el = 1;
        if (arm_excp_unmasked(cs, excp_idx, target_el)) {
            cs->exception_index = excp_idx;
            env->exception.target_el = target_el;
            cc->do_interrupt(cs);
            ret = true;
        }
409
    }
410 411 412 413

    return ret;
}

414 415 416 417 418 419 420 421
#if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64)
static bool arm_v7m_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
{
    CPUClass *cc = CPU_GET_CLASS(cs);
    ARMCPU *cpu = ARM_CPU(cs);
    CPUARMState *env = &cpu->env;
    bool ret = false;

422
    /* ARMv7-M interrupt masking works differently than -A or -R.
423 424 425 426 427
     * There is no FIQ/IRQ distinction. Instead of I and F bits
     * masking FIQ and IRQ interrupts, an exception is taken only
     * if it is higher priority than the current execution priority
     * (which depends on state like BASEPRI, FAULTMASK and the
     * currently active exception).
428 429
     */
    if (interrupt_request & CPU_INTERRUPT_HARD
430
        && (armv7m_nvic_can_take_pending_exception(env->nvic))) {
431 432 433 434 435 436 437 438
        cs->exception_index = EXCP_IRQ;
        cc->do_interrupt(cs);
        ret = true;
    }
    return ret;
}
#endif

439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480
void arm_cpu_update_virq(ARMCPU *cpu)
{
    /*
     * Update the interrupt level for VIRQ, which is the logical OR of
     * the HCR_EL2.VI bit and the input line level from the GIC.
     */
    CPUARMState *env = &cpu->env;
    CPUState *cs = CPU(cpu);

    bool new_state = (env->cp15.hcr_el2 & HCR_VI) ||
        (env->irq_line_state & CPU_INTERRUPT_VIRQ);

    if (new_state != ((cs->interrupt_request & CPU_INTERRUPT_VIRQ) != 0)) {
        if (new_state) {
            cpu_interrupt(cs, CPU_INTERRUPT_VIRQ);
        } else {
            cpu_reset_interrupt(cs, CPU_INTERRUPT_VIRQ);
        }
    }
}

void arm_cpu_update_vfiq(ARMCPU *cpu)
{
    /*
     * Update the interrupt level for VFIQ, which is the logical OR of
     * the HCR_EL2.VF bit and the input line level from the GIC.
     */
    CPUARMState *env = &cpu->env;
    CPUState *cs = CPU(cpu);

    bool new_state = (env->cp15.hcr_el2 & HCR_VF) ||
        (env->irq_line_state & CPU_INTERRUPT_VFIQ);

    if (new_state != ((cs->interrupt_request & CPU_INTERRUPT_VFIQ) != 0)) {
        if (new_state) {
            cpu_interrupt(cs, CPU_INTERRUPT_VFIQ);
        } else {
            cpu_reset_interrupt(cs, CPU_INTERRUPT_VFIQ);
        }
    }
}

481 482 483 484
#ifndef CONFIG_USER_ONLY
static void arm_cpu_set_irq(void *opaque, int irq, int level)
{
    ARMCPU *cpu = opaque;
485
    CPUARMState *env = &cpu->env;
486
    CPUState *cs = CPU(cpu);
487 488 489 490 491 492
    static const int mask[] = {
        [ARM_CPU_IRQ] = CPU_INTERRUPT_HARD,
        [ARM_CPU_FIQ] = CPU_INTERRUPT_FIQ,
        [ARM_CPU_VIRQ] = CPU_INTERRUPT_VIRQ,
        [ARM_CPU_VFIQ] = CPU_INTERRUPT_VFIQ
    };
493

494 495 496 497 498 499
    if (level) {
        env->irq_line_state |= mask[irq];
    } else {
        env->irq_line_state &= ~mask[irq];
    }

500
    switch (irq) {
501
    case ARM_CPU_VIRQ:
502 503 504
        assert(arm_feature(env, ARM_FEATURE_EL2));
        arm_cpu_update_virq(cpu);
        break;
505
    case ARM_CPU_VFIQ:
506
        assert(arm_feature(env, ARM_FEATURE_EL2));
507 508
        arm_cpu_update_vfiq(cpu);
        break;
509
    case ARM_CPU_IRQ:
510 511
    case ARM_CPU_FIQ:
        if (level) {
512
            cpu_interrupt(cs, mask[irq]);
513
        } else {
514
            cpu_reset_interrupt(cs, mask[irq]);
515 516 517
        }
        break;
    default:
518
        g_assert_not_reached();
519 520 521 522 523 524 525
    }
}

static void arm_cpu_kvm_set_irq(void *opaque, int irq, int level)
{
#ifdef CONFIG_KVM
    ARMCPU *cpu = opaque;
526
    CPUARMState *env = &cpu->env;
527 528
    CPUState *cs = CPU(cpu);
    int kvm_irq = KVM_ARM_IRQ_TYPE_CPU << KVM_ARM_IRQ_TYPE_SHIFT;
529
    uint32_t linestate_bit;
530 531 532 533

    switch (irq) {
    case ARM_CPU_IRQ:
        kvm_irq |= KVM_ARM_IRQ_CPU_IRQ;
534
        linestate_bit = CPU_INTERRUPT_HARD;
535 536 537
        break;
    case ARM_CPU_FIQ:
        kvm_irq |= KVM_ARM_IRQ_CPU_FIQ;
538
        linestate_bit = CPU_INTERRUPT_FIQ;
539 540
        break;
    default:
541
        g_assert_not_reached();
542
    }
543 544 545 546 547 548 549

    if (level) {
        env->irq_line_state |= linestate_bit;
    } else {
        env->irq_line_state &= ~linestate_bit;
    }

550 551 552 553
    kvm_irq |= cs->cpu_index << KVM_ARM_IRQ_VCPU_SHIFT;
    kvm_set_irq(kvm_state, kvm_irq, level ? 1 : 0);
#endif
}
554

555
static bool arm_cpu_virtio_is_big_endian(CPUState *cs)
556 557 558 559 560
{
    ARMCPU *cpu = ARM_CPU(cs);
    CPUARMState *env = &cpu->env;

    cpu_synchronize_state(cs);
561
    return arm_cpu_data_is_big_endian(env);
562 563
}

564 565
#endif

566 567
static inline void set_feature(CPUARMState *env, int feature)
{
568
    env->features |= 1ULL << feature;
569 570
}

571 572 573 574 575
static inline void unset_feature(CPUARMState *env, int feature)
{
    env->features &= ~(1ULL << feature);
}

576 577 578 579 580 581 582 583 584 585
static int
print_insn_thumb1(bfd_vma pc, disassemble_info *info)
{
  return print_insn_arm(pc | 1, info);
}

static void arm_disas_set_info(CPUState *cpu, disassemble_info *info)
{
    ARMCPU *ac = ARM_CPU(cpu);
    CPUARMState *env = &ac->env;
586
    bool sctlr_b;
587 588 589 590 591 592 593 594 595

    if (is_a64(env)) {
        /* We might not be compiled with the A64 disassembler
         * because it needs a C++ compiler. Leave print_insn
         * unset in this case to use the caller default behaviour.
         */
#if defined(CONFIG_ARM_A64_DIS)
        info->print_insn = print_insn_arm_a64;
#endif
596
        info->cap_arch = CS_ARCH_ARM64;
597 598
        info->cap_insn_unit = 4;
        info->cap_insn_split = 4;
599
    } else {
600 601 602
        int cap_mode;
        if (env->thumb) {
            info->print_insn = print_insn_thumb1;
603 604
            info->cap_insn_unit = 2;
            info->cap_insn_split = 4;
605 606 607
            cap_mode = CS_MODE_THUMB;
        } else {
            info->print_insn = print_insn_arm;
608 609
            info->cap_insn_unit = 4;
            info->cap_insn_split = 4;
610 611 612 613 614 615 616 617 618 619
            cap_mode = CS_MODE_ARM;
        }
        if (arm_feature(env, ARM_FEATURE_V8)) {
            cap_mode |= CS_MODE_V8;
        }
        if (arm_feature(env, ARM_FEATURE_M)) {
            cap_mode |= CS_MODE_MCLASS;
        }
        info->cap_arch = CS_ARCH_ARM;
        info->cap_mode = cap_mode;
620
    }
621 622 623

    sctlr_b = arm_sctlr_b(env);
    if (bswap_code(sctlr_b)) {
624 625 626 627 628 629
#ifdef TARGET_WORDS_BIGENDIAN
        info->endian = BFD_ENDIAN_LITTLE;
#else
        info->endian = BFD_ENDIAN_BIG;
#endif
    }
630
    info->flags &= ~INSN_ARM_BE32;
631 632
#ifndef CONFIG_USER_ONLY
    if (sctlr_b) {
633 634
        info->flags |= INSN_ARM_BE32;
    }
635
#endif
636 637
}

638 639 640 641 642 643 644
uint64_t arm_cpu_mp_affinity(int idx, uint8_t clustersz)
{
    uint32_t Aff1 = idx / clustersz;
    uint32_t Aff0 = idx % clustersz;
    return (Aff1 << ARM_AFF1_SHIFT) | Aff0;
}

645 646 647 648 649 650 651 652 653 654 655 656 657 658
static void cpreg_hashtable_data_destroy(gpointer data)
{
    /*
     * Destroy function for cpu->cp_regs hashtable data entries.
     * We must free the name string because it was g_strdup()ed in
     * add_cpreg_to_hashtable(). It's OK to cast away the 'const'
     * from r->name because we know we definitely allocated it.
     */
    ARMCPRegInfo *r = data;

    g_free((void *)r->name);
    g_free(r);
}

659 660
static void arm_cpu_initfn(Object *obj)
{
661
    CPUState *cs = CPU(obj);
662 663
    ARMCPU *cpu = ARM_CPU(obj);

664
    cs->env_ptr = &cpu->env;
665
    cpu->cp_regs = g_hash_table_new_full(g_int_hash, g_int_equal,
666
                                         g_free, cpreg_hashtable_data_destroy);
667

668
    QLIST_INIT(&cpu->pre_el_change_hooks);
669 670
    QLIST_INIT(&cpu->el_change_hooks);

671 672 673
#ifndef CONFIG_USER_ONLY
    /* Our inbound IRQ and FIQ lines */
    if (kvm_enabled()) {
674 675 676 677
        /* VIRQ and VFIQ are unused with KVM but we add them to maintain
         * the same interface as non-KVM CPUs.
         */
        qdev_init_gpio_in(DEVICE(cpu), arm_cpu_kvm_set_irq, 4);
678
    } else {
679
        qdev_init_gpio_in(DEVICE(cpu), arm_cpu_set_irq, 4);
680
    }
681 682 683

    qdev_init_gpio_out(DEVICE(cpu), cpu->gt_timer_outputs,
                       ARRAY_SIZE(cpu->gt_timer_outputs));
684 685 686

    qdev_init_gpio_out_named(DEVICE(cpu), &cpu->gicv3_maintenance_interrupt,
                             "gicv3-maintenance-interrupt", 1);
687 688
    qdev_init_gpio_out_named(DEVICE(cpu), &cpu->pmu_interrupt,
                             "pmu-interrupt", 1);
689 690
#endif

691 692 693 694 695
    /* DTB consumers generally don't in fact care what the 'compatible'
     * string is, so always provide some string and trust that a hypothetical
     * picky DTB consumer will also provide a helpful error message.
     */
    cpu->dtb_compatible = "qemu,unknown";
696
    cpu->psci_version = 1; /* By default assume PSCI v0.1 */
697
    cpu->kvm_target = QEMU_KVM_ARM_TARGET_NONE;
698

699 700
    if (tcg_enabled()) {
        cpu->psci_version = 2; /* TCG implements PSCI 0.2 */
701
    }
702 703
}

704
static Property arm_cpu_reset_cbar_property =
705
            DEFINE_PROP_UINT64("reset-cbar", ARMCPU, reset_cbar, 0);
706

707 708 709
static Property arm_cpu_reset_hivecs_property =
            DEFINE_PROP_BOOL("reset-hivecs", ARMCPU, reset_hivecs, false);

710 711 712
static Property arm_cpu_rvbar_property =
            DEFINE_PROP_UINT64("rvbar", ARMCPU, rvbar, 0);

713 714 715
static Property arm_cpu_has_el2_property =
            DEFINE_PROP_BOOL("has_el2", ARMCPU, has_el2, true);

716 717 718
static Property arm_cpu_has_el3_property =
            DEFINE_PROP_BOOL("has_el3", ARMCPU, has_el3, true);

719 720 721
static Property arm_cpu_cfgend_property =
            DEFINE_PROP_BOOL("cfgend", ARMCPU, cfgend, false);

722 723 724 725
/* use property name "pmu" to match other archs and virt tools */
static Property arm_cpu_has_pmu_property =
            DEFINE_PROP_BOOL("pmu", ARMCPU, has_pmu, true);

P
Peter Crosthwaite 已提交
726 727 728
static Property arm_cpu_has_mpu_property =
            DEFINE_PROP_BOOL("has-mpu", ARMCPU, has_mpu, true);

729 730 731 732 733
/* This is like DEFINE_PROP_UINT32 but it doesn't set the default value,
 * because the CPU initfn will have already set cpu->pmsav7_dregion to
 * the right value for that particular CPU type, and we don't want
 * to override that with an incorrect constant value.
 */
734
static Property arm_cpu_pmsav7_dregion_property =
735 736 737
            DEFINE_PROP_UNSIGNED_NODEFAULT("pmsav7-dregion", ARMCPU,
                                           pmsav7_dregion,
                                           qdev_prop_uint32, uint32_t);
738

739 740 741 742
/* M profile: initial value of the Secure VTOR */
static Property arm_cpu_initsvtor_property =
            DEFINE_PROP_UINT32("init-svtor", ARMCPU, init_svtor, 0);

743 744 745 746
static void arm_cpu_post_init(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);

747 748 749 750 751 752 753 754
    /* M profile implies PMSA. We have to do this here rather than
     * in realize with the other feature-implication checks because
     * we look at the PMSA bit to see if we should add some properties.
     */
    if (arm_feature(&cpu->env, ARM_FEATURE_M)) {
        set_feature(&cpu->env, ARM_FEATURE_PMSA);
    }

755 756
    if (arm_feature(&cpu->env, ARM_FEATURE_CBAR) ||
        arm_feature(&cpu->env, ARM_FEATURE_CBAR_RO)) {
757
        qdev_property_add_static(DEVICE(obj), &arm_cpu_reset_cbar_property,
758
                                 &error_abort);
759
    }
760 761 762

    if (!arm_feature(&cpu->env, ARM_FEATURE_M)) {
        qdev_property_add_static(DEVICE(obj), &arm_cpu_reset_hivecs_property,
763
                                 &error_abort);
764
    }
765 766 767 768 769

    if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
        qdev_property_add_static(DEVICE(obj), &arm_cpu_rvbar_property,
                                 &error_abort);
    }
770 771 772 773 774 775 776

    if (arm_feature(&cpu->env, ARM_FEATURE_EL3)) {
        /* Add the has_el3 state CPU property only if EL3 is allowed.  This will
         * prevent "has_el3" from existing on CPUs which cannot support EL3.
         */
        qdev_property_add_static(DEVICE(obj), &arm_cpu_has_el3_property,
                                 &error_abort);
777 778 779 780 781 782

#ifndef CONFIG_USER_ONLY
        object_property_add_link(obj, "secure-memory",
                                 TYPE_MEMORY_REGION,
                                 (Object **)&cpu->secure_memory,
                                 qdev_prop_allow_set_link_before_realize,
783
                                 OBJ_PROP_LINK_STRONG,
784 785
                                 &error_abort);
#endif
786
    }
P
Peter Crosthwaite 已提交
787

788 789 790 791 792
    if (arm_feature(&cpu->env, ARM_FEATURE_EL2)) {
        qdev_property_add_static(DEVICE(obj), &arm_cpu_has_el2_property,
                                 &error_abort);
    }

793 794 795 796 797
    if (arm_feature(&cpu->env, ARM_FEATURE_PMU)) {
        qdev_property_add_static(DEVICE(obj), &arm_cpu_has_pmu_property,
                                 &error_abort);
    }

798
    if (arm_feature(&cpu->env, ARM_FEATURE_PMSA)) {
P
Peter Crosthwaite 已提交
799 800
        qdev_property_add_static(DEVICE(obj), &arm_cpu_has_mpu_property,
                                 &error_abort);
801 802 803 804 805
        if (arm_feature(&cpu->env, ARM_FEATURE_V7)) {
            qdev_property_add_static(DEVICE(obj),
                                     &arm_cpu_pmsav7_dregion_property,
                                     &error_abort);
        }
P
Peter Crosthwaite 已提交
806 807
    }

808 809 810
    if (arm_feature(&cpu->env, ARM_FEATURE_M_SECURITY)) {
        object_property_add_link(obj, "idau", TYPE_IDAU_INTERFACE, &cpu->idau,
                                 qdev_prop_allow_set_link_before_realize,
811
                                 OBJ_PROP_LINK_STRONG,
812
                                 &error_abort);
813 814
        qdev_property_add_static(DEVICE(obj), &arm_cpu_initsvtor_property,
                                 &error_abort);
815 816
    }

817 818
    qdev_property_add_static(DEVICE(obj), &arm_cpu_cfgend_property,
                             &error_abort);
819 820
}

821 822 823
static void arm_cpu_finalizefn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
824 825
    ARMELChangeHook *hook, *next;

826
    g_hash_table_destroy(cpu->cp_regs);
827

828 829 830 831
    QLIST_FOREACH_SAFE(hook, &cpu->pre_el_change_hooks, node, next) {
        QLIST_REMOVE(hook, node);
        g_free(hook);
    }
832 833 834 835
    QLIST_FOREACH_SAFE(hook, &cpu->el_change_hooks, node, next) {
        QLIST_REMOVE(hook, node);
        g_free(hook);
    }
836 837
}

838
static void arm_cpu_realizefn(DeviceState *dev, Error **errp)
839
{
840
    CPUState *cs = CPU(dev);
841 842
    ARMCPU *cpu = ARM_CPU(dev);
    ARMCPUClass *acc = ARM_CPU_GET_CLASS(dev);
843
    CPUARMState *env = &cpu->env;
844
    int pagebits;
845
    Error *local_err = NULL;
846
    bool no_aa32 = false;
847

848 849 850 851 852 853 854 855 856 857 858 859 860
    /* If we needed to query the host kernel for the CPU features
     * then it's possible that might have failed in the initfn, but
     * this is the first point where we can report it.
     */
    if (cpu->host_cpu_probe_failed) {
        if (!kvm_enabled()) {
            error_setg(errp, "The 'host' CPU type can only be used with KVM");
        } else {
            error_setg(errp, "Failed to retrieve host CPU features");
        }
        return;
    }

861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876
#ifndef CONFIG_USER_ONLY
    /* The NVIC and M-profile CPU are two halves of a single piece of
     * hardware; trying to use one without the other is a command line
     * error and will result in segfaults if not caught here.
     */
    if (arm_feature(env, ARM_FEATURE_M)) {
        if (!env->nvic) {
            error_setg(errp, "This board cannot be used with Cortex-M CPUs");
            return;
        }
    } else {
        if (env->nvic) {
            error_setg(errp, "This board can only be used with Cortex-M CPUs");
            return;
        }
    }
877 878 879 880 881 882 883 884 885

    cpu->gt_timer[GTIMER_PHYS] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
                                           arm_gt_ptimer_cb, cpu);
    cpu->gt_timer[GTIMER_VIRT] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
                                           arm_gt_vtimer_cb, cpu);
    cpu->gt_timer[GTIMER_HYP] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
                                          arm_gt_htimer_cb, cpu);
    cpu->gt_timer[GTIMER_SEC] = timer_new(QEMU_CLOCK_VIRTUAL, GTIMER_SCALE,
                                          arm_gt_stimer_cb, cpu);
886 887
#endif

888 889 890 891 892
    cpu_exec_realizefn(cs, &local_err);
    if (local_err != NULL) {
        error_propagate(errp, local_err);
        return;
    }
893

894
    /* Some features automatically imply others: */
895
    if (arm_feature(env, ARM_FEATURE_V8)) {
896 897 898 899 900
        if (arm_feature(env, ARM_FEATURE_M)) {
            set_feature(env, ARM_FEATURE_V7);
        } else {
            set_feature(env, ARM_FEATURE_V7VE);
        }
901
    }
902 903 904 905 906 907 908 909 910 911

    /*
     * There exist AArch64 cpus without AArch32 support.  When KVM
     * queries ID_ISAR0_EL1 on such a host, the value is UNKNOWN.
     * Similarly, we cannot check ID_AA64PFR0 without AArch64 support.
     */
    if (arm_feature(&cpu->env, ARM_FEATURE_AARCH64)) {
        no_aa32 = !cpu_isar_feature(aa64_aa32, cpu);
    }

912 913 914 915 916 917 918 919 920
    if (arm_feature(env, ARM_FEATURE_V7VE)) {
        /* v7 Virtualization Extensions. In real hardware this implies
         * EL2 and also the presence of the Security Extensions.
         * For QEMU, for backwards-compatibility we implement some
         * CPUs or CPU configs which have no actual EL2 or EL3 but do
         * include the various other features that V7VE implies.
         * Presence of EL2 itself is ARM_FEATURE_EL2, and of the
         * Security Extensions is ARM_FEATURE_EL3.
         */
921
        assert(no_aa32 || cpu_isar_feature(arm_div, cpu));
922
        set_feature(env, ARM_FEATURE_LPAE);
923
        set_feature(env, ARM_FEATURE_V7);
924
    }
925 926 927
    if (arm_feature(env, ARM_FEATURE_V7)) {
        set_feature(env, ARM_FEATURE_VAPA);
        set_feature(env, ARM_FEATURE_THUMB2);
P
Peter Maydell 已提交
928
        set_feature(env, ARM_FEATURE_MPIDR);
929 930 931 932 933
        if (!arm_feature(env, ARM_FEATURE_M)) {
            set_feature(env, ARM_FEATURE_V6K);
        } else {
            set_feature(env, ARM_FEATURE_V6);
        }
934 935 936 937 938

        /* Always define VBAR for V7 CPUs even if it doesn't exist in
         * non-EL3 configs. This is needed by some legacy boards.
         */
        set_feature(env, ARM_FEATURE_VBAR);
939 940 941 942 943 944 945 946
    }
    if (arm_feature(env, ARM_FEATURE_V6K)) {
        set_feature(env, ARM_FEATURE_V6);
        set_feature(env, ARM_FEATURE_MVFR);
    }
    if (arm_feature(env, ARM_FEATURE_V6)) {
        set_feature(env, ARM_FEATURE_V5);
        if (!arm_feature(env, ARM_FEATURE_M)) {
947
            assert(no_aa32 || cpu_isar_feature(jazelle, cpu));
948 949 950 951 952 953 954 955
            set_feature(env, ARM_FEATURE_AUXCR);
        }
    }
    if (arm_feature(env, ARM_FEATURE_V5)) {
        set_feature(env, ARM_FEATURE_V4T);
    }
    if (arm_feature(env, ARM_FEATURE_VFP4)) {
        set_feature(env, ARM_FEATURE_VFP3);
956
        set_feature(env, ARM_FEATURE_VFP_FP16);
957 958 959 960
    }
    if (arm_feature(env, ARM_FEATURE_VFP3)) {
        set_feature(env, ARM_FEATURE_VFP);
    }
961
    if (arm_feature(env, ARM_FEATURE_LPAE)) {
962
        set_feature(env, ARM_FEATURE_V7MP);
963 964
        set_feature(env, ARM_FEATURE_PXN);
    }
965 966 967
    if (arm_feature(env, ARM_FEATURE_CBAR_RO)) {
        set_feature(env, ARM_FEATURE_CBAR);
    }
968 969 970 971
    if (arm_feature(env, ARM_FEATURE_THUMB2) &&
        !arm_feature(env, ARM_FEATURE_M)) {
        set_feature(env, ARM_FEATURE_THUMB_DSP);
    }
972

973 974
    if (arm_feature(env, ARM_FEATURE_V7) &&
        !arm_feature(env, ARM_FEATURE_M) &&
975
        !arm_feature(env, ARM_FEATURE_PMSA)) {
976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995
        /* v7VMSA drops support for the old ARMv5 tiny pages, so we
         * can use 4K pages.
         */
        pagebits = 12;
    } else {
        /* For CPUs which might have tiny 1K pages, or which have an
         * MPU and might have small region sizes, stick with 1K pages.
         */
        pagebits = 10;
    }
    if (!set_preferred_target_page_bits(pagebits)) {
        /* This can only ever happen for hotplugging a CPU, or if
         * the board code incorrectly creates a CPU which it has
         * promised via minimum_page_size that it will not.
         */
        error_setg(errp, "This CPU requires a smaller page size than the "
                   "system is using");
        return;
    }

996 997 998 999 1000 1001
    /* This cpu-id-to-MPIDR affinity is used only for TCG; KVM will override it.
     * We don't support setting cluster ID ([16..23]) (known as Aff2
     * in later ARM ARM versions), or any of the higher affinity level fields,
     * so these bits always RAZ.
     */
    if (cpu->mp_affinity == ARM64_AFFINITY_INVALID) {
1002 1003
        cpu->mp_affinity = arm_cpu_mp_affinity(cs->cpu_index,
                                               ARM_DEFAULT_CPUS_PER_CLUSTER);
1004 1005
    }

1006 1007 1008 1009
    if (cpu->reset_hivecs) {
            cpu->reset_sctlr |= (1 << 13);
    }

1010 1011 1012 1013 1014 1015 1016 1017
    if (cpu->cfgend) {
        if (arm_feature(&cpu->env, ARM_FEATURE_V7)) {
            cpu->reset_sctlr |= SCTLR_EE;
        } else {
            cpu->reset_sctlr |= SCTLR_B;
        }
    }

1018 1019 1020 1021 1022 1023 1024
    if (!cpu->has_el3) {
        /* If the has_el3 CPU property is disabled then we need to disable the
         * feature.
         */
        unset_feature(env, ARM_FEATURE_EL3);

        /* Disable the security extension feature bits in the processor feature
1025
         * registers as well. These are id_pfr1[7:4] and id_aa64pfr0[15:12].
1026 1027
         */
        cpu->id_pfr1 &= ~0xf0;
1028
        cpu->isar.id_aa64pfr0 &= ~0xf000;
1029 1030
    }

1031 1032 1033 1034
    if (!cpu->has_el2) {
        unset_feature(env, ARM_FEATURE_EL2);
    }

1035
    if (!cpu->has_pmu) {
1036
        unset_feature(env, ARM_FEATURE_PMU);
1037
        cpu->id_aa64dfr0 &= ~0xf00;
1038 1039
    }

1040 1041 1042 1043 1044
    if (!arm_feature(env, ARM_FEATURE_EL2)) {
        /* Disable the hypervisor feature bits in the processor feature
         * registers if we don't have EL2. These are id_pfr1[15:12] and
         * id_aa64pfr0_el1[11:8].
         */
1045
        cpu->isar.id_aa64pfr0 &= ~0xf00;
1046 1047 1048
        cpu->id_pfr1 &= ~0xf000;
    }

1049 1050 1051
    /* MPU can be configured out of a PMSA CPU either by setting has-mpu
     * to false or by setting pmsav7-dregion to 0.
     */
P
Peter Crosthwaite 已提交
1052
    if (!cpu->has_mpu) {
1053 1054 1055 1056
        cpu->pmsav7_dregion = 0;
    }
    if (cpu->pmsav7_dregion == 0) {
        cpu->has_mpu = false;
P
Peter Crosthwaite 已提交
1057 1058
    }

1059
    if (arm_feature(env, ARM_FEATURE_PMSA) &&
1060 1061 1062 1063
        arm_feature(env, ARM_FEATURE_V7)) {
        uint32_t nr = cpu->pmsav7_dregion;

        if (nr > 0xff) {
1064
            error_setg(errp, "PMSAv7 MPU #regions invalid %" PRIu32, nr);
1065 1066
            return;
        }
1067 1068

        if (nr) {
1069 1070
            if (arm_feature(env, ARM_FEATURE_V8)) {
                /* PMSAv8 */
1071 1072 1073 1074 1075 1076
                env->pmsav8.rbar[M_REG_NS] = g_new0(uint32_t, nr);
                env->pmsav8.rlar[M_REG_NS] = g_new0(uint32_t, nr);
                if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
                    env->pmsav8.rbar[M_REG_S] = g_new0(uint32_t, nr);
                    env->pmsav8.rlar[M_REG_S] = g_new0(uint32_t, nr);
                }
1077 1078 1079 1080 1081
            } else {
                env->pmsav7.drbar = g_new0(uint32_t, nr);
                env->pmsav7.drsr = g_new0(uint32_t, nr);
                env->pmsav7.dracr = g_new0(uint32_t, nr);
            }
1082
        }
1083 1084
    }

1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
    if (arm_feature(env, ARM_FEATURE_M_SECURITY)) {
        uint32_t nr = cpu->sau_sregion;

        if (nr > 0xff) {
            error_setg(errp, "v8M SAU #regions invalid %" PRIu32, nr);
            return;
        }

        if (nr) {
            env->sau.rbar = g_new0(uint32_t, nr);
            env->sau.rlar = g_new0(uint32_t, nr);
        }
    }

1099 1100 1101 1102
    if (arm_feature(env, ARM_FEATURE_EL3)) {
        set_feature(env, ARM_FEATURE_VBAR);
    }

1103
    register_cp_regs_for_features(cpu);
1104 1105
    arm_cpu_register_gdb_regs_for_features(cpu);

1106 1107
    init_cpreg_list(cpu);

1108
#ifndef CONFIG_USER_ONLY
1109 1110 1111
    if (cpu->has_el3 || arm_feature(env, ARM_FEATURE_M_SECURITY)) {
        cs->num_ases = 2;

1112 1113 1114
        if (!cpu->secure_memory) {
            cpu->secure_memory = cs->memory;
        }
P
Peter Xu 已提交
1115 1116
        cpu_address_space_init(cs, ARMASIdx_S, "cpu-secure-memory",
                               cpu->secure_memory);
1117 1118
    } else {
        cs->num_ases = 1;
1119
    }
P
Peter Xu 已提交
1120
    cpu_address_space_init(cs, ARMASIdx_NS, "cpu-memory", cs->memory);
1121 1122 1123 1124 1125

    /* No core_count specified, default to smp_cpus. */
    if (cpu->core_count == -1) {
        cpu->core_count = smp_cpus;
    }
1126 1127
#endif

1128
    qemu_init_vcpu(cs);
1129
    cpu_reset(cs);
1130 1131

    acc->parent_realize(dev, errp);
1132 1133
}

1134 1135 1136
static ObjectClass *arm_cpu_class_by_name(const char *cpu_model)
{
    ObjectClass *oc;
A
Andreas Färber 已提交
1137
    char *typename;
1138
    char **cpuname;
1139
    const char *cpunamestr;
1140

1141
    cpuname = g_strsplit(cpu_model, ",", 1);
1142 1143 1144 1145 1146 1147 1148 1149 1150 1151
    cpunamestr = cpuname[0];
#ifdef CONFIG_USER_ONLY
    /* For backwards compatibility usermode emulation allows "-cpu any",
     * which has the same semantics as "-cpu max".
     */
    if (!strcmp(cpunamestr, "any")) {
        cpunamestr = "max";
    }
#endif
    typename = g_strdup_printf(ARM_CPU_TYPE_NAME("%s"), cpunamestr);
A
Andreas Färber 已提交
1152
    oc = object_class_by_name(typename);
1153
    g_strfreev(cpuname);
A
Andreas Färber 已提交
1154
    g_free(typename);
1155 1156
    if (!oc || !object_class_dynamic_cast(oc, TYPE_ARM_CPU) ||
        object_class_is_abstract(oc)) {
1157 1158 1159 1160 1161
        return NULL;
    }
    return oc;
}

1162 1163 1164
/* CPU models. These are not needed for the AArch64 linux-user build. */
#if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64)

1165 1166 1167
static void arm926_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1168 1169

    cpu->dtb_compatible = "arm,arm926";
1170 1171
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_VFP);
1172 1173
    set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
    set_feature(&cpu->env, ARM_FEATURE_CACHE_TEST_CLEAN);
1174
    cpu->midr = 0x41069265;
1175
    cpu->reset_fpsid = 0x41011090;
1176
    cpu->ctr = 0x1dd20d2;
1177
    cpu->reset_sctlr = 0x00090078;
1178 1179 1180 1181 1182 1183

    /*
     * ARMv5 does not have the ID_ISAR registers, but we can still
     * set the field to indicate Jazelle support within QEMU.
     */
    cpu->isar.id_isar1 = FIELD_DP32(cpu->isar.id_isar1, ID_ISAR1, JAZELLE, 1);
1184 1185 1186 1187 1188
}

static void arm946_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1189 1190

    cpu->dtb_compatible = "arm,arm946";
1191
    set_feature(&cpu->env, ARM_FEATURE_V5);
1192
    set_feature(&cpu->env, ARM_FEATURE_PMSA);
1193
    set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
1194
    cpu->midr = 0x41059461;
1195
    cpu->ctr = 0x0f004006;
1196
    cpu->reset_sctlr = 0x00000078;
1197 1198 1199 1200 1201
}

static void arm1026_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1202 1203

    cpu->dtb_compatible = "arm,arm1026";
1204 1205 1206
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_VFP);
    set_feature(&cpu->env, ARM_FEATURE_AUXCR);
1207 1208
    set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
    set_feature(&cpu->env, ARM_FEATURE_CACHE_TEST_CLEAN);
1209
    cpu->midr = 0x4106a262;
1210
    cpu->reset_fpsid = 0x410110a0;
1211
    cpu->ctr = 0x1dd20d2;
1212
    cpu->reset_sctlr = 0x00090078;
1213
    cpu->reset_auxcr = 1;
1214 1215 1216 1217 1218 1219 1220

    /*
     * ARMv5 does not have the ID_ISAR registers, but we can still
     * set the field to indicate Jazelle support within QEMU.
     */
    cpu->isar.id_isar1 = FIELD_DP32(cpu->isar.id_isar1, ID_ISAR1, JAZELLE, 1);

1221 1222 1223 1224 1225
    {
        /* The 1026 had an IFAR at c6,c0,0,1 rather than the ARMv6 c6,c0,0,2 */
        ARMCPRegInfo ifar = {
            .name = "IFAR", .cp = 15, .crn = 6, .crm = 0, .opc1 = 0, .opc2 = 1,
            .access = PL1_RW,
F
Fabian Aggeler 已提交
1226
            .fieldoffset = offsetof(CPUARMState, cp15.ifar_ns),
1227 1228 1229 1230
            .resetvalue = 0
        };
        define_one_arm_cp_reg(cpu, &ifar);
    }
1231 1232 1233 1234 1235
}

static void arm1136_r2_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1236 1237 1238 1239 1240 1241 1242
    /* What qemu calls "arm1136_r2" is actually the 1136 r0p2, ie an
     * older core than plain "arm1136". In particular this does not
     * have the v6K features.
     * These ID register values are correct for 1136 but may be wrong
     * for 1136_r2 (in particular r0p2 does not actually implement most
     * of the ID registers).
     */
1243 1244

    cpu->dtb_compatible = "arm,arm1136";
1245 1246
    set_feature(&cpu->env, ARM_FEATURE_V6);
    set_feature(&cpu->env, ARM_FEATURE_VFP);
1247 1248 1249
    set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
    set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG);
    set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS);
1250
    cpu->midr = 0x4107b362;
1251
    cpu->reset_fpsid = 0x410120b4;
1252 1253
    cpu->isar.mvfr0 = 0x11111111;
    cpu->isar.mvfr1 = 0x00000000;
1254
    cpu->ctr = 0x1dd20d2;
1255
    cpu->reset_sctlr = 0x00050078;
1256 1257 1258 1259 1260 1261 1262
    cpu->id_pfr0 = 0x111;
    cpu->id_pfr1 = 0x1;
    cpu->id_dfr0 = 0x2;
    cpu->id_afr0 = 0x3;
    cpu->id_mmfr0 = 0x01130003;
    cpu->id_mmfr1 = 0x10030302;
    cpu->id_mmfr2 = 0x01222110;
1263 1264 1265 1266 1267
    cpu->isar.id_isar0 = 0x00140011;
    cpu->isar.id_isar1 = 0x12002111;
    cpu->isar.id_isar2 = 0x11231111;
    cpu->isar.id_isar3 = 0x01102131;
    cpu->isar.id_isar4 = 0x141;
1268
    cpu->reset_auxcr = 7;
1269 1270 1271 1272 1273
}

static void arm1136_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1274 1275

    cpu->dtb_compatible = "arm,arm1136";
1276 1277 1278
    set_feature(&cpu->env, ARM_FEATURE_V6K);
    set_feature(&cpu->env, ARM_FEATURE_V6);
    set_feature(&cpu->env, ARM_FEATURE_VFP);
1279 1280 1281
    set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
    set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG);
    set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS);
1282
    cpu->midr = 0x4117b363;
1283
    cpu->reset_fpsid = 0x410120b4;
1284 1285
    cpu->isar.mvfr0 = 0x11111111;
    cpu->isar.mvfr1 = 0x00000000;
1286
    cpu->ctr = 0x1dd20d2;
1287
    cpu->reset_sctlr = 0x00050078;
1288 1289 1290 1291 1292 1293 1294
    cpu->id_pfr0 = 0x111;
    cpu->id_pfr1 = 0x1;
    cpu->id_dfr0 = 0x2;
    cpu->id_afr0 = 0x3;
    cpu->id_mmfr0 = 0x01130003;
    cpu->id_mmfr1 = 0x10030302;
    cpu->id_mmfr2 = 0x01222110;
1295 1296 1297 1298 1299
    cpu->isar.id_isar0 = 0x00140011;
    cpu->isar.id_isar1 = 0x12002111;
    cpu->isar.id_isar2 = 0x11231111;
    cpu->isar.id_isar3 = 0x01102131;
    cpu->isar.id_isar4 = 0x141;
1300
    cpu->reset_auxcr = 7;
1301 1302 1303 1304 1305
}

static void arm1176_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1306 1307

    cpu->dtb_compatible = "arm,arm1176";
1308 1309 1310
    set_feature(&cpu->env, ARM_FEATURE_V6K);
    set_feature(&cpu->env, ARM_FEATURE_VFP);
    set_feature(&cpu->env, ARM_FEATURE_VAPA);
1311 1312 1313
    set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
    set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG);
    set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS);
1314
    set_feature(&cpu->env, ARM_FEATURE_EL3);
1315
    cpu->midr = 0x410fb767;
1316
    cpu->reset_fpsid = 0x410120b5;
1317 1318
    cpu->isar.mvfr0 = 0x11111111;
    cpu->isar.mvfr1 = 0x00000000;
1319
    cpu->ctr = 0x1dd20d2;
1320
    cpu->reset_sctlr = 0x00050078;
1321 1322 1323 1324 1325 1326 1327
    cpu->id_pfr0 = 0x111;
    cpu->id_pfr1 = 0x11;
    cpu->id_dfr0 = 0x33;
    cpu->id_afr0 = 0;
    cpu->id_mmfr0 = 0x01130003;
    cpu->id_mmfr1 = 0x10030302;
    cpu->id_mmfr2 = 0x01222100;
1328 1329 1330 1331 1332
    cpu->isar.id_isar0 = 0x0140011;
    cpu->isar.id_isar1 = 0x12002111;
    cpu->isar.id_isar2 = 0x11231121;
    cpu->isar.id_isar3 = 0x01102131;
    cpu->isar.id_isar4 = 0x01141;
1333
    cpu->reset_auxcr = 7;
1334 1335 1336 1337 1338
}

static void arm11mpcore_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1339 1340

    cpu->dtb_compatible = "arm,arm11mpcore";
1341 1342 1343
    set_feature(&cpu->env, ARM_FEATURE_V6K);
    set_feature(&cpu->env, ARM_FEATURE_VFP);
    set_feature(&cpu->env, ARM_FEATURE_VAPA);
P
Peter Maydell 已提交
1344
    set_feature(&cpu->env, ARM_FEATURE_MPIDR);
1345
    set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
1346
    cpu->midr = 0x410fb022;
1347
    cpu->reset_fpsid = 0x410120b4;
1348 1349
    cpu->isar.mvfr0 = 0x11111111;
    cpu->isar.mvfr1 = 0x00000000;
1350
    cpu->ctr = 0x1d192992; /* 32K icache 32K dcache */
1351 1352 1353 1354 1355 1356 1357
    cpu->id_pfr0 = 0x111;
    cpu->id_pfr1 = 0x1;
    cpu->id_dfr0 = 0;
    cpu->id_afr0 = 0x2;
    cpu->id_mmfr0 = 0x01100103;
    cpu->id_mmfr1 = 0x10020302;
    cpu->id_mmfr2 = 0x01222000;
1358 1359 1360 1361 1362
    cpu->isar.id_isar0 = 0x00100011;
    cpu->isar.id_isar1 = 0x12002111;
    cpu->isar.id_isar2 = 0x11221011;
    cpu->isar.id_isar3 = 0x01102131;
    cpu->isar.id_isar4 = 0x141;
1363
    cpu->reset_auxcr = 1;
1364 1365
}

1366 1367 1368 1369 1370 1371 1372 1373 1374
static void cortex_m0_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
    set_feature(&cpu->env, ARM_FEATURE_V6);
    set_feature(&cpu->env, ARM_FEATURE_M);

    cpu->midr = 0x410cc200;
}

1375 1376 1377
static void cortex_m3_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1378 1379
    set_feature(&cpu->env, ARM_FEATURE_V7);
    set_feature(&cpu->env, ARM_FEATURE_M);
1380
    set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
1381
    cpu->midr = 0x410fc231;
1382
    cpu->pmsav7_dregion = 8;
1383 1384 1385 1386 1387 1388 1389 1390
    cpu->id_pfr0 = 0x00000030;
    cpu->id_pfr1 = 0x00000200;
    cpu->id_dfr0 = 0x00100000;
    cpu->id_afr0 = 0x00000000;
    cpu->id_mmfr0 = 0x00000030;
    cpu->id_mmfr1 = 0x00000000;
    cpu->id_mmfr2 = 0x00000000;
    cpu->id_mmfr3 = 0x00000000;
1391 1392 1393 1394 1395 1396 1397
    cpu->isar.id_isar0 = 0x01141110;
    cpu->isar.id_isar1 = 0x02111000;
    cpu->isar.id_isar2 = 0x21112231;
    cpu->isar.id_isar3 = 0x01111110;
    cpu->isar.id_isar4 = 0x01310102;
    cpu->isar.id_isar5 = 0x00000000;
    cpu->isar.id_isar6 = 0x00000000;
1398 1399
}

1400 1401 1402 1403 1404 1405
static void cortex_m4_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);

    set_feature(&cpu->env, ARM_FEATURE_V7);
    set_feature(&cpu->env, ARM_FEATURE_M);
1406
    set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
1407 1408
    set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
    cpu->midr = 0x410fc240; /* r0p0 */
1409
    cpu->pmsav7_dregion = 8;
1410 1411 1412 1413 1414 1415 1416 1417
    cpu->id_pfr0 = 0x00000030;
    cpu->id_pfr1 = 0x00000200;
    cpu->id_dfr0 = 0x00100000;
    cpu->id_afr0 = 0x00000000;
    cpu->id_mmfr0 = 0x00000030;
    cpu->id_mmfr1 = 0x00000000;
    cpu->id_mmfr2 = 0x00000000;
    cpu->id_mmfr3 = 0x00000000;
1418 1419 1420 1421 1422 1423 1424
    cpu->isar.id_isar0 = 0x01141110;
    cpu->isar.id_isar1 = 0x02111000;
    cpu->isar.id_isar2 = 0x21112231;
    cpu->isar.id_isar3 = 0x01111110;
    cpu->isar.id_isar4 = 0x01310102;
    cpu->isar.id_isar5 = 0x00000000;
    cpu->isar.id_isar6 = 0x00000000;
1425
}
1426

P
Peter Maydell 已提交
1427 1428 1429 1430 1431 1432
static void cortex_m33_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);

    set_feature(&cpu->env, ARM_FEATURE_V8);
    set_feature(&cpu->env, ARM_FEATURE_M);
1433
    set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
P
Peter Maydell 已提交
1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446
    set_feature(&cpu->env, ARM_FEATURE_M_SECURITY);
    set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
    cpu->midr = 0x410fd213; /* r0p3 */
    cpu->pmsav7_dregion = 16;
    cpu->sau_sregion = 8;
    cpu->id_pfr0 = 0x00000030;
    cpu->id_pfr1 = 0x00000210;
    cpu->id_dfr0 = 0x00200000;
    cpu->id_afr0 = 0x00000000;
    cpu->id_mmfr0 = 0x00101F40;
    cpu->id_mmfr1 = 0x00000000;
    cpu->id_mmfr2 = 0x01000000;
    cpu->id_mmfr3 = 0x00000000;
1447 1448 1449 1450 1451 1452 1453
    cpu->isar.id_isar0 = 0x01101110;
    cpu->isar.id_isar1 = 0x02212000;
    cpu->isar.id_isar2 = 0x20232232;
    cpu->isar.id_isar3 = 0x01111131;
    cpu->isar.id_isar4 = 0x01310132;
    cpu->isar.id_isar5 = 0x00000000;
    cpu->isar.id_isar6 = 0x00000000;
P
Peter Maydell 已提交
1454 1455 1456 1457
    cpu->clidr = 0x00000000;
    cpu->ctr = 0x8000c000;
}

1458 1459 1460 1461
static void arm_v7m_class_init(ObjectClass *oc, void *data)
{
    CPUClass *cc = CPU_CLASS(oc);

1462
#ifndef CONFIG_USER_ONLY
1463 1464
    cc->do_interrupt = arm_v7m_cpu_do_interrupt;
#endif
1465 1466

    cc->cpu_exec_interrupt = arm_v7m_cpu_exec_interrupt;
1467 1468
}

1469 1470 1471 1472 1473 1474
static const ARMCPRegInfo cortexr5_cp_reginfo[] = {
    /* Dummy the TCM region regs for the moment */
    { .name = "ATCM", .cp = 15, .opc1 = 0, .crn = 9, .crm = 1, .opc2 = 0,
      .access = PL1_RW, .type = ARM_CP_CONST },
    { .name = "BTCM", .cp = 15, .opc1 = 0, .crn = 9, .crm = 1, .opc2 = 1,
      .access = PL1_RW, .type = ARM_CP_CONST },
1475 1476
    { .name = "DCACHE_INVAL", .cp = 15, .opc1 = 0, .crn = 15, .crm = 5,
      .opc2 = 0, .access = PL1_W, .type = ARM_CP_NOP },
1477 1478 1479 1480 1481 1482 1483 1484 1485
    REGINFO_SENTINEL
};

static void cortex_r5_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);

    set_feature(&cpu->env, ARM_FEATURE_V7);
    set_feature(&cpu->env, ARM_FEATURE_V7MP);
1486
    set_feature(&cpu->env, ARM_FEATURE_PMSA);
1487 1488 1489 1490 1491 1492 1493 1494 1495
    cpu->midr = 0x411fc153; /* r1p3 */
    cpu->id_pfr0 = 0x0131;
    cpu->id_pfr1 = 0x001;
    cpu->id_dfr0 = 0x010400;
    cpu->id_afr0 = 0x0;
    cpu->id_mmfr0 = 0x0210030;
    cpu->id_mmfr1 = 0x00000000;
    cpu->id_mmfr2 = 0x01200000;
    cpu->id_mmfr3 = 0x0211;
1496 1497 1498 1499 1500 1501 1502
    cpu->isar.id_isar0 = 0x02101111;
    cpu->isar.id_isar1 = 0x13112111;
    cpu->isar.id_isar2 = 0x21232141;
    cpu->isar.id_isar3 = 0x01112131;
    cpu->isar.id_isar4 = 0x0010142;
    cpu->isar.id_isar5 = 0x0;
    cpu->isar.id_isar6 = 0x0;
1503
    cpu->mp_is_up = true;
1504
    cpu->pmsav7_dregion = 16;
1505 1506 1507
    define_arm_cp_regs(cpu, cortexr5_cp_reginfo);
}

1508 1509 1510 1511 1512 1513 1514 1515
static void cortex_r5f_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);

    cortex_r5_initfn(obj);
    set_feature(&cpu->env, ARM_FEATURE_VFP3);
}

1516 1517 1518 1519 1520 1521 1522 1523
static const ARMCPRegInfo cortexa8_cp_reginfo[] = {
    { .name = "L2LOCKDOWN", .cp = 15, .crn = 9, .crm = 0, .opc1 = 1, .opc2 = 0,
      .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
    { .name = "L2AUXCR", .cp = 15, .crn = 9, .crm = 0, .opc1 = 1, .opc2 = 2,
      .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
    REGINFO_SENTINEL
};

1524 1525 1526
static void cortex_a8_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1527 1528

    cpu->dtb_compatible = "arm,cortex-a8";
1529 1530 1531 1532
    set_feature(&cpu->env, ARM_FEATURE_V7);
    set_feature(&cpu->env, ARM_FEATURE_VFP3);
    set_feature(&cpu->env, ARM_FEATURE_NEON);
    set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
1533
    set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
1534
    set_feature(&cpu->env, ARM_FEATURE_EL3);
1535
    cpu->midr = 0x410fc080;
1536
    cpu->reset_fpsid = 0x410330c0;
1537 1538
    cpu->isar.mvfr0 = 0x11110222;
    cpu->isar.mvfr1 = 0x00011111;
1539
    cpu->ctr = 0x82048004;
1540
    cpu->reset_sctlr = 0x00c50078;
1541 1542 1543 1544 1545 1546 1547 1548
    cpu->id_pfr0 = 0x1031;
    cpu->id_pfr1 = 0x11;
    cpu->id_dfr0 = 0x400;
    cpu->id_afr0 = 0;
    cpu->id_mmfr0 = 0x31100003;
    cpu->id_mmfr1 = 0x20000000;
    cpu->id_mmfr2 = 0x01202000;
    cpu->id_mmfr3 = 0x11;
1549 1550 1551 1552 1553
    cpu->isar.id_isar0 = 0x00101111;
    cpu->isar.id_isar1 = 0x12112111;
    cpu->isar.id_isar2 = 0x21232031;
    cpu->isar.id_isar3 = 0x11112131;
    cpu->isar.id_isar4 = 0x00111142;
1554
    cpu->dbgdidr = 0x15141000;
1555 1556 1557 1558
    cpu->clidr = (1 << 27) | (2 << 24) | 3;
    cpu->ccsidr[0] = 0xe007e01a; /* 16k L1 dcache. */
    cpu->ccsidr[1] = 0x2007e01a; /* 16k L1 icache. */
    cpu->ccsidr[2] = 0xf0000000; /* No L2 icache. */
1559
    cpu->reset_auxcr = 2;
1560
    define_arm_cp_regs(cpu, cortexa8_cp_reginfo);
1561 1562
}

1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591
static const ARMCPRegInfo cortexa9_cp_reginfo[] = {
    /* power_control should be set to maximum latency. Again,
     * default to 0 and set by private hook
     */
    { .name = "A9_PWRCTL", .cp = 15, .crn = 15, .crm = 0, .opc1 = 0, .opc2 = 0,
      .access = PL1_RW, .resetvalue = 0,
      .fieldoffset = offsetof(CPUARMState, cp15.c15_power_control) },
    { .name = "A9_DIAG", .cp = 15, .crn = 15, .crm = 0, .opc1 = 0, .opc2 = 1,
      .access = PL1_RW, .resetvalue = 0,
      .fieldoffset = offsetof(CPUARMState, cp15.c15_diagnostic) },
    { .name = "A9_PWRDIAG", .cp = 15, .crn = 15, .crm = 0, .opc1 = 0, .opc2 = 2,
      .access = PL1_RW, .resetvalue = 0,
      .fieldoffset = offsetof(CPUARMState, cp15.c15_power_diagnostic) },
    { .name = "NEONBUSY", .cp = 15, .crn = 15, .crm = 1, .opc1 = 0, .opc2 = 0,
      .access = PL1_RW, .resetvalue = 0, .type = ARM_CP_CONST },
    /* TLB lockdown control */
    { .name = "TLB_LOCKR", .cp = 15, .crn = 15, .crm = 4, .opc1 = 5, .opc2 = 2,
      .access = PL1_W, .resetvalue = 0, .type = ARM_CP_NOP },
    { .name = "TLB_LOCKW", .cp = 15, .crn = 15, .crm = 4, .opc1 = 5, .opc2 = 4,
      .access = PL1_W, .resetvalue = 0, .type = ARM_CP_NOP },
    { .name = "TLB_VA", .cp = 15, .crn = 15, .crm = 5, .opc1 = 5, .opc2 = 2,
      .access = PL1_RW, .resetvalue = 0, .type = ARM_CP_CONST },
    { .name = "TLB_PA", .cp = 15, .crn = 15, .crm = 6, .opc1 = 5, .opc2 = 2,
      .access = PL1_RW, .resetvalue = 0, .type = ARM_CP_CONST },
    { .name = "TLB_ATTR", .cp = 15, .crn = 15, .crm = 7, .opc1 = 5, .opc2 = 2,
      .access = PL1_RW, .resetvalue = 0, .type = ARM_CP_CONST },
    REGINFO_SENTINEL
};

1592 1593 1594
static void cortex_a9_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1595 1596

    cpu->dtb_compatible = "arm,cortex-a9";
1597 1598 1599 1600 1601
    set_feature(&cpu->env, ARM_FEATURE_V7);
    set_feature(&cpu->env, ARM_FEATURE_VFP3);
    set_feature(&cpu->env, ARM_FEATURE_VFP_FP16);
    set_feature(&cpu->env, ARM_FEATURE_NEON);
    set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
1602
    set_feature(&cpu->env, ARM_FEATURE_EL3);
1603 1604 1605 1606 1607
    /* Note that A9 supports the MP extensions even for
     * A9UP and single-core A9MP (which are both different
     * and valid configurations; we don't model A9UP).
     */
    set_feature(&cpu->env, ARM_FEATURE_V7MP);
1608
    set_feature(&cpu->env, ARM_FEATURE_CBAR);
1609
    cpu->midr = 0x410fc090;
1610
    cpu->reset_fpsid = 0x41033090;
1611 1612
    cpu->isar.mvfr0 = 0x11110222;
    cpu->isar.mvfr1 = 0x01111111;
1613
    cpu->ctr = 0x80038003;
1614
    cpu->reset_sctlr = 0x00c50078;
1615 1616 1617 1618 1619 1620 1621 1622
    cpu->id_pfr0 = 0x1031;
    cpu->id_pfr1 = 0x11;
    cpu->id_dfr0 = 0x000;
    cpu->id_afr0 = 0;
    cpu->id_mmfr0 = 0x00100103;
    cpu->id_mmfr1 = 0x20000000;
    cpu->id_mmfr2 = 0x01230000;
    cpu->id_mmfr3 = 0x00002111;
1623 1624 1625 1626 1627
    cpu->isar.id_isar0 = 0x00101111;
    cpu->isar.id_isar1 = 0x13112111;
    cpu->isar.id_isar2 = 0x21232041;
    cpu->isar.id_isar3 = 0x11112131;
    cpu->isar.id_isar4 = 0x00111142;
1628
    cpu->dbgdidr = 0x35141000;
1629
    cpu->clidr = (1 << 27) | (1 << 24) | 3;
1630 1631
    cpu->ccsidr[0] = 0xe00fe019; /* 16k L1 dcache. */
    cpu->ccsidr[1] = 0x200fe019; /* 16k L1 icache. */
1632
    define_arm_cp_regs(cpu, cortexa9_cp_reginfo);
1633 1634
}

1635
#ifndef CONFIG_USER_ONLY
1636
static uint64_t a15_l2ctlr_read(CPUARMState *env, const ARMCPRegInfo *ri)
1637 1638 1639 1640
{
    /* Linux wants the number of processors from here.
     * Might as well set the interrupt-controller bit too.
     */
1641
    return ((smp_cpus - 1) << 24) | (1 << 23);
1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655
}
#endif

static const ARMCPRegInfo cortexa15_cp_reginfo[] = {
#ifndef CONFIG_USER_ONLY
    { .name = "L2CTLR", .cp = 15, .crn = 9, .crm = 0, .opc1 = 1, .opc2 = 2,
      .access = PL1_RW, .resetvalue = 0, .readfn = a15_l2ctlr_read,
      .writefn = arm_cp_write_ignore, },
#endif
    { .name = "L2ECTLR", .cp = 15, .crn = 9, .crm = 0, .opc1 = 1, .opc2 = 3,
      .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
    REGINFO_SENTINEL
};

1656 1657 1658 1659 1660
static void cortex_a7_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);

    cpu->dtb_compatible = "arm,cortex-a7";
1661
    set_feature(&cpu->env, ARM_FEATURE_V7VE);
1662 1663 1664 1665 1666 1667
    set_feature(&cpu->env, ARM_FEATURE_VFP4);
    set_feature(&cpu->env, ARM_FEATURE_NEON);
    set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
    set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
    set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
1668
    set_feature(&cpu->env, ARM_FEATURE_EL2);
1669 1670 1671 1672
    set_feature(&cpu->env, ARM_FEATURE_EL3);
    cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A7;
    cpu->midr = 0x410fc075;
    cpu->reset_fpsid = 0x41023075;
1673 1674
    cpu->isar.mvfr0 = 0x10110222;
    cpu->isar.mvfr1 = 0x11111111;
1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686
    cpu->ctr = 0x84448003;
    cpu->reset_sctlr = 0x00c50078;
    cpu->id_pfr0 = 0x00001131;
    cpu->id_pfr1 = 0x00011011;
    cpu->id_dfr0 = 0x02010555;
    cpu->pmceid0 = 0x00000000;
    cpu->pmceid1 = 0x00000000;
    cpu->id_afr0 = 0x00000000;
    cpu->id_mmfr0 = 0x10101105;
    cpu->id_mmfr1 = 0x40000000;
    cpu->id_mmfr2 = 0x01240000;
    cpu->id_mmfr3 = 0x02102211;
1687 1688 1689
    /* a7_mpcore_r0p5_trm, page 4-4 gives 0x01101110; but
     * table 4-41 gives 0x02101110, which includes the arm div insns.
     */
1690 1691 1692 1693 1694
    cpu->isar.id_isar0 = 0x02101110;
    cpu->isar.id_isar1 = 0x13112111;
    cpu->isar.id_isar2 = 0x21232041;
    cpu->isar.id_isar3 = 0x11112131;
    cpu->isar.id_isar4 = 0x10011142;
1695 1696 1697 1698 1699 1700 1701 1702
    cpu->dbgdidr = 0x3515f005;
    cpu->clidr = 0x0a200023;
    cpu->ccsidr[0] = 0x701fe00a; /* 32K L1 dcache */
    cpu->ccsidr[1] = 0x201fe00a; /* 32K L1 icache */
    cpu->ccsidr[2] = 0x711fe07a; /* 4096K L2 unified cache */
    define_arm_cp_regs(cpu, cortexa15_cp_reginfo); /* Same as A15 */
}

1703 1704 1705
static void cortex_a15_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1706 1707

    cpu->dtb_compatible = "arm,cortex-a15";
1708
    set_feature(&cpu->env, ARM_FEATURE_V7VE);
1709 1710 1711 1712
    set_feature(&cpu->env, ARM_FEATURE_VFP4);
    set_feature(&cpu->env, ARM_FEATURE_NEON);
    set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
    set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
1713
    set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
1714
    set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
1715
    set_feature(&cpu->env, ARM_FEATURE_EL2);
1716
    set_feature(&cpu->env, ARM_FEATURE_EL3);
1717
    cpu->kvm_target = QEMU_KVM_ARM_TARGET_CORTEX_A15;
1718
    cpu->midr = 0x412fc0f1;
1719
    cpu->reset_fpsid = 0x410430f0;
1720 1721
    cpu->isar.mvfr0 = 0x10110222;
    cpu->isar.mvfr1 = 0x11111111;
1722
    cpu->ctr = 0x8444c004;
1723
    cpu->reset_sctlr = 0x00c50078;
1724 1725 1726
    cpu->id_pfr0 = 0x00001131;
    cpu->id_pfr1 = 0x00011011;
    cpu->id_dfr0 = 0x02010555;
1727 1728
    cpu->pmceid0 = 0x0000000;
    cpu->pmceid1 = 0x00000000;
1729 1730 1731 1732 1733
    cpu->id_afr0 = 0x00000000;
    cpu->id_mmfr0 = 0x10201105;
    cpu->id_mmfr1 = 0x20000000;
    cpu->id_mmfr2 = 0x01240000;
    cpu->id_mmfr3 = 0x02102211;
1734 1735 1736 1737 1738
    cpu->isar.id_isar0 = 0x02101110;
    cpu->isar.id_isar1 = 0x13112111;
    cpu->isar.id_isar2 = 0x21232041;
    cpu->isar.id_isar3 = 0x11112131;
    cpu->isar.id_isar4 = 0x10011142;
1739
    cpu->dbgdidr = 0x3515f021;
1740 1741 1742 1743
    cpu->clidr = 0x0a200023;
    cpu->ccsidr[0] = 0x701fe00a; /* 32K L1 dcache */
    cpu->ccsidr[1] = 0x201fe00a; /* 32K L1 icache */
    cpu->ccsidr[2] = 0x711fe07a; /* 4096K L2 unified cache */
1744
    define_arm_cp_regs(cpu, cortexa15_cp_reginfo);
1745 1746 1747 1748 1749
}

static void ti925t_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1750 1751
    set_feature(&cpu->env, ARM_FEATURE_V4T);
    set_feature(&cpu->env, ARM_FEATURE_OMAPCP);
1752
    cpu->midr = ARM_CPUID_TI925T;
1753
    cpu->ctr = 0x5109149;
1754
    cpu->reset_sctlr = 0x00000070;
1755 1756 1757 1758 1759
}

static void sa1100_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1760 1761

    cpu->dtb_compatible = "intel,sa1100";
1762
    set_feature(&cpu->env, ARM_FEATURE_STRONGARM);
1763
    set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
1764
    cpu->midr = 0x4401A11B;
1765
    cpu->reset_sctlr = 0x00000070;
1766 1767 1768 1769 1770
}

static void sa1110_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1771
    set_feature(&cpu->env, ARM_FEATURE_STRONGARM);
1772
    set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
1773
    cpu->midr = 0x6901B119;
1774
    cpu->reset_sctlr = 0x00000070;
1775 1776 1777 1778 1779
}

static void pxa250_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1780 1781

    cpu->dtb_compatible = "marvell,xscale";
1782 1783
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_XSCALE);
1784
    cpu->midr = 0x69052100;
1785
    cpu->ctr = 0xd172172;
1786
    cpu->reset_sctlr = 0x00000078;
1787 1788 1789 1790 1791
}

static void pxa255_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1792 1793

    cpu->dtb_compatible = "marvell,xscale";
1794 1795
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_XSCALE);
1796
    cpu->midr = 0x69052d00;
1797
    cpu->ctr = 0xd172172;
1798
    cpu->reset_sctlr = 0x00000078;
1799 1800 1801 1802 1803
}

static void pxa260_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1804 1805

    cpu->dtb_compatible = "marvell,xscale";
1806 1807
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_XSCALE);
1808
    cpu->midr = 0x69052903;
1809
    cpu->ctr = 0xd172172;
1810
    cpu->reset_sctlr = 0x00000078;
1811 1812 1813 1814 1815
}

static void pxa261_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1816 1817

    cpu->dtb_compatible = "marvell,xscale";
1818 1819
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_XSCALE);
1820
    cpu->midr = 0x69052d05;
1821
    cpu->ctr = 0xd172172;
1822
    cpu->reset_sctlr = 0x00000078;
1823 1824 1825 1826 1827
}

static void pxa262_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1828 1829

    cpu->dtb_compatible = "marvell,xscale";
1830 1831
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_XSCALE);
1832
    cpu->midr = 0x69052d06;
1833
    cpu->ctr = 0xd172172;
1834
    cpu->reset_sctlr = 0x00000078;
1835 1836 1837 1838 1839
}

static void pxa270a0_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1840 1841

    cpu->dtb_compatible = "marvell,xscale";
1842 1843 1844
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_XSCALE);
    set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
1845
    cpu->midr = 0x69054110;
1846
    cpu->ctr = 0xd172172;
1847
    cpu->reset_sctlr = 0x00000078;
1848 1849 1850 1851 1852
}

static void pxa270a1_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1853 1854

    cpu->dtb_compatible = "marvell,xscale";
1855 1856 1857
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_XSCALE);
    set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
1858
    cpu->midr = 0x69054111;
1859
    cpu->ctr = 0xd172172;
1860
    cpu->reset_sctlr = 0x00000078;
1861 1862 1863 1864 1865
}

static void pxa270b0_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1866 1867

    cpu->dtb_compatible = "marvell,xscale";
1868 1869 1870
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_XSCALE);
    set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
1871
    cpu->midr = 0x69054112;
1872
    cpu->ctr = 0xd172172;
1873
    cpu->reset_sctlr = 0x00000078;
1874 1875 1876 1877 1878
}

static void pxa270b1_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1879 1880

    cpu->dtb_compatible = "marvell,xscale";
1881 1882 1883
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_XSCALE);
    set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
1884
    cpu->midr = 0x69054113;
1885
    cpu->ctr = 0xd172172;
1886
    cpu->reset_sctlr = 0x00000078;
1887 1888 1889 1890 1891
}

static void pxa270c0_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1892 1893

    cpu->dtb_compatible = "marvell,xscale";
1894 1895 1896
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_XSCALE);
    set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
1897
    cpu->midr = 0x69054114;
1898
    cpu->ctr = 0xd172172;
1899
    cpu->reset_sctlr = 0x00000078;
1900 1901 1902 1903 1904
}

static void pxa270c5_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);
1905 1906

    cpu->dtb_compatible = "marvell,xscale";
1907 1908 1909
    set_feature(&cpu->env, ARM_FEATURE_V5);
    set_feature(&cpu->env, ARM_FEATURE_XSCALE);
    set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
1910
    cpu->midr = 0x69054117;
1911
    cpu->ctr = 0xd172172;
1912
    cpu->reset_sctlr = 0x00000078;
1913 1914
}

1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928
#ifndef TARGET_AARCH64
/* -cpu max: if KVM is enabled, like -cpu host (best possible with this host);
 * otherwise, a CPU with as many features enabled as our emulation supports.
 * The version of '-cpu max' for qemu-system-aarch64 is defined in cpu64.c;
 * this only needs to handle 32 bits.
 */
static void arm_max_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);

    if (kvm_enabled()) {
        kvm_arm_set_cpu_features_from_host(cpu);
    } else {
        cortex_a15_initfn(obj);
1929 1930
#ifdef CONFIG_USER_ONLY
        /* We don't set these in system emulation mode for the moment,
1931 1932
         * since we don't correctly set (all of) the ID registers to
         * advertise them.
1933
         */
1934
        set_feature(&cpu->env, ARM_FEATURE_V8);
1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950
        {
            uint32_t t;

            t = cpu->isar.id_isar5;
            t = FIELD_DP32(t, ID_ISAR5, AES, 2);
            t = FIELD_DP32(t, ID_ISAR5, SHA1, 1);
            t = FIELD_DP32(t, ID_ISAR5, SHA2, 1);
            t = FIELD_DP32(t, ID_ISAR5, CRC32, 1);
            t = FIELD_DP32(t, ID_ISAR5, RDM, 1);
            t = FIELD_DP32(t, ID_ISAR5, VCMA, 1);
            cpu->isar.id_isar5 = t;

            t = cpu->isar.id_isar6;
            t = FIELD_DP32(t, ID_ISAR6, DP, 1);
            cpu->isar.id_isar6 = t;
        }
1951
#endif
1952
    }
1953
}
1954
#endif
1955

1956 1957
#endif /* !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64) */

1958 1959 1960
typedef struct ARMCPUInfo {
    const char *name;
    void (*initfn)(Object *obj);
1961
    void (*class_init)(ObjectClass *oc, void *data);
1962 1963 1964
} ARMCPUInfo;

static const ARMCPUInfo arm_cpus[] = {
1965
#if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64)
1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976
    { .name = "arm926",      .initfn = arm926_initfn },
    { .name = "arm946",      .initfn = arm946_initfn },
    { .name = "arm1026",     .initfn = arm1026_initfn },
    /* What QEMU calls "arm1136-r2" is actually the 1136 r0p2, i.e. an
     * older core than plain "arm1136". In particular this does not
     * have the v6K features.
     */
    { .name = "arm1136-r2",  .initfn = arm1136_r2_initfn },
    { .name = "arm1136",     .initfn = arm1136_initfn },
    { .name = "arm1176",     .initfn = arm1176_initfn },
    { .name = "arm11mpcore", .initfn = arm11mpcore_initfn },
1977 1978
    { .name = "cortex-m0",   .initfn = cortex_m0_initfn,
                             .class_init = arm_v7m_class_init },
1979 1980
    { .name = "cortex-m3",   .initfn = cortex_m3_initfn,
                             .class_init = arm_v7m_class_init },
1981 1982
    { .name = "cortex-m4",   .initfn = cortex_m4_initfn,
                             .class_init = arm_v7m_class_init },
P
Peter Maydell 已提交
1983 1984
    { .name = "cortex-m33",  .initfn = cortex_m33_initfn,
                             .class_init = arm_v7m_class_init },
1985
    { .name = "cortex-r5",   .initfn = cortex_r5_initfn },
1986
    { .name = "cortex-r5f",  .initfn = cortex_r5f_initfn },
1987
    { .name = "cortex-a7",   .initfn = cortex_a7_initfn },
1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006
    { .name = "cortex-a8",   .initfn = cortex_a8_initfn },
    { .name = "cortex-a9",   .initfn = cortex_a9_initfn },
    { .name = "cortex-a15",  .initfn = cortex_a15_initfn },
    { .name = "ti925t",      .initfn = ti925t_initfn },
    { .name = "sa1100",      .initfn = sa1100_initfn },
    { .name = "sa1110",      .initfn = sa1110_initfn },
    { .name = "pxa250",      .initfn = pxa250_initfn },
    { .name = "pxa255",      .initfn = pxa255_initfn },
    { .name = "pxa260",      .initfn = pxa260_initfn },
    { .name = "pxa261",      .initfn = pxa261_initfn },
    { .name = "pxa262",      .initfn = pxa262_initfn },
    /* "pxa270" is an alias for "pxa270-a0" */
    { .name = "pxa270",      .initfn = pxa270a0_initfn },
    { .name = "pxa270-a0",   .initfn = pxa270a0_initfn },
    { .name = "pxa270-a1",   .initfn = pxa270a1_initfn },
    { .name = "pxa270-b0",   .initfn = pxa270b0_initfn },
    { .name = "pxa270-b1",   .initfn = pxa270b1_initfn },
    { .name = "pxa270-c0",   .initfn = pxa270c0_initfn },
    { .name = "pxa270-c5",   .initfn = pxa270c5_initfn },
2007 2008 2009
#ifndef TARGET_AARCH64
    { .name = "max",         .initfn = arm_max_initfn },
#endif
2010
#ifdef CONFIG_USER_ONLY
2011
    { .name = "any",         .initfn = arm_max_initfn },
2012
#endif
2013
#endif
2014
    { .name = NULL }
2015 2016
};

2017 2018
static Property arm_cpu_properties[] = {
    DEFINE_PROP_BOOL("start-powered-off", ARMCPU, start_powered_off, false),
2019
    DEFINE_PROP_UINT32("psci-conduit", ARMCPU, psci_conduit, 0),
2020
    DEFINE_PROP_UINT32("midr", ARMCPU, midr, 0),
2021 2022
    DEFINE_PROP_UINT64("mp-affinity", ARMCPU,
                        mp_affinity, ARM64_AFFINITY_INVALID),
2023
    DEFINE_PROP_INT32("node-id", ARMCPU, node_id, CPU_UNSET_NUMA_NODE_ID),
2024
    DEFINE_PROP_INT32("core-count", ARMCPU, core_count, -1),
2025 2026 2027
    DEFINE_PROP_END_OF_LIST()
};

2028
#ifdef CONFIG_USER_ONLY
2029 2030
static int arm_cpu_handle_mmu_fault(CPUState *cs, vaddr address, int size,
                                    int rw, int mmu_idx)
2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044
{
    ARMCPU *cpu = ARM_CPU(cs);
    CPUARMState *env = &cpu->env;

    env->exception.vaddress = address;
    if (rw == 2) {
        cs->exception_index = EXCP_PREFETCH_ABORT;
    } else {
        cs->exception_index = EXCP_DATA_ABORT;
    }
    return 1;
}
#endif

2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055
static gchar *arm_gdb_arch_name(CPUState *cs)
{
    ARMCPU *cpu = ARM_CPU(cs);
    CPUARMState *env = &cpu->env;

    if (arm_feature(env, ARM_FEATURE_IWMMXT)) {
        return g_strdup("iwmmxt");
    }
    return g_strdup("arm");
}

2056 2057 2058 2059
static void arm_cpu_class_init(ObjectClass *oc, void *data)
{
    ARMCPUClass *acc = ARM_CPU_CLASS(oc);
    CPUClass *cc = CPU_CLASS(acc);
2060 2061
    DeviceClass *dc = DEVICE_CLASS(oc);

2062 2063
    device_class_set_parent_realize(dc, arm_cpu_realizefn,
                                    &acc->parent_realize);
2064
    dc->props = arm_cpu_properties;
2065 2066 2067

    acc->parent_reset = cc->reset;
    cc->reset = arm_cpu_reset;
2068 2069

    cc->class_by_name = arm_cpu_class_by_name;
2070
    cc->has_work = arm_cpu_has_work;
2071
    cc->cpu_exec_interrupt = arm_cpu_exec_interrupt;
2072
    cc->dump_state = arm_cpu_dump_state;
2073
    cc->set_pc = arm_cpu_set_pc;
2074 2075
    cc->gdb_read_register = arm_cpu_gdb_read_register;
    cc->gdb_write_register = arm_cpu_gdb_write_register;
2076 2077 2078
#ifdef CONFIG_USER_ONLY
    cc->handle_mmu_fault = arm_cpu_handle_mmu_fault;
#else
2079
    cc->do_interrupt = arm_cpu_do_interrupt;
2080
    cc->do_unaligned_access = arm_cpu_do_unaligned_access;
2081
    cc->do_transaction_failed = arm_cpu_do_transaction_failed;
2082
    cc->get_phys_page_attrs_debug = arm_cpu_get_phys_page_attrs_debug;
2083
    cc->asidx_from_attrs = arm_asidx_from_attrs;
2084
    cc->vmsd = &vmstate_arm_cpu;
2085
    cc->virtio_is_big_endian = arm_cpu_virtio_is_big_endian;
2086 2087
    cc->write_elf64_note = arm_cpu_write_elf64_note;
    cc->write_elf32_note = arm_cpu_write_elf32_note;
2088
#endif
2089
    cc->gdb_num_core_regs = 26;
2090
    cc->gdb_core_xml_file = "arm-core.xml";
2091
    cc->gdb_arch_name = arm_gdb_arch_name;
2092
    cc->gdb_get_dynamic_xml = arm_gdb_get_dynamic_xml;
2093
    cc->gdb_stop_before_watchpoint = true;
2094
    cc->debug_excp_handler = arm_debug_excp_handler;
2095
    cc->debug_check_watchpoint = arm_debug_check_watchpoint;
2096 2097 2098
#if !defined(CONFIG_USER_ONLY)
    cc->adjust_watchpoint_address = arm_adjust_watchpoint_address;
#endif
2099 2100

    cc->disas_set_info = arm_disas_set_info;
2101
#ifdef CONFIG_TCG
2102
    cc->tcg_initialize = arm_translate_init;
2103
#endif
2104 2105
}

2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125
#ifdef CONFIG_KVM
static void arm_host_initfn(Object *obj)
{
    ARMCPU *cpu = ARM_CPU(obj);

    kvm_arm_set_cpu_features_from_host(cpu);
}

static const TypeInfo host_arm_cpu_type_info = {
    .name = TYPE_ARM_HOST_CPU,
#ifdef TARGET_AARCH64
    .parent = TYPE_AARCH64_CPU,
#else
    .parent = TYPE_ARM_CPU,
#endif
    .instance_init = arm_host_initfn,
};

#endif

2126 2127 2128 2129 2130 2131 2132
static void cpu_register(const ARMCPUInfo *info)
{
    TypeInfo type_info = {
        .parent = TYPE_ARM_CPU,
        .instance_size = sizeof(ARMCPU),
        .instance_init = info->initfn,
        .class_size = sizeof(ARMCPUClass),
2133
        .class_init = info->class_init,
2134 2135
    };

A
Andreas Färber 已提交
2136
    type_info.name = g_strdup_printf("%s-" TYPE_ARM_CPU, info->name);
2137
    type_register(&type_info);
A
Andreas Färber 已提交
2138
    g_free((void *)type_info.name);
2139 2140
}

2141 2142 2143 2144
static const TypeInfo arm_cpu_type_info = {
    .name = TYPE_ARM_CPU,
    .parent = TYPE_CPU,
    .instance_size = sizeof(ARMCPU),
2145
    .instance_init = arm_cpu_initfn,
2146
    .instance_post_init = arm_cpu_post_init,
2147
    .instance_finalize = arm_cpu_finalizefn,
2148
    .abstract = true,
2149 2150 2151 2152
    .class_size = sizeof(ARMCPUClass),
    .class_init = arm_cpu_class_init,
};

2153 2154 2155 2156 2157 2158
static const TypeInfo idau_interface_type_info = {
    .name = TYPE_IDAU_INTERFACE,
    .parent = TYPE_INTERFACE,
    .class_size = sizeof(IDAUInterfaceClass),
};

2159 2160
static void arm_cpu_register_types(void)
{
2161
    const ARMCPUInfo *info = arm_cpus;
2162

2163
    type_register_static(&arm_cpu_type_info);
2164
    type_register_static(&idau_interface_type_info);
2165 2166 2167 2168

    while (info->name) {
        cpu_register(info);
        info++;
2169
    }
2170 2171 2172 2173

#ifdef CONFIG_KVM
    type_register_static(&host_arm_cpu_type_info);
#endif
2174 2175 2176
}

type_init(arm_cpu_register_types)