2 * Copyright (c) 2010-2021 ARM Limited
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 #include "arch/arm/isa.hh"
40 #include "arch/arm/faults.hh"
41 #include "arch/arm/htm.hh"
42 #include "arch/arm/interrupts.hh"
43 #include "arch/arm/mmu.hh"
44 #include "arch/arm/pmu.hh"
45 #include "arch/arm/self_debug.hh"
46 #include "arch/arm/system.hh"
47 #include "arch/arm/tlbi_op.hh"
48 #include "cpu/base.hh"
49 #include "cpu/checker/cpu.hh"
50 #include "debug/Arm.hh"
51 #include "debug/MiscRegs.hh"
52 #include "dev/arm/generic_timer.hh"
53 #include "dev/arm/gic_v3.hh"
54 #include "dev/arm/gic_v3_cpu_interface.hh"
55 #include "params/ArmISA.hh"
56 #include "sim/faults.hh"
57 #include "sim/stat_control.hh"
58 #include "sim/system.hh"
63 ISA::ISA(const Params
&p
) : BaseISA(p
), system(NULL
),
64 _decoderFlavor(p
.decoderFlavor
), _vecRegRenameMode(Enums::Full
),
65 pmu(p
.pmu
), impdefAsNop(p
.impdef_nop
),
68 miscRegs
[MISCREG_SCTLR_RST
] = 0;
70 // Hook up a dummy device if we haven't been configured with a
71 // real PMU. By using a dummy device, we don't need to check that
72 // the PMU exist every time we try to access a PMU register.
76 // Give all ISA devices a pointer to this ISA
79 system
= dynamic_cast<ArmSystem
*>(p
.system
);
81 // Cache system-level properties
82 if (FullSystem
&& system
) {
83 highestELIs64
= system
->highestELIs64();
84 haveSecurity
= system
->haveSecurity();
85 haveLPAE
= system
->haveLPAE();
86 haveCrypto
= system
->haveCrypto();
87 haveVirtualization
= system
->haveVirtualization();
88 haveLargeAsid64
= system
->haveLargeAsid64();
89 physAddrRange
= system
->physAddrRange();
90 haveSVE
= system
->haveSVE();
91 haveVHE
= system
->haveVHE();
92 havePAN
= system
->havePAN();
93 haveSecEL2
= system
->haveSecEL2();
94 sveVL
= system
->sveVL();
95 haveLSE
= system
->haveLSE();
96 haveTME
= system
->haveTME();
98 highestELIs64
= true; // ArmSystem::highestELIs64 does the same
99 haveSecurity
= haveLPAE
= haveVirtualization
= false;
101 haveLargeAsid64
= false;
102 physAddrRange
= 32; // dummy value
112 // Initial rename mode depends on highestEL
113 const_cast<Enums::VecRegRenameMode
&>(_vecRegRenameMode
) =
114 highestELIs64
? Enums::Full
: Enums::Elem
;
116 selfDebug
= new SelfDebug();
117 initializeMiscRegMetadata();
118 preUnflattenMiscReg();
123 std::vector
<struct ISA::MiscRegLUTEntry
> ISA::lookUpMiscReg(NUM_MISCREGS
);
128 return dynamic_cast<const Params
&>(_params
);
134 const Params
&p(params());
136 // Invalidate cached copies of miscregs in the TLBs
138 getMMUPtr(tc
)->invalidateMiscReg();
141 SCTLR sctlr_rst
= miscRegs
[MISCREG_SCTLR_RST
];
142 memset(miscRegs
, 0, sizeof(miscRegs
));
146 // We always initialize AArch64 ID registers even
147 // if we are in AArch32. This is done since if we
148 // are in SE mode we don't know if our ArmProcess is
149 // AArch32 or AArch64
152 // Start with an event in the mailbox
153 miscRegs
[MISCREG_SEV_MAILBOX
] = 1;
155 // Separate Instruction and Data TLBs
156 miscRegs
[MISCREG_TLBTR
] = 1;
159 mvfr0
.advSimdRegisters
= 2;
160 mvfr0
.singlePrecision
= 2;
161 mvfr0
.doublePrecision
= 2;
162 mvfr0
.vfpExceptionTrapping
= 0;
164 mvfr0
.squareRoot
= 1;
165 mvfr0
.shortVectors
= 1;
166 mvfr0
.roundingModes
= 1;
167 miscRegs
[MISCREG_MVFR0
] = mvfr0
;
170 mvfr1
.flushToZero
= 1;
171 mvfr1
.defaultNaN
= 1;
172 mvfr1
.advSimdLoadStore
= 1;
173 mvfr1
.advSimdInteger
= 1;
174 mvfr1
.advSimdSinglePrecision
= 1;
175 mvfr1
.advSimdHalfPrecision
= 1;
176 mvfr1
.vfpHalfPrecision
= 1;
177 miscRegs
[MISCREG_MVFR1
] = mvfr1
;
179 // Reset values of PRRR and NMRR are implementation dependent
181 // @todo: PRRR and NMRR in secure state?
182 miscRegs
[MISCREG_PRRR_NS
] =
196 miscRegs
[MISCREG_NMRR_NS
] =
213 if (FullSystem
&& system
->highestELIs64()) {
214 // Initialize AArch64 state
219 // Initialize AArch32 state...
220 clear32(p
, sctlr_rst
);
224 ISA::clear32(const ArmISAParams
&p
, const SCTLR
&sctlr_rst
)
227 cpsr
.mode
= MODE_USER
;
230 miscRegs
[MISCREG_MVBAR
] = system
->resetAddr();
233 miscRegs
[MISCREG_CPSR
] = cpsr
;
237 sctlr
.te
= (bool) sctlr_rst
.te
;
238 sctlr
.nmfi
= (bool) sctlr_rst
.nmfi
;
239 sctlr
.v
= (bool) sctlr_rst
.v
;
244 sctlr
.rao4
= 0xf; // SCTLR[6:3]
247 miscRegs
[MISCREG_SCTLR_NS
] = sctlr
;
248 miscRegs
[MISCREG_SCTLR_RST
] = sctlr_rst
;
249 miscRegs
[MISCREG_HCPTR
] = 0;
251 miscRegs
[MISCREG_CPACR
] = 0;
253 miscRegs
[MISCREG_FPSID
] = p
.fpsid
;
256 TTBCR ttbcr
= miscRegs
[MISCREG_TTBCR_NS
];
258 miscRegs
[MISCREG_TTBCR_NS
] = ttbcr
;
259 // Enforce consistency with system-level settings
260 miscRegs
[MISCREG_ID_MMFR0
] = (miscRegs
[MISCREG_ID_MMFR0
] & ~0xf) | 0x5;
264 miscRegs
[MISCREG_SCTLR_S
] = sctlr
;
265 miscRegs
[MISCREG_SCR
] = 0;
266 miscRegs
[MISCREG_VBAR_S
] = 0;
268 // we're always non-secure
269 miscRegs
[MISCREG_SCR
] = 1;
272 //XXX We need to initialize the rest of the state.
276 ISA::clear64(const ArmISAParams
&p
)
279 Addr rvbar
= system
->resetAddr();
280 switch (system
->highestEL()) {
281 // Set initial EL to highest implemented EL using associated stack
282 // pointer (SP_ELx); set RVBAR_ELx to implementation defined reset
285 cpsr
.mode
= MODE_EL3H
;
286 miscRegs
[MISCREG_RVBAR_EL3
] = rvbar
;
289 cpsr
.mode
= MODE_EL2H
;
290 miscRegs
[MISCREG_RVBAR_EL2
] = rvbar
;
293 cpsr
.mode
= MODE_EL1H
;
294 miscRegs
[MISCREG_RVBAR_EL1
] = rvbar
;
297 panic("Invalid highest implemented exception level");
301 // Initialize rest of CPSR
302 cpsr
.daif
= 0xf; // Mask all interrupts
305 miscRegs
[MISCREG_CPSR
] = cpsr
;
308 // Initialize other control registers
309 miscRegs
[MISCREG_MPIDR_EL1
] = 0x80000000;
311 miscRegs
[MISCREG_SCTLR_EL3
] = 0x30c50830;
312 miscRegs
[MISCREG_SCR_EL3
] = 0x00000030; // RES1 fields
313 } else if (haveVirtualization
) {
314 // also MISCREG_SCTLR_EL2 (by mapping)
315 miscRegs
[MISCREG_HSCTLR
] = 0x30c50830;
317 // also MISCREG_SCTLR_EL1 (by mapping)
318 miscRegs
[MISCREG_SCTLR_NS
] = 0x30d00800 | 0x00050030; // RES1 | init
320 miscRegs
[MISCREG_SCR_EL3
] = 1;
325 ISA::initID32(const ArmISAParams
&p
)
327 // Initialize configurable default values
332 else if (highestELIs64
)
333 // Cortex-A57 TRM r0p0 MIDR
336 // Cortex-A15 TRM r0p0 MIDR
339 miscRegs
[MISCREG_MIDR
] = midr
;
340 miscRegs
[MISCREG_MIDR_EL1
] = midr
;
341 miscRegs
[MISCREG_VPIDR
] = midr
;
343 miscRegs
[MISCREG_ID_ISAR0
] = p
.id_isar0
;
344 miscRegs
[MISCREG_ID_ISAR1
] = p
.id_isar1
;
345 miscRegs
[MISCREG_ID_ISAR2
] = p
.id_isar2
;
346 miscRegs
[MISCREG_ID_ISAR3
] = p
.id_isar3
;
347 miscRegs
[MISCREG_ID_ISAR4
] = p
.id_isar4
;
348 miscRegs
[MISCREG_ID_ISAR5
] = p
.id_isar5
;
349 miscRegs
[MISCREG_ID_ISAR6
] = p
.id_isar6
;
351 miscRegs
[MISCREG_ID_MMFR0
] = p
.id_mmfr0
;
352 miscRegs
[MISCREG_ID_MMFR1
] = p
.id_mmfr1
;
353 miscRegs
[MISCREG_ID_MMFR2
] = p
.id_mmfr2
;
354 miscRegs
[MISCREG_ID_MMFR3
] = p
.id_mmfr3
;
355 miscRegs
[MISCREG_ID_MMFR4
] = p
.id_mmfr4
;
357 miscRegs
[MISCREG_ID_ISAR5
] = insertBits(
358 miscRegs
[MISCREG_ID_ISAR5
], 19, 4,
359 haveCrypto
? 0x1112 : 0x0);
363 ISA::initID64(const ArmISAParams
&p
)
365 // Initialize configurable id registers
366 miscRegs
[MISCREG_ID_AA64AFR0_EL1
] = p
.id_aa64afr0_el1
;
367 miscRegs
[MISCREG_ID_AA64AFR1_EL1
] = p
.id_aa64afr1_el1
;
368 miscRegs
[MISCREG_ID_AA64DFR0_EL1
] =
369 (p
.id_aa64dfr0_el1
& 0xfffffffffffff0ffULL
) |
370 (p
.pmu
? 0x0000000000000100ULL
: 0); // Enable PMUv3
372 miscRegs
[MISCREG_ID_AA64DFR1_EL1
] = p
.id_aa64dfr1_el1
;
373 miscRegs
[MISCREG_ID_AA64ISAR0_EL1
] = p
.id_aa64isar0_el1
;
374 miscRegs
[MISCREG_ID_AA64ISAR1_EL1
] = p
.id_aa64isar1_el1
;
375 miscRegs
[MISCREG_ID_AA64MMFR0_EL1
] = p
.id_aa64mmfr0_el1
;
376 miscRegs
[MISCREG_ID_AA64MMFR1_EL1
] = p
.id_aa64mmfr1_el1
;
377 miscRegs
[MISCREG_ID_AA64MMFR2_EL1
] = p
.id_aa64mmfr2_el1
;
379 miscRegs
[MISCREG_ID_DFR0_EL1
] =
380 (p
.pmu
? 0x03000000ULL
: 0); // Enable PMUv3
382 miscRegs
[MISCREG_ID_DFR0
] = miscRegs
[MISCREG_ID_DFR0_EL1
];
385 miscRegs
[MISCREG_ID_AA64ZFR0_EL1
] = 0; // SVEver 0
387 miscRegs
[MISCREG_ZCR_EL3
] = sveVL
- 1;
388 } else if (haveVirtualization
) {
389 miscRegs
[MISCREG_ZCR_EL2
] = sveVL
- 1;
391 miscRegs
[MISCREG_ZCR_EL1
] = sveVL
- 1;
394 // Enforce consistency with system-level settings...
397 miscRegs
[MISCREG_ID_AA64PFR0_EL1
] = insertBits(
398 miscRegs
[MISCREG_ID_AA64PFR0_EL1
], 15, 12,
399 haveSecurity
? 0x2 : 0x0);
401 miscRegs
[MISCREG_ID_AA64PFR0_EL1
] = insertBits(
402 miscRegs
[MISCREG_ID_AA64PFR0_EL1
], 11, 8,
403 haveVirtualization
? 0x2 : 0x0);
405 miscRegs
[MISCREG_ID_AA64PFR0_EL1
] = insertBits(
406 miscRegs
[MISCREG_ID_AA64PFR0_EL1
], 35, 32,
407 haveSVE
? 0x1 : 0x0);
409 miscRegs
[MISCREG_ID_AA64PFR0_EL1
] = insertBits(
410 miscRegs
[MISCREG_ID_AA64PFR0_EL1
], 39, 36,
411 haveSecEL2
? 0x1 : 0x0);
412 miscRegs
[MISCREG_ID_AA64ISAR0_EL1
] = insertBits(
413 miscRegs
[MISCREG_ID_AA64ISAR0_EL1
], 39, 36,
414 haveSecEL2
? 0x1 : 0x0);
415 // Large ASID support
416 miscRegs
[MISCREG_ID_AA64MMFR0_EL1
] = insertBits(
417 miscRegs
[MISCREG_ID_AA64MMFR0_EL1
], 7, 4,
418 haveLargeAsid64
? 0x2 : 0x0);
419 // Physical address size
420 miscRegs
[MISCREG_ID_AA64MMFR0_EL1
] = insertBits(
421 miscRegs
[MISCREG_ID_AA64MMFR0_EL1
], 3, 0,
422 encodePhysAddrRange64(physAddrRange
));
424 miscRegs
[MISCREG_ID_AA64ISAR0_EL1
] = insertBits(
425 miscRegs
[MISCREG_ID_AA64ISAR0_EL1
], 19, 4,
426 haveCrypto
? 0x1112 : 0x0);
428 miscRegs
[MISCREG_ID_AA64ISAR0_EL1
] = insertBits(
429 miscRegs
[MISCREG_ID_AA64ISAR0_EL1
], 23, 20,
430 haveLSE
? 0x2 : 0x0);
432 miscRegs
[MISCREG_ID_AA64MMFR1_EL1
] = insertBits(
433 miscRegs
[MISCREG_ID_AA64MMFR1_EL1
], 11, 8,
434 haveVHE
? 0x1 : 0x0);
436 miscRegs
[MISCREG_ID_AA64MMFR1_EL1
] = insertBits(
437 miscRegs
[MISCREG_ID_AA64MMFR1_EL1
], 23, 20,
438 havePAN
? 0x1 : 0x0);
440 miscRegs
[MISCREG_ID_AA64ISAR0_EL1
] = insertBits(
441 miscRegs
[MISCREG_ID_AA64ISAR0_EL1
], 27, 24,
442 haveTME
? 0x1 : 0x0);
451 setupThreadContext();
454 std::unique_ptr
<BaseHTMCheckpoint
> cpt(new HTMCheckpoint());
455 tc
->setHtmCheckpointPtr(std::move(cpt
));
463 ISA::setupThreadContext()
465 pmu
->setThreadContext(tc
);
472 Gicv3
*gicv3
= dynamic_cast<Gicv3
*>(system
->getGIC());
476 if (!gicv3CpuInterface
)
477 gicv3CpuInterface
.reset(gicv3
->getCPUInterface(tc
->contextId()));
479 gicv3CpuInterface
->setISA(this);
480 gicv3CpuInterface
->setThreadContext(tc
);
484 ISA::takeOverFrom(ThreadContext
*new_tc
, ThreadContext
*old_tc
)
487 setupThreadContext();
491 ISA::readMiscRegNoEffect(int misc_reg
) const
493 assert(misc_reg
< NumMiscRegs
);
495 const auto ®
= lookUpMiscReg
[misc_reg
]; // bit masks
496 const auto &map
= getMiscIndices(misc_reg
);
497 int lower
= map
.first
, upper
= map
.second
;
498 // NB!: apply architectural masks according to desired register,
499 // despite possibly getting value from different (mapped) register.
500 auto val
= !upper
? miscRegs
[lower
] : ((miscRegs
[lower
] & mask(32))
501 |(miscRegs
[upper
] << 32));
502 if (val
& reg
.res0()) {
503 DPRINTF(MiscRegs
, "Reading MiscReg %s with set res0 bits: %#x\n",
504 miscRegName
[misc_reg
], val
& reg
.res0());
506 if ((val
& reg
.res1()) != reg
.res1()) {
507 DPRINTF(MiscRegs
, "Reading MiscReg %s with clear res1 bits: %#x\n",
508 miscRegName
[misc_reg
], (val
& reg
.res1()) ^ reg
.res1());
510 return (val
& ~reg
.raz()) | reg
.rao(); // enforce raz/rao
515 ISA::readMiscReg(int misc_reg
)
521 if (misc_reg
== MISCREG_CPSR
) {
522 cpsr
= miscRegs
[misc_reg
];
524 cpsr
.j
= pc
.jazelle() ? 1 : 0;
525 cpsr
.t
= pc
.thumb() ? 1 : 0;
530 if (!miscRegInfo
[misc_reg
][MISCREG_IMPLEMENTED
]) {
531 if (miscRegInfo
[misc_reg
][MISCREG_WARN_NOT_FAIL
])
532 warn("Unimplemented system register %s read.\n",
533 miscRegName
[misc_reg
]);
535 panic("Unimplemented system register %s read.\n",
536 miscRegName
[misc_reg
]);
539 misc_reg
= redirectRegVHE(tc
, misc_reg
);
541 switch (unflattenMiscReg(misc_reg
)) {
544 if (!haveVirtualization
)
549 const uint32_t ones
= (uint32_t)(-1);
551 // Only cp10, cp11, and ase are implemented, nothing else should
552 // be readable? (straight copy from the write code)
553 cpacrMask
.cp10
= ones
;
554 cpacrMask
.cp11
= ones
;
555 cpacrMask
.asedis
= ones
;
557 // Security Extensions may limit the readability of CPACR
559 scr
= readMiscRegNoEffect(MISCREG_SCR
);
560 cpsr
= readMiscRegNoEffect(MISCREG_CPSR
);
561 if (scr
.ns
&& (cpsr
.mode
!= MODE_MON
) && ELIs32(tc
, EL3
)) {
562 NSACR nsacr
= readMiscRegNoEffect(MISCREG_NSACR
);
563 // NB: Skipping the full loop, here
564 if (!nsacr
.cp10
) cpacrMask
.cp10
= 0;
565 if (!nsacr
.cp11
) cpacrMask
.cp11
= 0;
568 RegVal val
= readMiscRegNoEffect(MISCREG_CPACR
);
570 DPRINTF(MiscRegs
, "Reading misc reg %s: %#x\n",
571 miscRegName
[misc_reg
], val
);
575 case MISCREG_MPIDR_EL1
:
576 return readMPIDR(system
, tc
);
578 case MISCREG_VMPIDR_EL2
:
579 // top bit defined as RES1
580 return readMiscRegNoEffect(misc_reg
) | 0x80000000;
581 case MISCREG_ID_AFR0
: // not implemented, so alias MIDR
582 case MISCREG_REVIDR
: // not implemented, so alias MIDR
584 cpsr
= readMiscRegNoEffect(MISCREG_CPSR
);
585 scr
= readMiscRegNoEffect(MISCREG_SCR
);
586 if ((cpsr
.mode
== MODE_HYP
) || isSecure(tc
)) {
587 return readMiscRegNoEffect(misc_reg
);
589 return readMiscRegNoEffect(MISCREG_VPIDR
);
592 case MISCREG_JOSCR
: // Jazelle trivial implementation, RAZ/WI
593 case MISCREG_JMCR
: // Jazelle trivial implementation, RAZ/WI
594 case MISCREG_JIDR
: // Jazelle trivial implementation, RAZ/WI
595 case MISCREG_AIDR
: // AUX ID set to 0
596 case MISCREG_TCMTR
: // No TCM's
600 warn_once("The clidr register always reports 0 caches.\n");
601 warn_once("clidr LoUIS field of 0b001 to match current "
602 "ARM implementations.\n");
605 warn_once("The ccsidr register isn't implemented and "
606 "always reads as 0.\n");
608 case MISCREG_CTR
: // AArch32, ARMv7, top bit set
609 case MISCREG_CTR_EL0
: // AArch64
611 //all caches have the same line size in gem5
612 //4 byte words in ARM
613 unsigned lineSizeWords
=
614 tc
->getSystemPtr()->cacheLineSize() / 4;
615 unsigned log2LineSizeWords
= 0;
617 while (lineSizeWords
>>= 1) {
622 //log2 of minimun i-cache line size (words)
623 ctr
.iCacheLineSize
= log2LineSizeWords
;
624 //b11 - gem5 uses pipt
625 ctr
.l1IndexPolicy
= 0x3;
626 //log2 of minimum d-cache line size (words)
627 ctr
.dCacheLineSize
= log2LineSizeWords
;
628 //log2 of max reservation size (words)
629 ctr
.erg
= log2LineSizeWords
;
630 //log2 of max writeback size (words)
631 ctr
.cwg
= log2LineSizeWords
;
632 //b100 - gem5 format is ARMv7
638 warn("Not doing anything for miscreg ACTLR\n");
641 case MISCREG_PMXEVTYPER_PMCCFILTR
:
642 case MISCREG_PMINTENSET_EL1
... MISCREG_PMOVSSET_EL0
:
643 case MISCREG_PMEVCNTR0_EL0
... MISCREG_PMEVTYPER5_EL0
:
644 case MISCREG_PMCR
... MISCREG_PMOVSSET
:
645 return pmu
->readMiscReg(misc_reg
);
648 panic("shouldn't be reading this register seperately\n");
649 case MISCREG_FPSCR_QC
:
650 return readMiscRegNoEffect(MISCREG_FPSCR
) & ~FpscrQcMask
;
651 case MISCREG_FPSCR_EXC
:
652 return readMiscRegNoEffect(MISCREG_FPSCR
) & ~FpscrExcMask
;
655 const uint32_t ones
= (uint32_t)(-1);
657 fpscrMask
.ioc
= ones
;
658 fpscrMask
.dzc
= ones
;
659 fpscrMask
.ofc
= ones
;
660 fpscrMask
.ufc
= ones
;
661 fpscrMask
.ixc
= ones
;
662 fpscrMask
.idc
= ones
;
668 return readMiscRegNoEffect(MISCREG_FPSCR
) & (uint32_t)fpscrMask
;
672 const uint32_t ones
= (uint32_t)(-1);
674 fpscrMask
.len
= ones
;
675 fpscrMask
.fz16
= ones
;
676 fpscrMask
.stride
= ones
;
677 fpscrMask
.rMode
= ones
;
680 fpscrMask
.ahp
= ones
;
681 return readMiscRegNoEffect(MISCREG_FPSCR
) & (uint32_t)fpscrMask
;
686 cpsr
.nz
= tc
->readCCReg(CCREG_NZ
);
687 cpsr
.c
= tc
->readCCReg(CCREG_C
);
688 cpsr
.v
= tc
->readCCReg(CCREG_V
);
694 cpsr
.daif
= (uint8_t) ((CPSR
) miscRegs
[MISCREG_CPSR
]).daif
;
699 return tc
->readIntReg(INTREG_SP0
);
703 return tc
->readIntReg(INTREG_SP1
);
707 return tc
->readIntReg(INTREG_SP2
);
711 return miscRegs
[MISCREG_CPSR
] & 0x1;
713 case MISCREG_CURRENTEL
:
715 return miscRegs
[MISCREG_CPSR
] & 0xc;
719 return miscRegs
[MISCREG_CPSR
] & 0x400000;
723 // mostly unimplemented, just set NumCPUs field from sim and return
725 // b00:1CPU to b11:4CPUs
726 l2ctlr
.numCPUs
= tc
->getSystemPtr()->threads
.size() - 1;
729 case MISCREG_DBGDIDR
:
730 /* For now just implement the version number.
731 * ARMv7, v7.1 Debug architecture (0b0101 --> 0x5)
734 case MISCREG_DBGDSCRint
:
735 return readMiscRegNoEffect(MISCREG_DBGDSCRint
);
738 auto ic
= dynamic_cast<ArmISA::Interrupts
*>(
739 tc
->getCpuPtr()->getInterruptController(tc
->threadId()));
741 readMiscRegNoEffect(MISCREG_HCR
),
742 readMiscRegNoEffect(MISCREG_CPSR
),
743 readMiscRegNoEffect(MISCREG_SCR
));
745 case MISCREG_ISR_EL1
:
747 auto ic
= dynamic_cast<ArmISA::Interrupts
*>(
748 tc
->getCpuPtr()->getInterruptController(tc
->threadId()));
750 readMiscRegNoEffect(MISCREG_HCR_EL2
),
751 readMiscRegNoEffect(MISCREG_CPSR
),
752 readMiscRegNoEffect(MISCREG_SCR_EL3
));
754 case MISCREG_DCZID_EL0
:
755 return 0x04; // DC ZVA clear 64-byte chunks
758 RegVal val
= readMiscRegNoEffect(misc_reg
);
759 // The trap bit associated with CP14 is defined as RAZ
761 // If a CP bit in NSACR is 0 then the corresponding bit in
763 bool secure_lookup
= haveSecurity
&& isSecure(tc
);
764 if (!secure_lookup
) {
765 RegVal mask
= readMiscRegNoEffect(MISCREG_NSACR
);
766 val
|= (mask
^ 0x7FFF) & 0xBFFF;
768 // Set the bits for unimplemented coprocessors to RAO/WI
772 case MISCREG_HDFAR
: // alias for secure DFAR
773 return readMiscRegNoEffect(MISCREG_DFAR_S
);
774 case MISCREG_HIFAR
: // alias for secure IFAR
775 return readMiscRegNoEffect(MISCREG_IFAR_S
);
777 case MISCREG_ID_PFR0
:
778 // !ThumbEE | !Jazelle | Thumb | ARM
780 case MISCREG_ID_PFR1
:
781 { // Timer | Virti | !M Profile | TrustZone | ARMv4
782 bool haveTimer
= (system
->getGenericTimer() != NULL
);
784 | (haveSecurity
? 0x00000010 : 0x0)
785 | (haveVirtualization
? 0x00001000 : 0x0)
786 | (haveTimer
? 0x00010000 : 0x0);
788 case MISCREG_ID_AA64PFR0_EL1
:
789 return 0x0000000000000002 | // AArch{64,32} supported at EL0
790 0x0000000000000020 | // EL1
791 (haveVirtualization
? 0x0000000000000200 : 0) | // EL2
792 (haveSecurity
? 0x0000000000002000 : 0) | // EL3
793 (haveSVE
? 0x0000000100000000 : 0) | // SVE
794 (haveSecEL2
? 0x0000001000000000 : 0) | // SecEL2
795 (gicv3CpuInterface
? 0x0000000001000000 : 0);
796 case MISCREG_ID_AA64PFR1_EL1
:
797 return 0; // bits [63:0] RES0 (reserved for future use)
799 // Generic Timer registers
800 case MISCREG_CNTFRQ
... MISCREG_CNTVOFF
:
801 case MISCREG_CNTFRQ_EL0
... MISCREG_CNTVOFF_EL2
:
802 return getGenericTimer().readMiscReg(misc_reg
);
804 case MISCREG_ICC_AP0R0
... MISCREG_ICH_LRC15
:
805 case MISCREG_ICC_PMR_EL1
... MISCREG_ICC_IGRPEN1_EL3
:
806 case MISCREG_ICH_AP0R0_EL2
... MISCREG_ICH_LR15_EL2
:
807 return getGICv3CPUInterface().readMiscReg(misc_reg
);
813 return readMiscRegNoEffect(misc_reg
);
817 ISA::setMiscRegNoEffect(int misc_reg
, RegVal val
)
819 assert(misc_reg
< NumMiscRegs
);
821 const auto ®
= lookUpMiscReg
[misc_reg
]; // bit masks
822 const auto &map
= getMiscIndices(misc_reg
);
823 int lower
= map
.first
, upper
= map
.second
;
825 auto v
= (val
& ~reg
.wi()) | reg
.rao();
827 miscRegs
[lower
] = bits(v
, 31, 0);
828 miscRegs
[upper
] = bits(v
, 63, 32);
829 DPRINTF(MiscRegs
, "Writing MiscReg %s (%d %d:%d) : %#x\n",
830 miscRegName
[misc_reg
], misc_reg
, lower
, upper
, v
);
833 DPRINTF(MiscRegs
, "Writing MiscReg %s (%d %d) : %#x\n",
834 miscRegName
[misc_reg
], misc_reg
, lower
, v
);
839 ISA::setMiscReg(int misc_reg
, RegVal val
)
846 if (misc_reg
== MISCREG_CPSR
) {
850 CPSR old_cpsr
= miscRegs
[MISCREG_CPSR
];
851 int old_mode
= old_cpsr
.mode
;
853 if (old_mode
!= cpsr
.mode
|| cpsr
.il
!= old_cpsr
.il
) {
854 getMMUPtr(tc
)->invalidateMiscReg();
857 if (cpsr
.pan
!= old_cpsr
.pan
) {
858 getMMUPtr(tc
)->invalidateMiscReg(MMU::D_TLBS
);
861 DPRINTF(Arm
, "Updating CPSR from %#x to %#x f:%d i:%d a:%d mode:%#x\n",
862 miscRegs
[misc_reg
], cpsr
, cpsr
.f
, cpsr
.i
, cpsr
.a
, cpsr
.mode
);
863 PCState pc
= tc
->pcState();
864 pc
.nextThumb(cpsr
.t
);
865 pc
.nextJazelle(cpsr
.j
);
866 pc
.illegalExec(cpsr
.il
== 1);
867 selfDebug
->setDebugMask(cpsr
.d
== 1);
869 tc
->getDecoderPtr()->setSveLen((getCurSveVecLenInBits() >> 7) - 1);
871 // Follow slightly different semantics if a CheckerCPU object
873 CheckerCPU
*checker
= tc
->getCheckerCpuPtr();
875 tc
->pcStateNoRecord(pc
);
881 if (!miscRegInfo
[misc_reg
][MISCREG_IMPLEMENTED
]) {
882 if (miscRegInfo
[misc_reg
][MISCREG_WARN_NOT_FAIL
])
883 warn("Unimplemented system register %s write with %#x.\n",
884 miscRegName
[misc_reg
], val
);
886 panic("Unimplemented system register %s write with %#x.\n",
887 miscRegName
[misc_reg
], val
);
890 misc_reg
= redirectRegVHE(tc
, misc_reg
);
892 switch (unflattenMiscReg(misc_reg
)) {
896 const uint32_t ones
= (uint32_t)(-1);
898 // Only cp10, cp11, and ase are implemented, nothing else should
900 cpacrMask
.cp10
= ones
;
901 cpacrMask
.cp11
= ones
;
902 cpacrMask
.asedis
= ones
;
904 // Security Extensions may limit the writability of CPACR
906 scr
= readMiscRegNoEffect(MISCREG_SCR
);
907 CPSR cpsr
= readMiscRegNoEffect(MISCREG_CPSR
);
908 if (scr
.ns
&& (cpsr
.mode
!= MODE_MON
) && ELIs32(tc
, EL3
)) {
909 NSACR nsacr
= readMiscRegNoEffect(MISCREG_NSACR
);
910 // NB: Skipping the full loop, here
911 if (!nsacr
.cp10
) cpacrMask
.cp10
= 0;
912 if (!nsacr
.cp11
) cpacrMask
.cp11
= 0;
916 RegVal old_val
= readMiscRegNoEffect(MISCREG_CPACR
);
918 newVal
|= old_val
& ~cpacrMask
;
919 DPRINTF(MiscRegs
, "Writing misc reg %s: %#x\n",
920 miscRegName
[misc_reg
], newVal
);
923 case MISCREG_CPACR_EL1
:
925 const uint32_t ones
= (uint32_t)(-1);
927 cpacrMask
.tta
= ones
;
928 cpacrMask
.fpen
= ones
;
930 cpacrMask
.zen
= ones
;
933 DPRINTF(MiscRegs
, "Writing misc reg %s: %#x\n",
934 miscRegName
[misc_reg
], newVal
);
937 case MISCREG_CPTR_EL2
:
939 const uint32_t ones
= (uint32_t)(-1);
941 cptrMask
.tcpac
= ones
;
949 cptrMask
.res1_13_12_el2
= ones
;
950 cptrMask
.res1_7_0_el2
= ones
;
952 cptrMask
.res1_8_el2
= ones
;
954 cptrMask
.res1_9_el2
= ones
;
956 DPRINTF(MiscRegs
, "Writing misc reg %s: %#x\n",
957 miscRegName
[misc_reg
], newVal
);
960 case MISCREG_CPTR_EL3
:
962 const uint32_t ones
= (uint32_t)(-1);
964 cptrMask
.tcpac
= ones
;
971 DPRINTF(MiscRegs
, "Writing misc reg %s: %#x\n",
972 miscRegName
[misc_reg
], newVal
);
976 warn_once("The csselr register isn't implemented.\n");
979 case MISCREG_DC_ZVA_Xt
:
980 warn("Calling DC ZVA! Not Implemeted! Expect WEIRD results\n");
985 const uint32_t ones
= (uint32_t)(-1);
987 fpscrMask
.ioc
= ones
;
988 fpscrMask
.dzc
= ones
;
989 fpscrMask
.ofc
= ones
;
990 fpscrMask
.ufc
= ones
;
991 fpscrMask
.ixc
= ones
;
992 fpscrMask
.idc
= ones
;
993 fpscrMask
.ioe
= ones
;
994 fpscrMask
.dze
= ones
;
995 fpscrMask
.ofe
= ones
;
996 fpscrMask
.ufe
= ones
;
997 fpscrMask
.ixe
= ones
;
998 fpscrMask
.ide
= ones
;
999 fpscrMask
.len
= ones
;
1000 fpscrMask
.fz16
= ones
;
1001 fpscrMask
.stride
= ones
;
1002 fpscrMask
.rMode
= ones
;
1003 fpscrMask
.fz
= ones
;
1004 fpscrMask
.dn
= ones
;
1005 fpscrMask
.ahp
= ones
;
1006 fpscrMask
.qc
= ones
;
1011 newVal
= (newVal
& (uint32_t)fpscrMask
) |
1012 (readMiscRegNoEffect(MISCREG_FPSCR
) &
1013 ~(uint32_t)fpscrMask
);
1014 tc
->getDecoderPtr()->setContext(newVal
);
1019 const uint32_t ones
= (uint32_t)(-1);
1020 FPSCR fpscrMask
= 0;
1021 fpscrMask
.ioc
= ones
;
1022 fpscrMask
.dzc
= ones
;
1023 fpscrMask
.ofc
= ones
;
1024 fpscrMask
.ufc
= ones
;
1025 fpscrMask
.ixc
= ones
;
1026 fpscrMask
.idc
= ones
;
1027 fpscrMask
.qc
= ones
;
1032 newVal
= (newVal
& (uint32_t)fpscrMask
) |
1033 (readMiscRegNoEffect(MISCREG_FPSCR
) &
1034 ~(uint32_t)fpscrMask
);
1035 misc_reg
= MISCREG_FPSCR
;
1040 const uint32_t ones
= (uint32_t)(-1);
1041 FPSCR fpscrMask
= 0;
1042 fpscrMask
.len
= ones
;
1043 fpscrMask
.fz16
= ones
;
1044 fpscrMask
.stride
= ones
;
1045 fpscrMask
.rMode
= ones
;
1046 fpscrMask
.fz
= ones
;
1047 fpscrMask
.dn
= ones
;
1048 fpscrMask
.ahp
= ones
;
1049 newVal
= (newVal
& (uint32_t)fpscrMask
) |
1050 (readMiscRegNoEffect(MISCREG_FPSCR
) &
1051 ~(uint32_t)fpscrMask
);
1052 misc_reg
= MISCREG_FPSCR
;
1055 case MISCREG_CPSR_Q
:
1057 assert(!(newVal
& ~CpsrMaskQ
));
1058 newVal
= readMiscRegNoEffect(MISCREG_CPSR
) | newVal
;
1059 misc_reg
= MISCREG_CPSR
;
1062 case MISCREG_FPSCR_QC
:
1064 newVal
= readMiscRegNoEffect(MISCREG_FPSCR
) |
1065 (newVal
& FpscrQcMask
);
1066 misc_reg
= MISCREG_FPSCR
;
1069 case MISCREG_FPSCR_EXC
:
1071 newVal
= readMiscRegNoEffect(MISCREG_FPSCR
) |
1072 (newVal
& FpscrExcMask
);
1073 misc_reg
= MISCREG_FPSCR
;
1078 // vfpv3 architecture, section B.6.1 of DDI04068
1079 // bit 29 - valid only if fpexc[31] is 0
1080 const uint32_t fpexcMask
= 0x60000000;
1081 newVal
= (newVal
& fpexcMask
) |
1082 (readMiscRegNoEffect(MISCREG_FPEXC
) & ~fpexcMask
);
1086 if (!haveVirtualization
)
1091 const HDCR mdcr
= tc
->readMiscRegNoEffect(MISCREG_MDCR_EL2
);
1092 selfDebug
->setenableTDETGE((HCR
)val
, mdcr
);
1093 if (!haveVirtualization
)
1100 const HCR hcr
= tc
->readMiscReg(MISCREG_HCR_EL2
);
1101 selfDebug
->setenableTDETGE(hcr
, (HDCR
)val
);
1104 case MISCREG_DBGOSLAR
:
1106 OSL r
= tc
->readMiscReg(MISCREG_DBGOSLSR
);
1107 const uint32_t temp
= (val
== 0xC5ACCE55)? 0x1 : 0x0;
1108 selfDebug
->updateOSLock((RegVal
) temp
);
1109 r
.oslk
= bits(temp
,0);
1110 tc
->setMiscReg(MISCREG_DBGOSLSR
, r
);
1113 case MISCREG_DBGBCR0
:
1114 selfDebug
->updateDBGBCR(0, val
);
1116 case MISCREG_DBGBCR1
:
1117 selfDebug
->updateDBGBCR(1, val
);
1119 case MISCREG_DBGBCR2
:
1120 selfDebug
->updateDBGBCR(2, val
);
1122 case MISCREG_DBGBCR3
:
1123 selfDebug
->updateDBGBCR(3, val
);
1125 case MISCREG_DBGBCR4
:
1126 selfDebug
->updateDBGBCR(4, val
);
1128 case MISCREG_DBGBCR5
:
1129 selfDebug
->updateDBGBCR(5, val
);
1131 case MISCREG_DBGBCR6
:
1132 selfDebug
->updateDBGBCR(6, val
);
1134 case MISCREG_DBGBCR7
:
1135 selfDebug
->updateDBGBCR(7, val
);
1137 case MISCREG_DBGBCR8
:
1138 selfDebug
->updateDBGBCR(8, val
);
1140 case MISCREG_DBGBCR9
:
1141 selfDebug
->updateDBGBCR(9, val
);
1143 case MISCREG_DBGBCR10
:
1144 selfDebug
->updateDBGBCR(10, val
);
1146 case MISCREG_DBGBCR11
:
1147 selfDebug
->updateDBGBCR(11, val
);
1149 case MISCREG_DBGBCR12
:
1150 selfDebug
->updateDBGBCR(12, val
);
1152 case MISCREG_DBGBCR13
:
1153 selfDebug
->updateDBGBCR(13, val
);
1155 case MISCREG_DBGBCR14
:
1156 selfDebug
->updateDBGBCR(14, val
);
1158 case MISCREG_DBGBCR15
:
1159 selfDebug
->updateDBGBCR(15, val
);
1161 case MISCREG_DBGWCR0
:
1162 selfDebug
->updateDBGWCR(0, val
);
1164 case MISCREG_DBGWCR1
:
1165 selfDebug
->updateDBGWCR(1, val
);
1167 case MISCREG_DBGWCR2
:
1168 selfDebug
->updateDBGWCR(2, val
);
1170 case MISCREG_DBGWCR3
:
1171 selfDebug
->updateDBGWCR(3, val
);
1173 case MISCREG_DBGWCR4
:
1174 selfDebug
->updateDBGWCR(4, val
);
1176 case MISCREG_DBGWCR5
:
1177 selfDebug
->updateDBGWCR(5, val
);
1179 case MISCREG_DBGWCR6
:
1180 selfDebug
->updateDBGWCR(6, val
);
1182 case MISCREG_DBGWCR7
:
1183 selfDebug
->updateDBGWCR(7, val
);
1185 case MISCREG_DBGWCR8
:
1186 selfDebug
->updateDBGWCR(8, val
);
1188 case MISCREG_DBGWCR9
:
1189 selfDebug
->updateDBGWCR(9, val
);
1191 case MISCREG_DBGWCR10
:
1192 selfDebug
->updateDBGWCR(10, val
);
1194 case MISCREG_DBGWCR11
:
1195 selfDebug
->updateDBGWCR(11, val
);
1197 case MISCREG_DBGWCR12
:
1198 selfDebug
->updateDBGWCR(12, val
);
1200 case MISCREG_DBGWCR13
:
1201 selfDebug
->updateDBGWCR(13, val
);
1203 case MISCREG_DBGWCR14
:
1204 selfDebug
->updateDBGWCR(14, val
);
1206 case MISCREG_DBGWCR15
:
1207 selfDebug
->updateDBGWCR(15, val
);
1210 case MISCREG_MDCR_EL2
:
1212 const HCR hcr
= tc
->readMiscReg(MISCREG_HCR_EL2
);
1213 selfDebug
->setenableTDETGE(hcr
, (HDCR
)val
);
1217 case MISCREG_MDCR_EL3
:
1219 selfDebug
->setbSDD(val
);
1222 case MISCREG_DBGDSCRext
:
1224 selfDebug
->setMDBGen(val
);
1225 DBGDS32 r
= tc
->readMiscReg(MISCREG_DBGDSCRint
);
1228 r
.udccdis
= v
.udccdis
;
1229 r
.mdbgen
= v
.mdbgen
;
1230 tc
->setMiscReg(MISCREG_DBGDSCRint
, r
);
1231 r
= tc
->readMiscReg(MISCREG_DBGDSCRint
);
1235 case MISCREG_MDSCR_EL1
:
1237 selfDebug
->setMDSCRvals(val
);
1241 case MISCREG_OSLAR_EL1
:
1243 selfDebug
->updateOSLock(val
);
1244 OSL r
= tc
->readMiscReg(MISCREG_OSLSR_EL1
);
1245 r
.oslk
= bits(val
, 0);
1247 tc
->setMiscReg(MISCREG_OSLSR_EL1
, r
);
1251 case MISCREG_DBGBCR0_EL1
:
1252 selfDebug
->updateDBGBCR(0, val
);
1254 case MISCREG_DBGBCR1_EL1
:
1255 selfDebug
->updateDBGBCR(1, val
);
1257 case MISCREG_DBGBCR2_EL1
:
1258 selfDebug
->updateDBGBCR(2, val
);
1260 case MISCREG_DBGBCR3_EL1
:
1261 selfDebug
->updateDBGBCR(3, val
);
1263 case MISCREG_DBGBCR4_EL1
:
1264 selfDebug
->updateDBGBCR(4, val
);
1266 case MISCREG_DBGBCR5_EL1
:
1267 selfDebug
->updateDBGBCR(5, val
);
1269 case MISCREG_DBGBCR6_EL1
:
1270 selfDebug
->updateDBGBCR(6, val
);
1272 case MISCREG_DBGBCR7_EL1
:
1273 selfDebug
->updateDBGBCR(7, val
);
1275 case MISCREG_DBGBCR8_EL1
:
1276 selfDebug
->updateDBGBCR(8, val
);
1278 case MISCREG_DBGBCR9_EL1
:
1279 selfDebug
->updateDBGBCR(9, val
);
1281 case MISCREG_DBGBCR10_EL1
:
1282 selfDebug
->updateDBGBCR(10, val
);
1284 case MISCREG_DBGBCR11_EL1
:
1285 selfDebug
->updateDBGBCR(11, val
);
1287 case MISCREG_DBGBCR12_EL1
:
1288 selfDebug
->updateDBGBCR(12, val
);
1290 case MISCREG_DBGBCR13_EL1
:
1291 selfDebug
->updateDBGBCR(13, val
);
1293 case MISCREG_DBGBCR14_EL1
:
1294 selfDebug
->updateDBGBCR(14, val
);
1296 case MISCREG_DBGBCR15_EL1
:
1297 selfDebug
->updateDBGBCR(15, val
);
1299 case MISCREG_DBGWCR0_EL1
:
1300 selfDebug
->updateDBGWCR(0, val
);
1302 case MISCREG_DBGWCR1_EL1
:
1303 selfDebug
->updateDBGWCR(1, val
);
1305 case MISCREG_DBGWCR2_EL1
:
1306 selfDebug
->updateDBGWCR(2, val
);
1308 case MISCREG_DBGWCR3_EL1
:
1309 selfDebug
->updateDBGWCR(3, val
);
1311 case MISCREG_DBGWCR4_EL1
:
1312 selfDebug
->updateDBGWCR(4, val
);
1314 case MISCREG_DBGWCR5_EL1
:
1315 selfDebug
->updateDBGWCR(5, val
);
1317 case MISCREG_DBGWCR6_EL1
:
1318 selfDebug
->updateDBGWCR(6, val
);
1320 case MISCREG_DBGWCR7_EL1
:
1321 selfDebug
->updateDBGWCR(7, val
);
1323 case MISCREG_DBGWCR8_EL1
:
1324 selfDebug
->updateDBGWCR(8, val
);
1326 case MISCREG_DBGWCR9_EL1
:
1327 selfDebug
->updateDBGWCR(9, val
);
1329 case MISCREG_DBGWCR10_EL1
:
1330 selfDebug
->updateDBGWCR(10, val
);
1332 case MISCREG_DBGWCR11_EL1
:
1333 selfDebug
->updateDBGWCR(11, val
);
1335 case MISCREG_DBGWCR12_EL1
:
1336 selfDebug
->updateDBGWCR(12, val
);
1338 case MISCREG_DBGWCR13_EL1
:
1339 selfDebug
->updateDBGWCR(13, val
);
1341 case MISCREG_DBGWCR14_EL1
:
1342 selfDebug
->updateDBGWCR(14, val
);
1344 case MISCREG_DBGWCR15_EL1
:
1345 selfDebug
->updateDBGWCR(15, val
);
1349 // ARM ARM (ARM DDI 0406C.b) B4.1.96
1350 const uint32_t ifsrMask
=
1351 mask(31, 13) | mask(11, 11) | mask(8, 6);
1352 newVal
= newVal
& ~ifsrMask
;
1357 // ARM ARM (ARM DDI 0406C.b) B4.1.52
1358 const uint32_t dfsrMask
= mask(31, 14) | mask(8, 8);
1359 newVal
= newVal
& ~dfsrMask
;
1362 case MISCREG_AMAIR0
:
1363 case MISCREG_AMAIR1
:
1365 // ARM ARM (ARM DDI 0406C.b) B4.1.5
1366 // Valid only with LPAE
1369 DPRINTF(MiscRegs
, "Writing AMAIR: %#x\n", newVal
);
1373 getMMUPtr(tc
)->invalidateMiscReg();
1377 DPRINTF(MiscRegs
, "Writing SCTLR: %#x\n", newVal
);
1378 scr
= readMiscRegNoEffect(MISCREG_SCR
);
1380 MiscRegIndex sctlr_idx
;
1381 if (haveSecurity
&& !highestELIs64
&& !scr
.ns
) {
1382 sctlr_idx
= MISCREG_SCTLR_S
;
1384 sctlr_idx
= MISCREG_SCTLR_NS
;
1387 SCTLR sctlr
= miscRegs
[sctlr_idx
];
1388 SCTLR new_sctlr
= newVal
;
1389 new_sctlr
.nmfi
= ((bool)sctlr
.nmfi
) && !haveVirtualization
;
1390 miscRegs
[sctlr_idx
] = (RegVal
)new_sctlr
;
1391 getMMUPtr(tc
)->invalidateMiscReg();
1394 case MISCREG_ID_PFR0
:
1395 case MISCREG_ID_PFR1
:
1396 case MISCREG_ID_DFR0
:
1397 case MISCREG_ID_MMFR0
:
1398 case MISCREG_ID_MMFR1
:
1399 case MISCREG_ID_MMFR2
:
1400 case MISCREG_ID_MMFR3
:
1401 case MISCREG_ID_MMFR4
:
1402 case MISCREG_ID_ISAR0
:
1403 case MISCREG_ID_ISAR1
:
1404 case MISCREG_ID_ISAR2
:
1405 case MISCREG_ID_ISAR3
:
1406 case MISCREG_ID_ISAR4
:
1407 case MISCREG_ID_ISAR5
:
1415 case MISCREG_ID_AA64AFR0_EL1
:
1416 case MISCREG_ID_AA64AFR1_EL1
:
1417 case MISCREG_ID_AA64DFR0_EL1
:
1418 case MISCREG_ID_AA64DFR1_EL1
:
1419 case MISCREG_ID_AA64ISAR0_EL1
:
1420 case MISCREG_ID_AA64ISAR1_EL1
:
1421 case MISCREG_ID_AA64MMFR0_EL1
:
1422 case MISCREG_ID_AA64MMFR1_EL1
:
1423 case MISCREG_ID_AA64MMFR2_EL1
:
1424 case MISCREG_ID_AA64PFR0_EL1
:
1425 case MISCREG_ID_AA64PFR1_EL1
:
1426 // ID registers are constants.
1429 // TLB Invalidate All
1430 case MISCREG_TLBIALL
: // TLBI all entries, EL0&1,
1433 scr
= readMiscReg(MISCREG_SCR
);
1435 TLBIALL
tlbiOp(EL1
, haveSecurity
&& !scr
.ns
);
1439 // TLB Invalidate All, Inner Shareable
1440 case MISCREG_TLBIALLIS
:
1443 scr
= readMiscReg(MISCREG_SCR
);
1445 TLBIALL
tlbiOp(EL1
, haveSecurity
&& !scr
.ns
);
1446 tlbiOp
.broadcast(tc
);
1449 // Instruction TLB Invalidate All
1450 case MISCREG_ITLBIALL
:
1453 scr
= readMiscReg(MISCREG_SCR
);
1455 ITLBIALL
tlbiOp(EL1
, haveSecurity
&& !scr
.ns
);
1459 // Data TLB Invalidate All
1460 case MISCREG_DTLBIALL
:
1463 scr
= readMiscReg(MISCREG_SCR
);
1465 DTLBIALL
tlbiOp(EL1
, haveSecurity
&& !scr
.ns
);
1469 // TLB Invalidate by VA
1470 // mcr tlbimval(is) is invalidating all matching entries
1471 // regardless of the level of lookup, since in gem5 we cache
1472 // in the tlb the last level of lookup only.
1473 case MISCREG_TLBIMVA
:
1474 case MISCREG_TLBIMVAL
:
1477 scr
= readMiscReg(MISCREG_SCR
);
1480 haveSecurity
&& !scr
.ns
,
1481 mbits(newVal
, 31, 12),
1487 // TLB Invalidate by VA, Inner Shareable
1488 case MISCREG_TLBIMVAIS
:
1489 case MISCREG_TLBIMVALIS
:
1492 scr
= readMiscReg(MISCREG_SCR
);
1495 haveSecurity
&& !scr
.ns
,
1496 mbits(newVal
, 31, 12),
1499 tlbiOp
.broadcast(tc
);
1502 // TLB Invalidate by ASID match
1503 case MISCREG_TLBIASID
:
1506 scr
= readMiscReg(MISCREG_SCR
);
1508 TLBIASID
tlbiOp(EL1
,
1509 haveSecurity
&& !scr
.ns
,
1515 // TLB Invalidate by ASID match, Inner Shareable
1516 case MISCREG_TLBIASIDIS
:
1519 scr
= readMiscReg(MISCREG_SCR
);
1521 TLBIASID
tlbiOp(EL1
,
1522 haveSecurity
&& !scr
.ns
,
1525 tlbiOp
.broadcast(tc
);
1528 // mcr tlbimvaal(is) is invalidating all matching entries
1529 // regardless of the level of lookup, since in gem5 we cache
1530 // in the tlb the last level of lookup only.
1531 // TLB Invalidate by VA, All ASID
1532 case MISCREG_TLBIMVAA
:
1533 case MISCREG_TLBIMVAAL
:
1536 scr
= readMiscReg(MISCREG_SCR
);
1538 TLBIMVAA
tlbiOp(EL1
, haveSecurity
&& !scr
.ns
,
1539 mbits(newVal
, 31,12));
1544 // TLB Invalidate by VA, All ASID, Inner Shareable
1545 case MISCREG_TLBIMVAAIS
:
1546 case MISCREG_TLBIMVAALIS
:
1549 scr
= readMiscReg(MISCREG_SCR
);
1551 TLBIMVAA
tlbiOp(EL1
, haveSecurity
&& !scr
.ns
,
1552 mbits(newVal
, 31,12));
1554 tlbiOp
.broadcast(tc
);
1557 // mcr tlbimvalh(is) is invalidating all matching entries
1558 // regardless of the level of lookup, since in gem5 we cache
1559 // in the tlb the last level of lookup only.
1560 // TLB Invalidate by VA, Hyp mode
1561 case MISCREG_TLBIMVAH
:
1562 case MISCREG_TLBIMVALH
:
1565 scr
= readMiscReg(MISCREG_SCR
);
1567 TLBIMVAA
tlbiOp(EL2
, haveSecurity
&& !scr
.ns
,
1568 mbits(newVal
, 31,12));
1573 // TLB Invalidate by VA, Hyp mode, Inner Shareable
1574 case MISCREG_TLBIMVAHIS
:
1575 case MISCREG_TLBIMVALHIS
:
1578 scr
= readMiscReg(MISCREG_SCR
);
1580 TLBIMVAA
tlbiOp(EL2
, haveSecurity
&& !scr
.ns
,
1581 mbits(newVal
, 31,12));
1583 tlbiOp
.broadcast(tc
);
1586 // mcr tlbiipas2l(is) is invalidating all matching entries
1587 // regardless of the level of lookup, since in gem5 we cache
1588 // in the tlb the last level of lookup only.
1589 // TLB Invalidate by Intermediate Physical Address, Stage 2
1590 case MISCREG_TLBIIPAS2
:
1591 case MISCREG_TLBIIPAS2L
:
1594 scr
= readMiscReg(MISCREG_SCR
);
1597 haveSecurity
&& !scr
.ns
,
1598 static_cast<Addr
>(bits(newVal
, 35, 0)) << 12);
1603 // TLB Invalidate by Intermediate Physical Address, Stage 2,
1605 case MISCREG_TLBIIPAS2IS
:
1606 case MISCREG_TLBIIPAS2LIS
:
1609 scr
= readMiscReg(MISCREG_SCR
);
1612 haveSecurity
&& !scr
.ns
,
1613 static_cast<Addr
>(bits(newVal
, 35, 0)) << 12);
1615 tlbiOp
.broadcast(tc
);
1618 // Instruction TLB Invalidate by VA
1619 case MISCREG_ITLBIMVA
:
1622 scr
= readMiscReg(MISCREG_SCR
);
1624 ITLBIMVA
tlbiOp(EL1
,
1625 haveSecurity
&& !scr
.ns
,
1626 mbits(newVal
, 31, 12),
1632 // Data TLB Invalidate by VA
1633 case MISCREG_DTLBIMVA
:
1636 scr
= readMiscReg(MISCREG_SCR
);
1638 DTLBIMVA
tlbiOp(EL1
,
1639 haveSecurity
&& !scr
.ns
,
1640 mbits(newVal
, 31, 12),
1646 // Instruction TLB Invalidate by ASID match
1647 case MISCREG_ITLBIASID
:
1650 scr
= readMiscReg(MISCREG_SCR
);
1652 ITLBIASID
tlbiOp(EL1
,
1653 haveSecurity
&& !scr
.ns
,
1659 // Data TLB Invalidate by ASID match
1660 case MISCREG_DTLBIASID
:
1663 scr
= readMiscReg(MISCREG_SCR
);
1665 DTLBIASID
tlbiOp(EL1
,
1666 haveSecurity
&& !scr
.ns
,
1672 // TLB Invalidate All, Non-Secure Non-Hyp
1673 case MISCREG_TLBIALLNSNH
:
1677 TLBIALLN
tlbiOp(EL1
);
1681 // TLB Invalidate All, Non-Secure Non-Hyp, Inner Shareable
1682 case MISCREG_TLBIALLNSNHIS
:
1686 TLBIALLN
tlbiOp(EL1
);
1687 tlbiOp
.broadcast(tc
);
1690 // TLB Invalidate All, Hyp mode
1691 case MISCREG_TLBIALLH
:
1695 TLBIALLN
tlbiOp(EL2
);
1699 // TLB Invalidate All, Hyp mode, Inner Shareable
1700 case MISCREG_TLBIALLHIS
:
1704 TLBIALLN
tlbiOp(EL2
);
1705 tlbiOp
.broadcast(tc
);
1708 // AArch64 TLB Invalidate All, EL3
1709 case MISCREG_TLBI_ALLE3
:
1713 TLBIALLEL
tlbiOp(EL3
, true);
1717 // AArch64 TLB Invalidate All, EL3, Inner Shareable
1718 case MISCREG_TLBI_ALLE3IS
:
1722 TLBIALLEL
tlbiOp(EL3
, true);
1723 tlbiOp
.broadcast(tc
);
1726 // AArch64 TLB Invalidate All, EL2
1727 case MISCREG_TLBI_ALLE2
:
1730 scr
= readMiscReg(MISCREG_SCR
);
1732 TLBIALLEL
tlbiOp(EL2
, haveSecurity
&& !scr
.ns
);
1736 // AArch64 TLB Invalidate All, EL2, Inner Shareable
1737 case MISCREG_TLBI_ALLE2IS
:
1740 scr
= readMiscReg(MISCREG_SCR
);
1742 TLBIALLEL
tlbiOp(EL2
, haveSecurity
&& !scr
.ns
);
1743 tlbiOp
.broadcast(tc
);
1746 // AArch64 TLB Invalidate All, EL1
1747 case MISCREG_TLBI_ALLE1
:
1750 scr
= readMiscReg(MISCREG_SCR
);
1752 TLBIALLEL
tlbiOp(EL1
, haveSecurity
&& !scr
.ns
);
1756 // AArch64 TLB Invalidate All, EL1, Inner Shareable
1757 case MISCREG_TLBI_ALLE1IS
:
1760 scr
= readMiscReg(MISCREG_SCR
);
1762 TLBIALLEL
tlbiOp(EL1
, haveSecurity
&& !scr
.ns
);
1763 tlbiOp
.broadcast(tc
);
1766 case MISCREG_TLBI_VMALLS12E1
:
1769 scr
= readMiscReg(MISCREG_SCR
);
1771 TLBIVMALL
tlbiOp(EL1
, haveSecurity
&& !scr
.ns
, true);
1775 case MISCREG_TLBI_VMALLE1
:
1778 scr
= readMiscReg(MISCREG_SCR
);
1780 HCR hcr
= readMiscReg(MISCREG_HCR_EL2
);
1781 bool is_host
= (hcr
.tge
&& hcr
.e2h
);
1782 ExceptionLevel target_el
= is_host
? EL2
: EL1
;
1783 TLBIVMALL
tlbiOp(target_el
, haveSecurity
&& !scr
.ns
, false);
1787 case MISCREG_TLBI_VMALLS12E1IS
:
1790 scr
= readMiscReg(MISCREG_SCR
);
1792 TLBIVMALL
tlbiOp(EL1
, haveSecurity
&& !scr
.ns
, true);
1793 tlbiOp
.broadcast(tc
);
1796 case MISCREG_TLBI_VMALLE1IS
:
1799 scr
= readMiscReg(MISCREG_SCR
);
1801 HCR hcr
= readMiscReg(MISCREG_HCR_EL2
);
1802 bool is_host
= (hcr
.tge
&& hcr
.e2h
);
1803 ExceptionLevel target_el
= is_host
? EL2
: EL1
;
1804 TLBIVMALL
tlbiOp(target_el
, haveSecurity
&& !scr
.ns
, false);
1805 tlbiOp
.broadcast(tc
);
1808 // VAEx(IS) and VALEx(IS) are the same because TLBs
1809 // only store entries
1810 // from the last level of translation table walks
1811 // AArch64 TLB Invalidate by VA, EL3
1812 case MISCREG_TLBI_VAE3_Xt
:
1813 case MISCREG_TLBI_VALE3_Xt
:
1817 TLBIMVA
tlbiOp(EL3
, true,
1818 static_cast<Addr
>(bits(newVal
, 43, 0)) << 12,
1823 // AArch64 TLB Invalidate by VA, EL3, Inner Shareable
1824 case MISCREG_TLBI_VAE3IS_Xt
:
1825 case MISCREG_TLBI_VALE3IS_Xt
:
1829 TLBIMVA
tlbiOp(EL3
, true,
1830 static_cast<Addr
>(bits(newVal
, 43, 0)) << 12,
1833 tlbiOp
.broadcast(tc
);
1836 // AArch64 TLB Invalidate by VA, EL2
1837 case MISCREG_TLBI_VAE2_Xt
:
1838 case MISCREG_TLBI_VALE2_Xt
:
1841 scr
= readMiscReg(MISCREG_SCR
);
1843 TLBIMVA
tlbiOp(EL2
, haveSecurity
&& !scr
.ns
,
1844 static_cast<Addr
>(bits(newVal
, 43, 0)) << 12,
1849 // AArch64 TLB Invalidate by VA, EL2, Inner Shareable
1850 case MISCREG_TLBI_VAE2IS_Xt
:
1851 case MISCREG_TLBI_VALE2IS_Xt
:
1854 scr
= readMiscReg(MISCREG_SCR
);
1856 TLBIMVA
tlbiOp(EL2
, haveSecurity
&& !scr
.ns
,
1857 static_cast<Addr
>(bits(newVal
, 43, 0)) << 12,
1860 tlbiOp
.broadcast(tc
);
1863 // AArch64 TLB Invalidate by VA, EL1
1864 case MISCREG_TLBI_VAE1_Xt
:
1865 case MISCREG_TLBI_VALE1_Xt
:
1868 scr
= readMiscReg(MISCREG_SCR
);
1869 auto asid
= haveLargeAsid64
? bits(newVal
, 63, 48) :
1870 bits(newVal
, 55, 48);
1872 HCR hcr
= readMiscReg(MISCREG_HCR_EL2
);
1873 bool is_host
= (hcr
.tge
&& hcr
.e2h
);
1874 ExceptionLevel target_el
= is_host
? EL2
: EL1
;
1875 TLBIMVA
tlbiOp(target_el
, haveSecurity
&& !scr
.ns
,
1876 static_cast<Addr
>(bits(newVal
, 43, 0)) << 12,
1882 // AArch64 TLB Invalidate by VA, EL1, Inner Shareable
1883 case MISCREG_TLBI_VAE1IS_Xt
:
1884 case MISCREG_TLBI_VALE1IS_Xt
:
1887 scr
= readMiscReg(MISCREG_SCR
);
1888 auto asid
= haveLargeAsid64
? bits(newVal
, 63, 48) :
1889 bits(newVal
, 55, 48);
1891 HCR hcr
= readMiscReg(MISCREG_HCR_EL2
);
1892 bool is_host
= (hcr
.tge
&& hcr
.e2h
);
1893 ExceptionLevel target_el
= is_host
? EL2
: EL1
;
1894 TLBIMVA
tlbiOp(target_el
, haveSecurity
&& !scr
.ns
,
1895 static_cast<Addr
>(bits(newVal
, 43, 0)) << 12,
1898 tlbiOp
.broadcast(tc
);
1901 // AArch64 TLB Invalidate by ASID, EL1
1902 case MISCREG_TLBI_ASIDE1_Xt
:
1905 scr
= readMiscReg(MISCREG_SCR
);
1906 auto asid
= haveLargeAsid64
? bits(newVal
, 63, 48) :
1907 bits(newVal
, 55, 48);
1909 HCR hcr
= readMiscReg(MISCREG_HCR_EL2
);
1910 bool is_host
= (hcr
.tge
&& hcr
.e2h
);
1911 ExceptionLevel target_el
= is_host
? EL2
: EL1
;
1912 TLBIASID
tlbiOp(target_el
, haveSecurity
&& !scr
.ns
, asid
);
1916 // AArch64 TLB Invalidate by ASID, EL1, Inner Shareable
1917 case MISCREG_TLBI_ASIDE1IS_Xt
:
1920 scr
= readMiscReg(MISCREG_SCR
);
1921 auto asid
= haveLargeAsid64
? bits(newVal
, 63, 48) :
1922 bits(newVal
, 55, 48);
1924 HCR hcr
= readMiscReg(MISCREG_HCR_EL2
);
1925 bool is_host
= (hcr
.tge
&& hcr
.e2h
);
1926 ExceptionLevel target_el
= is_host
? EL2
: EL1
;
1927 TLBIASID
tlbiOp(target_el
, haveSecurity
&& !scr
.ns
, asid
);
1928 tlbiOp
.broadcast(tc
);
1931 // VAAE1(IS) and VAALE1(IS) are the same because TLBs only store
1932 // entries from the last level of translation table walks
1933 // AArch64 TLB Invalidate by VA, All ASID, EL1
1934 case MISCREG_TLBI_VAAE1_Xt
:
1935 case MISCREG_TLBI_VAALE1_Xt
:
1938 scr
= readMiscReg(MISCREG_SCR
);
1940 HCR hcr
= readMiscReg(MISCREG_HCR_EL2
);
1941 bool is_host
= (hcr
.tge
&& hcr
.e2h
);
1942 ExceptionLevel target_el
= is_host
? EL2
: EL1
;
1943 TLBIMVAA
tlbiOp(target_el
, haveSecurity
&& !scr
.ns
,
1944 static_cast<Addr
>(bits(newVal
, 43, 0)) << 12);
1949 // AArch64 TLB Invalidate by VA, All ASID, EL1, Inner Shareable
1950 case MISCREG_TLBI_VAAE1IS_Xt
:
1951 case MISCREG_TLBI_VAALE1IS_Xt
:
1954 scr
= readMiscReg(MISCREG_SCR
);
1956 HCR hcr
= readMiscReg(MISCREG_HCR_EL2
);
1957 bool is_host
= (hcr
.tge
&& hcr
.e2h
);
1958 ExceptionLevel target_el
= is_host
? EL2
: EL1
;
1959 TLBIMVAA
tlbiOp(target_el
, haveSecurity
&& !scr
.ns
,
1960 static_cast<Addr
>(bits(newVal
, 43, 0)) << 12);
1962 tlbiOp
.broadcast(tc
);
1965 // AArch64 TLB Invalidate by Intermediate Physical Address,
1967 case MISCREG_TLBI_IPAS2E1_Xt
:
1968 case MISCREG_TLBI_IPAS2LE1_Xt
:
1971 scr
= readMiscReg(MISCREG_SCR
);
1973 TLBIIPA
tlbiOp(EL1
, haveSecurity
&& !scr
.ns
,
1974 static_cast<Addr
>(bits(newVal
, 35, 0)) << 12);
1979 // AArch64 TLB Invalidate by Intermediate Physical Address,
1980 // Stage 2, EL1, Inner Shareable
1981 case MISCREG_TLBI_IPAS2E1IS_Xt
:
1982 case MISCREG_TLBI_IPAS2LE1IS_Xt
:
1985 scr
= readMiscReg(MISCREG_SCR
);
1987 TLBIIPA
tlbiOp(EL1
, haveSecurity
&& !scr
.ns
,
1988 static_cast<Addr
>(bits(newVal
, 35, 0)) << 12);
1990 tlbiOp
.broadcast(tc
);
1994 warn("Not doing anything for write of miscreg ACTLR\n");
1997 case MISCREG_PMXEVTYPER_PMCCFILTR
:
1998 case MISCREG_PMINTENSET_EL1
... MISCREG_PMOVSSET_EL0
:
1999 case MISCREG_PMEVCNTR0_EL0
... MISCREG_PMEVTYPER5_EL0
:
2000 case MISCREG_PMCR
... MISCREG_PMOVSSET
:
2001 pmu
->setMiscReg(misc_reg
, newVal
);
2005 case MISCREG_HSTR
: // TJDBX, now redifined to be RES0
2009 newVal
&= ~((uint32_t) hstrMask
);
2014 // If a CP bit in NSACR is 0 then the corresponding bit in
2015 // HCPTR is RAO/WI. Same applies to NSASEDIS
2016 secure_lookup
= haveSecurity
&& isSecure(tc
);
2017 if (!secure_lookup
) {
2018 RegVal oldValue
= readMiscRegNoEffect(MISCREG_HCPTR
);
2020 (readMiscRegNoEffect(MISCREG_NSACR
) ^ 0x7FFF) & 0xBFFF;
2021 newVal
= (newVal
& ~mask
) | (oldValue
& mask
);
2025 case MISCREG_HDFAR
: // alias for secure DFAR
2026 misc_reg
= MISCREG_DFAR_S
;
2028 case MISCREG_HIFAR
: // alias for secure IFAR
2029 misc_reg
= MISCREG_IFAR_S
;
2031 case MISCREG_ATS1CPR
:
2032 addressTranslation(TLB::S1CTran
, BaseTLB::Read
, 0, val
);
2034 case MISCREG_ATS1CPW
:
2035 addressTranslation(TLB::S1CTran
, BaseTLB::Write
, 0, val
);
2037 case MISCREG_ATS1CUR
:
2038 addressTranslation(TLB::S1CTran
, BaseTLB::Read
,
2039 TLB::UserMode
, val
);
2041 case MISCREG_ATS1CUW
:
2042 addressTranslation(TLB::S1CTran
, BaseTLB::Write
,
2043 TLB::UserMode
, val
);
2045 case MISCREG_ATS12NSOPR
:
2047 panic("Security Extensions required for ATS12NSOPR");
2048 addressTranslation(TLB::S1S2NsTran
, BaseTLB::Read
, 0, val
);
2050 case MISCREG_ATS12NSOPW
:
2052 panic("Security Extensions required for ATS12NSOPW");
2053 addressTranslation(TLB::S1S2NsTran
, BaseTLB::Write
, 0, val
);
2055 case MISCREG_ATS12NSOUR
:
2057 panic("Security Extensions required for ATS12NSOUR");
2058 addressTranslation(TLB::S1S2NsTran
, BaseTLB::Read
,
2059 TLB::UserMode
, val
);
2061 case MISCREG_ATS12NSOUW
:
2063 panic("Security Extensions required for ATS12NSOUW");
2064 addressTranslation(TLB::S1S2NsTran
, BaseTLB::Write
,
2065 TLB::UserMode
, val
);
2067 case MISCREG_ATS1HR
:
2068 addressTranslation(TLB::HypMode
, BaseTLB::Read
, 0, val
);
2070 case MISCREG_ATS1HW
:
2071 addressTranslation(TLB::HypMode
, BaseTLB::Write
, 0, val
);
2075 TTBCR ttbcr
= readMiscRegNoEffect(MISCREG_TTBCR
);
2076 const uint32_t ones
= (uint32_t)(-1);
2077 TTBCR ttbcrMask
= 0;
2078 TTBCR ttbcrNew
= newVal
;
2080 // ARM DDI 0406C.b, ARMv7-32
2081 ttbcrMask
.n
= ones
; // T0SZ
2083 ttbcrMask
.pd0
= ones
;
2084 ttbcrMask
.pd1
= ones
;
2086 ttbcrMask
.epd0
= ones
;
2087 ttbcrMask
.irgn0
= ones
;
2088 ttbcrMask
.orgn0
= ones
;
2089 ttbcrMask
.sh0
= ones
;
2090 ttbcrMask
.ps
= ones
; // T1SZ
2091 ttbcrMask
.a1
= ones
;
2092 ttbcrMask
.epd1
= ones
;
2093 ttbcrMask
.irgn1
= ones
;
2094 ttbcrMask
.orgn1
= ones
;
2095 ttbcrMask
.sh1
= ones
;
2097 ttbcrMask
.eae
= ones
;
2099 if (haveLPAE
&& ttbcrNew
.eae
) {
2100 newVal
= newVal
& ttbcrMask
;
2102 newVal
= (newVal
& ttbcrMask
) | (ttbcr
& (~ttbcrMask
));
2104 // Invalidate TLB MiscReg
2105 getMMUPtr(tc
)->invalidateMiscReg();
2111 TTBCR ttbcr
= readMiscRegNoEffect(MISCREG_TTBCR
);
2114 // ARMv7 bit 63-56, 47-40 reserved, UNK/SBZP
2115 // ARMv8 AArch32 bit 63-56 only
2116 uint64_t ttbrMask
= mask(63,56) | mask(47,40);
2117 newVal
= (newVal
& (~ttbrMask
));
2120 // Invalidate TLB MiscReg
2121 getMMUPtr(tc
)->invalidateMiscReg();
2124 case MISCREG_SCTLR_EL1
:
2125 case MISCREG_CONTEXTIDR
:
2132 case MISCREG_SCR_EL3
:
2133 case MISCREG_TCR_EL1
:
2134 case MISCREG_TCR_EL2
:
2135 case MISCREG_TCR_EL3
:
2136 case MISCREG_SCTLR_EL2
:
2137 case MISCREG_SCTLR_EL3
:
2138 case MISCREG_HSCTLR
:
2139 case MISCREG_TTBR0_EL1
:
2140 case MISCREG_TTBR1_EL1
:
2141 case MISCREG_TTBR0_EL2
:
2142 case MISCREG_TTBR1_EL2
:
2143 case MISCREG_TTBR0_EL3
:
2144 getMMUPtr(tc
)->invalidateMiscReg();
2146 case MISCREG_HCR_EL2
:
2148 const HDCR mdcr
= tc
->readMiscRegNoEffect(MISCREG_MDCR_EL2
);
2149 selfDebug
->setenableTDETGE((HCR
)val
, mdcr
);
2150 getMMUPtr(tc
)->invalidateMiscReg();
2157 tc
->setCCReg(CCREG_NZ
, cpsr
.nz
);
2158 tc
->setCCReg(CCREG_C
, cpsr
.c
);
2159 tc
->setCCReg(CCREG_V
, cpsr
.v
);
2164 CPSR cpsr
= miscRegs
[MISCREG_CPSR
];
2165 cpsr
.daif
= (uint8_t) ((CPSR
) newVal
).daif
;
2167 misc_reg
= MISCREG_CPSR
;
2170 case MISCREG_SP_EL0
:
2171 tc
->setIntReg(INTREG_SP0
, newVal
);
2173 case MISCREG_SP_EL1
:
2174 tc
->setIntReg(INTREG_SP1
, newVal
);
2176 case MISCREG_SP_EL2
:
2177 tc
->setIntReg(INTREG_SP2
, newVal
);
2181 CPSR cpsr
= miscRegs
[MISCREG_CPSR
];
2182 cpsr
.sp
= (uint8_t) ((CPSR
) newVal
).sp
;
2184 misc_reg
= MISCREG_CPSR
;
2187 case MISCREG_CURRENTEL
:
2189 CPSR cpsr
= miscRegs
[MISCREG_CPSR
];
2190 cpsr
.el
= (uint8_t) ((CPSR
) newVal
).el
;
2192 misc_reg
= MISCREG_CPSR
;
2197 // PAN is affecting data accesses
2198 getMMUPtr(tc
)->invalidateMiscReg(MMU::D_TLBS
);
2200 CPSR cpsr
= miscRegs
[MISCREG_CPSR
];
2201 cpsr
.pan
= (uint8_t) ((CPSR
) newVal
).pan
;
2203 misc_reg
= MISCREG_CPSR
;
2206 case MISCREG_AT_S1E1R_Xt
:
2207 addressTranslation64(TLB::S1E1Tran
, BaseTLB::Read
, 0, val
);
2209 case MISCREG_AT_S1E1W_Xt
:
2210 addressTranslation64(TLB::S1E1Tran
, BaseTLB::Write
, 0, val
);
2212 case MISCREG_AT_S1E0R_Xt
:
2213 addressTranslation64(TLB::S1E0Tran
, BaseTLB::Read
,
2214 TLB::UserMode
, val
);
2216 case MISCREG_AT_S1E0W_Xt
:
2217 addressTranslation64(TLB::S1E0Tran
, BaseTLB::Write
,
2218 TLB::UserMode
, val
);
2220 case MISCREG_AT_S1E2R_Xt
:
2221 addressTranslation64(TLB::S1E2Tran
, BaseTLB::Read
, 0, val
);
2223 case MISCREG_AT_S1E2W_Xt
:
2224 addressTranslation64(TLB::S1E2Tran
, BaseTLB::Write
, 0, val
);
2226 case MISCREG_AT_S12E1R_Xt
:
2227 addressTranslation64(TLB::S12E1Tran
, BaseTLB::Read
, 0, val
);
2229 case MISCREG_AT_S12E1W_Xt
:
2230 addressTranslation64(TLB::S12E1Tran
, BaseTLB::Write
, 0, val
);
2232 case MISCREG_AT_S12E0R_Xt
:
2233 addressTranslation64(TLB::S12E0Tran
, BaseTLB::Read
,
2234 TLB::UserMode
, val
);
2236 case MISCREG_AT_S12E0W_Xt
:
2237 addressTranslation64(TLB::S12E0Tran
, BaseTLB::Write
,
2238 TLB::UserMode
, val
);
2240 case MISCREG_AT_S1E3R_Xt
:
2241 addressTranslation64(TLB::S1E3Tran
, BaseTLB::Read
, 0, val
);
2243 case MISCREG_AT_S1E3W_Xt
:
2244 addressTranslation64(TLB::S1E3Tran
, BaseTLB::Write
, 0, val
);
2246 case MISCREG_SPSR_EL3
:
2247 case MISCREG_SPSR_EL2
:
2248 case MISCREG_SPSR_EL1
:
2250 RegVal spsr_mask
= havePAN
?
2251 ~(0x2 << 22) : ~(0x3 << 22);
2253 newVal
= val
& spsr_mask
;
2256 case MISCREG_L2CTLR
:
2257 warn("miscreg L2CTLR (%s) written with %#x. ignored...\n",
2258 miscRegName
[misc_reg
], uint32_t(val
));
2261 // Generic Timer registers
2262 case MISCREG_CNTFRQ
... MISCREG_CNTVOFF
:
2263 case MISCREG_CNTFRQ_EL0
... MISCREG_CNTVOFF_EL2
:
2264 getGenericTimer().setMiscReg(misc_reg
, newVal
);
2266 case MISCREG_ICC_AP0R0
... MISCREG_ICH_LRC15
:
2267 case MISCREG_ICC_PMR_EL1
... MISCREG_ICC_IGRPEN1_EL3
:
2268 case MISCREG_ICH_AP0R0_EL2
... MISCREG_ICH_LR15_EL2
:
2269 getGICv3CPUInterface().setMiscReg(misc_reg
, newVal
);
2271 case MISCREG_ZCR_EL3
:
2272 case MISCREG_ZCR_EL2
:
2273 case MISCREG_ZCR_EL1
:
2274 tc
->getDecoderPtr()->setSveLen((getCurSveVecLenInBits() >> 7) - 1);
2278 setMiscRegNoEffect(misc_reg
, newVal
);
2282 ISA::getGenericTimer()
2284 // We only need to create an ISA interface the first time we try
2285 // to access the timer.
2287 return *timer
.get();
2290 GenericTimer
*generic_timer(system
->getGenericTimer());
2291 if (!generic_timer
) {
2292 panic("Trying to get a generic timer from a system that hasn't "
2293 "been configured to use a generic timer.\n");
2296 timer
.reset(new GenericTimerISA(*generic_timer
, tc
->contextId()));
2297 timer
->setThreadContext(tc
);
2299 return *timer
.get();
2303 ISA::getGICv3CPUInterface()
2305 panic_if(!gicv3CpuInterface
, "GICV3 cpu interface is not registered!");
2306 return *gicv3CpuInterface
.get();
2310 ISA::getCurSveVecLenInBits() const
2317 "A ThreadContext is needed to determine the SVE vector length "
2318 "in full-system mode");
2320 CPSR cpsr
= miscRegs
[MISCREG_CPSR
];
2321 ExceptionLevel el
= (ExceptionLevel
) (uint8_t) cpsr
.el
;
2325 if (el
== EL1
|| (el
== EL0
&& !ELIsInHost(tc
, el
))) {
2326 len
= static_cast<ZCR
>(miscRegs
[MISCREG_ZCR_EL1
]).len
;
2329 if (el
== EL2
|| (el
== EL0
&& ELIsInHost(tc
, el
))) {
2330 len
= static_cast<ZCR
>(miscRegs
[MISCREG_ZCR_EL2
]).len
;
2331 } else if (haveVirtualization
&& !isSecure(tc
) &&
2332 (el
== EL0
|| el
== EL1
)) {
2335 static_cast<unsigned>(
2336 static_cast<ZCR
>(miscRegs
[MISCREG_ZCR_EL2
]).len
));
2340 len
= static_cast<ZCR
>(miscRegs
[MISCREG_ZCR_EL3
]).len
;
2341 } else if (haveSecurity
) {
2344 static_cast<unsigned>(
2345 static_cast<ZCR
>(miscRegs
[MISCREG_ZCR_EL3
]).len
));
2348 len
= std::min(len
, sveVL
- 1);
2350 return (len
+ 1) * 128;
2354 ISA::zeroSveVecRegUpperPart(VecRegContainer
&vc
, unsigned eCount
)
2356 auto vv
= vc
.as
<uint64_t>();
2357 for (int i
= 2; i
< eCount
; ++i
) {
2363 ISA::serialize(CheckpointOut
&cp
) const
2365 DPRINTF(Checkpoint
, "Serializing Arm Misc Registers\n");
2366 SERIALIZE_MAPPING(miscRegs
, miscRegName
, NUM_PHYS_MISCREGS
);
2370 ISA::unserialize(CheckpointIn
&cp
)
2372 DPRINTF(Checkpoint
, "Unserializing Arm Misc Registers\n");
2373 UNSERIALIZE_MAPPING(miscRegs
, miscRegName
, NUM_PHYS_MISCREGS
);
2374 CPSR tmp_cpsr
= miscRegs
[MISCREG_CPSR
];
2375 updateRegMap(tmp_cpsr
);
2379 ISA::addressTranslation64(TLB::ArmTranslationType tran_type
,
2380 BaseTLB::Mode mode
, Request::Flags flags
, RegVal val
)
2382 // If we're in timing mode then doing the translation in
2383 // functional mode then we're slightly distorting performance
2384 // results obtained from simulations. The translation should be
2385 // done in the same mode the core is running in. NOTE: This
2386 // can't be an atomic translation because that causes problems
2387 // with unexpected atomic snoop requests.
2388 warn_once("Doing AT (address translation) in functional mode! Fix Me!\n");
2390 auto req
= std::make_shared
<Request
>(
2391 val
, 0, flags
, Request::funcRequestorId
,
2392 tc
->pcState().pc(), tc
->contextId());
2394 Fault fault
= getMMUPtr(tc
)->translateFunctional(
2395 req
, tc
, mode
, tran_type
);
2398 if (fault
== NoFault
) {
2399 Addr paddr
= req
->getPaddr();
2400 uint64_t attr
= getMMUPtr(tc
)->getAttr();
2401 uint64_t attr1
= attr
>> 56;
2402 if (!attr1
|| attr1
==0x44) {
2404 attr
&= ~ uint64_t(0x80);
2406 par
= (paddr
& mask(47, 12)) | attr
;
2408 "MISCREG: Translated addr %#x: PAR_EL1: %#xx\n",
2411 ArmFault
*arm_fault
= static_cast<ArmFault
*>(fault
.get());
2412 arm_fault
->update(tc
);
2413 // Set fault bit and FSR
2414 FSR fsr
= arm_fault
->getFsr(tc
);
2417 par
.fst
= fsr
.status
; // FST
2418 par
.ptw
= (arm_fault
->iss() >> 7) & 0x1; // S1PTW
2419 par
.s
= arm_fault
->isStage2() ? 1 : 0; // S
2422 "MISCREG: Translated addr %#x fault fsr %#x: PAR: %#x\n",
2425 setMiscRegNoEffect(MISCREG_PAR_EL1
, par
);
2430 ISA::addressTranslation(TLB::ArmTranslationType tran_type
,
2431 BaseTLB::Mode mode
, Request::Flags flags
, RegVal val
)
2433 // If we're in timing mode then doing the translation in
2434 // functional mode then we're slightly distorting performance
2435 // results obtained from simulations. The translation should be
2436 // done in the same mode the core is running in. NOTE: This
2437 // can't be an atomic translation because that causes problems
2438 // with unexpected atomic snoop requests.
2439 warn_once("Doing AT (address translation) in functional mode! Fix Me!\n");
2441 auto req
= std::make_shared
<Request
>(
2442 val
, 0, flags
, Request::funcRequestorId
,
2443 tc
->pcState().pc(), tc
->contextId());
2445 Fault fault
= getMMUPtr(tc
)->translateFunctional(
2446 req
, tc
, mode
, tran_type
);
2449 if (fault
== NoFault
) {
2450 Addr paddr
= req
->getPaddr();
2451 TTBCR ttbcr
= readMiscRegNoEffect(MISCREG_TTBCR
);
2452 HCR hcr
= readMiscRegNoEffect(MISCREG_HCR
);
2454 uint8_t max_paddr_bit
= 0;
2455 if (haveLPAE
&& (ttbcr
.eae
|| tran_type
& TLB::HypMode
||
2456 ((tran_type
& TLB::S1S2NsTran
) && hcr
.vm
) )) {
2463 par
= (paddr
& mask(max_paddr_bit
, 12)) |
2464 (getMMUPtr(tc
)->getAttr());
2467 "MISCREG: Translated addr 0x%08x: PAR: 0x%08x\n",
2470 ArmFault
*arm_fault
= static_cast<ArmFault
*>(fault
.get());
2471 arm_fault
->update(tc
);
2472 // Set fault bit and FSR
2473 FSR fsr
= arm_fault
->getFsr(tc
);
2475 par
.f
= 0x1; // F bit
2476 par
.lpae
= fsr
.lpae
;
2477 par
.ptw
= (arm_fault
->iss() >> 7) & 0x1;
2478 par
.s
= arm_fault
->isStage2() ? 1 : 0;
2481 // LPAE - rearange fault status
2482 par
.fst
= fsr
.status
;
2484 // VMSA - rearange fault status
2485 par
.fs4_0
= fsr
.fsLow
| (fsr
.fsHigh
<< 5);
2489 "MISCREG: Translated addr 0x%08x fault fsr %#x: PAR: 0x%08x\n",
2492 setMiscRegNoEffect(MISCREG_PAR
, par
);
2496 ISA::MiscRegLUTEntryInitializer::chain
2497 ISA::MiscRegLUTEntryInitializer::highest(ArmSystem
*const sys
) const
2499 switch (FullSystem
? sys
->highestEL() : EL1
) {
2501 case EL1
: priv(); break;
2502 case EL2
: hyp(); break;
2503 case EL3
: mon(); break;
2508 } // namespace ArmISA