blob: 142b25f8c428b27fd62a73908ae8a0e4c714d726 [file] [log] [blame]
/*
* Copyright (c) 2010-2013, 2015-2022 Arm Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
* not be construed as granting a license to any other intellectual
* property including but not limited to intellectual property relating
* to a hardware implementation of the functionality of the software
* licensed hereunder. You may use the software subject to the license
* terms below provided that you ensure that this notice is replicated
* unmodified and in its entirety in all distributions of the software,
* modified or unmodified, in source code or in binary form.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met: redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer;
* redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution;
* neither the name of the copyright holders nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "arch/arm/regs/misc.hh"
#include <tuple>
#include "arch/arm/insts/misc64.hh"
#include "arch/arm/isa.hh"
#include "base/logging.hh"
#include "cpu/thread_context.hh"
#include "dev/arm/gic_v3_cpu_interface.hh"
#include "sim/full_system.hh"
namespace gem5
{
namespace ArmISA
{
namespace
{
std::unordered_map<MiscRegNum32, MiscRegIndex> miscRegNum32ToIdx{
// MCR/MRC regs
{ MiscRegNum32(14, 0, 0, 0, 0), MISCREG_DBGDIDR },
{ MiscRegNum32(14, 0, 0, 0, 2), MISCREG_DBGDTRRXext },
{ MiscRegNum32(14, 0, 0, 0, 4), MISCREG_DBGBVR0 },
{ MiscRegNum32(14, 0, 0, 0, 5), MISCREG_DBGBCR0 },
{ MiscRegNum32(14, 0, 0, 0, 6), MISCREG_DBGWVR0 },
{ MiscRegNum32(14, 0, 0, 0, 7), MISCREG_DBGWCR0 },
{ MiscRegNum32(14, 0, 0, 1, 0), MISCREG_DBGDSCRint },
{ MiscRegNum32(14, 0, 0, 1, 4), MISCREG_DBGBVR1 },
{ MiscRegNum32(14, 0, 0, 1, 5), MISCREG_DBGBCR1 },
{ MiscRegNum32(14, 0, 0, 1, 6), MISCREG_DBGWVR1 },
{ MiscRegNum32(14, 0, 0, 1, 7), MISCREG_DBGWCR1 },
{ MiscRegNum32(14, 0, 0, 2, 2), MISCREG_DBGDSCRext },
{ MiscRegNum32(14, 0, 0, 2, 4), MISCREG_DBGBVR2 },
{ MiscRegNum32(14, 0, 0, 2, 5), MISCREG_DBGBCR2 },
{ MiscRegNum32(14, 0, 0, 2, 6), MISCREG_DBGWVR2 },
{ MiscRegNum32(14, 0, 0, 2, 7), MISCREG_DBGWCR2 },
{ MiscRegNum32(14, 0, 0, 3, 2), MISCREG_DBGDTRTXext },
{ MiscRegNum32(14, 0, 0, 3, 4), MISCREG_DBGBVR3 },
{ MiscRegNum32(14, 0, 0, 3, 5), MISCREG_DBGBCR3 },
{ MiscRegNum32(14, 0, 0, 3, 6), MISCREG_DBGWVR3 },
{ MiscRegNum32(14, 0, 0, 3, 7), MISCREG_DBGWCR3 },
{ MiscRegNum32(14, 0, 0, 4, 4), MISCREG_DBGBVR4 },
{ MiscRegNum32(14, 0, 0, 4, 5), MISCREG_DBGBCR4 },
{ MiscRegNum32(14, 0, 0, 4, 6), MISCREG_DBGWVR4 },
{ MiscRegNum32(14, 0, 0, 4, 7), MISCREG_DBGWCR4 },
{ MiscRegNum32(14, 0, 0, 5, 4), MISCREG_DBGBVR5 },
{ MiscRegNum32(14, 0, 0, 5, 5), MISCREG_DBGBCR5 },
{ MiscRegNum32(14, 0, 0, 5, 6), MISCREG_DBGWVR5 },
{ MiscRegNum32(14, 0, 0, 5, 7), MISCREG_DBGWCR5 },
{ MiscRegNum32(14, 0, 0, 6, 2), MISCREG_DBGOSECCR },
{ MiscRegNum32(14, 0, 0, 6, 4), MISCREG_DBGBVR6 },
{ MiscRegNum32(14, 0, 0, 6, 5), MISCREG_DBGBCR6 },
{ MiscRegNum32(14, 0, 0, 6, 6), MISCREG_DBGWVR6 },
{ MiscRegNum32(14, 0, 0, 6, 7), MISCREG_DBGWCR6 },
{ MiscRegNum32(14, 0, 0, 7, 0), MISCREG_DBGVCR },
{ MiscRegNum32(14, 0, 0, 7, 4), MISCREG_DBGBVR7 },
{ MiscRegNum32(14, 0, 0, 7, 5), MISCREG_DBGBCR7 },
{ MiscRegNum32(14, 0, 0, 7, 6), MISCREG_DBGWVR7 },
{ MiscRegNum32(14, 0, 0, 7, 7), MISCREG_DBGWCR7 },
{ MiscRegNum32(14, 0, 0, 8, 4), MISCREG_DBGBVR8 },
{ MiscRegNum32(14, 0, 0, 8, 5), MISCREG_DBGBCR8 },
{ MiscRegNum32(14, 0, 0, 8, 6), MISCREG_DBGWVR8 },
{ MiscRegNum32(14, 0, 0, 8, 7), MISCREG_DBGWCR8 },
{ MiscRegNum32(14, 0, 0, 9, 4), MISCREG_DBGBVR9 },
{ MiscRegNum32(14, 0, 0, 9, 5), MISCREG_DBGBCR9 },
{ MiscRegNum32(14, 0, 0, 9, 6), MISCREG_DBGWVR9 },
{ MiscRegNum32(14, 0, 0, 9, 7), MISCREG_DBGWCR9 },
{ MiscRegNum32(14, 0, 0, 10, 4), MISCREG_DBGBVR10 },
{ MiscRegNum32(14, 0, 0, 10, 5), MISCREG_DBGBCR10 },
{ MiscRegNum32(14, 0, 0, 10, 6), MISCREG_DBGWVR10 },
{ MiscRegNum32(14, 0, 0, 10, 7), MISCREG_DBGWCR10 },
{ MiscRegNum32(14, 0, 0, 11, 4), MISCREG_DBGBVR11 },
{ MiscRegNum32(14, 0, 0, 11, 5), MISCREG_DBGBCR11 },
{ MiscRegNum32(14, 0, 0, 11, 6), MISCREG_DBGWVR11 },
{ MiscRegNum32(14, 0, 0, 11, 7), MISCREG_DBGWCR11 },
{ MiscRegNum32(14, 0, 0, 12, 4), MISCREG_DBGBVR12 },
{ MiscRegNum32(14, 0, 0, 12, 5), MISCREG_DBGBCR12 },
{ MiscRegNum32(14, 0, 0, 12, 6), MISCREG_DBGWVR12 },
{ MiscRegNum32(14, 0, 0, 12, 7), MISCREG_DBGWCR12 },
{ MiscRegNum32(14, 0, 0, 13, 4), MISCREG_DBGBVR13 },
{ MiscRegNum32(14, 0, 0, 13, 5), MISCREG_DBGBCR13 },
{ MiscRegNum32(14, 0, 0, 13, 6), MISCREG_DBGWVR13 },
{ MiscRegNum32(14, 0, 0, 13, 7), MISCREG_DBGWCR13 },
{ MiscRegNum32(14, 0, 0, 14, 4), MISCREG_DBGBVR14 },
{ MiscRegNum32(14, 0, 0, 14, 5), MISCREG_DBGBCR14 },
{ MiscRegNum32(14, 0, 0, 14, 6), MISCREG_DBGWVR14 },
{ MiscRegNum32(14, 0, 0, 14, 7), MISCREG_DBGWCR14 },
{ MiscRegNum32(14, 0, 0, 15, 4), MISCREG_DBGBVR15 },
{ MiscRegNum32(14, 0, 0, 15, 5), MISCREG_DBGBCR15 },
{ MiscRegNum32(14, 0, 0, 15, 6), MISCREG_DBGWVR15 },
{ MiscRegNum32(14, 0, 0, 15, 7), MISCREG_DBGWCR15 },
{ MiscRegNum32(14, 0, 1, 0, 1), MISCREG_DBGBXVR0 },
{ MiscRegNum32(14, 0, 1, 0, 4), MISCREG_DBGOSLAR },
{ MiscRegNum32(14, 0, 1, 1, 1), MISCREG_DBGBXVR1 },
{ MiscRegNum32(14, 0, 1, 1, 4), MISCREG_DBGOSLSR },
{ MiscRegNum32(14, 0, 1, 2, 1), MISCREG_DBGBXVR2 },
{ MiscRegNum32(14, 0, 1, 3, 1), MISCREG_DBGBXVR3 },
{ MiscRegNum32(14, 0, 1, 3, 4), MISCREG_DBGOSDLR },
{ MiscRegNum32(14, 0, 1, 4, 1), MISCREG_DBGBXVR4 },
{ MiscRegNum32(14, 0, 1, 4, 4), MISCREG_DBGPRCR },
{ MiscRegNum32(14, 0, 1, 5, 1), MISCREG_DBGBXVR5 },
{ MiscRegNum32(14, 0, 1, 6, 1), MISCREG_DBGBXVR6 },
{ MiscRegNum32(14, 0, 1, 7, 1), MISCREG_DBGBXVR7 },
{ MiscRegNum32(14, 0, 1, 8, 1), MISCREG_DBGBXVR8 },
{ MiscRegNum32(14, 0, 1, 9, 1), MISCREG_DBGBXVR9 },
{ MiscRegNum32(14, 0, 1, 10, 1), MISCREG_DBGBXVR10 },
{ MiscRegNum32(14, 0, 1, 11, 1), MISCREG_DBGBXVR11 },
{ MiscRegNum32(14, 0, 1, 12, 1), MISCREG_DBGBXVR12 },
{ MiscRegNum32(14, 0, 1, 13, 1), MISCREG_DBGBXVR13 },
{ MiscRegNum32(14, 0, 1, 14, 1), MISCREG_DBGBXVR14 },
{ MiscRegNum32(14, 0, 1, 15, 1), MISCREG_DBGBXVR15 },
{ MiscRegNum32(14, 6, 1, 0, 0), MISCREG_TEEHBR },
{ MiscRegNum32(14, 7, 0, 0, 0), MISCREG_JIDR },
{ MiscRegNum32(14, 7, 1, 0, 0), MISCREG_JOSCR },
{ MiscRegNum32(14, 7, 2, 0, 0), MISCREG_JMCR },
{ MiscRegNum32(15, 0, 0, 0, 0), MISCREG_MIDR },
{ MiscRegNum32(15, 0, 0, 0, 1), MISCREG_CTR },
{ MiscRegNum32(15, 0, 0, 0, 2), MISCREG_TCMTR },
{ MiscRegNum32(15, 0, 0, 0, 3), MISCREG_TLBTR },
{ MiscRegNum32(15, 0, 0, 0, 4), MISCREG_MIDR },
{ MiscRegNum32(15, 0, 0, 0, 5), MISCREG_MPIDR },
{ MiscRegNum32(15, 0, 0, 0, 6), MISCREG_REVIDR },
{ MiscRegNum32(15, 0, 0, 0, 7), MISCREG_MIDR },
{ MiscRegNum32(15, 0, 0, 1, 0), MISCREG_ID_PFR0 },
{ MiscRegNum32(15, 0, 0, 1, 1), MISCREG_ID_PFR1 },
{ MiscRegNum32(15, 0, 0, 1, 2), MISCREG_ID_DFR0 },
{ MiscRegNum32(15, 0, 0, 1, 3), MISCREG_ID_AFR0 },
{ MiscRegNum32(15, 0, 0, 1, 4), MISCREG_ID_MMFR0 },
{ MiscRegNum32(15, 0, 0, 1, 5), MISCREG_ID_MMFR1 },
{ MiscRegNum32(15, 0, 0, 1, 6), MISCREG_ID_MMFR2 },
{ MiscRegNum32(15, 0, 0, 1, 7), MISCREG_ID_MMFR3 },
{ MiscRegNum32(15, 0, 0, 2, 0), MISCREG_ID_ISAR0 },
{ MiscRegNum32(15, 0, 0, 2, 1), MISCREG_ID_ISAR1 },
{ MiscRegNum32(15, 0, 0, 2, 2), MISCREG_ID_ISAR2 },
{ MiscRegNum32(15, 0, 0, 2, 3), MISCREG_ID_ISAR3 },
{ MiscRegNum32(15, 0, 0, 2, 4), MISCREG_ID_ISAR4 },
{ MiscRegNum32(15, 0, 0, 2, 5), MISCREG_ID_ISAR5 },
{ MiscRegNum32(15, 0, 0, 2, 6), MISCREG_ID_MMFR4 },
{ MiscRegNum32(15, 0, 0, 2, 7), MISCREG_ID_ISAR6 },
{ MiscRegNum32(15, 0, 0, 3, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 3, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 3, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 3, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 3, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 3, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 3, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 3, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 4, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 4, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 4, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 4, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 4, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 4, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 4, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 4, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 5, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 5, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 5, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 5, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 5, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 5, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 5, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 5, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 6, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 6, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 6, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 6, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 6, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 6, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 6, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 6, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 7, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 7, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 7, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 7, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 7, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 7, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 7, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 7, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 8, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 8, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 8, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 8, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 8, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 8, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 8, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 8, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 9, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 9, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 9, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 9, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 9, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 9, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 9, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 9, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 10, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 10, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 10, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 10, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 10, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 10, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 10, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 10, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 11, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 11, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 11, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 11, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 11, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 11, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 11, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 11, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 12, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 12, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 12, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 12, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 12, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 12, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 12, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 12, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 13, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 13, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 13, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 13, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 13, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 13, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 13, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 13, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 14, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 14, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 14, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 14, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 14, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 14, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 14, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 14, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 15, 0), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 15, 1), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 15, 2), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 15, 3), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 15, 4), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 15, 5), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 15, 6), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 0, 15, 7), MISCREG_RAZ },
{ MiscRegNum32(15, 0, 1, 0, 0), MISCREG_SCTLR },
{ MiscRegNum32(15, 0, 1, 0, 1), MISCREG_ACTLR },
{ MiscRegNum32(15, 0, 1, 0, 2), MISCREG_CPACR },
{ MiscRegNum32(15, 0, 1, 1, 0), MISCREG_SCR },
{ MiscRegNum32(15, 0, 1, 1, 1), MISCREG_SDER },
{ MiscRegNum32(15, 0, 1, 1, 2), MISCREG_NSACR },
{ MiscRegNum32(15, 0, 1, 3, 1), MISCREG_SDCR },
{ MiscRegNum32(15, 0, 2, 0, 0), MISCREG_TTBR0 },
{ MiscRegNum32(15, 0, 2, 0, 1), MISCREG_TTBR1 },
{ MiscRegNum32(15, 0, 2, 0, 2), MISCREG_TTBCR },
{ MiscRegNum32(15, 0, 3, 0, 0), MISCREG_DACR },
{ MiscRegNum32(15, 0, 4, 6, 0), MISCREG_ICC_PMR },
{ MiscRegNum32(15, 0, 5, 0, 0), MISCREG_DFSR },
{ MiscRegNum32(15, 0, 5, 0, 1), MISCREG_IFSR },
{ MiscRegNum32(15, 0, 5, 1, 0), MISCREG_ADFSR },
{ MiscRegNum32(15, 0, 5, 1, 1), MISCREG_AIFSR },
{ MiscRegNum32(15, 0, 6, 0, 0), MISCREG_DFAR },
{ MiscRegNum32(15, 0, 6, 0, 2), MISCREG_IFAR },
{ MiscRegNum32(15, 0, 7, 0, 4), MISCREG_NOP },
{ MiscRegNum32(15, 0, 7, 1, 0), MISCREG_ICIALLUIS },
{ MiscRegNum32(15, 0, 7, 1, 6), MISCREG_BPIALLIS },
{ MiscRegNum32(15, 0, 7, 2, 7), MISCREG_DBGDEVID0 },
{ MiscRegNum32(15, 0, 7, 4, 0), MISCREG_PAR },
{ MiscRegNum32(15, 0, 7, 5, 0), MISCREG_ICIALLU },
{ MiscRegNum32(15, 0, 7, 5, 1), MISCREG_ICIMVAU },
{ MiscRegNum32(15, 0, 7, 5, 4), MISCREG_CP15ISB },
{ MiscRegNum32(15, 0, 7, 5, 6), MISCREG_BPIALL },
{ MiscRegNum32(15, 0, 7, 5, 7), MISCREG_BPIMVA },
{ MiscRegNum32(15, 0, 7, 6, 1), MISCREG_DCIMVAC },
{ MiscRegNum32(15, 0, 7, 6, 2), MISCREG_DCISW },
{ MiscRegNum32(15, 0, 7, 8, 0), MISCREG_ATS1CPR },
{ MiscRegNum32(15, 0, 7, 8, 1), MISCREG_ATS1CPW },
{ MiscRegNum32(15, 0, 7, 8, 2), MISCREG_ATS1CUR },
{ MiscRegNum32(15, 0, 7, 8, 3), MISCREG_ATS1CUW },
{ MiscRegNum32(15, 0, 7, 8, 4), MISCREG_ATS12NSOPR },
{ MiscRegNum32(15, 0, 7, 8, 5), MISCREG_ATS12NSOPW },
{ MiscRegNum32(15, 0, 7, 8, 6), MISCREG_ATS12NSOUR },
{ MiscRegNum32(15, 0, 7, 8, 7), MISCREG_ATS12NSOUW },
{ MiscRegNum32(15, 0, 7, 10, 1), MISCREG_DCCMVAC },
{ MiscRegNum32(15, 0, 7, 10, 2), MISCREG_DCCSW },
{ MiscRegNum32(15, 0, 7, 10, 4), MISCREG_CP15DSB },
{ MiscRegNum32(15, 0, 7, 10, 5), MISCREG_CP15DMB },
{ MiscRegNum32(15, 0, 7, 11, 1), MISCREG_DCCMVAU },
{ MiscRegNum32(15, 0, 7, 13, 1), MISCREG_NOP },
{ MiscRegNum32(15, 0, 7, 14, 1), MISCREG_DCCIMVAC },
{ MiscRegNum32(15, 0, 7, 14, 2), MISCREG_DCCISW },
{ MiscRegNum32(15, 0, 8, 3, 0), MISCREG_TLBIALLIS },
{ MiscRegNum32(15, 0, 8, 3, 1), MISCREG_TLBIMVAIS },
{ MiscRegNum32(15, 0, 8, 3, 2), MISCREG_TLBIASIDIS },
{ MiscRegNum32(15, 0, 8, 3, 3), MISCREG_TLBIMVAAIS },
{ MiscRegNum32(15, 0, 8, 3, 5), MISCREG_TLBIMVALIS },
{ MiscRegNum32(15, 0, 8, 3, 7), MISCREG_TLBIMVAALIS },
{ MiscRegNum32(15, 0, 8, 5, 0), MISCREG_ITLBIALL },
{ MiscRegNum32(15, 0, 8, 5, 1), MISCREG_ITLBIMVA },
{ MiscRegNum32(15, 0, 8, 5, 2), MISCREG_ITLBIASID },
{ MiscRegNum32(15, 0, 8, 6, 0), MISCREG_DTLBIALL },
{ MiscRegNum32(15, 0, 8, 6, 1), MISCREG_DTLBIMVA },
{ MiscRegNum32(15, 0, 8, 6, 2), MISCREG_DTLBIASID },
{ MiscRegNum32(15, 0, 8, 7, 0), MISCREG_TLBIALL },
{ MiscRegNum32(15, 0, 8, 7, 1), MISCREG_TLBIMVA },
{ MiscRegNum32(15, 0, 8, 7, 2), MISCREG_TLBIASID },
{ MiscRegNum32(15, 0, 8, 7, 3), MISCREG_TLBIMVAA },
{ MiscRegNum32(15, 0, 8, 7, 5), MISCREG_TLBIMVAL },
{ MiscRegNum32(15, 0, 8, 7, 7), MISCREG_TLBIMVAAL },
{ MiscRegNum32(15, 0, 9, 12, 0), MISCREG_PMCR },
{ MiscRegNum32(15, 0, 9, 12, 1), MISCREG_PMCNTENSET },
{ MiscRegNum32(15, 0, 9, 12, 2), MISCREG_PMCNTENCLR },
{ MiscRegNum32(15, 0, 9, 12, 3), MISCREG_PMOVSR },
{ MiscRegNum32(15, 0, 9, 12, 4), MISCREG_PMSWINC },
{ MiscRegNum32(15, 0, 9, 12, 5), MISCREG_PMSELR },
{ MiscRegNum32(15, 0, 9, 12, 6), MISCREG_PMCEID0 },
{ MiscRegNum32(15, 0, 9, 12, 7), MISCREG_PMCEID1 },
{ MiscRegNum32(15, 0, 9, 13, 0), MISCREG_PMCCNTR },
{ MiscRegNum32(15, 0, 9, 13, 1), MISCREG_PMXEVTYPER_PMCCFILTR },
{ MiscRegNum32(15, 0, 9, 13, 2), MISCREG_PMXEVCNTR },
{ MiscRegNum32(15, 0, 9, 14, 0), MISCREG_PMUSERENR },
{ MiscRegNum32(15, 0, 9, 14, 1), MISCREG_PMINTENSET },
{ MiscRegNum32(15, 0, 9, 14, 2), MISCREG_PMINTENCLR },
{ MiscRegNum32(15, 0, 9, 14, 3), MISCREG_PMOVSSET },
{ MiscRegNum32(15, 0, 10, 2, 0), MISCREG_PRRR_MAIR0 },
{ MiscRegNum32(15, 0, 10, 2, 1), MISCREG_NMRR_MAIR1 },
{ MiscRegNum32(15, 0, 10, 3, 0), MISCREG_AMAIR0 },
{ MiscRegNum32(15, 0, 10, 3, 1), MISCREG_AMAIR1 },
{ MiscRegNum32(15, 0, 12, 0, 0), MISCREG_VBAR },
{ MiscRegNum32(15, 0, 12, 0, 1), MISCREG_MVBAR },
{ MiscRegNum32(15, 0, 12, 1, 0), MISCREG_ISR },
{ MiscRegNum32(15, 0, 12, 8, 0), MISCREG_ICC_IAR0 },
{ MiscRegNum32(15, 0, 12, 8, 1), MISCREG_ICC_EOIR0 },
{ MiscRegNum32(15, 0, 12, 8, 2), MISCREG_ICC_HPPIR0 },
{ MiscRegNum32(15, 0, 12, 8, 3), MISCREG_ICC_BPR0 },
{ MiscRegNum32(15, 0, 12, 8, 4), MISCREG_ICC_AP0R0 },
{ MiscRegNum32(15, 0, 12, 8, 5), MISCREG_ICC_AP0R1 },
{ MiscRegNum32(15, 0, 12, 8, 6), MISCREG_ICC_AP0R2 },
{ MiscRegNum32(15, 0, 12, 8, 7), MISCREG_ICC_AP0R3 },
{ MiscRegNum32(15, 0, 12, 9, 0), MISCREG_ICC_AP1R0 },
{ MiscRegNum32(15, 0, 12, 9, 1), MISCREG_ICC_AP1R1 },
{ MiscRegNum32(15, 0, 12, 9, 2), MISCREG_ICC_AP1R2 },
{ MiscRegNum32(15, 0, 12, 9, 3), MISCREG_ICC_AP1R3 },
{ MiscRegNum32(15, 0, 12, 11, 1), MISCREG_ICC_DIR },
{ MiscRegNum32(15, 0, 12, 11, 3), MISCREG_ICC_RPR },
{ MiscRegNum32(15, 0, 12, 12, 0), MISCREG_ICC_IAR1 },
{ MiscRegNum32(15, 0, 12, 12, 1), MISCREG_ICC_EOIR1 },
{ MiscRegNum32(15, 0, 12, 12, 2), MISCREG_ICC_HPPIR1 },
{ MiscRegNum32(15, 0, 12, 12, 3), MISCREG_ICC_BPR1 },
{ MiscRegNum32(15, 0, 12, 12, 4), MISCREG_ICC_CTLR },
{ MiscRegNum32(15, 0, 12, 12, 5), MISCREG_ICC_SRE },
{ MiscRegNum32(15, 0, 12, 12, 6), MISCREG_ICC_IGRPEN0 },
{ MiscRegNum32(15, 0, 12, 12, 7), MISCREG_ICC_IGRPEN1 },
{ MiscRegNum32(15, 0, 13, 0, 0), MISCREG_FCSEIDR },
{ MiscRegNum32(15, 0, 13, 0, 1), MISCREG_CONTEXTIDR },
{ MiscRegNum32(15, 0, 13, 0, 2), MISCREG_TPIDRURW },
{ MiscRegNum32(15, 0, 13, 0, 3), MISCREG_TPIDRURO },
{ MiscRegNum32(15, 0, 13, 0, 4), MISCREG_TPIDRPRW },
{ MiscRegNum32(15, 0, 14, 0, 0), MISCREG_CNTFRQ },
{ MiscRegNum32(15, 0, 14, 1, 0), MISCREG_CNTKCTL },
{ MiscRegNum32(15, 0, 14, 2, 0), MISCREG_CNTP_TVAL },
{ MiscRegNum32(15, 0, 14, 2, 1), MISCREG_CNTP_CTL },
{ MiscRegNum32(15, 0, 14, 3, 0), MISCREG_CNTV_TVAL },
{ MiscRegNum32(15, 0, 14, 3, 1), MISCREG_CNTV_CTL },
{ MiscRegNum32(15, 1, 0, 0, 0), MISCREG_CCSIDR },
{ MiscRegNum32(15, 1, 0, 0, 1), MISCREG_CLIDR },
{ MiscRegNum32(15, 1, 0, 0, 7), MISCREG_AIDR },
{ MiscRegNum32(15, 2, 0, 0, 0), MISCREG_CSSELR },
{ MiscRegNum32(15, 4, 0, 0, 0), MISCREG_VPIDR },
{ MiscRegNum32(15, 4, 0, 0, 5), MISCREG_VMPIDR },
{ MiscRegNum32(15, 4, 1, 0, 0), MISCREG_HSCTLR },
{ MiscRegNum32(15, 4, 1, 0, 1), MISCREG_HACTLR },
{ MiscRegNum32(15, 4, 1, 1, 0), MISCREG_HCR },
{ MiscRegNum32(15, 4, 1, 1, 1), MISCREG_HDCR },
{ MiscRegNum32(15, 4, 1, 1, 2), MISCREG_HCPTR },
{ MiscRegNum32(15, 4, 1, 1, 3), MISCREG_HSTR },
{ MiscRegNum32(15, 4, 1, 1, 4), MISCREG_HCR2 },
{ MiscRegNum32(15, 4, 1, 1, 7), MISCREG_HACR },
{ MiscRegNum32(15, 4, 2, 0, 2), MISCREG_HTCR },
{ MiscRegNum32(15, 4, 2, 1, 2), MISCREG_VTCR },
{ MiscRegNum32(15, 4, 5, 1, 0), MISCREG_HADFSR },
{ MiscRegNum32(15, 4, 5, 1, 1), MISCREG_HAIFSR },
{ MiscRegNum32(15, 4, 5, 2, 0), MISCREG_HSR },
{ MiscRegNum32(15, 4, 6, 0, 0), MISCREG_HDFAR },
{ MiscRegNum32(15, 4, 6, 0, 2), MISCREG_HIFAR },
{ MiscRegNum32(15, 4, 6, 0, 4), MISCREG_HPFAR },
{ MiscRegNum32(15, 4, 7, 8, 0), MISCREG_ATS1HR },
{ MiscRegNum32(15, 4, 7, 8, 1), MISCREG_ATS1HW },
{ MiscRegNum32(15, 4, 8, 0, 1), MISCREG_TLBIIPAS2IS },
{ MiscRegNum32(15, 4, 8, 0, 5), MISCREG_TLBIIPAS2LIS },
{ MiscRegNum32(15, 4, 8, 3, 0), MISCREG_TLBIALLHIS },
{ MiscRegNum32(15, 4, 8, 3, 1), MISCREG_TLBIMVAHIS },
{ MiscRegNum32(15, 4, 8, 3, 4), MISCREG_TLBIALLNSNHIS },
{ MiscRegNum32(15, 4, 8, 3, 5), MISCREG_TLBIMVALHIS },
{ MiscRegNum32(15, 4, 8, 4, 1), MISCREG_TLBIIPAS2 },
{ MiscRegNum32(15, 4, 8, 4, 5), MISCREG_TLBIIPAS2L },
{ MiscRegNum32(15, 4, 8, 7, 0), MISCREG_TLBIALLH },
{ MiscRegNum32(15, 4, 8, 7, 1), MISCREG_TLBIMVAH },
{ MiscRegNum32(15, 4, 8, 7, 4), MISCREG_TLBIALLNSNH },
{ MiscRegNum32(15, 4, 8, 7, 5), MISCREG_TLBIMVALH },
{ MiscRegNum32(15, 4, 10, 2, 0), MISCREG_HMAIR0 },
{ MiscRegNum32(15, 4, 10, 2, 1), MISCREG_HMAIR1 },
{ MiscRegNum32(15, 4, 10, 3, 0), MISCREG_HAMAIR0 },
{ MiscRegNum32(15, 4, 10, 3, 1), MISCREG_HAMAIR1 },
{ MiscRegNum32(15, 4, 12, 0, 0), MISCREG_HVBAR },
{ MiscRegNum32(15, 4, 12, 8, 0), MISCREG_ICH_AP0R0 },
{ MiscRegNum32(15, 4, 12, 8, 1), MISCREG_ICH_AP0R1 },
{ MiscRegNum32(15, 4, 12, 8, 2), MISCREG_ICH_AP0R2 },
{ MiscRegNum32(15, 4, 12, 8, 3), MISCREG_ICH_AP0R3 },
{ MiscRegNum32(15, 4, 12, 9, 0), MISCREG_ICH_AP1R0 },
{ MiscRegNum32(15, 4, 12, 9, 1), MISCREG_ICH_AP1R1 },
{ MiscRegNum32(15, 4, 12, 9, 2), MISCREG_ICH_AP1R2 },
{ MiscRegNum32(15, 4, 12, 9, 3), MISCREG_ICH_AP1R3 },
{ MiscRegNum32(15, 4, 12, 9, 5), MISCREG_ICC_HSRE },
{ MiscRegNum32(15, 4, 12, 11, 0), MISCREG_ICH_HCR },
{ MiscRegNum32(15, 4, 12, 11, 1), MISCREG_ICH_VTR },
{ MiscRegNum32(15, 4, 12, 11, 2), MISCREG_ICH_MISR },
{ MiscRegNum32(15, 4, 12, 11, 3), MISCREG_ICH_EISR },
{ MiscRegNum32(15, 4, 12, 11, 5), MISCREG_ICH_ELRSR },
{ MiscRegNum32(15, 4, 12, 11, 7), MISCREG_ICH_VMCR },
{ MiscRegNum32(15, 4, 12, 12, 0), MISCREG_ICH_LR0 },
{ MiscRegNum32(15, 4, 12, 12, 1), MISCREG_ICH_LR1 },
{ MiscRegNum32(15, 4, 12, 12, 2), MISCREG_ICH_LR2 },
{ MiscRegNum32(15, 4, 12, 12, 3), MISCREG_ICH_LR3 },
{ MiscRegNum32(15, 4, 12, 12, 4), MISCREG_ICH_LR4 },
{ MiscRegNum32(15, 4, 12, 12, 5), MISCREG_ICH_LR5 },
{ MiscRegNum32(15, 4, 12, 12, 6), MISCREG_ICH_LR6 },
{ MiscRegNum32(15, 4, 12, 12, 7), MISCREG_ICH_LR7 },
{ MiscRegNum32(15, 4, 12, 13, 0), MISCREG_ICH_LR8 },
{ MiscRegNum32(15, 4, 12, 13, 1), MISCREG_ICH_LR9 },
{ MiscRegNum32(15, 4, 12, 13, 2), MISCREG_ICH_LR10 },
{ MiscRegNum32(15, 4, 12, 13, 3), MISCREG_ICH_LR11 },
{ MiscRegNum32(15, 4, 12, 13, 4), MISCREG_ICH_LR12 },
{ MiscRegNum32(15, 4, 12, 13, 5), MISCREG_ICH_LR13 },
{ MiscRegNum32(15, 4, 12, 13, 6), MISCREG_ICH_LR14 },
{ MiscRegNum32(15, 4, 12, 13, 7), MISCREG_ICH_LR15 },
{ MiscRegNum32(15, 4, 12, 14, 0), MISCREG_ICH_LRC0 },
{ MiscRegNum32(15, 4, 12, 14, 1), MISCREG_ICH_LRC1 },
{ MiscRegNum32(15, 4, 12, 14, 2), MISCREG_ICH_LRC2 },
{ MiscRegNum32(15, 4, 12, 14, 3), MISCREG_ICH_LRC3 },
{ MiscRegNum32(15, 4, 12, 14, 4), MISCREG_ICH_LRC4 },
{ MiscRegNum32(15, 4, 12, 14, 5), MISCREG_ICH_LRC5 },
{ MiscRegNum32(15, 4, 12, 14, 6), MISCREG_ICH_LRC6 },
{ MiscRegNum32(15, 4, 12, 14, 7), MISCREG_ICH_LRC7 },
{ MiscRegNum32(15, 4, 12, 15, 0), MISCREG_ICH_LRC8 },
{ MiscRegNum32(15, 4, 12, 15, 1), MISCREG_ICH_LRC9 },
{ MiscRegNum32(15, 4, 12, 15, 2), MISCREG_ICH_LRC10 },
{ MiscRegNum32(15, 4, 12, 15, 3), MISCREG_ICH_LRC11 },
{ MiscRegNum32(15, 4, 12, 15, 4), MISCREG_ICH_LRC12 },
{ MiscRegNum32(15, 4, 12, 15, 5), MISCREG_ICH_LRC13 },
{ MiscRegNum32(15, 4, 12, 15, 6), MISCREG_ICH_LRC14 },
{ MiscRegNum32(15, 4, 12, 15, 7), MISCREG_ICH_LRC15 },
{ MiscRegNum32(15, 4, 13, 0, 2), MISCREG_HTPIDR },
{ MiscRegNum32(15, 4, 14, 1, 0), MISCREG_CNTHCTL },
{ MiscRegNum32(15, 4, 14, 2, 0), MISCREG_CNTHP_TVAL },
{ MiscRegNum32(15, 4, 14, 2, 1), MISCREG_CNTHP_CTL },
{ MiscRegNum32(15, 6, 12, 12, 4), MISCREG_ICC_MCTLR },
{ MiscRegNum32(15, 6, 12, 12, 5), MISCREG_ICC_MSRE },
{ MiscRegNum32(15, 6, 12, 12, 7), MISCREG_ICC_MGRPEN1 },
// MCRR/MRRC regs
{ MiscRegNum32(15, 0, 2), MISCREG_TTBR0 },
{ MiscRegNum32(15, 0, 7), MISCREG_PAR },
{ MiscRegNum32(15, 0, 12), MISCREG_ICC_SGI1R },
{ MiscRegNum32(15, 0, 14), MISCREG_CNTPCT },
{ MiscRegNum32(15, 0, 15), MISCREG_CPUMERRSR },
{ MiscRegNum32(15, 1, 2), MISCREG_TTBR1 },
{ MiscRegNum32(15, 1, 12), MISCREG_ICC_ASGI1R },
{ MiscRegNum32(15, 1, 14), MISCREG_CNTVCT },
{ MiscRegNum32(15, 1, 15), MISCREG_L2MERRSR },
{ MiscRegNum32(15, 2, 12), MISCREG_ICC_SGI0R },
{ MiscRegNum32(15, 2, 14), MISCREG_CNTP_CVAL },
{ MiscRegNum32(15, 3, 14), MISCREG_CNTV_CVAL },
{ MiscRegNum32(15, 4, 2), MISCREG_HTTBR },
{ MiscRegNum32(15, 4, 14), MISCREG_CNTVOFF },
{ MiscRegNum32(15, 6, 2), MISCREG_VTTBR },
{ MiscRegNum32(15, 6, 14), MISCREG_CNTHP_CVAL },
};
}
MiscRegIndex
decodeCP14Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2)
{
MiscRegNum32 cop_reg(14, opc1, crn, crm, opc2);
auto it = miscRegNum32ToIdx.find(cop_reg);
if (it != miscRegNum32ToIdx.end()) {
return it->second;
} else {
warn("CP14 unimplemented crn[%d], opc1[%d], crm[%d], opc2[%d]",
crn, opc1, crm, opc2);
return MISCREG_UNKNOWN;
}
}
MiscRegIndex
decodeCP15Reg(unsigned crn, unsigned opc1, unsigned crm, unsigned opc2)
{
MiscRegNum32 cop_reg(15, opc1, crn, crm, opc2);
auto it = miscRegNum32ToIdx.find(cop_reg);
if (it != miscRegNum32ToIdx.end()) {
return it->second;
} else {
if ((crn == 15) ||
(crn == 9 && (crm <= 2 || crm >= 5)) ||
(crn == 10 && opc1 == 0 && crm <= 1) ||
(crn == 11 && opc1 <= 7 && (crm <= 8 || crm ==15))) {
return MISCREG_IMPDEF_UNIMPL;
} else {
return MISCREG_UNKNOWN;
}
}
}
MiscRegIndex
decodeCP15Reg64(unsigned crm, unsigned opc1)
{
MiscRegNum32 cop_reg(15, opc1, crm);
auto it = miscRegNum32ToIdx.find(cop_reg);
if (it != miscRegNum32ToIdx.end()) {
return it->second;
} else {
return MISCREG_UNKNOWN;
}
}
std::tuple<bool, bool>
canReadCoprocReg(MiscRegIndex reg, SCR scr, CPSR cpsr, ThreadContext *tc)
{
bool secure = !scr.ns;
bool can_read = false;
bool undefined = false;
auto& miscreg_info = lookUpMiscReg[reg].info;
switch (cpsr.mode) {
case MODE_USER:
can_read = secure ? miscreg_info[MISCREG_USR_S_RD] :
miscreg_info[MISCREG_USR_NS_RD];
break;
case MODE_FIQ:
case MODE_IRQ:
case MODE_SVC:
case MODE_ABORT:
case MODE_UNDEFINED:
case MODE_SYSTEM:
can_read = secure ? miscreg_info[MISCREG_PRI_S_RD] :
miscreg_info[MISCREG_PRI_NS_RD];
break;
case MODE_MON:
can_read = secure ? miscreg_info[MISCREG_MON_NS0_RD] :
miscreg_info[MISCREG_MON_NS1_RD];
break;
case MODE_HYP:
can_read = miscreg_info[MISCREG_HYP_NS_RD];
break;
default:
undefined = true;
}
switch (reg) {
case MISCREG_CNTFRQ ... MISCREG_CNTVOFF:
if (!undefined)
undefined = AArch32isUndefinedGenericTimer(reg, tc);
break;
default:
break;
}
// can't do permissions checkes on the root of a banked pair of regs
assert(!miscreg_info[MISCREG_BANKED]);
return std::make_tuple(can_read, undefined);
}
std::tuple<bool, bool>
canWriteCoprocReg(MiscRegIndex reg, SCR scr, CPSR cpsr, ThreadContext *tc)
{
bool secure = !scr.ns;
bool can_write = false;
bool undefined = false;
const auto& miscreg_info = lookUpMiscReg[reg].info;
switch (cpsr.mode) {
case MODE_USER:
can_write = secure ? miscreg_info[MISCREG_USR_S_WR] :
miscreg_info[MISCREG_USR_NS_WR];
break;
case MODE_FIQ:
case MODE_IRQ:
case MODE_SVC:
case MODE_ABORT:
case MODE_UNDEFINED:
case MODE_SYSTEM:
can_write = secure ? miscreg_info[MISCREG_PRI_S_WR] :
miscreg_info[MISCREG_PRI_NS_WR];
break;
case MODE_MON:
can_write = secure ? miscreg_info[MISCREG_MON_NS0_WR] :
miscreg_info[MISCREG_MON_NS1_WR];
break;
case MODE_HYP:
can_write = miscreg_info[MISCREG_HYP_NS_WR];
break;
default:
undefined = true;
}
switch (reg) {
case MISCREG_CNTFRQ ... MISCREG_CNTVOFF:
if (!undefined)
undefined = AArch32isUndefinedGenericTimer(reg, tc);
break;
default:
break;
}
// can't do permissions checkes on the root of a banked pair of regs
assert(!miscreg_info[MISCREG_BANKED]);
return std::make_tuple(can_write, undefined);
}
bool
AArch32isUndefinedGenericTimer(MiscRegIndex reg, ThreadContext *tc)
{
if (currEL(tc) == EL0 && ELIs32(tc, EL1)) {
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
bool trap_cond = condGenericTimerSystemAccessTrapEL1(reg, tc);
if (trap_cond && (!EL2Enabled(tc) || !hcr.tge))
return true;
}
return false;
}
int
snsBankedIndex(MiscRegIndex reg, ThreadContext *tc)
{
SCR scr = tc->readMiscReg(MISCREG_SCR_EL3);
return snsBankedIndex(reg, tc, scr.ns);
}
int
snsBankedIndex(MiscRegIndex reg, ThreadContext *tc, bool ns)
{
int reg_as_int = static_cast<int>(reg);
if (lookUpMiscReg[reg].info[MISCREG_BANKED]) {
reg_as_int += (ArmSystem::haveEL(tc, EL3) &&
!ArmSystem::highestELIs64(tc) && !ns) ? 2 : 1;
}
return reg_as_int;
}
int
snsBankedIndex64(MiscRegIndex reg, ThreadContext *tc)
{
auto *isa = static_cast<ArmISA::ISA *>(tc->getIsaPtr());
SCR scr = tc->readMiscReg(MISCREG_SCR_EL3);
return isa->snsBankedIndex64(reg, scr.ns);
}
/**
* If the reg is a child reg of a banked set, then the parent is the last
* banked one in the list. This is messy, and the wish is to eventually have
* the bitmap replaced with a better data structure. the preUnflatten function
* initializes a lookup table to speed up the search for these banked
* registers.
*/
int unflattenResultMiscReg[NUM_MISCREGS];
void
preUnflattenMiscReg()
{
int reg = -1;
for (int i = 0 ; i < NUM_MISCREGS; i++){
if (lookUpMiscReg[i].info[MISCREG_BANKED])
reg = i;
if (lookUpMiscReg[i].info[MISCREG_BANKED_CHILD])
unflattenResultMiscReg[i] = reg;
else
unflattenResultMiscReg[i] = i;
// if this assert fails, no parent was found, and something is broken
assert(unflattenResultMiscReg[i] > -1);
}
}
int
unflattenMiscReg(int reg)
{
return unflattenResultMiscReg[reg];
}
Fault
checkFaultAccessAArch64SysReg(MiscRegIndex reg, CPSR cpsr,
ThreadContext *tc, const MiscRegOp64 &inst)
{
return lookUpMiscReg[reg].checkFault(tc, inst, currEL(cpsr));
}
std::vector<struct MiscRegLUTEntry> lookUpMiscReg(NUM_MISCREGS);
namespace {
// The map is translating a MiscRegIndex into AArch64 system register
// numbers (op0, op1, crn, crm, op2)
std::unordered_map<MiscRegIndex, MiscRegNum64> idxToMiscRegNum;
// The map is translating AArch64 system register numbers
// (op0, op1, crn, crm, op2) into a MiscRegIndex
std::unordered_map<MiscRegNum64, MiscRegIndex> miscRegNumToIdx{
{ MiscRegNum64(1, 0, 7, 1, 0), MISCREG_IC_IALLUIS },
{ MiscRegNum64(1, 0, 7, 5, 0), MISCREG_IC_IALLU },
{ MiscRegNum64(1, 0, 7, 6, 1), MISCREG_DC_IVAC_Xt },
{ MiscRegNum64(1, 0, 7, 6, 2), MISCREG_DC_ISW_Xt },
{ MiscRegNum64(1, 0, 7, 8, 0), MISCREG_AT_S1E1R_Xt },
{ MiscRegNum64(1, 0, 7, 8, 1), MISCREG_AT_S1E1W_Xt },
{ MiscRegNum64(1, 0, 7, 8, 2), MISCREG_AT_S1E0R_Xt },
{ MiscRegNum64(1, 0, 7, 8, 3), MISCREG_AT_S1E0W_Xt },
{ MiscRegNum64(1, 0, 7, 10, 2), MISCREG_DC_CSW_Xt },
{ MiscRegNum64(1, 0, 7, 14, 2), MISCREG_DC_CISW_Xt },
{ MiscRegNum64(1, 0, 8, 3, 0), MISCREG_TLBI_VMALLE1IS },
{ MiscRegNum64(1, 0, 8, 3, 1), MISCREG_TLBI_VAE1IS_Xt },
{ MiscRegNum64(1, 0, 8, 3, 2), MISCREG_TLBI_ASIDE1IS_Xt },
{ MiscRegNum64(1, 0, 8, 3, 3), MISCREG_TLBI_VAAE1IS_Xt },
{ MiscRegNum64(1, 0, 8, 3, 5), MISCREG_TLBI_VALE1IS_Xt },
{ MiscRegNum64(1, 0, 8, 3, 7), MISCREG_TLBI_VAALE1IS_Xt },
{ MiscRegNum64(1, 0, 8, 7, 0), MISCREG_TLBI_VMALLE1 },
{ MiscRegNum64(1, 0, 8, 7, 1), MISCREG_TLBI_VAE1_Xt },
{ MiscRegNum64(1, 0, 8, 7, 2), MISCREG_TLBI_ASIDE1_Xt },
{ MiscRegNum64(1, 0, 8, 7, 3), MISCREG_TLBI_VAAE1_Xt },
{ MiscRegNum64(1, 0, 8, 7, 5), MISCREG_TLBI_VALE1_Xt },
{ MiscRegNum64(1, 0, 8, 7, 7), MISCREG_TLBI_VAALE1_Xt },
{ MiscRegNum64(1, 3, 7, 4, 1), MISCREG_DC_ZVA_Xt },
{ MiscRegNum64(1, 3, 7, 5, 1), MISCREG_IC_IVAU_Xt },
{ MiscRegNum64(1, 3, 7, 10, 1), MISCREG_DC_CVAC_Xt },
{ MiscRegNum64(1, 3, 7, 11, 1), MISCREG_DC_CVAU_Xt },
{ MiscRegNum64(1, 3, 7, 14, 1), MISCREG_DC_CIVAC_Xt },
{ MiscRegNum64(1, 4, 7, 8, 0), MISCREG_AT_S1E2R_Xt },
{ MiscRegNum64(1, 4, 7, 8, 1), MISCREG_AT_S1E2W_Xt },
{ MiscRegNum64(1, 4, 7, 8, 4), MISCREG_AT_S12E1R_Xt },
{ MiscRegNum64(1, 4, 7, 8, 5), MISCREG_AT_S12E1W_Xt },
{ MiscRegNum64(1, 4, 7, 8, 6), MISCREG_AT_S12E0R_Xt },
{ MiscRegNum64(1, 4, 7, 8, 7), MISCREG_AT_S12E0W_Xt },
{ MiscRegNum64(1, 4, 8, 0, 1), MISCREG_TLBI_IPAS2E1IS_Xt },
{ MiscRegNum64(1, 4, 8, 0, 5), MISCREG_TLBI_IPAS2LE1IS_Xt },
{ MiscRegNum64(1, 4, 8, 3, 0), MISCREG_TLBI_ALLE2IS },
{ MiscRegNum64(1, 4, 8, 3, 1), MISCREG_TLBI_VAE2IS_Xt },
{ MiscRegNum64(1, 4, 8, 3, 4), MISCREG_TLBI_ALLE1IS },
{ MiscRegNum64(1, 4, 8, 3, 5), MISCREG_TLBI_VALE2IS_Xt },
{ MiscRegNum64(1, 4, 8, 3, 6), MISCREG_TLBI_VMALLS12E1IS },
{ MiscRegNum64(1, 4, 8, 4, 1), MISCREG_TLBI_IPAS2E1_Xt },
{ MiscRegNum64(1, 4, 8, 4, 5), MISCREG_TLBI_IPAS2LE1_Xt },
{ MiscRegNum64(1, 4, 8, 7, 0), MISCREG_TLBI_ALLE2 },
{ MiscRegNum64(1, 4, 8, 7, 1), MISCREG_TLBI_VAE2_Xt },
{ MiscRegNum64(1, 4, 8, 7, 4), MISCREG_TLBI_ALLE1 },
{ MiscRegNum64(1, 4, 8, 7, 5), MISCREG_TLBI_VALE2_Xt },
{ MiscRegNum64(1, 4, 8, 7, 6), MISCREG_TLBI_VMALLS12E1 },
{ MiscRegNum64(1, 6, 7, 8, 0), MISCREG_AT_S1E3R_Xt },
{ MiscRegNum64(1, 6, 7, 8, 1), MISCREG_AT_S1E3W_Xt },
{ MiscRegNum64(1, 6, 8, 3, 0), MISCREG_TLBI_ALLE3IS },
{ MiscRegNum64(1, 6, 8, 3, 1), MISCREG_TLBI_VAE3IS_Xt },
{ MiscRegNum64(1, 6, 8, 3, 5), MISCREG_TLBI_VALE3IS_Xt },
{ MiscRegNum64(1, 6, 8, 7, 0), MISCREG_TLBI_ALLE3 },
{ MiscRegNum64(1, 6, 8, 7, 1), MISCREG_TLBI_VAE3_Xt },
{ MiscRegNum64(1, 6, 8, 7, 5), MISCREG_TLBI_VALE3_Xt },
{ MiscRegNum64(2, 0, 0, 0, 2), MISCREG_OSDTRRX_EL1 },
{ MiscRegNum64(2, 0, 0, 0, 4), MISCREG_DBGBVR0_EL1 },
{ MiscRegNum64(2, 0, 0, 0, 5), MISCREG_DBGBCR0_EL1 },
{ MiscRegNum64(2, 0, 0, 0, 6), MISCREG_DBGWVR0_EL1 },
{ MiscRegNum64(2, 0, 0, 0, 7), MISCREG_DBGWCR0_EL1 },
{ MiscRegNum64(2, 0, 0, 1, 4), MISCREG_DBGBVR1_EL1 },
{ MiscRegNum64(2, 0, 0, 1, 5), MISCREG_DBGBCR1_EL1 },
{ MiscRegNum64(2, 0, 0, 1, 6), MISCREG_DBGWVR1_EL1 },
{ MiscRegNum64(2, 0, 0, 1, 7), MISCREG_DBGWCR1_EL1 },
{ MiscRegNum64(2, 0, 0, 2, 0), MISCREG_MDCCINT_EL1 },
{ MiscRegNum64(2, 0, 0, 2, 2), MISCREG_MDSCR_EL1 },
{ MiscRegNum64(2, 0, 0, 2, 4), MISCREG_DBGBVR2_EL1 },
{ MiscRegNum64(2, 0, 0, 2, 5), MISCREG_DBGBCR2_EL1 },
{ MiscRegNum64(2, 0, 0, 2, 6), MISCREG_DBGWVR2_EL1 },
{ MiscRegNum64(2, 0, 0, 2, 7), MISCREG_DBGWCR2_EL1 },
{ MiscRegNum64(2, 0, 0, 3, 2), MISCREG_OSDTRTX_EL1 },
{ MiscRegNum64(2, 0, 0, 3, 4), MISCREG_DBGBVR3_EL1 },
{ MiscRegNum64(2, 0, 0, 3, 5), MISCREG_DBGBCR3_EL1 },
{ MiscRegNum64(2, 0, 0, 3, 6), MISCREG_DBGWVR3_EL1 },
{ MiscRegNum64(2, 0, 0, 3, 7), MISCREG_DBGWCR3_EL1 },
{ MiscRegNum64(2, 0, 0, 4, 4), MISCREG_DBGBVR4_EL1 },
{ MiscRegNum64(2, 0, 0, 4, 5), MISCREG_DBGBCR4_EL1 },
{ MiscRegNum64(2, 0, 0, 4, 6), MISCREG_DBGWVR4_EL1 },
{ MiscRegNum64(2, 0, 0, 4, 7), MISCREG_DBGWCR4_EL1 },
{ MiscRegNum64(2, 0, 0, 5, 4), MISCREG_DBGBVR5_EL1 },
{ MiscRegNum64(2, 0, 0, 5, 5), MISCREG_DBGBCR5_EL1 },
{ MiscRegNum64(2, 0, 0, 5, 6), MISCREG_DBGWVR5_EL1 },
{ MiscRegNum64(2, 0, 0, 5, 7), MISCREG_DBGWCR5_EL1 },
{ MiscRegNum64(2, 0, 0, 6, 2), MISCREG_OSECCR_EL1 },
{ MiscRegNum64(2, 0, 0, 6, 4), MISCREG_DBGBVR6_EL1 },
{ MiscRegNum64(2, 0, 0, 6, 5), MISCREG_DBGBCR6_EL1 },
{ MiscRegNum64(2, 0, 0, 6, 6), MISCREG_DBGWVR6_EL1 },
{ MiscRegNum64(2, 0, 0, 6, 7), MISCREG_DBGWCR6_EL1 },
{ MiscRegNum64(2, 0, 0, 7, 4), MISCREG_DBGBVR7_EL1 },
{ MiscRegNum64(2, 0, 0, 7, 5), MISCREG_DBGBCR7_EL1 },
{ MiscRegNum64(2, 0, 0, 7, 6), MISCREG_DBGWVR7_EL1 },
{ MiscRegNum64(2, 0, 0, 7, 7), MISCREG_DBGWCR7_EL1 },
{ MiscRegNum64(2, 0, 0, 8, 4), MISCREG_DBGBVR8_EL1 },
{ MiscRegNum64(2, 0, 0, 8, 5), MISCREG_DBGBCR8_EL1 },
{ MiscRegNum64(2, 0, 0, 8, 6), MISCREG_DBGWVR8_EL1 },
{ MiscRegNum64(2, 0, 0, 8, 7), MISCREG_DBGWCR8_EL1 },
{ MiscRegNum64(2, 0, 0, 9, 4), MISCREG_DBGBVR9_EL1 },
{ MiscRegNum64(2, 0, 0, 9, 5), MISCREG_DBGBCR9_EL1 },
{ MiscRegNum64(2, 0, 0, 9, 6), MISCREG_DBGWVR9_EL1 },
{ MiscRegNum64(2, 0, 0, 9, 7), MISCREG_DBGWCR9_EL1 },
{ MiscRegNum64(2, 0, 0, 10, 4), MISCREG_DBGBVR10_EL1 },
{ MiscRegNum64(2, 0, 0, 10, 5), MISCREG_DBGBCR10_EL1 },
{ MiscRegNum64(2, 0, 0, 10, 6), MISCREG_DBGWVR10_EL1 },
{ MiscRegNum64(2, 0, 0, 10, 7), MISCREG_DBGWCR10_EL1 },
{ MiscRegNum64(2, 0, 0, 11, 4), MISCREG_DBGBVR11_EL1 },
{ MiscRegNum64(2, 0, 0, 11, 5), MISCREG_DBGBCR11_EL1 },
{ MiscRegNum64(2, 0, 0, 11, 6), MISCREG_DBGWVR11_EL1 },
{ MiscRegNum64(2, 0, 0, 11, 7), MISCREG_DBGWCR11_EL1 },
{ MiscRegNum64(2, 0, 0, 12, 4), MISCREG_DBGBVR12_EL1 },
{ MiscRegNum64(2, 0, 0, 12, 5), MISCREG_DBGBCR12_EL1 },
{ MiscRegNum64(2, 0, 0, 12, 6), MISCREG_DBGWVR12_EL1 },
{ MiscRegNum64(2, 0, 0, 12, 7), MISCREG_DBGWCR12_EL1 },
{ MiscRegNum64(2, 0, 0, 13, 4), MISCREG_DBGBVR13_EL1 },
{ MiscRegNum64(2, 0, 0, 13, 5), MISCREG_DBGBCR13_EL1 },
{ MiscRegNum64(2, 0, 0, 13, 6), MISCREG_DBGWVR13_EL1 },
{ MiscRegNum64(2, 0, 0, 13, 7), MISCREG_DBGWCR13_EL1 },
{ MiscRegNum64(2, 0, 0, 14, 4), MISCREG_DBGBVR14_EL1 },
{ MiscRegNum64(2, 0, 0, 14, 5), MISCREG_DBGBCR14_EL1 },
{ MiscRegNum64(2, 0, 0, 14, 6), MISCREG_DBGWVR14_EL1 },
{ MiscRegNum64(2, 0, 0, 14, 7), MISCREG_DBGWCR14_EL1 },
{ MiscRegNum64(2, 0, 0, 15, 4), MISCREG_DBGBVR15_EL1 },
{ MiscRegNum64(2, 0, 0, 15, 5), MISCREG_DBGBCR15_EL1 },
{ MiscRegNum64(2, 0, 0, 15, 6), MISCREG_DBGWVR15_EL1 },
{ MiscRegNum64(2, 0, 0, 15, 7), MISCREG_DBGWCR15_EL1 },
{ MiscRegNum64(2, 0, 1, 0, 0), MISCREG_MDRAR_EL1 },
{ MiscRegNum64(2, 0, 1, 0, 4), MISCREG_OSLAR_EL1 },
{ MiscRegNum64(2, 0, 1, 1, 4), MISCREG_OSLSR_EL1 },
{ MiscRegNum64(2, 0, 1, 3, 4), MISCREG_OSDLR_EL1 },
{ MiscRegNum64(2, 0, 1, 4, 4), MISCREG_DBGPRCR_EL1 },
{ MiscRegNum64(2, 0, 7, 8, 6), MISCREG_DBGCLAIMSET_EL1 },
{ MiscRegNum64(2, 0, 7, 9, 6), MISCREG_DBGCLAIMCLR_EL1 },
{ MiscRegNum64(2, 0, 7, 14, 6), MISCREG_DBGAUTHSTATUS_EL1 },
{ MiscRegNum64(2, 2, 0, 0, 0), MISCREG_TEECR32_EL1 },
{ MiscRegNum64(2, 2, 1, 0, 0), MISCREG_TEEHBR32_EL1 },
{ MiscRegNum64(2, 3, 0, 1, 0), MISCREG_MDCCSR_EL0 },
{ MiscRegNum64(2, 3, 0, 4, 0), MISCREG_MDDTR_EL0 },
{ MiscRegNum64(2, 3, 0, 5, 0), MISCREG_MDDTRRX_EL0 },
{ MiscRegNum64(2, 4, 0, 7, 0), MISCREG_DBGVCR32_EL2 },
{ MiscRegNum64(3, 0, 0, 0, 0), MISCREG_MIDR_EL1 },
{ MiscRegNum64(3, 0, 0, 0, 5), MISCREG_MPIDR_EL1 },
{ MiscRegNum64(3, 0, 0, 0, 6), MISCREG_REVIDR_EL1 },
{ MiscRegNum64(3, 0, 0, 1, 0), MISCREG_ID_PFR0_EL1 },
{ MiscRegNum64(3, 0, 0, 1, 1), MISCREG_ID_PFR1_EL1 },
{ MiscRegNum64(3, 0, 0, 1, 2), MISCREG_ID_DFR0_EL1 },
{ MiscRegNum64(3, 0, 0, 1, 3), MISCREG_ID_AFR0_EL1 },
{ MiscRegNum64(3, 0, 0, 1, 4), MISCREG_ID_MMFR0_EL1 },
{ MiscRegNum64(3, 0, 0, 1, 5), MISCREG_ID_MMFR1_EL1 },
{ MiscRegNum64(3, 0, 0, 1, 6), MISCREG_ID_MMFR2_EL1 },
{ MiscRegNum64(3, 0, 0, 1, 7), MISCREG_ID_MMFR3_EL1 },
{ MiscRegNum64(3, 0, 0, 2, 0), MISCREG_ID_ISAR0_EL1 },
{ MiscRegNum64(3, 0, 0, 2, 1), MISCREG_ID_ISAR1_EL1 },
{ MiscRegNum64(3, 0, 0, 2, 2), MISCREG_ID_ISAR2_EL1 },
{ MiscRegNum64(3, 0, 0, 2, 3), MISCREG_ID_ISAR3_EL1 },
{ MiscRegNum64(3, 0, 0, 2, 4), MISCREG_ID_ISAR4_EL1 },
{ MiscRegNum64(3, 0, 0, 2, 5), MISCREG_ID_ISAR5_EL1 },
{ MiscRegNum64(3, 0, 0, 2, 6), MISCREG_ID_MMFR4_EL1 },
{ MiscRegNum64(3, 0, 0, 2, 7), MISCREG_ID_ISAR6_EL1 },
{ MiscRegNum64(3, 0, 0, 3, 0), MISCREG_MVFR0_EL1 },
{ MiscRegNum64(3, 0, 0, 3, 1), MISCREG_MVFR1_EL1 },
{ MiscRegNum64(3, 0, 0, 3, 2), MISCREG_MVFR2_EL1 },
{ MiscRegNum64(3, 0, 0, 3, 3), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 3, 4), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 3, 5), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 3, 6), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 3, 7), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 4, 0), MISCREG_ID_AA64PFR0_EL1 },
{ MiscRegNum64(3, 0, 0, 4, 1), MISCREG_ID_AA64PFR1_EL1 },
{ MiscRegNum64(3, 0, 0, 4, 2), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 4, 3), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 4, 4), MISCREG_ID_AA64ZFR0_EL1 },
{ MiscRegNum64(3, 0, 0, 4, 5), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 4, 6), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 4, 7), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 5, 0), MISCREG_ID_AA64DFR0_EL1 },
{ MiscRegNum64(3, 0, 0, 5, 1), MISCREG_ID_AA64DFR1_EL1 },
{ MiscRegNum64(3, 0, 0, 5, 2), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 5, 3), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 5, 4), MISCREG_ID_AA64AFR0_EL1 },
{ MiscRegNum64(3, 0, 0, 5, 5), MISCREG_ID_AA64AFR1_EL1 },
{ MiscRegNum64(3, 0, 0, 5, 6), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 5, 7), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 6, 0), MISCREG_ID_AA64ISAR0_EL1 },
{ MiscRegNum64(3, 0, 0, 6, 1), MISCREG_ID_AA64ISAR1_EL1 },
{ MiscRegNum64(3, 0, 0, 6, 2), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 6, 3), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 6, 4), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 6, 5), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 6, 6), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 6, 7), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 7, 0), MISCREG_ID_AA64MMFR0_EL1 },
{ MiscRegNum64(3, 0, 0, 7, 1), MISCREG_ID_AA64MMFR1_EL1 },
{ MiscRegNum64(3, 0, 0, 7, 2), MISCREG_ID_AA64MMFR2_EL1 },
{ MiscRegNum64(3, 0, 0, 7, 3), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 7, 4), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 7, 5), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 7, 6), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 0, 7, 7), MISCREG_RAZ },
{ MiscRegNum64(3, 0, 1, 0, 0), MISCREG_SCTLR_EL1 },
{ MiscRegNum64(3, 0, 1, 0, 1), MISCREG_ACTLR_EL1 },
{ MiscRegNum64(3, 0, 1, 0, 2), MISCREG_CPACR_EL1 },
{ MiscRegNum64(3, 0, 1, 2, 0), MISCREG_ZCR_EL1 },
{ MiscRegNum64(3, 0, 2, 0, 0), MISCREG_TTBR0_EL1 },
{ MiscRegNum64(3, 0, 2, 0, 1), MISCREG_TTBR1_EL1 },
{ MiscRegNum64(3, 0, 2, 0, 2), MISCREG_TCR_EL1 },
{ MiscRegNum64(3, 0, 2, 1, 0), MISCREG_APIAKeyLo_EL1 },
{ MiscRegNum64(3, 0, 2, 1, 1), MISCREG_APIAKeyHi_EL1 },
{ MiscRegNum64(3, 0, 2, 1, 2), MISCREG_APIBKeyLo_EL1 },
{ MiscRegNum64(3, 0, 2, 1, 3), MISCREG_APIBKeyHi_EL1 },
{ MiscRegNum64(3, 0, 2, 2, 0), MISCREG_APDAKeyLo_EL1 },
{ MiscRegNum64(3, 0, 2, 2, 1), MISCREG_APDAKeyHi_EL1 },
{ MiscRegNum64(3, 0, 2, 2, 2), MISCREG_APDBKeyLo_EL1 },
{ MiscRegNum64(3, 0, 2, 2, 3), MISCREG_APDBKeyHi_EL1 },
{ MiscRegNum64(3, 0, 2, 3, 0), MISCREG_APGAKeyLo_EL1 },
{ MiscRegNum64(3, 0, 2, 3, 1), MISCREG_APGAKeyHi_EL1 },
{ MiscRegNum64(3, 0, 4, 0, 0), MISCREG_SPSR_EL1 },
{ MiscRegNum64(3, 0, 4, 0, 1), MISCREG_ELR_EL1 },
{ MiscRegNum64(3, 0, 4, 1, 0), MISCREG_SP_EL0 },
{ MiscRegNum64(3, 0, 4, 2, 0), MISCREG_SPSEL },
{ MiscRegNum64(3, 0, 4, 2, 2), MISCREG_CURRENTEL },
{ MiscRegNum64(3, 0, 4, 2, 3), MISCREG_PAN },
{ MiscRegNum64(3, 0, 4, 2, 4), MISCREG_UAO },
{ MiscRegNum64(3, 0, 4, 6, 0), MISCREG_ICC_PMR_EL1 },
{ MiscRegNum64(3, 0, 5, 1, 0), MISCREG_AFSR0_EL1 },
{ MiscRegNum64(3, 0, 5, 1, 1), MISCREG_AFSR1_EL1 },
{ MiscRegNum64(3, 0, 5, 2, 0), MISCREG_ESR_EL1 },
{ MiscRegNum64(3, 0, 5, 3, 0), MISCREG_ERRIDR_EL1 },
{ MiscRegNum64(3, 0, 5, 3, 1), MISCREG_ERRSELR_EL1 },
{ MiscRegNum64(3, 0, 5, 4, 0), MISCREG_ERXFR_EL1 },
{ MiscRegNum64(3, 0, 5, 4, 1), MISCREG_ERXCTLR_EL1 },
{ MiscRegNum64(3, 0, 5, 4, 2), MISCREG_ERXSTATUS_EL1 },
{ MiscRegNum64(3, 0, 5, 4, 3), MISCREG_ERXADDR_EL1 },
{ MiscRegNum64(3, 0, 5, 5, 0), MISCREG_ERXMISC0_EL1 },
{ MiscRegNum64(3, 0, 5, 5, 1), MISCREG_ERXMISC1_EL1 },
{ MiscRegNum64(3, 0, 6, 0, 0), MISCREG_FAR_EL1 },
{ MiscRegNum64(3, 0, 7, 4, 0), MISCREG_PAR_EL1 },
{ MiscRegNum64(3, 0, 9, 14, 1), MISCREG_PMINTENSET_EL1 },
{ MiscRegNum64(3, 0, 9, 14, 2), MISCREG_PMINTENCLR_EL1 },
{ MiscRegNum64(3, 0, 10, 2, 0), MISCREG_MAIR_EL1 },
{ MiscRegNum64(3, 0, 10, 3, 0), MISCREG_AMAIR_EL1 },
{ MiscRegNum64(3, 0, 12, 0, 0), MISCREG_VBAR_EL1 },
{ MiscRegNum64(3, 0, 12, 0, 1), MISCREG_RVBAR_EL1 },
{ MiscRegNum64(3, 0, 12, 1, 0), MISCREG_ISR_EL1 },
{ MiscRegNum64(3, 0, 12, 1, 1), MISCREG_DISR_EL1 },
{ MiscRegNum64(3, 0, 12, 8, 0), MISCREG_ICC_IAR0_EL1 },
{ MiscRegNum64(3, 0, 12, 8, 1), MISCREG_ICC_EOIR0_EL1 },
{ MiscRegNum64(3, 0, 12, 8, 2), MISCREG_ICC_HPPIR0_EL1 },
{ MiscRegNum64(3, 0, 12, 8, 3), MISCREG_ICC_BPR0_EL1 },
{ MiscRegNum64(3, 0, 12, 8, 4), MISCREG_ICC_AP0R0_EL1 },
{ MiscRegNum64(3, 0, 12, 8, 5), MISCREG_ICC_AP0R1_EL1 },
{ MiscRegNum64(3, 0, 12, 8, 6), MISCREG_ICC_AP0R2_EL1 },
{ MiscRegNum64(3, 0, 12, 8, 7), MISCREG_ICC_AP0R3_EL1 },
{ MiscRegNum64(3, 0, 12, 9, 0), MISCREG_ICC_AP1R0_EL1 },
{ MiscRegNum64(3, 0, 12, 9, 1), MISCREG_ICC_AP1R1_EL1 },
{ MiscRegNum64(3, 0, 12, 9, 2), MISCREG_ICC_AP1R2_EL1 },
{ MiscRegNum64(3, 0, 12, 9, 3), MISCREG_ICC_AP1R3_EL1 },
{ MiscRegNum64(3, 0, 12, 11, 1), MISCREG_ICC_DIR_EL1 },
{ MiscRegNum64(3, 0, 12, 11, 3), MISCREG_ICC_RPR_EL1 },
{ MiscRegNum64(3, 0, 12, 11, 5), MISCREG_ICC_SGI1R_EL1 },
{ MiscRegNum64(3, 0, 12, 11, 6), MISCREG_ICC_ASGI1R_EL1 },
{ MiscRegNum64(3, 0, 12, 11, 7), MISCREG_ICC_SGI0R_EL1 },
{ MiscRegNum64(3, 0, 12, 12, 0), MISCREG_ICC_IAR1_EL1 },
{ MiscRegNum64(3, 0, 12, 12, 1), MISCREG_ICC_EOIR1_EL1 },
{ MiscRegNum64(3, 0, 12, 12, 2), MISCREG_ICC_HPPIR1_EL1 },
{ MiscRegNum64(3, 0, 12, 12, 3), MISCREG_ICC_BPR1_EL1 },
{ MiscRegNum64(3, 0, 12, 12, 4), MISCREG_ICC_CTLR_EL1 },
{ MiscRegNum64(3, 0, 12, 12, 5), MISCREG_ICC_SRE_EL1 },
{ MiscRegNum64(3, 0, 12, 12, 6), MISCREG_ICC_IGRPEN0_EL1 },
{ MiscRegNum64(3, 0, 12, 12, 7), MISCREG_ICC_IGRPEN1_EL1 },
{ MiscRegNum64(3, 0, 13, 0, 1), MISCREG_CONTEXTIDR_EL1 },
{ MiscRegNum64(3, 0, 13, 0, 4), MISCREG_TPIDR_EL1 },
{ MiscRegNum64(3, 0, 14, 1, 0), MISCREG_CNTKCTL_EL1 },
{ MiscRegNum64(3, 0, 15, 0, 0), MISCREG_IL1DATA0_EL1 },
{ MiscRegNum64(3, 0, 15, 0, 1), MISCREG_IL1DATA1_EL1 },
{ MiscRegNum64(3, 0, 15, 0, 2), MISCREG_IL1DATA2_EL1 },
{ MiscRegNum64(3, 0, 15, 0, 3), MISCREG_IL1DATA3_EL1 },
{ MiscRegNum64(3, 0, 15, 1, 0), MISCREG_DL1DATA0_EL1 },
{ MiscRegNum64(3, 0, 15, 1, 1), MISCREG_DL1DATA1_EL1 },
{ MiscRegNum64(3, 0, 15, 1, 2), MISCREG_DL1DATA2_EL1 },
{ MiscRegNum64(3, 0, 15, 1, 3), MISCREG_DL1DATA3_EL1 },
{ MiscRegNum64(3, 0, 15, 1, 4), MISCREG_DL1DATA4_EL1 },
{ MiscRegNum64(3, 1, 0, 0, 0), MISCREG_CCSIDR_EL1 },
{ MiscRegNum64(3, 1, 0, 0, 1), MISCREG_CLIDR_EL1 },
{ MiscRegNum64(3, 1, 0, 0, 7), MISCREG_AIDR_EL1 },
{ MiscRegNum64(3, 1, 11, 0, 2), MISCREG_L2CTLR_EL1 },
{ MiscRegNum64(3, 1, 11, 0, 3), MISCREG_L2ECTLR_EL1 },
{ MiscRegNum64(3, 1, 15, 0, 0), MISCREG_L2ACTLR_EL1 },
{ MiscRegNum64(3, 1, 15, 2, 0), MISCREG_CPUACTLR_EL1 },
{ MiscRegNum64(3, 1, 15, 2, 1), MISCREG_CPUECTLR_EL1 },
{ MiscRegNum64(3, 1, 15, 2, 2), MISCREG_CPUMERRSR_EL1 },
{ MiscRegNum64(3, 1, 15, 2, 3), MISCREG_L2MERRSR_EL1 },
{ MiscRegNum64(3, 1, 15, 3, 0), MISCREG_CBAR_EL1 },
{ MiscRegNum64(3, 2, 0, 0, 0), MISCREG_CSSELR_EL1 },
{ MiscRegNum64(3, 3, 0, 0, 1), MISCREG_CTR_EL0 },
{ MiscRegNum64(3, 3, 0, 0, 7), MISCREG_DCZID_EL0 },
{ MiscRegNum64(3, 3, 4, 2, 0), MISCREG_NZCV },
{ MiscRegNum64(3, 3, 4, 2, 1), MISCREG_DAIF },
{ MiscRegNum64(3, 3, 4, 4, 0), MISCREG_FPCR },
{ MiscRegNum64(3, 3, 4, 4, 1), MISCREG_FPSR },
{ MiscRegNum64(3, 3, 4, 5, 0), MISCREG_DSPSR_EL0 },
{ MiscRegNum64(3, 3, 4, 5, 1), MISCREG_DLR_EL0 },
{ MiscRegNum64(3, 3, 9, 12, 0), MISCREG_PMCR_EL0 },
{ MiscRegNum64(3, 3, 9, 12, 1), MISCREG_PMCNTENSET_EL0 },
{ MiscRegNum64(3, 3, 9, 12, 2), MISCREG_PMCNTENCLR_EL0 },
{ MiscRegNum64(3, 3, 9, 12, 3), MISCREG_PMOVSCLR_EL0 },
{ MiscRegNum64(3, 3, 9, 12, 4), MISCREG_PMSWINC_EL0 },
{ MiscRegNum64(3, 3, 9, 12, 5), MISCREG_PMSELR_EL0 },
{ MiscRegNum64(3, 3, 9, 12, 6), MISCREG_PMCEID0_EL0 },
{ MiscRegNum64(3, 3, 9, 12, 7), MISCREG_PMCEID1_EL0 },
{ MiscRegNum64(3, 3, 9, 13, 0), MISCREG_PMCCNTR_EL0 },
{ MiscRegNum64(3, 3, 9, 13, 1), MISCREG_PMXEVTYPER_EL0 },
{ MiscRegNum64(3, 3, 9, 13, 2), MISCREG_PMXEVCNTR_EL0 },
{ MiscRegNum64(3, 3, 9, 14, 0), MISCREG_PMUSERENR_EL0 },
{ MiscRegNum64(3, 3, 9, 14, 3), MISCREG_PMOVSSET_EL0 },
{ MiscRegNum64(3, 3, 13, 0, 2), MISCREG_TPIDR_EL0 },
{ MiscRegNum64(3, 3, 13, 0, 3), MISCREG_TPIDRRO_EL0 },
{ MiscRegNum64(3, 3, 14, 0, 0), MISCREG_CNTFRQ_EL0 },
{ MiscRegNum64(3, 3, 14, 0, 1), MISCREG_CNTPCT_EL0 },
{ MiscRegNum64(3, 3, 14, 0, 2), MISCREG_CNTVCT_EL0 },
{ MiscRegNum64(3, 3, 14, 2, 0), MISCREG_CNTP_TVAL_EL0 },
{ MiscRegNum64(3, 3, 14, 2, 1), MISCREG_CNTP_CTL_EL0 },
{ MiscRegNum64(3, 3, 14, 2, 2), MISCREG_CNTP_CVAL_EL0 },
{ MiscRegNum64(3, 3, 14, 3, 0), MISCREG_CNTV_TVAL_EL0 },
{ MiscRegNum64(3, 3, 14, 3, 1), MISCREG_CNTV_CTL_EL0 },
{ MiscRegNum64(3, 3, 14, 3, 2), MISCREG_CNTV_CVAL_EL0 },
{ MiscRegNum64(3, 3, 14, 8, 0), MISCREG_PMEVCNTR0_EL0 },
{ MiscRegNum64(3, 3, 14, 8, 1), MISCREG_PMEVCNTR1_EL0 },
{ MiscRegNum64(3, 3, 14, 8, 2), MISCREG_PMEVCNTR2_EL0 },
{ MiscRegNum64(3, 3, 14, 8, 3), MISCREG_PMEVCNTR3_EL0 },
{ MiscRegNum64(3, 3, 14, 8, 4), MISCREG_PMEVCNTR4_EL0 },
{ MiscRegNum64(3, 3, 14, 8, 5), MISCREG_PMEVCNTR5_EL0 },
{ MiscRegNum64(3, 3, 14, 12, 0), MISCREG_PMEVTYPER0_EL0 },
{ MiscRegNum64(3, 3, 14, 12, 1), MISCREG_PMEVTYPER1_EL0 },
{ MiscRegNum64(3, 3, 14, 12, 2), MISCREG_PMEVTYPER2_EL0 },
{ MiscRegNum64(3, 3, 14, 12, 3), MISCREG_PMEVTYPER3_EL0 },
{ MiscRegNum64(3, 3, 14, 12, 4), MISCREG_PMEVTYPER4_EL0 },
{ MiscRegNum64(3, 3, 14, 12, 5), MISCREG_PMEVTYPER5_EL0 },
{ MiscRegNum64(3, 3, 14, 15, 7), MISCREG_PMCCFILTR_EL0 },
{ MiscRegNum64(3, 4, 0, 0, 0), MISCREG_VPIDR_EL2 },
{ MiscRegNum64(3, 4, 0, 0, 5), MISCREG_VMPIDR_EL2 },
{ MiscRegNum64(3, 4, 1, 0, 0), MISCREG_SCTLR_EL2 },
{ MiscRegNum64(3, 4, 1, 0, 1), MISCREG_ACTLR_EL2 },
{ MiscRegNum64(3, 4, 1, 1, 0), MISCREG_HCR_EL2 },
{ MiscRegNum64(3, 4, 1, 1, 1), MISCREG_MDCR_EL2 },
{ MiscRegNum64(3, 4, 1, 1, 2), MISCREG_CPTR_EL2 },
{ MiscRegNum64(3, 4, 1, 1, 3), MISCREG_HSTR_EL2 },
{ MiscRegNum64(3, 4, 1, 1, 7), MISCREG_HACR_EL2 },
{ MiscRegNum64(3, 4, 1, 2, 0), MISCREG_ZCR_EL2 },
{ MiscRegNum64(3, 4, 2, 0, 0), MISCREG_TTBR0_EL2 },
{ MiscRegNum64(3, 4, 2, 0, 1), MISCREG_TTBR1_EL2 },
{ MiscRegNum64(3, 4, 2, 0, 2), MISCREG_TCR_EL2 },
{ MiscRegNum64(3, 4, 2, 1, 0), MISCREG_VTTBR_EL2 },
{ MiscRegNum64(3, 4, 2, 1, 2), MISCREG_VTCR_EL2 },
{ MiscRegNum64(3, 4, 2, 6, 0), MISCREG_VSTTBR_EL2 },
{ MiscRegNum64(3, 4, 2, 6, 2), MISCREG_VSTCR_EL2 },
{ MiscRegNum64(3, 4, 3, 0, 0), MISCREG_DACR32_EL2 },
{ MiscRegNum64(3, 4, 4, 0, 0), MISCREG_SPSR_EL2 },
{ MiscRegNum64(3, 4, 4, 0, 1), MISCREG_ELR_EL2 },
{ MiscRegNum64(3, 4, 4, 1, 0), MISCREG_SP_EL1 },
{ MiscRegNum64(3, 4, 4, 3, 0), MISCREG_SPSR_IRQ_AA64 },
{ MiscRegNum64(3, 4, 4, 3, 1), MISCREG_SPSR_ABT_AA64 },
{ MiscRegNum64(3, 4, 4, 3, 2), MISCREG_SPSR_UND_AA64 },
{ MiscRegNum64(3, 4, 4, 3, 3), MISCREG_SPSR_FIQ_AA64 },
{ MiscRegNum64(3, 4, 5, 0, 1), MISCREG_IFSR32_EL2 },
{ MiscRegNum64(3, 4, 5, 1, 0), MISCREG_AFSR0_EL2 },
{ MiscRegNum64(3, 4, 5, 1, 1), MISCREG_AFSR1_EL2 },
{ MiscRegNum64(3, 4, 5, 2, 0), MISCREG_ESR_EL2 },
{ MiscRegNum64(3, 4, 5, 2, 3), MISCREG_VSESR_EL2 },
{ MiscRegNum64(3, 4, 5, 3, 0), MISCREG_FPEXC32_EL2 },
{ MiscRegNum64(3, 4, 6, 0, 0), MISCREG_FAR_EL2 },
{ MiscRegNum64(3, 4, 6, 0, 4), MISCREG_HPFAR_EL2 },
{ MiscRegNum64(3, 4, 10, 2, 0), MISCREG_MAIR_EL2 },
{ MiscRegNum64(3, 4, 10, 3, 0), MISCREG_AMAIR_EL2 },
{ MiscRegNum64(3, 4, 12, 0, 0), MISCREG_VBAR_EL2 },
{ MiscRegNum64(3, 4, 12, 0, 1), MISCREG_RVBAR_EL2 },
{ MiscRegNum64(3, 4, 12, 1, 1), MISCREG_VDISR_EL2 },
{ MiscRegNum64(3, 4, 12, 8, 0), MISCREG_ICH_AP0R0_EL2 },
{ MiscRegNum64(3, 4, 12, 8, 1), MISCREG_ICH_AP0R1_EL2 },
{ MiscRegNum64(3, 4, 12, 8, 2), MISCREG_ICH_AP0R2_EL2 },
{ MiscRegNum64(3, 4, 12, 8, 3), MISCREG_ICH_AP0R3_EL2 },
{ MiscRegNum64(3, 4, 12, 9, 0), MISCREG_ICH_AP1R0_EL2 },
{ MiscRegNum64(3, 4, 12, 9, 1), MISCREG_ICH_AP1R1_EL2 },
{ MiscRegNum64(3, 4, 12, 9, 2), MISCREG_ICH_AP1R2_EL2 },
{ MiscRegNum64(3, 4, 12, 9, 3), MISCREG_ICH_AP1R3_EL2 },
{ MiscRegNum64(3, 4, 12, 9, 5), MISCREG_ICC_SRE_EL2 },
{ MiscRegNum64(3, 4, 12, 11, 0), MISCREG_ICH_HCR_EL2 },
{ MiscRegNum64(3, 4, 12, 11, 1), MISCREG_ICH_VTR_EL2 },
{ MiscRegNum64(3, 4, 12, 11, 2), MISCREG_ICH_MISR_EL2 },
{ MiscRegNum64(3, 4, 12, 11, 3), MISCREG_ICH_EISR_EL2 },
{ MiscRegNum64(3, 4, 12, 11, 5), MISCREG_ICH_ELRSR_EL2 },
{ MiscRegNum64(3, 4, 12, 11, 7), MISCREG_ICH_VMCR_EL2 },
{ MiscRegNum64(3, 4, 12, 12, 0), MISCREG_ICH_LR0_EL2 },
{ MiscRegNum64(3, 4, 12, 12, 1), MISCREG_ICH_LR1_EL2 },
{ MiscRegNum64(3, 4, 12, 12, 2), MISCREG_ICH_LR2_EL2 },
{ MiscRegNum64(3, 4, 12, 12, 3), MISCREG_ICH_LR3_EL2 },
{ MiscRegNum64(3, 4, 12, 12, 4), MISCREG_ICH_LR4_EL2 },
{ MiscRegNum64(3, 4, 12, 12, 5), MISCREG_ICH_LR5_EL2 },
{ MiscRegNum64(3, 4, 12, 12, 6), MISCREG_ICH_LR6_EL2 },
{ MiscRegNum64(3, 4, 12, 12, 7), MISCREG_ICH_LR7_EL2 },
{ MiscRegNum64(3, 4, 12, 13, 0), MISCREG_ICH_LR8_EL2 },
{ MiscRegNum64(3, 4, 12, 13, 1), MISCREG_ICH_LR9_EL2 },
{ MiscRegNum64(3, 4, 12, 13, 2), MISCREG_ICH_LR10_EL2 },
{ MiscRegNum64(3, 4, 12, 13, 3), MISCREG_ICH_LR11_EL2 },
{ MiscRegNum64(3, 4, 12, 13, 4), MISCREG_ICH_LR12_EL2 },
{ MiscRegNum64(3, 4, 12, 13, 5), MISCREG_ICH_LR13_EL2 },
{ MiscRegNum64(3, 4, 12, 13, 6), MISCREG_ICH_LR14_EL2 },
{ MiscRegNum64(3, 4, 12, 13, 7), MISCREG_ICH_LR15_EL2 },
{ MiscRegNum64(3, 4, 13, 0, 1), MISCREG_CONTEXTIDR_EL2 },
{ MiscRegNum64(3, 4, 13, 0, 2), MISCREG_TPIDR_EL2 },
{ MiscRegNum64(3, 4, 14, 0, 3), MISCREG_CNTVOFF_EL2 },
{ MiscRegNum64(3, 4, 14, 1, 0), MISCREG_CNTHCTL_EL2 },
{ MiscRegNum64(3, 4, 14, 2, 0), MISCREG_CNTHP_TVAL_EL2 },
{ MiscRegNum64(3, 4, 14, 2, 1), MISCREG_CNTHP_CTL_EL2 },
{ MiscRegNum64(3, 4, 14, 2, 2), MISCREG_CNTHP_CVAL_EL2 },
{ MiscRegNum64(3, 4, 14, 3, 0), MISCREG_CNTHV_TVAL_EL2 },
{ MiscRegNum64(3, 4, 14, 3, 1), MISCREG_CNTHV_CTL_EL2 },
{ MiscRegNum64(3, 4, 14, 3, 2), MISCREG_CNTHV_CVAL_EL2 },
{ MiscRegNum64(3, 4, 14, 4, 0), MISCREG_CNTHVS_TVAL_EL2 },
{ MiscRegNum64(3, 4, 14, 4, 1), MISCREG_CNTHVS_CTL_EL2 },
{ MiscRegNum64(3, 4, 14, 4, 2), MISCREG_CNTHVS_CVAL_EL2 },
{ MiscRegNum64(3, 4, 14, 5, 0), MISCREG_CNTHPS_TVAL_EL2 },
{ MiscRegNum64(3, 4, 14, 5, 1), MISCREG_CNTHPS_CTL_EL2 },
{ MiscRegNum64(3, 4, 14, 5, 2), MISCREG_CNTHPS_CVAL_EL2 },
{ MiscRegNum64(3, 5, 1, 0, 0), MISCREG_SCTLR_EL12 },
{ MiscRegNum64(3, 5, 1, 0, 2), MISCREG_CPACR_EL12 },
{ MiscRegNum64(3, 5, 1, 2, 0), MISCREG_ZCR_EL12 },
{ MiscRegNum64(3, 5, 2, 0, 0), MISCREG_TTBR0_EL12 },
{ MiscRegNum64(3, 5, 2, 0, 1), MISCREG_TTBR1_EL12 },
{ MiscRegNum64(3, 5, 2, 0, 2), MISCREG_TCR_EL12 },
{ MiscRegNum64(3, 5, 4, 0, 0), MISCREG_SPSR_EL12 },
{ MiscRegNum64(3, 5, 4, 0, 1), MISCREG_ELR_EL12 },
{ MiscRegNum64(3, 5, 5, 1, 0), MISCREG_AFSR0_EL12 },
{ MiscRegNum64(3, 5, 5, 1, 1), MISCREG_AFSR1_EL12 },
{ MiscRegNum64(3, 5, 5, 2, 0), MISCREG_ESR_EL12 },
{ MiscRegNum64(3, 5, 6, 0, 0), MISCREG_FAR_EL12 },
{ MiscRegNum64(3, 5, 10, 2, 0), MISCREG_MAIR_EL12 },
{ MiscRegNum64(3, 5, 10, 3, 0), MISCREG_AMAIR_EL12 },
{ MiscRegNum64(3, 5, 12, 0, 0), MISCREG_VBAR_EL12 },
{ MiscRegNum64(3, 5, 13, 0, 1), MISCREG_CONTEXTIDR_EL12 },
{ MiscRegNum64(3, 5, 14, 1, 0), MISCREG_CNTKCTL_EL12 },
{ MiscRegNum64(3, 5, 14, 2, 0), MISCREG_CNTP_TVAL_EL02 },
{ MiscRegNum64(3, 5, 14, 2, 1), MISCREG_CNTP_CTL_EL02 },
{ MiscRegNum64(3, 5, 14, 2, 2), MISCREG_CNTP_CVAL_EL02 },
{ MiscRegNum64(3, 5, 14, 3, 0), MISCREG_CNTV_TVAL_EL02 },
{ MiscRegNum64(3, 5, 14, 3, 1), MISCREG_CNTV_CTL_EL02 },
{ MiscRegNum64(3, 5, 14, 3, 2), MISCREG_CNTV_CVAL_EL02 },
{ MiscRegNum64(3, 6, 1, 0, 0), MISCREG_SCTLR_EL3 },
{ MiscRegNum64(3, 6, 1, 0, 1), MISCREG_ACTLR_EL3 },
{ MiscRegNum64(3, 6, 1, 1, 0), MISCREG_SCR_EL3 },
{ MiscRegNum64(3, 6, 1, 1, 1), MISCREG_SDER32_EL3 },
{ MiscRegNum64(3, 6, 1, 1, 2), MISCREG_CPTR_EL3 },
{ MiscRegNum64(3, 6, 1, 2, 0), MISCREG_ZCR_EL3 },
{ MiscRegNum64(3, 6, 1, 3, 1), MISCREG_MDCR_EL3 },
{ MiscRegNum64(3, 6, 2, 0, 0), MISCREG_TTBR0_EL3 },
{ MiscRegNum64(3, 6, 2, 0, 2), MISCREG_TCR_EL3 },
{ MiscRegNum64(3, 6, 4, 0, 0), MISCREG_SPSR_EL3 },
{ MiscRegNum64(3, 6, 4, 0, 1), MISCREG_ELR_EL3 },
{ MiscRegNum64(3, 6, 4, 1, 0), MISCREG_SP_EL2 },
{ MiscRegNum64(3, 6, 5, 1, 0), MISCREG_AFSR0_EL3 },
{ MiscRegNum64(3, 6, 5, 1, 1), MISCREG_AFSR1_EL3 },
{ MiscRegNum64(3, 6, 5, 2, 0), MISCREG_ESR_EL3 },
{ MiscRegNum64(3, 6, 6, 0, 0), MISCREG_FAR_EL3 },
{ MiscRegNum64(3, 6, 10, 2, 0), MISCREG_MAIR_EL3 },
{ MiscRegNum64(3, 6, 10, 3, 0), MISCREG_AMAIR_EL3 },
{ MiscRegNum64(3, 6, 12, 0, 0), MISCREG_VBAR_EL3 },
{ MiscRegNum64(3, 6, 12, 0, 1), MISCREG_RVBAR_EL3 },
{ MiscRegNum64(3, 6, 12, 0, 2), MISCREG_RMR_EL3 },
{ MiscRegNum64(3, 6, 12, 12, 4), MISCREG_ICC_CTLR_EL3 },
{ MiscRegNum64(3, 6, 12, 12, 5), MISCREG_ICC_SRE_EL3 },
{ MiscRegNum64(3, 6, 12, 12, 7), MISCREG_ICC_IGRPEN1_EL3 },
{ MiscRegNum64(3, 6, 13, 0, 2), MISCREG_TPIDR_EL3 },
{ MiscRegNum64(3, 7, 14, 2, 0), MISCREG_CNTPS_TVAL_EL1 },
{ MiscRegNum64(3, 7, 14, 2, 1), MISCREG_CNTPS_CTL_EL1 },
{ MiscRegNum64(3, 7, 14, 2, 2), MISCREG_CNTPS_CVAL_EL1 }
};
Fault
faultSpEL0(const MiscRegLUTEntry &entry, ThreadContext *tc,
const MiscRegOp64 &inst)
{
if (tc->readMiscReg(MISCREG_SPSEL) == 0)
return inst.undefined();
else
return NoFault;
}
Fault
faultDaif(const MiscRegLUTEntry &entry, ThreadContext *tc,
const MiscRegOp64 &inst)
{
const bool el2_enabled = EL2Enabled(tc);
const HCR hcr = tc->readMiscRegNoEffect(MISCREG_HCR_EL2);
const SCTLR sctlr = tc->readMiscRegNoEffect(MISCREG_SCTLR_EL1);
if ((el2_enabled && hcr.e2h && hcr.tge) || sctlr.uma == 0) {
if (el2_enabled && hcr.tge) {
return inst.generateTrap(EL2);
} else {
return inst.generateTrap(EL1);
}
} else {
return NoFault;
}
}
Fault
faultDczvaEL0(const MiscRegLUTEntry &entry, ThreadContext *tc,
const MiscRegOp64 &inst)
{
if (!FullSystem)
return NoFault;
const SCTLR sctlr = tc->readMiscRegNoEffect(MISCREG_SCTLR_EL1);
const SCTLR sctlr2 = tc->readMiscRegNoEffect(MISCREG_SCTLR_EL2);
const HCR hcr = tc->readMiscRegNoEffect(MISCREG_HCR_EL2);
const bool el2_enabled = EL2Enabled(tc);
const bool in_host = hcr.e2h && hcr.tge;
if (!(el2_enabled && in_host) && !sctlr.dze) {
if (el2_enabled && hcr.tge) {
return inst.generateTrap(EL2);
} else {
return inst.generateTrap(EL1);
}
} else if (el2_enabled && !in_host && hcr.tdz) {
return inst.generateTrap(EL2);
} else if (el2_enabled && in_host && !sctlr2.dze) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultCvacEL0(const MiscRegLUTEntry &entry, ThreadContext *tc,
const MiscRegOp64 &inst)
{
const SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR_EL1);
const SCTLR sctlr2 = tc->readMiscReg(MISCREG_SCTLR_EL2);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool el2_enabled = EL2Enabled(tc);
const bool in_host = hcr.e2h && hcr.tge;
if (!(el2_enabled && in_host) && !sctlr.uci) {
if (el2_enabled && hcr.tge) {
return inst.generateTrap(EL2);
} else {
return inst.generateTrap(EL1);
}
} else if (el2_enabled && !in_host && hcr.tpc) {
return inst.generateTrap(EL2);
} else if (el2_enabled && in_host && !sctlr2.uci) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultFpcrEL0(const MiscRegLUTEntry &entry, ThreadContext *tc,
const MiscRegOp64 &inst)
{
const CPACR cpacr = tc->readMiscReg(MISCREG_CPACR_EL1);
const CPTR cptr_el2 = tc->readMiscReg(MISCREG_CPTR_EL2);
const CPTR cptr_el3 = tc->readMiscReg(MISCREG_CPTR_EL3);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool el2_enabled = EL2Enabled(tc);
const bool in_host = hcr.e2h && hcr.tge;
if (!(el2_enabled && in_host) && cpacr.fpen != 0b11) {
if (el2_enabled && hcr.tge) {
return inst.generateTrap(EL2, ExceptionClass::UNKNOWN, inst.iss());
} else {
return inst.generateTrap(EL1,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
}
} else if (el2_enabled && in_host && cptr_el2.fpen != 0b11) {
return inst.generateTrap(EL2,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
} else if (el2_enabled && hcr.e2h && ((cptr_el2.fpen & 0b1) == 0b0)) {
return inst.generateTrap(EL2,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
} else if (el2_enabled && !hcr.e2h && cptr_el2.tfp) {
return inst.generateTrap(EL2,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
} else if (ArmSystem::haveEL(tc, EL3) && cptr_el3.tfp) {
return inst.generateTrap(EL3,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
} else {
return NoFault;
}
}
Fault
faultFpcrEL1(const MiscRegLUTEntry &entry, ThreadContext *tc,
const MiscRegOp64 &inst)
{
const CPACR cpacr = tc->readMiscReg(MISCREG_CPACR_EL1);
const CPTR cptr_el2 = tc->readMiscReg(MISCREG_CPTR_EL2);
const CPTR cptr_el3 = tc->readMiscReg(MISCREG_CPTR_EL3);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool el2_enabled = EL2Enabled(tc);
if ((cpacr.fpen & 0b1) == 0b0) {
return inst.generateTrap(EL1,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
} else if (el2_enabled && !hcr.e2h && cptr_el2.tfp) {
return inst.generateTrap(EL2,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
} else if (el2_enabled && hcr.e2h && ((cptr_el2.fpen & 0b1) == 0b0)) {
return inst.generateTrap(EL2,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
} else if (ArmSystem::haveEL(tc, EL3) && cptr_el3.tfp) {
return inst.generateTrap(EL3,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
} else {
return NoFault;
}
}
Fault
faultFpcrEL2(const MiscRegLUTEntry &entry, ThreadContext *tc,
const MiscRegOp64 &inst)
{
const CPTR cptr_el2 = tc->readMiscReg(MISCREG_CPTR_EL2);
const CPTR cptr_el3 = tc->readMiscReg(MISCREG_CPTR_EL3);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
if (!hcr.e2h && cptr_el2.tfp) {
return inst.generateTrap(EL2,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
} else if (hcr.e2h && ((cptr_el2.fpen & 0b1) == 0b0)) {
return inst.generateTrap(EL2,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
} else if (ArmSystem::haveEL(tc, EL3) && cptr_el3.tfp) {
return inst.generateTrap(EL3,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
} else {
return NoFault;
}
}
Fault
faultFpcrEL3(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const CPTR cptr_el3 = tc->readMiscReg(MISCREG_CPTR_EL3);
if (cptr_el3.tfp) {
return inst.generateTrap(EL3,
ExceptionClass::TRAPPED_SIMD_FP, 0x1E00000);
} else {
return NoFault;
}
}
Fault
faultPouEL0(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR_EL1);
const SCTLR sctlr2 = tc->readMiscReg(MISCREG_SCTLR_EL2);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool el2_enabled = EL2Enabled(tc);
const bool in_host = hcr.e2h && hcr.tge;
if (!(el2_enabled && in_host) && !sctlr.uci) {
if (el2_enabled && hcr.tge) {
return inst.generateTrap(EL2);
} else {
return inst.generateTrap(EL1);
}
} else if (el2_enabled && !in_host && hcr.tpu) {
return inst.generateTrap(EL2);
} else if (el2_enabled && !in_host && hcr.tocu) {
return inst.generateTrap(EL2);
} else if (el2_enabled && in_host && !sctlr2.uci) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultPouEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool el2_enabled = EL2Enabled(tc);
if (el2_enabled && hcr.tpu) {
return inst.generateTrap(EL2);
} else if (el2_enabled && hcr.tocu) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultPouIsEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool el2_enabled = EL2Enabled(tc);
if (el2_enabled && hcr.tpu) {
return inst.generateTrap(EL2);
} else if (el2_enabled && hcr.ticab) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultCtrEL0(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const SCTLR sctlr = tc->readMiscReg(MISCREG_SCTLR_EL1);
const SCTLR sctlr2 = tc->readMiscReg(MISCREG_SCTLR_EL2);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool el2_enabled = EL2Enabled(tc);
const bool in_host = hcr.e2h && hcr.tge;
if (!(el2_enabled && in_host) && !sctlr.uct) {
if (el2_enabled && hcr.tge) {
return inst.generateTrap(EL2);
} else {
return inst.generateTrap(EL1);
}
} else if (el2_enabled && !in_host && hcr.tid2) {
return inst.generateTrap(EL2);
} else if (el2_enabled && in_host && !sctlr2.uct) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultMdccsrEL0(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const DBGDS32 mdscr = tc->readMiscReg(MISCREG_MDSCR_EL1);
const HDCR mdcr_el2 = tc->readMiscReg(MISCREG_MDCR_EL2);
const HDCR mdcr_el3 = tc->readMiscReg(MISCREG_MDCR_EL3);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool el2_enabled = EL2Enabled(tc);
if (mdscr.tdcc) {
if (el2_enabled && hcr.tge) {
return inst.generateTrap(EL2);
} else {
return inst.generateTrap(EL1);
}
} else if (el2_enabled && mdcr_el2.tdcc) {
return inst.generateTrap(EL2);
} else if (el2_enabled && (hcr.tge || (mdcr_el2.tde || mdcr_el2.tda))) {
return inst.generateTrap(EL2);
} else if (ArmSystem::haveEL(tc, EL3) && (mdcr_el3.tdcc || mdcr_el3.tda)) {
return inst.generateTrap(EL3);
} else {
return NoFault;
}
}
Fault
faultMdccsrEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const HDCR mdcr_el2 = tc->readMiscReg(MISCREG_MDCR_EL2);
const HDCR mdcr_el3 = tc->readMiscReg(MISCREG_MDCR_EL3);
const bool el2_enabled = EL2Enabled(tc);
if (el2_enabled && mdcr_el2.tdcc) {
return inst.generateTrap(EL2);
} else if (el2_enabled && (mdcr_el2.tde || mdcr_el2.tda)) {
return inst.generateTrap(EL2);
} else if (ArmSystem::haveEL(tc, EL3) && (mdcr_el3.tdcc || mdcr_el3.tda)) {
return inst.generateTrap(EL3);
} else {
return NoFault;
}
}
Fault
faultMdccsrEL2(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const HDCR mdcr_el3 = tc->readMiscReg(MISCREG_MDCR_EL3);
if (ArmSystem::haveEL(tc, EL3) && (mdcr_el3.tdcc || mdcr_el3.tda)) {
return inst.generateTrap(EL3);
} else {
return NoFault;
}
}
Fault
faultDebugEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const HDCR mdcr_el2 = tc->readMiscReg(MISCREG_MDCR_EL2);
const HDCR mdcr_el3 = tc->readMiscReg(MISCREG_MDCR_EL3);
const bool el2_enabled = EL2Enabled(tc);
if (el2_enabled && (mdcr_el2.tde || mdcr_el2.tda)) {
return inst.generateTrap(EL2);
} else if (ArmSystem::haveEL(tc, EL3) && mdcr_el3.tda) {
return inst.generateTrap(EL3);
} else {
return NoFault;
}
}
Fault
faultDebugEL2(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const HDCR mdcr_el3 = tc->readMiscReg(MISCREG_MDCR_EL3);
if (ArmSystem::haveEL(tc, EL3) && mdcr_el3.tda) {
return inst.generateTrap(EL3);
} else {
return NoFault;
}
}
Fault
faultZcrEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const CPACR cpacr_el1 = tc->readMiscReg(MISCREG_CPACR_EL1);
const CPTR cptr_el2 = tc->readMiscReg(MISCREG_CPTR_EL2);
const CPTR cptr_el3 = tc->readMiscReg(MISCREG_CPTR_EL3);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool el2_enabled = EL2Enabled(tc);
if (!(cpacr_el1.zen & 0x1)) {
return inst.generateTrap(EL1, ExceptionClass::TRAPPED_SVE, 0);
} else if (el2_enabled && !hcr.e2h && cptr_el2.tz) {
return inst.generateTrap(EL2, ExceptionClass::TRAPPED_SVE, 0);
} else if (el2_enabled && hcr.e2h && !(cptr_el2.zen & 0x1)) {
return inst.generateTrap(EL2, ExceptionClass::TRAPPED_SVE, 0);
} else if (ArmSystem::haveEL(tc, EL3) && !cptr_el3.ez) {
return inst.generateTrap(EL3, ExceptionClass::TRAPPED_SVE, 0);
} else {
return NoFault;
}
}
Fault
faultZcrEL2(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const CPTR cptr_el2 = tc->readMiscReg(MISCREG_CPTR_EL2);
const CPTR cptr_el3 = tc->readMiscReg(MISCREG_CPTR_EL3);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
if (!hcr.e2h && cptr_el2.tz) {
return inst.generateTrap(EL2, ExceptionClass::TRAPPED_SVE, 0);
} else if (hcr.e2h && !(cptr_el2.zen & 0x1)) {
return inst.generateTrap(EL2, ExceptionClass::TRAPPED_SVE, 0);
} else if (ArmSystem::haveEL(tc, EL3) && !cptr_el3.ez) {
return inst.generateTrap(EL3, ExceptionClass::TRAPPED_SVE, 0);
} else {
return NoFault;
}
}
Fault
faultZcrEL3(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const CPTR cptr_el3 = tc->readMiscReg(MISCREG_CPTR_EL3);
if (!cptr_el3.ez) {
return inst.generateTrap(EL3, ExceptionClass::TRAPPED_SVE, 0);
} else {
return NoFault;
}
}
Fault
faultGicv3(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
auto gic = static_cast<ArmSystem*>(tc->getSystemPtr())->getGIC();
if (!gic->supportsVersion(BaseGic::GicVersion::GIC_V3)) {
return inst.undefined();
} else {
return NoFault;
}
}
Fault
faultIccSgiEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
if (auto fault = faultGicv3(entry, tc, inst); fault != NoFault) {
return fault;
}
const Gicv3CPUInterface::ICH_HCR_EL2 ich_hcr =
tc->readMiscReg(MISCREG_ICH_HCR_EL2);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const SCR scr = tc->readMiscReg(MISCREG_SCR_EL3);
if (EL2Enabled(tc) && (hcr.fmo || hcr.imo || ich_hcr.TC)) {
return inst.generateTrap(EL2);
} else if (ArmSystem::haveEL(tc, EL3) && scr.irq && scr.fiq) {
return inst.generateTrap(EL3);
} else {
return NoFault;
}
}
Fault
faultIccSgiEL2(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
if (auto fault = faultGicv3(entry, tc, inst); fault != NoFault) {
return fault;
}
const SCR scr = tc->readMiscReg(MISCREG_SCR_EL3);
if (ArmSystem::haveEL(tc, EL3) && scr.irq && scr.fiq) {
return inst.generateTrap(EL3);
} else {
return NoFault;
}
}
Fault
faultCpacrEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const CPTR cptr_el2 = tc->readMiscReg(MISCREG_CPTR_EL2);
const CPTR cptr_el3 = tc->readMiscReg(MISCREG_CPTR_EL3);
if (EL2Enabled(tc) && cptr_el2.tcpac) {
return inst.generateTrap(EL2);
} else if (ArmSystem::haveEL(tc, EL3) && cptr_el3.tcpac) {
return inst.generateTrap(EL3);
} else {
return NoFault;
}
}
Fault
faultCpacrEL2(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const CPTR cptr_el3 = tc->readMiscReg(MISCREG_CPTR_EL3);
if (ArmSystem::haveEL(tc, EL3) && cptr_el3.tcpac) {
return inst.generateTrap(EL3);
} else {
return NoFault;
}
}
Fault
faultCpacrVheEL2(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const HCR hcr = tc->readMiscRegNoEffect(MISCREG_HCR_EL2);
if (hcr.e2h) {
return faultCpacrEL2(entry, tc, inst);
} else {
return inst.undefined();
}
}
#define HCR_TRAP(bitfield) [] (const MiscRegLUTEntry &entry, \
ThreadContext *tc, const MiscRegOp64 &inst) -> Fault \
{ \
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2); \
if (EL2Enabled(tc) && hcr.bitfield) { \
return inst.generateTrap(EL2); \
} else { \
return NoFault; \
} \
}
Fault
faultPauthEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const SCR scr = tc->readMiscReg(MISCREG_SCR_EL3);
if (EL2Enabled(tc) && !hcr.apk) {
return inst.generateTrap(EL2);
} else if (ArmSystem::haveEL(tc, EL3) && !scr.apk) {
return inst.generateTrap(EL3);
} else {
return NoFault;
}
}
Fault
faultPauthEL2(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const SCR scr = tc->readMiscReg(MISCREG_SCR_EL3);
if (ArmSystem::haveEL(tc, EL3) && !scr.apk) {
return inst.generateTrap(EL3);
} else {
return NoFault;
}
}
Fault
faultGenericTimerEL0(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const bool el2_enabled = EL2Enabled(tc);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool in_host = el2_enabled && hcr.e2h && hcr.tge;
const CNTKCTL cntkctl_el1 = tc->readMiscReg(MISCREG_CNTKCTL_EL1);
const CNTHCTL_E2H cnthctl_el2 = tc->readMiscReg(MISCREG_CNTHCTL_EL2);
if (!(in_host) && !cntkctl_el1.el0pcten && !cntkctl_el1.el0vcten) {
if (el2_enabled && hcr.tge)
return inst.generateTrap(EL2);
else
return inst.generateTrap(EL1);
} else if (in_host && !cnthctl_el2.el0pcten && !cnthctl_el2.el0vcten) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultCntpctEL0(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const bool el2_enabled = EL2Enabled(tc);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool in_host = el2_enabled && hcr.e2h && hcr.tge;
const CNTKCTL cntkctl_el1 = tc->readMiscReg(MISCREG_CNTKCTL_EL1);
const RegVal cnthctl_el2 = tc->readMiscReg(MISCREG_CNTHCTL_EL2);
if (!(in_host) && !cntkctl_el1.el0pcten) {
if (el2_enabled && hcr.tge)
return inst.generateTrap(EL2);
else
return inst.generateTrap(EL1);
} else if (el2_enabled && !hcr.e2h &&
!static_cast<CNTHCTL>(cnthctl_el2).el1pcten) {
return inst.generateTrap(EL2);
} else if (el2_enabled && hcr.e2h && !hcr.tge &&
!static_cast<CNTHCTL_E2H>(cnthctl_el2).el1pcten) {
return inst.generateTrap(EL2);
} else if (in_host &&
!static_cast<CNTHCTL_E2H>(cnthctl_el2).el0pcten) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultCntpctEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const bool el2_enabled = EL2Enabled(tc);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const RegVal cnthctl_el2 = tc->readMiscReg(MISCREG_CNTHCTL_EL2);
if (el2_enabled && hcr.e2h &&
!static_cast<CNTHCTL_E2H>(cnthctl_el2).el1pcten) {
return inst.generateTrap(EL2);
} else if (el2_enabled && !hcr.e2h &&
!static_cast<CNTHCTL>(cnthctl_el2).el1pcten) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultCntvctEL0(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const bool el2_enabled = EL2Enabled(tc);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool in_host = el2_enabled && hcr.e2h && hcr.tge;
const CNTKCTL cntkctl_el1 = tc->readMiscReg(MISCREG_CNTKCTL_EL1);
const CNTHCTL_E2H cnthctl_el2 = tc->readMiscReg(MISCREG_CNTHCTL_EL2);
if (!(in_host) && !cntkctl_el1.el0vcten) {
if (el2_enabled && hcr.tge)
return inst.generateTrap(EL2);
else
return inst.generateTrap(EL1);
} else if (in_host && !cnthctl_el2.el0vcten) {
return inst.generateTrap(EL2);
} else if (el2_enabled && !(hcr.e2h && hcr.tge) && cnthctl_el2.el1tvct) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultCntvctEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const CNTHCTL cnthctl_el2 = tc->readMiscReg(MISCREG_CNTHCTL_EL2);
if (EL2Enabled(tc) && cnthctl_el2.el1tvct) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
//TODO: See faultCntpctEL0
Fault
faultCntpCtlEL0(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const bool el2_enabled = EL2Enabled(tc);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool in_host = el2_enabled && hcr.e2h && hcr.tge;
const CNTKCTL cntkctl_el1 = tc->readMiscReg(MISCREG_CNTKCTL_EL1);
const RegVal cnthctl_el2 = tc->readMiscReg(MISCREG_CNTHCTL_EL2);
if (!(in_host) && !cntkctl_el1.el0pten) {
if (el2_enabled && hcr.tge)
return inst.generateTrap(EL2);
else
return inst.generateTrap(EL1);
} else if (el2_enabled && !hcr.e2h &&
!static_cast<CNTHCTL>(cnthctl_el2).el1pcen) {
return inst.generateTrap(EL2);
} else if (el2_enabled && hcr.e2h && !hcr.tge &&
!static_cast<CNTHCTL_E2H>(cnthctl_el2).el1pten) {
return inst.generateTrap(EL2);
} else if (in_host &&
!static_cast<CNTHCTL_E2H>(cnthctl_el2).el0pten) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultCntpCtlEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const bool el2_enabled = EL2Enabled(tc);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const RegVal cnthctl_el2 = tc->readMiscReg(MISCREG_CNTHCTL_EL2);
if (el2_enabled && !hcr.e2h &&
!static_cast<CNTHCTL>(cnthctl_el2).el1pcen) {
return inst.generateTrap(EL2);
} else if (el2_enabled && hcr.e2h &&
!static_cast<CNTHCTL_E2H>(cnthctl_el2).el1pten) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
// TODO: see faultCntvctEL0
Fault
faultCntvCtlEL0(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const bool el2_enabled = EL2Enabled(tc);
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
const bool in_host = el2_enabled && hcr.e2h && hcr.tge;
const CNTKCTL cntkctl_el1 = tc->readMiscReg(MISCREG_CNTKCTL_EL1);
const CNTHCTL_E2H cnthctl_el2 = tc->readMiscReg(MISCREG_CNTHCTL_EL2);
if (!(in_host) && !cntkctl_el1.el0vten) {
if (el2_enabled && hcr.tge)
return inst.generateTrap(EL2);
else
return inst.generateTrap(EL1);
} else if (in_host && !cnthctl_el2.el0vten) {
return inst.generateTrap(EL2);
} else if (el2_enabled && !(hcr.e2h && hcr.tge) && cnthctl_el2.el1tvt) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultCntvCtlEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const CNTHCTL cnthctl_el2 = tc->readMiscReg(MISCREG_CNTHCTL_EL2);
if (EL2Enabled(tc) && cnthctl_el2.el1tvt) {
return inst.generateTrap(EL2);
} else {
return NoFault;
}
}
Fault
faultCntpsCtlEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const SCR scr = tc->readMiscReg(MISCREG_SCR_EL3);
if (ArmSystem::haveEL(tc, EL3) && !scr.ns) {
if (scr.eel2)
return inst.undefined();
else if (!scr.st)
return inst.generateTrap(EL3);
else
return NoFault;
} else {
return inst.undefined();
}
}
Fault
faultUnimplemented(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
if (entry.info[MISCREG_WARN_NOT_FAIL]) {
return NoFault;
} else {
return inst.undefined();
}
}
Fault
faultImpdefUnimplEL1(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const HCR hcr = tc->readMiscReg(MISCREG_HCR_EL2);
if (EL2Enabled(tc) && hcr.tidcp) {
return inst.generateTrap(EL2);
} else {
return faultUnimplemented(entry, tc, inst);
}
}
}
MiscRegIndex
decodeAArch64SysReg(unsigned op0, unsigned op1,
unsigned crn, unsigned crm,
unsigned op2)
{
MiscRegNum64 sys_reg(op0, op1, crn, crm, op2);
return decodeAArch64SysReg(sys_reg);
}
MiscRegIndex
decodeAArch64SysReg(const MiscRegNum64 &sys_reg)
{
auto it = miscRegNumToIdx.find(sys_reg);
if (it != miscRegNumToIdx.end()) {
return it->second;
} else {
// Check for a pseudo register before returning MISCREG_UNKNOWN
if ((sys_reg.op0 == 1 || sys_reg.op0 == 3) &&
(sys_reg.crn == 11 || sys_reg.crn == 15)) {
return MISCREG_IMPDEF_UNIMPL;
} else {
return MISCREG_UNKNOWN;
}
}
}
MiscRegNum64
encodeAArch64SysReg(MiscRegIndex misc_reg)
{
if (auto it = idxToMiscRegNum.find(misc_reg);
it != idxToMiscRegNum.end()) {
return it->second;
} else {
panic("Invalid MiscRegIndex: %d\n", misc_reg);
}
}
Fault
MiscRegLUTEntry::checkFault(ThreadContext *tc,
const MiscRegOp64 &inst, ExceptionLevel el)
{
return !inst.miscRead() ? faultWrite[el](*this, tc, inst) :
faultRead[el](*this, tc, inst);
}
template <MiscRegInfo Sec, MiscRegInfo NonSec>
Fault
MiscRegLUTEntry::defaultFault(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
if (isSecureBelowEL3(tc) ? entry.info[Sec] : entry.info[NonSec]) {
return NoFault;
} else {
return inst.undefined();
}
}
static Fault
defaultFaultE2H_EL2(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const HCR hcr = tc->readMiscRegNoEffect(MISCREG_HCR_EL2);
if (hcr.e2h) {
return NoFault;
} else {
return inst.undefined();
}
}
static Fault
defaultFaultE2H_EL3(const MiscRegLUTEntry &entry,
ThreadContext *tc, const MiscRegOp64 &inst)
{
const HCR hcr = tc->readMiscRegNoEffect(MISCREG_HCR_EL2);
const bool el2_host = EL2Enabled(tc) && hcr.e2h;
if (el2_host) {
return NoFault;
} else {
return inst.undefined();
}
}
MiscRegLUTEntryInitializer::chain
MiscRegLUTEntryInitializer::highest(ArmSystem *const sys) const
{
switch (FullSystem ? sys->highestEL() : EL1) {
case EL0:
case EL1: priv(); break;
case EL2: hyp(); break;
case EL3: mon(); break;
}
return *this;
}
void
ISA::initializeMiscRegMetadata()
{
// the MiscReg metadata tables are shared across all instances of the
// ISA object, so there's no need to initialize them multiple times.
static bool completed = false;
if (completed)
return;
// This boolean variable specifies if the system is running in aarch32 at
// EL3 (aarch32EL3 = true). It is false if EL3 is not implemented, or it
// is running in aarch64 (aarch32EL3 = false)
bool aarch32EL3 = release->has(ArmExtension::SECURITY) && !highestELIs64;
// Set Privileged Access Never on taking an exception to EL1 (Arm 8.1+),
// unsupported
bool SPAN = false;
// Implicit error synchronization event enable (Arm 8.2+), unsupported
bool IESB = false;
// Load Multiple and Store Multiple Atomicity and Ordering (Arm 8.2+),
// unsupported
bool LSMAOE = false;
// No Trap Load Multiple and Store Multiple (Arm 8.2+), unsupported
bool nTLSMD = false;
// Pointer authentication (Arm 8.3+), unsupported
bool EnDA = true; // using APDAKey_EL1 key of instr addrs in ELs 0,1
bool EnDB = true; // using APDBKey_EL1 key of instr addrs in ELs 0,1
bool EnIA = true; // using APIAKey_EL1 key of instr addrs in ELs 0,1
bool EnIB = true; // using APIBKey_EL1 key of instr addrs in ELs 0,1
const bool vhe_implemented = release->has(ArmExtension::FEAT_VHE);
const bool sel2_implemented = release->has(ArmExtension::FEAT_SEL2);
/**
* Some registers alias with others, and therefore need to be translated.
* When two mapping registers are given, they are the 32b lower and
* upper halves, respectively, of the 64b register being mapped.
* aligned with reference documentation ARM DDI 0487A.i pp 1540-1543
*
* NAM = "not architecturally mandated",
* from ARM DDI 0487A.i, template text
* "AArch64 System register ___ can be mapped to
* AArch32 System register ___, but this is not
* architecturally mandated."
*/
InitReg(MISCREG_CPSR)
.allPrivileges();
InitReg(MISCREG_SPSR)
.allPrivileges();
InitReg(MISCREG_SPSR_FIQ)
.allPrivileges();
InitReg(MISCREG_SPSR_IRQ)
.allPrivileges();
InitReg(MISCREG_SPSR_SVC)
.allPrivileges();
InitReg(MISCREG_SPSR_MON)
.allPrivileges();
InitReg(MISCREG_SPSR_ABT)
.allPrivileges();
InitReg(MISCREG_SPSR_HYP)
.allPrivileges();
InitReg(MISCREG_SPSR_UND)
.allPrivileges();
InitReg(MISCREG_ELR_HYP)
.allPrivileges();
InitReg(MISCREG_FPSID)
.allPrivileges();
InitReg(MISCREG_FPSCR)
.allPrivileges();
InitReg(MISCREG_MVFR1)
.allPrivileges();
InitReg(MISCREG_MVFR0)
.allPrivileges();
InitReg(MISCREG_FPEXC)
.allPrivileges();
// Helper registers
InitReg(MISCREG_CPSR_MODE)
.allPrivileges();
InitReg(MISCREG_CPSR_Q)
.allPrivileges();
InitReg(MISCREG_FPSCR_EXC)
.allPrivileges();
InitReg(MISCREG_FPSCR_QC)
.allPrivileges();
InitReg(MISCREG_LOCKADDR)
.allPrivileges();
InitReg(MISCREG_LOCKFLAG)
.allPrivileges();
InitReg(MISCREG_PRRR_MAIR0)
.mutex()
.banked();
InitReg(MISCREG_PRRR_MAIR0_NS)
.mutex()
.privSecure(!aarch32EL3)
.bankedChild();
InitReg(MISCREG_PRRR_MAIR0_S)
.mutex()
.bankedChild();
InitReg(MISCREG_NMRR_MAIR1)
.mutex()
.banked();
InitReg(MISCREG_NMRR_MAIR1_NS)
.mutex()
.privSecure(!aarch32EL3)
.bankedChild();
InitReg(MISCREG_NMRR_MAIR1_S)
.mutex()
.bankedChild();
InitReg(MISCREG_PMXEVTYPER_PMCCFILTR)
.mutex();
InitReg(MISCREG_SCTLR_RST)
.allPrivileges();
InitReg(MISCREG_SEV_MAILBOX)
.allPrivileges();
InitReg(MISCREG_TLBINEEDSYNC)
.allPrivileges().exceptUserMode();
// AArch32 CP14 registers
InitReg(MISCREG_DBGDIDR)
.allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
InitReg(MISCREG_DBGDSCRint)
.allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
InitReg(MISCREG_DBGDCCINT)
.unimplemented()
.allPrivileges();
InitReg(MISCREG_DBGDTRTXint)
.unimplemented()
.allPrivileges();
InitReg(MISCREG_DBGDTRRXint)
.unimplemented()
.allPrivileges();
InitReg(MISCREG_DBGWFAR)
.unimplemented()
.allPrivileges();
InitReg(MISCREG_DBGVCR)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGDTRRXext)
.unimplemented()
.allPrivileges();
InitReg(MISCREG_DBGDSCRext)
.allPrivileges();
InitReg(MISCREG_DBGDTRTXext)
.unimplemented()
.allPrivileges();
InitReg(MISCREG_DBGOSECCR)
.unimplemented()
.allPrivileges();
InitReg(MISCREG_DBGBVR0)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR3)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR4)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR5)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR6)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR7)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR8)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR9)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR10)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR11)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR12)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR13)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR14)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBVR15)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR0)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR3)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR4)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR5)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR6)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR7)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR8)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR9)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR10)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR11)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR12)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR13)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR14)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBCR15)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR0)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR3)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR4)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR5)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR6)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR7)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR8)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR9)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR10)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR11)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR12)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR13)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR14)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWVR15)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR0)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR3)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR4)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR5)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR6)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR7)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR8)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR9)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR10)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR11)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR12)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR13)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR14)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGWCR15)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGDRAR)
.unimplemented()
.allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
InitReg(MISCREG_DBGBXVR0)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR3)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR4)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR5)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR0)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR6)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR7)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR8)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR9)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR10)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR11)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR12)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR13)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR14)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGBXVR15)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DBGOSLAR)
.allPrivileges().monSecureRead(0).monNonSecureRead(0);
InitReg(MISCREG_DBGOSLSR)
.allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
InitReg(MISCREG_DBGOSDLR)
.unimplemented()
.warnNotFail()
.allPrivileges();
InitReg(MISCREG_DBGPRCR)
.unimplemented()
.allPrivileges();
InitReg(MISCREG_DBGDSAR)
.unimplemented()
.allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
InitReg(MISCREG_DBGCLAIMSET)
.unimplemented()
.allPrivileges();
InitReg(MISCREG_DBGCLAIMCLR)
.unimplemented()
.allPrivileges();
InitReg(MISCREG_DBGAUTHSTATUS)
.unimplemented()
.allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
InitReg(MISCREG_DBGDEVID2)
.unimplemented()
.allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
InitReg(MISCREG_DBGDEVID1)
.unimplemented()
.allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
InitReg(MISCREG_DBGDEVID0)
.allPrivileges().monSecureWrite(0).monNonSecureWrite(0);
InitReg(MISCREG_TEECR)
.unimplemented()
.allPrivileges();
InitReg(MISCREG_JIDR)
.allPrivileges();
InitReg(MISCREG_TEEHBR)
.allPrivileges();
InitReg(MISCREG_JOSCR)
.allPrivileges();
InitReg(MISCREG_JMCR)
.allPrivileges();
// AArch32 CP15 registers
InitReg(MISCREG_MIDR)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_CTR)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_TCMTR)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_TLBTR)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_MPIDR)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_REVIDR)
.unimplemented()
.warnNotFail()
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_PFR0)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_PFR1)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_DFR0)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_AFR0)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_MMFR0)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_MMFR1)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_MMFR2)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_MMFR3)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_MMFR4)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_ISAR0)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_ISAR1)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_ISAR2)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_ISAR3)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_ISAR4)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_ISAR5)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_ISAR6)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_CCSIDR)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_CLIDR)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_AIDR)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_CSSELR)
.banked();
InitReg(MISCREG_CSSELR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_CSSELR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_VPIDR)
.hyp().monNonSecure();
InitReg(MISCREG_VMPIDR)
.hyp().monNonSecure();
InitReg(MISCREG_SCTLR)
.banked()
// readMiscRegNoEffect() uses this metadata
// despite using children (below) as backing store
.res0(0x8d22c600)
.res1(0x00400800 | (SPAN ? 0 : 0x800000)
| (LSMAOE ? 0 : 0x10)
| (nTLSMD ? 0 : 0x8));
InitReg(MISCREG_SCTLR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_SCTLR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_ACTLR)
.banked();
InitReg(MISCREG_ACTLR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_ACTLR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_CPACR)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_SDCR)
.mon();
InitReg(MISCREG_SCR)
.mon().secure().exceptUserMode()
.res0(0xff40) // [31:16], [6]
.res1(0x0030); // [5:4]
InitReg(MISCREG_SDER)
.mon();
InitReg(MISCREG_NSACR)
.allPrivileges().hypWrite(0).privNonSecureWrite(0).exceptUserMode();
InitReg(MISCREG_HSCTLR)
.hyp().monNonSecure()
.res0(0x0512c7c0 | (EnDB ? 0 : 0x2000)
| (IESB ? 0 : 0x200000)
| (EnDA ? 0 : 0x8000000)
| (EnIB ? 0 : 0x40000000)
| (EnIA ? 0 : 0x80000000))
.res1(0x30c50830);
InitReg(MISCREG_HACTLR)
.hyp().monNonSecure();
InitReg(MISCREG_HCR)
.hyp().monNonSecure()
.res0(0x90000000);
InitReg(MISCREG_HCR2)
.hyp().monNonSecure()
.res0(0xffa9ff8c);
InitReg(MISCREG_HDCR)
.hyp().monNonSecure();
InitReg(MISCREG_HCPTR)
.hyp().monNonSecure();
InitReg(MISCREG_HSTR)
.hyp().monNonSecure();
InitReg(MISCREG_HACR)
.unimplemented()
.warnNotFail()
.hyp().monNonSecure();
InitReg(MISCREG_TTBR0)
.banked();
InitReg(MISCREG_TTBR0_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_TTBR0_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_TTBR1)
.banked();
InitReg(MISCREG_TTBR1_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_TTBR1_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_TTBCR)
.banked();
InitReg(MISCREG_TTBCR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_TTBCR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_HTCR)
.hyp().monNonSecure();
InitReg(MISCREG_VTCR)
.hyp().monNonSecure();
InitReg(MISCREG_DACR)
.banked();
InitReg(MISCREG_DACR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_DACR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_DFSR)
.banked();
InitReg(MISCREG_DFSR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_DFSR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_IFSR)
.banked();
InitReg(MISCREG_IFSR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_IFSR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_ADFSR)
.unimplemented()
.warnNotFail()
.banked();
InitReg(MISCREG_ADFSR_NS)
.unimplemented()
.warnNotFail()
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_ADFSR_S)
.unimplemented()
.warnNotFail()
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_AIFSR)
.unimplemented()
.warnNotFail()
.banked();
InitReg(MISCREG_AIFSR_NS)
.unimplemented()
.warnNotFail()
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_AIFSR_S)
.unimplemented()
.warnNotFail()
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_HADFSR)
.hyp().monNonSecure();
InitReg(MISCREG_HAIFSR)
.hyp().monNonSecure();
InitReg(MISCREG_HSR)
.hyp().monNonSecure();
InitReg(MISCREG_DFAR)
.banked();
InitReg(MISCREG_DFAR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_DFAR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_IFAR)
.banked();
InitReg(MISCREG_IFAR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_IFAR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_HDFAR)
.hyp().monNonSecure();
InitReg(MISCREG_HIFAR)
.hyp().monNonSecure();
InitReg(MISCREG_HPFAR)
.hyp().monNonSecure();
InitReg(MISCREG_ICIALLUIS)
.unimplemented()
.warnNotFail()
.writes(1).exceptUserMode();
InitReg(MISCREG_BPIALLIS)
.unimplemented()
.warnNotFail()
.writes(1).exceptUserMode();
InitReg(MISCREG_PAR)
.banked();
InitReg(MISCREG_PAR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_PAR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_ICIALLU)
.writes(1).exceptUserMode();
InitReg(MISCREG_ICIMVAU)
.unimplemented()
.warnNotFail()
.writes(1).exceptUserMode();
InitReg(MISCREG_CP15ISB)
.writes(1);
InitReg(MISCREG_BPIALL)
.unimplemented()
.warnNotFail()
.writes(1).exceptUserMode();
InitReg(MISCREG_BPIMVA)
.unimplemented()
.warnNotFail()
.writes(1).exceptUserMode();
InitReg(MISCREG_DCIMVAC)
.unimplemented()
.warnNotFail()
.writes(1).exceptUserMode();
InitReg(MISCREG_DCISW)
.unimplemented()
.warnNotFail()
.writes(1).exceptUserMode();
InitReg(MISCREG_ATS1CPR)
.writes(1).exceptUserMode();
InitReg(MISCREG_ATS1CPW)
.writes(1).exceptUserMode();
InitReg(MISCREG_ATS1CUR)
.writes(1).exceptUserMode();
InitReg(MISCREG_ATS1CUW)
.writes(1).exceptUserMode();
InitReg(MISCREG_ATS12NSOPR)
.privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_ATS12NSOPW)
.privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_ATS12NSOUR)
.privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_ATS12NSOUW)
.privSecureWrite().hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_DCCMVAC)
.writes(1).exceptUserMode();
InitReg(MISCREG_DCCSW)
.unimplemented()
.warnNotFail()
.writes(1).exceptUserMode();
InitReg(MISCREG_CP15DSB)
.writes(1);
InitReg(MISCREG_CP15DMB)
.writes(1);
InitReg(MISCREG_DCCMVAU)
.unimplemented()
.warnNotFail()
.writes(1).exceptUserMode();
InitReg(MISCREG_DCCIMVAC)
.unimplemented()
.warnNotFail()
.writes(1).exceptUserMode();
InitReg(MISCREG_DCCISW)
.unimplemented()
.warnNotFail()
.writes(1).exceptUserMode();
InitReg(MISCREG_ATS1HR)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_ATS1HW)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBIALLIS)
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBIMVAIS)
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBIASIDIS)
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBIMVAAIS)
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBIMVALIS)
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBIMVAALIS)
.writes(1).exceptUserMode();
InitReg(MISCREG_ITLBIALL)
.writes(1).exceptUserMode();
InitReg(MISCREG_ITLBIMVA)
.writes(1).exceptUserMode();
InitReg(MISCREG_ITLBIASID)
.writes(1).exceptUserMode();
InitReg(MISCREG_DTLBIALL)
.writes(1).exceptUserMode();
InitReg(MISCREG_DTLBIMVA)
.writes(1).exceptUserMode();
InitReg(MISCREG_DTLBIASID)
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBIALL)
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBIMVA)
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBIASID)
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBIMVAA)
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBIMVAL)
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBIMVAAL)
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBIIPAS2IS)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBIIPAS2LIS)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBIALLHIS)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBIMVAHIS)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBIALLNSNHIS)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBIMVALHIS)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBIIPAS2)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBIIPAS2L)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBIALLH)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBIMVAH)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBIALLNSNH)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBIMVALH)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_PMCR)
.allPrivileges();
InitReg(MISCREG_PMCNTENSET)
.allPrivileges();
InitReg(MISCREG_PMCNTENCLR)
.allPrivileges();
InitReg(MISCREG_PMOVSR)
.allPrivileges();
InitReg(MISCREG_PMSWINC)
.allPrivileges();
InitReg(MISCREG_PMSELR)
.allPrivileges();
InitReg(MISCREG_PMCEID0)
.allPrivileges();
InitReg(MISCREG_PMCEID1)
.allPrivileges();
InitReg(MISCREG_PMCCNTR)
.allPrivileges();
InitReg(MISCREG_PMXEVTYPER)
.allPrivileges();
InitReg(MISCREG_PMCCFILTR)
.allPrivileges();
InitReg(MISCREG_PMXEVCNTR)
.allPrivileges();
InitReg(MISCREG_PMUSERENR)
.allPrivileges().userNonSecureWrite(0).userSecureWrite(0);
InitReg(MISCREG_PMINTENSET)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_PMINTENCLR)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_PMOVSSET)
.unimplemented()
.allPrivileges();
InitReg(MISCREG_L2CTLR)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_L2ECTLR)
.unimplemented()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_PRRR)
.banked();
InitReg(MISCREG_PRRR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_PRRR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_MAIR0)
.banked();
InitReg(MISCREG_MAIR0_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_MAIR0_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_NMRR)
.banked();
InitReg(MISCREG_NMRR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_NMRR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_MAIR1)
.banked();
InitReg(MISCREG_MAIR1_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_MAIR1_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_AMAIR0)
.banked();
InitReg(MISCREG_AMAIR0_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_AMAIR0_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_AMAIR1)
.banked();
InitReg(MISCREG_AMAIR1_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_AMAIR1_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_HMAIR0)
.hyp().monNonSecure();
InitReg(MISCREG_HMAIR1)
.hyp().monNonSecure();
InitReg(MISCREG_HAMAIR0)
.unimplemented()
.warnNotFail()
.hyp().monNonSecure();
InitReg(MISCREG_HAMAIR1)
.unimplemented()
.warnNotFail()
.hyp().monNonSecure();
InitReg(MISCREG_VBAR)
.banked();
InitReg(MISCREG_VBAR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_VBAR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_MVBAR)
.mon().secure()
.hypRead(FullSystem && system->highestEL() == EL2)
.privRead(FullSystem && system->highestEL() == EL1)
.exceptUserMode();
InitReg(MISCREG_RMR)
.unimplemented()
.mon().secure().exceptUserMode();
InitReg(MISCREG_ISR)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_HVBAR)
.hyp().monNonSecure()
.res0(0x1f);
InitReg(MISCREG_FCSEIDR)
.unimplemented()
.warnNotFail()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_CONTEXTIDR)
.banked();
InitReg(MISCREG_CONTEXTIDR_NS)
.bankedChild()
.privSecure(!aarch32EL3)
.nonSecure().exceptUserMode();
InitReg(MISCREG_CONTEXTIDR_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_TPIDRURW)
.banked();
InitReg(MISCREG_TPIDRURW_NS)
.bankedChild()
.allPrivileges()
.privSecure(!aarch32EL3)
.monSecure(0);
InitReg(MISCREG_TPIDRURW_S)
.bankedChild()
.secure();
InitReg(MISCREG_TPIDRURO)
.banked();
InitReg(MISCREG_TPIDRURO_NS)
.bankedChild()
.allPrivileges()
.userNonSecureWrite(0).userSecureRead(1)
.privSecure(!aarch32EL3)
.monSecure(0);
InitReg(MISCREG_TPIDRURO_S)
.bankedChild()
.secure().userSecureWrite(0);
InitReg(MISCREG_TPIDRPRW)
.banked();
InitReg(MISCREG_TPIDRPRW_NS)
.bankedChild()
.nonSecure().exceptUserMode()
.privSecure(!aarch32EL3);
InitReg(MISCREG_TPIDRPRW_S)
.bankedChild()
.secure().exceptUserMode();
InitReg(MISCREG_HTPIDR)
.hyp().monNonSecure();
// BEGIN Generic Timer (AArch32)
InitReg(MISCREG_CNTFRQ)
.reads(1)
.highest(system)
.privSecureWrite(aarch32EL3);
InitReg(MISCREG_CNTPCT)
.unverifiable()
.reads(1);
InitReg(MISCREG_CNTVCT)
.unverifiable()
.reads(1);
InitReg(MISCREG_CNTP_CTL)
.banked();
InitReg(MISCREG_CNTP_CTL_NS)
.bankedChild()
.nonSecure()
.privSecure(!aarch32EL3)
.userSecureRead(!aarch32EL3)
.userSecureWrite(!aarch32EL3)
.res0(0xfffffff8);
InitReg(MISCREG_CNTP_CTL_S)
.bankedChild()
.secure()
.privSecure(aarch32EL3)
.res0(0xfffffff8);
InitReg(MISCREG_CNTP_CVAL)
.banked();
InitReg(MISCREG_CNTP_CVAL_NS)
.bankedChild()
.nonSecure()
.privSecure(!aarch32EL3)
.userSecureRead(!aarch32EL3)
.userSecureWrite(!aarch32EL3);
InitReg(MISCREG_CNTP_CVAL_S)
.bankedChild()
.secure()
.privSecure(aarch32EL3);
InitReg(MISCREG_CNTP_TVAL)
.banked();
InitReg(MISCREG_CNTP_TVAL_NS)
.bankedChild()
.nonSecure()
.privSecure(!aarch32EL3)
.userSecureRead(!aarch32EL3)
.userSecureWrite(!aarch32EL3);
InitReg(MISCREG_CNTP_TVAL_S)
.bankedChild()
.secure()
.privSecure(aarch32EL3);
InitReg(MISCREG_CNTV_CTL)
.allPrivileges()
.res0(0xfffffff8);
InitReg(MISCREG_CNTV_CVAL)
.allPrivileges();
InitReg(MISCREG_CNTV_TVAL)
.allPrivileges();
InitReg(MISCREG_CNTKCTL)
.allPrivileges()
.exceptUserMode()
.res0(0xfffdfc00);
InitReg(MISCREG_CNTHCTL)
.monNonSecure()
.hyp()
.res0(0xfffdff00);
InitReg(MISCREG_CNTHP_CTL)
.monNonSecure()
.hyp()
.res0(0xfffffff8);
InitReg(MISCREG_CNTHP_CVAL)
.monNonSecure()
.hyp();
InitReg(MISCREG_CNTHP_TVAL)
.monNonSecure()
.hyp();
InitReg(MISCREG_CNTVOFF)
.monNonSecure()
.hyp();
// END Generic Timer (AArch32)
InitReg(MISCREG_IL1DATA0)
.unimplemented()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_IL1DATA1)
.unimplemented()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_IL1DATA2)
.unimplemented()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_IL1DATA3)
.unimplemented()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DL1DATA0)
.unimplemented()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DL1DATA1)
.unimplemented()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DL1DATA2)
.unimplemented()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DL1DATA3)
.unimplemented()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DL1DATA4)
.unimplemented()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_RAMINDEX)
.unimplemented()
.writes(1).exceptUserMode();
InitReg(MISCREG_L2ACTLR)
.unimplemented()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_CBAR)
.unimplemented()
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_HTTBR)
.hyp().monNonSecure();
InitReg(MISCREG_VTTBR)
.hyp().monNonSecure();
InitReg(MISCREG_CPUMERRSR)
.unimplemented()
.allPrivileges().exceptUserMode();
InitReg(MISCREG_L2MERRSR)
.unimplemented()
.warnNotFail()
.allPrivileges().exceptUserMode();
// AArch64 registers (Op0=2);
InitReg(MISCREG_MDCCINT_EL1)
.fault(EL1, faultMdccsrEL1)
.fault(EL2, faultMdccsrEL2)
.allPrivileges();
InitReg(MISCREG_OSDTRRX_EL1)
.allPrivileges()
.mapsTo(MISCREG_DBGDTRRXext);
InitReg(MISCREG_MDSCR_EL1)
.allPrivileges()
.mapsTo(MISCREG_DBGDSCRext);
InitReg(MISCREG_OSDTRTX_EL1)
.allPrivileges()
.mapsTo(MISCREG_DBGDTRTXext);
InitReg(MISCREG_OSECCR_EL1)
.allPrivileges()
.mapsTo(MISCREG_DBGOSECCR);
InitReg(MISCREG_DBGBVR0_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR0, MISCREG_DBGBXVR0);
InitReg(MISCREG_DBGBVR1_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR1, MISCREG_DBGBXVR1);
InitReg(MISCREG_DBGBVR2_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR2, MISCREG_DBGBXVR2);
InitReg(MISCREG_DBGBVR3_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR3, MISCREG_DBGBXVR3);
InitReg(MISCREG_DBGBVR4_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR4, MISCREG_DBGBXVR4);
InitReg(MISCREG_DBGBVR5_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR5, MISCREG_DBGBXVR5);
InitReg(MISCREG_DBGBVR6_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR6, MISCREG_DBGBXVR6);
InitReg(MISCREG_DBGBVR7_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR7, MISCREG_DBGBXVR7);
InitReg(MISCREG_DBGBVR8_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR8, MISCREG_DBGBXVR8);
InitReg(MISCREG_DBGBVR9_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR9, MISCREG_DBGBXVR9);
InitReg(MISCREG_DBGBVR10_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR10, MISCREG_DBGBXVR10);
InitReg(MISCREG_DBGBVR11_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR11, MISCREG_DBGBXVR11);
InitReg(MISCREG_DBGBVR12_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR12, MISCREG_DBGBXVR12);
InitReg(MISCREG_DBGBVR13_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR13, MISCREG_DBGBXVR13);
InitReg(MISCREG_DBGBVR14_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR14, MISCREG_DBGBXVR14);
InitReg(MISCREG_DBGBVR15_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBVR15, MISCREG_DBGBXVR15);
InitReg(MISCREG_DBGBCR0_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR0);
InitReg(MISCREG_DBGBCR1_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR1);
InitReg(MISCREG_DBGBCR2_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR2);
InitReg(MISCREG_DBGBCR3_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR3);
InitReg(MISCREG_DBGBCR4_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR4);
InitReg(MISCREG_DBGBCR5_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR5);
InitReg(MISCREG_DBGBCR6_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR6);
InitReg(MISCREG_DBGBCR7_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR7);
InitReg(MISCREG_DBGBCR8_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR8);
InitReg(MISCREG_DBGBCR9_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR9);
InitReg(MISCREG_DBGBCR10_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR10);
InitReg(MISCREG_DBGBCR11_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR11);
InitReg(MISCREG_DBGBCR12_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR12);
InitReg(MISCREG_DBGBCR13_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR13);
InitReg(MISCREG_DBGBCR14_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR14);
InitReg(MISCREG_DBGBCR15_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGBCR15);
InitReg(MISCREG_DBGWVR0_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR0);
InitReg(MISCREG_DBGWVR1_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR1);
InitReg(MISCREG_DBGWVR2_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR2);
InitReg(MISCREG_DBGWVR3_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR3);
InitReg(MISCREG_DBGWVR4_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR4);
InitReg(MISCREG_DBGWVR5_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR5);
InitReg(MISCREG_DBGWVR6_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR6);
InitReg(MISCREG_DBGWVR7_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR7);
InitReg(MISCREG_DBGWVR8_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR8);
InitReg(MISCREG_DBGWVR9_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR9);
InitReg(MISCREG_DBGWVR10_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR10);
InitReg(MISCREG_DBGWVR11_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR11);
InitReg(MISCREG_DBGWVR12_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR12);
InitReg(MISCREG_DBGWVR13_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR13);
InitReg(MISCREG_DBGWVR14_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR14);
InitReg(MISCREG_DBGWVR15_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWVR15);
InitReg(MISCREG_DBGWCR0_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR0);
InitReg(MISCREG_DBGWCR1_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR1);
InitReg(MISCREG_DBGWCR2_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR2);
InitReg(MISCREG_DBGWCR3_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR3);
InitReg(MISCREG_DBGWCR4_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR4);
InitReg(MISCREG_DBGWCR5_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR5);
InitReg(MISCREG_DBGWCR6_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR6);
InitReg(MISCREG_DBGWCR7_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR7);
InitReg(MISCREG_DBGWCR8_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR8);
InitReg(MISCREG_DBGWCR9_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR9);
InitReg(MISCREG_DBGWCR10_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR10);
InitReg(MISCREG_DBGWCR11_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR11);
InitReg(MISCREG_DBGWCR12_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR12);
InitReg(MISCREG_DBGWCR13_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR13);
InitReg(MISCREG_DBGWCR14_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR14);
InitReg(MISCREG_DBGWCR15_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultDebugEL1)
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGWCR15);
InitReg(MISCREG_MDCCSR_EL0)
.allPrivileges().writes(0)
.faultRead(EL0, faultMdccsrEL0)
.faultRead(EL1, faultMdccsrEL1)
.faultRead(EL2, faultMdccsrEL2)
.mapsTo(MISCREG_DBGDSCRint);
InitReg(MISCREG_MDDTR_EL0)
.allPrivileges();
InitReg(MISCREG_MDDTRTX_EL0)
.allPrivileges();
InitReg(MISCREG_MDDTRRX_EL0)
.allPrivileges();
InitReg(MISCREG_DBGVCR32_EL2)
.hyp().mon()
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_DBGVCR);
InitReg(MISCREG_MDRAR_EL1)
.allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
.mapsTo(MISCREG_DBGDRAR);
InitReg(MISCREG_OSLAR_EL1)
.allPrivileges().monSecureRead(0).monNonSecureRead(0)
.mapsTo(MISCREG_DBGOSLAR);
InitReg(MISCREG_OSLSR_EL1)
.allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
.mapsTo(MISCREG_DBGOSLSR);
InitReg(MISCREG_OSDLR_EL1)
.allPrivileges()
.mapsTo(MISCREG_DBGOSDLR);
InitReg(MISCREG_DBGPRCR_EL1)
.allPrivileges()
.mapsTo(MISCREG_DBGPRCR);
InitReg(MISCREG_DBGCLAIMSET_EL1)
.allPrivileges()
.mapsTo(MISCREG_DBGCLAIMSET);
InitReg(MISCREG_DBGCLAIMCLR_EL1)
.allPrivileges()
.mapsTo(MISCREG_DBGCLAIMCLR);
InitReg(MISCREG_DBGAUTHSTATUS_EL1)
.allPrivileges().monSecureWrite(0).monNonSecureWrite(0)
.mapsTo(MISCREG_DBGAUTHSTATUS);
InitReg(MISCREG_TEECR32_EL1);
InitReg(MISCREG_TEEHBR32_EL1);
// AArch64 registers (Op0=1,3);
InitReg(MISCREG_MIDR_EL1)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_MPIDR_EL1)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_REVIDR_EL1)
.faultRead(EL1, HCR_TRAP(tid1))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_PFR0_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_PFR0);
InitReg(MISCREG_ID_PFR1_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_PFR1);
InitReg(MISCREG_ID_DFR0_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_DFR0);
InitReg(MISCREG_ID_AFR0_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_AFR0);
InitReg(MISCREG_ID_MMFR0_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_MMFR0);
InitReg(MISCREG_ID_MMFR1_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_MMFR1);
InitReg(MISCREG_ID_MMFR2_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_MMFR2);
InitReg(MISCREG_ID_MMFR3_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_MMFR3);
InitReg(MISCREG_ID_MMFR4_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_MMFR4);
InitReg(MISCREG_ID_ISAR0_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_ISAR0);
InitReg(MISCREG_ID_ISAR1_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_ISAR1);
InitReg(MISCREG_ID_ISAR2_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_ISAR2);
InitReg(MISCREG_ID_ISAR3_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_ISAR3);
InitReg(MISCREG_ID_ISAR4_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_ISAR4);
InitReg(MISCREG_ID_ISAR5_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_ISAR5);
InitReg(MISCREG_ID_ISAR6_EL1)
.allPrivileges().exceptUserMode().writes(0)
.faultRead(EL1, HCR_TRAP(tid3))
.mapsTo(MISCREG_ID_ISAR6);
InitReg(MISCREG_MVFR0_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_MVFR1_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_MVFR2_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_AA64PFR0_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_AA64PFR1_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_AA64DFR0_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_AA64DFR1_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_AA64AFR0_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_AA64AFR1_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_AA64ISAR0_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_AA64ISAR1_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_AA64MMFR0_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_AA64MMFR1_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ID_AA64MMFR2_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_APDAKeyHi_EL1)
.fault(EL1, faultPauthEL1)
.fault(EL2, faultPauthEL2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_APDAKeyLo_EL1)
.fault(EL1, faultPauthEL1)
.fault(EL2, faultPauthEL2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_APDBKeyHi_EL1)
.fault(EL1, faultPauthEL1)
.fault(EL2, faultPauthEL2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_APDBKeyLo_EL1)
.fault(EL1, faultPauthEL1)
.fault(EL2, faultPauthEL2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_APGAKeyHi_EL1)
.fault(EL1, faultPauthEL1)
.fault(EL2, faultPauthEL2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_APGAKeyLo_EL1)
.fault(EL1, faultPauthEL1)
.fault(EL2, faultPauthEL2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_APIAKeyHi_EL1)
.fault(EL1, faultPauthEL1)
.fault(EL2, faultPauthEL2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_APIAKeyLo_EL1)
.fault(EL1, faultPauthEL1)
.fault(EL2, faultPauthEL2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_APIBKeyHi_EL1)
.fault(EL1, faultPauthEL1)
.fault(EL2, faultPauthEL2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_APIBKeyLo_EL1)
.fault(EL1, faultPauthEL1)
.fault(EL2, faultPauthEL2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_CCSIDR_EL1)
.faultRead(EL1, HCR_TRAP(tid2))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_CLIDR_EL1)
.faultRead(EL1, HCR_TRAP(tid2))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_AIDR_EL1)
.faultRead(EL1, HCR_TRAP(tid1))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_CSSELR_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, HCR_TRAP(tid2))
.mapsTo(MISCREG_CSSELR_NS);
InitReg(MISCREG_CTR_EL0)
.faultRead(EL0, faultCtrEL0)
.faultRead(EL1, HCR_TRAP(tid2))
.reads(1);
InitReg(MISCREG_DCZID_EL0)
.reads(1);
InitReg(MISCREG_VPIDR_EL2)
.hyp().mon()
.mapsTo(MISCREG_VPIDR);
InitReg(MISCREG_VMPIDR_EL2)
.hyp().mon()
.mapsTo(MISCREG_VMPIDR);
InitReg(MISCREG_SCTLR_EL1)
.allPrivileges().exceptUserMode()
.faultRead(EL1, HCR_TRAP(trvm))
.faultWrite(EL1, HCR_TRAP(tvm))
.res0( 0x20440 | (EnDB ? 0 : 0x2000)
| (IESB ? 0 : 0x200000)
| (EnDA ? 0 : 0x8000000)
| (EnIB ? 0 : 0x40000000)
| (EnIA ? 0 : 0x80000000))
.res1(0x500800 | (SPAN ? 0 : 0x800000)
| (nTLSMD ? 0 : 0x8000000)
| (LSMAOE ? 0 : 0x10000000))
.mapsTo(MISCREG_SCTLR_NS);
InitReg(MISCREG_SCTLR_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.res0( 0x20440 | (EnDB ? 0 : 0x2000)
| (IESB ? 0 : 0x200000)
| (EnDA ? 0 : 0x8000000)
| (EnIB ? 0 : 0x40000000)
| (EnIA ? 0 : 0x80000000))
.res1(0x500800 | (SPAN ? 0 : 0x800000)
| (nTLSMD ? 0 : 0x8000000)
| (LSMAOE ? 0 : 0x10000000))
.mapsTo(MISCREG_SCTLR_EL1);
InitReg(MISCREG_ACTLR_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, HCR_TRAP(tacr))
.mapsTo(MISCREG_ACTLR_NS);
InitReg(MISCREG_CPACR_EL1)
.allPrivileges().exceptUserMode()
.fault(EL1, faultCpacrEL1)
.fault(EL2, faultCpacrEL2)
.mapsTo(MISCREG_CPACR);
InitReg(MISCREG_CPACR_EL12)
.fault(EL2, faultCpacrVheEL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_CPACR_EL1);
InitReg(MISCREG_SCTLR_EL2)
.hyp().mon()
.res0(0x0512c7c0 | (EnDB ? 0 : 0x2000)
| (IESB ? 0 : 0x200000)
| (EnDA ? 0 : 0x8000000)
| (EnIB ? 0 : 0x40000000)
| (EnIA ? 0 : 0x80000000))
.res1(0x30c50830)
.mapsTo(MISCREG_HSCTLR);
InitReg(MISCREG_ACTLR_EL2)
.hyp().mon()
.mapsTo(MISCREG_HACTLR);
InitReg(MISCREG_HCR_EL2)
.hyp().mon()
.mapsTo(MISCREG_HCR, MISCREG_HCR2);
InitReg(MISCREG_MDCR_EL2)
.hyp().mon()
.fault(EL2, faultDebugEL2)
.mapsTo(MISCREG_HDCR);
InitReg(MISCREG_CPTR_EL2)
.hyp().mon()
.fault(EL2, faultCpacrEL2)
.mapsTo(MISCREG_HCPTR);
InitReg(MISCREG_HSTR_EL2)
.hyp().mon()
.mapsTo(MISCREG_HSTR);
InitReg(MISCREG_HACR_EL2)
.hyp().mon()
.mapsTo(MISCREG_HACR);
InitReg(MISCREG_SCTLR_EL3)
.mon()
.res0(0x0512c7c0 | (EnDB ? 0 : 0x2000)
| (IESB ? 0 : 0x200000)
| (EnDA ? 0 : 0x8000000)
| (EnIB ? 0 : 0x40000000)
| (EnIA ? 0 : 0x80000000))
.res1(0x30c50830);
InitReg(MISCREG_ACTLR_EL3)
.mon();
InitReg(MISCREG_SCR_EL3)
.mon()
.mapsTo(MISCREG_SCR); // NAM D7-2005
InitReg(MISCREG_SDER32_EL3)
.mon()
.mapsTo(MISCREG_SDER);
InitReg(MISCREG_CPTR_EL3)
.mon();
InitReg(MISCREG_MDCR_EL3)
.mon()
.mapsTo(MISCREG_SDCR);
InitReg(MISCREG_TTBR0_EL1)
.allPrivileges().exceptUserMode()
.faultRead(EL1, HCR_TRAP(trvm))
.faultWrite(EL1, HCR_TRAP(tvm))
.mapsTo(MISCREG_TTBR0_NS);
InitReg(MISCREG_TTBR0_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_TTBR0_EL1);
InitReg(MISCREG_TTBR1_EL1)
.allPrivileges().exceptUserMode()
.faultRead(EL1, HCR_TRAP(trvm))
.faultWrite(EL1, HCR_TRAP(tvm))
.mapsTo(MISCREG_TTBR1_NS);
InitReg(MISCREG_TTBR1_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_TTBR1_EL1);
InitReg(MISCREG_TCR_EL1)
.allPrivileges().exceptUserMode()
.faultRead(EL1, HCR_TRAP(trvm))
.faultWrite(EL1, HCR_TRAP(tvm))
.mapsTo(MISCREG_TTBCR_NS);
InitReg(MISCREG_TCR_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_TTBCR_NS);
InitReg(MISCREG_TTBR0_EL2)
.hyp().mon()
.mapsTo(MISCREG_HTTBR);
InitReg(MISCREG_TTBR1_EL2)
.hyp().mon();
InitReg(MISCREG_TCR_EL2)
.hyp().mon()
.mapsTo(MISCREG_HTCR);
InitReg(MISCREG_VTTBR_EL2)
.hyp().mon()
.mapsTo(MISCREG_VTTBR);
InitReg(MISCREG_VTCR_EL2)
.hyp().mon()
.mapsTo(MISCREG_VTCR);
InitReg(MISCREG_VSTTBR_EL2)
.hypSecure().mon();
InitReg(MISCREG_VSTCR_EL2)
.hypSecure().mon();
InitReg(MISCREG_TTBR0_EL3)
.mon();
InitReg(MISCREG_TCR_EL3)
.mon();
InitReg(MISCREG_DACR32_EL2)
.hyp().mon()
.mapsTo(MISCREG_DACR_NS);
InitReg(MISCREG_SPSR_EL1)
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_SPSR_SVC); // NAM C5.2.17 SPSR_EL1
InitReg(MISCREG_SPSR_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_SPSR_SVC);
InitReg(MISCREG_ELR_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ELR_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_ELR_EL1);
InitReg(MISCREG_SP_EL0)
.allPrivileges().exceptUserMode()
.fault(EL1, faultSpEL0)
.fault(EL2, faultSpEL0)
.fault(EL3, faultSpEL0);
InitReg(MISCREG_SPSEL)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_CURRENTEL)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_PAN)
.allPrivileges(release->has(ArmExtension::FEAT_PAN))
.exceptUserMode();
InitReg(MISCREG_UAO)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_NZCV)
.allPrivileges();
InitReg(MISCREG_DAIF)
.allPrivileges()
.fault(EL0, faultDaif);
InitReg(MISCREG_FPCR)
.allPrivileges()
.fault(EL0, faultFpcrEL0)
.fault(EL1, faultFpcrEL1)
.fault(EL2, faultFpcrEL2)
.fault(EL3, faultFpcrEL3);
InitReg(MISCREG_FPSR)
.allPrivileges()
.fault(EL0, faultFpcrEL0)
.fault(EL1, faultFpcrEL1)
.fault(EL2, faultFpcrEL2)
.fault(EL3, faultFpcrEL3);
InitReg(MISCREG_DSPSR_EL0)
.allPrivileges();
InitReg(MISCREG_DLR_EL0)
.allPrivileges();
InitReg(MISCREG_SPSR_EL2)
.hyp().mon()
.mapsTo(MISCREG_SPSR_HYP); // NAM C5.2.18 SPSR_EL2
InitReg(MISCREG_ELR_EL2)
.hyp().mon();
InitReg(MISCREG_SP_EL1)
.hyp().mon();
InitReg(MISCREG_SPSR_IRQ_AA64)
.hyp().mon();
InitReg(MISCREG_SPSR_ABT_AA64)
.hyp().mon();
InitReg(MISCREG_SPSR_UND_AA64)
.hyp().mon();
InitReg(MISCREG_SPSR_FIQ_AA64)
.hyp().mon();
InitReg(MISCREG_SPSR_EL3)
.mon()
.mapsTo(MISCREG_SPSR_MON); // NAM C5.2.19 SPSR_EL3
InitReg(MISCREG_ELR_EL3)
.mon();
InitReg(MISCREG_SP_EL2)
.mon();
InitReg(MISCREG_AFSR0_EL1)
.allPrivileges().exceptUserMode()
.faultRead(EL1, HCR_TRAP(trvm))
.faultWrite(EL1, HCR_TRAP(tvm))
.mapsTo(MISCREG_ADFSR_NS);
InitReg(MISCREG_AFSR0_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_ADFSR_NS);
InitReg(MISCREG_AFSR1_EL1)
.allPrivileges().exceptUserMode()
.faultRead(EL1, HCR_TRAP(trvm))
.faultWrite(EL1, HCR_TRAP(tvm))
.mapsTo(MISCREG_AIFSR_NS);
InitReg(MISCREG_AFSR1_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_AIFSR_NS);
InitReg(MISCREG_ESR_EL1)
.faultRead(EL1, HCR_TRAP(trvm))
.faultWrite(EL1, HCR_TRAP(tvm))
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ESR_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_ESR_EL1);
InitReg(MISCREG_IFSR32_EL2)
.hyp().mon()
.mapsTo(MISCREG_IFSR_NS);
InitReg(MISCREG_AFSR0_EL2)
.hyp().mon()
.mapsTo(MISCREG_HADFSR);
InitReg(MISCREG_AFSR1_EL2)
.hyp().mon()
.mapsTo(MISCREG_HAIFSR);
InitReg(MISCREG_ESR_EL2)
.hyp().mon()
.mapsTo(MISCREG_HSR);
InitReg(MISCREG_FPEXC32_EL2)
.fault(EL2, faultFpcrEL2)
.fault(EL3, faultFpcrEL3)
.mapsTo(MISCREG_FPEXC);
InitReg(MISCREG_AFSR0_EL3)
.mon();
InitReg(MISCREG_AFSR1_EL3)
.mon();
InitReg(MISCREG_ESR_EL3)
.mon();
InitReg(MISCREG_FAR_EL1)
.allPrivileges().exceptUserMode()
.faultRead(EL1, HCR_TRAP(trvm))
.faultWrite(EL1, HCR_TRAP(tvm))
.mapsTo(MISCREG_DFAR_NS, MISCREG_IFAR_NS);
InitReg(MISCREG_FAR_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_DFAR_NS, MISCREG_IFAR_NS);
InitReg(MISCREG_FAR_EL2)
.hyp().mon()
.mapsTo(MISCREG_HDFAR, MISCREG_HIFAR);
InitReg(MISCREG_HPFAR_EL2)
.hyp().mon()
.mapsTo(MISCREG_HPFAR);
InitReg(MISCREG_FAR_EL3)
.mon();
InitReg(MISCREG_IC_IALLUIS)
.warnNotFail()
.faultWrite(EL1, faultPouIsEL1)
.writes(1).exceptUserMode();
InitReg(MISCREG_PAR_EL1)
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_PAR_NS);
InitReg(MISCREG_IC_IALLU)
.warnNotFail()
.faultWrite(EL1, faultPouEL1)
.writes(1).exceptUserMode();
InitReg(MISCREG_DC_IVAC_Xt)
.faultWrite(EL1, HCR_TRAP(tpc))
.writes(1).exceptUserMode();
InitReg(MISCREG_DC_ISW_Xt)
.warnNotFail()
.faultWrite(EL1, HCR_TRAP(tsw))
.writes(1).exceptUserMode();
InitReg(MISCREG_AT_S1E1R_Xt)
.faultWrite(EL1, HCR_TRAP(at))
.writes(1).exceptUserMode();
InitReg(MISCREG_AT_S1E1W_Xt)
.faultWrite(EL1, HCR_TRAP(at))
.writes(1).exceptUserMode();
InitReg(MISCREG_AT_S1E0R_Xt)
.faultWrite(EL1, HCR_TRAP(at))
.writes(1).exceptUserMode();
InitReg(MISCREG_AT_S1E0W_Xt)
.faultWrite(EL1, HCR_TRAP(at))
.writes(1).exceptUserMode();
InitReg(MISCREG_DC_CSW_Xt)
.warnNotFail()
.faultWrite(EL1, HCR_TRAP(tsw))
.writes(1).exceptUserMode();
InitReg(MISCREG_DC_CISW_Xt)
.warnNotFail()
.faultWrite(EL1, HCR_TRAP(tsw))
.writes(1).exceptUserMode();
InitReg(MISCREG_DC_ZVA_Xt)
.writes(1)
.faultWrite(EL0, faultDczvaEL0)
.faultWrite(EL1, HCR_TRAP(tdz));
InitReg(MISCREG_IC_IVAU_Xt)
.faultWrite(EL0, faultPouEL0)
.faultWrite(EL1, faultPouEL1)
.writes(1);
InitReg(MISCREG_DC_CVAC_Xt)
.faultWrite(EL0, faultCvacEL0)
.faultWrite(EL1, HCR_TRAP(tpc))
.writes(1);
InitReg(MISCREG_DC_CVAU_Xt)
.faultWrite(EL0, faultPouEL0)
.faultWrite(EL1, faultPouEL1)
.writes(1);
InitReg(MISCREG_DC_CIVAC_Xt)
.faultWrite(EL0, faultCvacEL0)
.faultWrite(EL1, HCR_TRAP(tpc))
.writes(1);
InitReg(MISCREG_AT_S1E2R_Xt)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_AT_S1E2W_Xt)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_AT_S12E1R_Xt)
.hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_AT_S12E1W_Xt)
.hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_AT_S12E0R_Xt)
.hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_AT_S12E0W_Xt)
.hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_AT_S1E3R_Xt)
.monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_AT_S1E3W_Xt)
.monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_VMALLE1IS)
.faultWrite(EL1, HCR_TRAP(ttlb))
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBI_VAE1IS_Xt)
.faultWrite(EL1, HCR_TRAP(ttlb))
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBI_ASIDE1IS_Xt)
.faultWrite(EL1, HCR_TRAP(ttlb))
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBI_VAAE1IS_Xt)
.faultWrite(EL1, HCR_TRAP(ttlb))
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBI_VALE1IS_Xt)
.faultWrite(EL1, HCR_TRAP(ttlb))
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBI_VAALE1IS_Xt)
.faultWrite(EL1, HCR_TRAP(ttlb))
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBI_VMALLE1)
.faultWrite(EL1, HCR_TRAP(ttlb))
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBI_VAE1_Xt)
.faultWrite(EL1, HCR_TRAP(ttlb))
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBI_ASIDE1_Xt)
.faultWrite(EL1, HCR_TRAP(ttlb))
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBI_VAAE1_Xt)
.faultWrite(EL1, HCR_TRAP(ttlb))
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBI_VALE1_Xt)
.faultWrite(EL1, HCR_TRAP(ttlb))
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBI_VAALE1_Xt)
.faultWrite(EL1, HCR_TRAP(ttlb))
.writes(1).exceptUserMode();
InitReg(MISCREG_TLBI_IPAS2E1IS_Xt)
.hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_IPAS2LE1IS_Xt)
.hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_ALLE2IS)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBI_VAE2IS_Xt)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBI_ALLE1IS)
.hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_VALE2IS_Xt)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBI_VMALLS12E1IS)
.hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_IPAS2E1_Xt)
.hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_IPAS2LE1_Xt)
.hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_ALLE2)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBI_VAE2_Xt)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBI_ALLE1)
.hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_VALE2_Xt)
.monNonSecureWrite().hypWrite();
InitReg(MISCREG_TLBI_VMALLS12E1)
.hypWrite().monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_ALLE3IS)
.monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_VAE3IS_Xt)
.monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_VALE3IS_Xt)
.monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_ALLE3)
.monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_VAE3_Xt)
.monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_TLBI_VALE3_Xt)
.monSecureWrite().monNonSecureWrite();
InitReg(MISCREG_PMINTENSET_EL1)
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_PMINTENSET);
InitReg(MISCREG_PMINTENCLR_EL1)
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_PMINTENCLR);
InitReg(MISCREG_PMCR_EL0)
.allPrivileges()
.mapsTo(MISCREG_PMCR);
InitReg(MISCREG_PMCNTENSET_EL0)
.allPrivileges()
.mapsTo(MISCREG_PMCNTENSET);
InitReg(MISCREG_PMCNTENCLR_EL0)
.allPrivileges()
.mapsTo(MISCREG_PMCNTENCLR);
InitReg(MISCREG_PMOVSCLR_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMOVSCLR);
InitReg(MISCREG_PMSWINC_EL0)
.writes(1).user()
.mapsTo(MISCREG_PMSWINC);
InitReg(MISCREG_PMSELR_EL0)
.allPrivileges()
.mapsTo(MISCREG_PMSELR);
InitReg(MISCREG_PMCEID0_EL0)
.reads(1).user()
.mapsTo(MISCREG_PMCEID0);
InitReg(MISCREG_PMCEID1_EL0)
.reads(1).user()
.mapsTo(MISCREG_PMCEID1);
InitReg(MISCREG_PMCCNTR_EL0)
.allPrivileges()
.mapsTo(MISCREG_PMCCNTR);
InitReg(MISCREG_PMXEVTYPER_EL0)
.allPrivileges()
.mapsTo(MISCREG_PMXEVTYPER);
InitReg(MISCREG_PMCCFILTR_EL0)
.allPrivileges();
InitReg(MISCREG_PMXEVCNTR_EL0)
.allPrivileges()
.mapsTo(MISCREG_PMXEVCNTR);
InitReg(MISCREG_PMUSERENR_EL0)
.allPrivileges().userNonSecureWrite(0).userSecureWrite(0)
.mapsTo(MISCREG_PMUSERENR);
InitReg(MISCREG_PMOVSSET_EL0)
.allPrivileges()
.mapsTo(MISCREG_PMOVSSET);
InitReg(MISCREG_MAIR_EL1)
.allPrivileges().exceptUserMode()
.faultRead(EL1, HCR_TRAP(trvm))
.faultWrite(EL1, HCR_TRAP(tvm))
.mapsTo(MISCREG_PRRR_NS, MISCREG_NMRR_NS);
InitReg(MISCREG_MAIR_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_PRRR_NS, MISCREG_NMRR_NS);
InitReg(MISCREG_AMAIR_EL1)
.allPrivileges().exceptUserMode()
.faultRead(EL1, HCR_TRAP(trvm))
.faultWrite(EL1, HCR_TRAP(tvm))
.mapsTo(MISCREG_AMAIR0_NS, MISCREG_AMAIR1_NS);
InitReg(MISCREG_AMAIR_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_AMAIR0_NS, MISCREG_AMAIR1_NS);
InitReg(MISCREG_MAIR_EL2)
.hyp().mon()
.mapsTo(MISCREG_HMAIR0, MISCREG_HMAIR1);
InitReg(MISCREG_AMAIR_EL2)
.hyp().mon()
.mapsTo(MISCREG_HAMAIR0, MISCREG_HAMAIR1);
InitReg(MISCREG_MAIR_EL3)
.mon();
InitReg(MISCREG_AMAIR_EL3)
.mon();
InitReg(MISCREG_L2CTLR_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_L2ECTLR_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_VBAR_EL1)
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_VBAR_NS);
InitReg(MISCREG_VBAR_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_VBAR_NS);
InitReg(MISCREG_RVBAR_EL1)
.privRead(FullSystem && system->highestEL() == EL1);
InitReg(MISCREG_ISR_EL1)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_VBAR_EL2)
.hyp().mon()
.res0(0x7ff)
.mapsTo(MISCREG_HVBAR);
InitReg(MISCREG_RVBAR_EL2)
.hypRead(FullSystem && system->highestEL() == EL2);
InitReg(MISCREG_VBAR_EL3)
.mon();
InitReg(MISCREG_RVBAR_EL3)
.mon().writes(0);
InitReg(MISCREG_RMR_EL3)
.mon();
InitReg(MISCREG_CONTEXTIDR_EL1)
.allPrivileges().exceptUserMode()
.faultRead(EL1, HCR_TRAP(trvm))
.faultWrite(EL1, HCR_TRAP(tvm))
.mapsTo(MISCREG_CONTEXTIDR_NS);
InitReg(MISCREG_CONTEXTIDR_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_CONTEXTIDR_NS);
InitReg(MISCREG_TPIDR_EL1)
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_TPIDRPRW_NS);
InitReg(MISCREG_TPIDR_EL0)
.allPrivileges()
.mapsTo(MISCREG_TPIDRURW_NS);
InitReg(MISCREG_TPIDRRO_EL0)
.allPrivileges().userNonSecureWrite(0).userSecureWrite(0)
.mapsTo(MISCREG_TPIDRURO_NS);
InitReg(MISCREG_TPIDR_EL2)
.hyp().mon()
.mapsTo(MISCREG_HTPIDR);
InitReg(MISCREG_TPIDR_EL3)
.mon();
// BEGIN Generic Timer (AArch64)
InitReg(MISCREG_CNTFRQ_EL0)
.reads(1)
.faultRead(EL0, faultGenericTimerEL0)
.highest(system)
.privSecureWrite(aarch32EL3)
.mapsTo(MISCREG_CNTFRQ);
InitReg(MISCREG_CNTPCT_EL0)
.unverifiable()
.faultRead(EL0, faultCntpctEL0)
.faultRead(EL1, faultCntpctEL1)
.reads(1)
.mapsTo(MISCREG_CNTPCT);
InitReg(MISCREG_CNTVCT_EL0)
.unverifiable()
.faultRead(EL0, faultCntvctEL0)
.faultRead(EL1, faultCntvctEL1)
.reads(1)
.mapsTo(MISCREG_CNTVCT);
InitReg(MISCREG_CNTP_CTL_EL0)
.allPrivileges()
.fault(EL0, faultCntpCtlEL0)
.fault(EL1, faultCntpCtlEL1)
.res0(0xfffffffffffffff8)
.mapsTo(MISCREG_CNTP_CTL_NS);
InitReg(MISCREG_CNTP_CVAL_EL0)
.allPrivileges()
.fault(EL0, faultCntpCtlEL0)
.fault(EL1, faultCntpCtlEL1)
.mapsTo(MISCREG_CNTP_CVAL_NS);
InitReg(MISCREG_CNTP_TVAL_EL0)
.allPrivileges()
.fault(EL0, faultCntpCtlEL0)
.fault(EL1, faultCntpCtlEL1)
.res0(0xffffffff00000000)
.mapsTo(MISCREG_CNTP_TVAL_NS);
InitReg(MISCREG_CNTV_CTL_EL0)
.allPrivileges()
.fault(EL0, faultCntvCtlEL0)
.fault(EL1, faultCntvCtlEL1)
.res0(0xfffffffffffffff8)
.mapsTo(MISCREG_CNTV_CTL);
InitReg(MISCREG_CNTV_CVAL_EL0)
.allPrivileges()
.fault(EL0, faultCntvCtlEL0)
.fault(EL1, faultCntvCtlEL1)
.mapsTo(MISCREG_CNTV_CVAL);
InitReg(MISCREG_CNTV_TVAL_EL0)
.allPrivileges()
.fault(EL0, faultCntvCtlEL0)
.fault(EL1, faultCntvCtlEL1)
.res0(0xffffffff00000000)
.mapsTo(MISCREG_CNTV_TVAL);
InitReg(MISCREG_CNTP_CTL_EL02)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.res0(0xfffffffffffffff8)
.mapsTo(MISCREG_CNTP_CTL_NS);
InitReg(MISCREG_CNTP_CVAL_EL02)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_CNTP_CVAL_NS);
InitReg(MISCREG_CNTP_TVAL_EL02)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.res0(0xffffffff00000000)
.mapsTo(MISCREG_CNTP_TVAL_NS);
InitReg(MISCREG_CNTV_CTL_EL02)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.res0(0xfffffffffffffff8)
.mapsTo(MISCREG_CNTV_CTL);
InitReg(MISCREG_CNTV_CVAL_EL02)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_CNTV_CVAL);
InitReg(MISCREG_CNTV_TVAL_EL02)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.res0(0xffffffff00000000)
.mapsTo(MISCREG_CNTV_TVAL);
InitReg(MISCREG_CNTKCTL_EL1)
.allPrivileges()
.exceptUserMode()
.res0(0xfffffffffffdfc00)
.mapsTo(MISCREG_CNTKCTL);
InitReg(MISCREG_CNTKCTL_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.res0(0xfffffffffffdfc00)
.mapsTo(MISCREG_CNTKCTL);
InitReg(MISCREG_CNTPS_CTL_EL1)
.mon()
.privSecure()
.fault(EL1, faultCntpsCtlEL1)
.res0(0xfffffffffffffff8);
InitReg(MISCREG_CNTPS_CVAL_EL1)
.mon()
.privSecure()
.fault(EL1, faultCntpsCtlEL1);
InitReg(MISCREG_CNTPS_TVAL_EL1)
.mon()
.privSecure()
.fault(EL1, faultCntpsCtlEL1)
.res0(0xffffffff00000000);
InitReg(MISCREG_CNTHCTL_EL2)
.mon()
.hyp()
.res0(0xfffffffffffc0000)
.mapsTo(MISCREG_CNTHCTL);
InitReg(MISCREG_CNTHP_CTL_EL2)
.mon()
.hyp()
.res0(0xfffffffffffffff8)
.mapsTo(MISCREG_CNTHP_CTL);
InitReg(MISCREG_CNTHP_CVAL_EL2)
.mon()
.hyp()
.mapsTo(MISCREG_CNTHP_CVAL);
InitReg(MISCREG_CNTHP_TVAL_EL2)
.mon()
.hyp()
.res0(0xffffffff00000000)
.mapsTo(MISCREG_CNTHP_TVAL);
InitReg(MISCREG_CNTHPS_CTL_EL2)
.mon(sel2_implemented)
.hypSecure(sel2_implemented)
.res0(0xfffffffffffffff8);
InitReg(MISCREG_CNTHPS_CVAL_EL2)
.mon(sel2_implemented)
.hypSecure(sel2_implemented);
InitReg(MISCREG_CNTHPS_TVAL_EL2)
.mon(sel2_implemented)
.hypSecure(sel2_implemented)
.res0(0xffffffff00000000);
InitReg(MISCREG_CNTHV_CTL_EL2)
.mon(vhe_implemented)
.hyp()
.res0(0xfffffffffffffff8);
InitReg(MISCREG_CNTHV_CVAL_EL2)
.mon(vhe_implemented)
.hyp(vhe_implemented);
InitReg(MISCREG_CNTHV_TVAL_EL2)
.mon(vhe_implemented)
.hyp(vhe_implemented)
.res0(0xffffffff00000000);
InitReg(MISCREG_CNTHVS_CTL_EL2)
.mon(vhe_implemented && sel2_implemented)
.hypSecure(vhe_implemented && sel2_implemented)
.res0(0xfffffffffffffff8);
InitReg(MISCREG_CNTHVS_CVAL_EL2)
.mon(vhe_implemented && sel2_implemented)
.hypSecure(vhe_implemented && sel2_implemented);
InitReg(MISCREG_CNTHVS_TVAL_EL2)
.mon(vhe_implemented && sel2_implemented)
.hypSecure(vhe_implemented && sel2_implemented)
.res0(0xffffffff00000000);
// ENDIF Armv8.1-VHE
InitReg(MISCREG_CNTVOFF_EL2)
.mon()
.hyp()
.mapsTo(MISCREG_CNTVOFF);
// END Generic Timer (AArch64)
InitReg(MISCREG_PMEVCNTR0_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMEVCNTR0);
InitReg(MISCREG_PMEVCNTR1_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMEVCNTR1);
InitReg(MISCREG_PMEVCNTR2_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMEVCNTR2);
InitReg(MISCREG_PMEVCNTR3_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMEVCNTR3);
InitReg(MISCREG_PMEVCNTR4_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMEVCNTR4);
InitReg(MISCREG_PMEVCNTR5_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMEVCNTR5);
InitReg(MISCREG_PMEVTYPER0_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMEVTYPER0);
InitReg(MISCREG_PMEVTYPER1_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMEVTYPER1);
InitReg(MISCREG_PMEVTYPER2_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMEVTYPER2);
InitReg(MISCREG_PMEVTYPER3_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMEVTYPER3);
InitReg(MISCREG_PMEVTYPER4_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMEVTYPER4);
InitReg(MISCREG_PMEVTYPER5_EL0)
.allPrivileges();
// .mapsTo(MISCREG_PMEVTYPER5);
InitReg(MISCREG_IL1DATA0_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_IL1DATA1_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_IL1DATA2_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_IL1DATA3_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DL1DATA0_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DL1DATA1_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DL1DATA2_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DL1DATA3_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_DL1DATA4_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_L2ACTLR_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_CPUACTLR_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_CPUECTLR_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_CPUMERRSR_EL1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_L2MERRSR_EL1)
.warnNotFail()
.fault(faultUnimplemented);
InitReg(MISCREG_CBAR_EL1)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_CONTEXTIDR_EL2)
.mon().hyp();
// GICv3 AArch64
InitReg(MISCREG_ICC_PMR_EL1)
.res0(0xffffff00) // [31:8]
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_PMR);
InitReg(MISCREG_ICC_IAR0_EL1)
.allPrivileges().exceptUserMode().writes(0)
.mapsTo(MISCREG_ICC_IAR0);
InitReg(MISCREG_ICC_EOIR0_EL1)
.allPrivileges().exceptUserMode().reads(0)
.mapsTo(MISCREG_ICC_EOIR0);
InitReg(MISCREG_ICC_HPPIR0_EL1)
.allPrivileges().exceptUserMode().writes(0)
.mapsTo(MISCREG_ICC_HPPIR0);
InitReg(MISCREG_ICC_BPR0_EL1)
.res0(0xfffffff8) // [31:3]
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_BPR0);
InitReg(MISCREG_ICC_AP0R0_EL1)
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_AP0R0);
InitReg(MISCREG_ICC_AP0R1_EL1)
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_AP0R1);
InitReg(MISCREG_ICC_AP0R2_EL1)
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_AP0R2);
InitReg(MISCREG_ICC_AP0R3_EL1)
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_AP0R3);
InitReg(MISCREG_ICC_AP1R0_EL1)
.banked64()
.mapsTo(MISCREG_ICC_AP1R0);
InitReg(MISCREG_ICC_AP1R0_EL1_NS)
.bankedChild()
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_AP1R0_NS);
InitReg(MISCREG_ICC_AP1R0_EL1_S)
.bankedChild()
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_AP1R0_S);
InitReg(MISCREG_ICC_AP1R1_EL1)
.banked64()
.mapsTo(MISCREG_ICC_AP1R1);
InitReg(MISCREG_ICC_AP1R1_EL1_NS)
.bankedChild()
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_AP1R1_NS);
InitReg(MISCREG_ICC_AP1R1_EL1_S)
.bankedChild()
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_AP1R1_S);
InitReg(MISCREG_ICC_AP1R2_EL1)
.banked64()
.mapsTo(MISCREG_ICC_AP1R2);
InitReg(MISCREG_ICC_AP1R2_EL1_NS)
.bankedChild()
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_AP1R2_NS);
InitReg(MISCREG_ICC_AP1R2_EL1_S)
.bankedChild()
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_AP1R2_S);
InitReg(MISCREG_ICC_AP1R3_EL1)
.banked64()
.mapsTo(MISCREG_ICC_AP1R3);
InitReg(MISCREG_ICC_AP1R3_EL1_NS)
.bankedChild()
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_AP1R3_NS);
InitReg(MISCREG_ICC_AP1R3_EL1_S)
.bankedChild()
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_AP1R3_S);
InitReg(MISCREG_ICC_DIR_EL1)
.res0(0xFF000000) // [31:24]
.allPrivileges().exceptUserMode().reads(0)
.mapsTo(MISCREG_ICC_DIR);
InitReg(MISCREG_ICC_RPR_EL1)
.allPrivileges().exceptUserMode().writes(0)
.mapsTo(MISCREG_ICC_RPR);
InitReg(MISCREG_ICC_SGI1R_EL1)
.allPrivileges().exceptUserMode().reads(0)
.faultWrite(EL1, faultIccSgiEL1)
.faultWrite(EL2, faultIccSgiEL2)
.mapsTo(MISCREG_ICC_SGI1R);
InitReg(MISCREG_ICC_ASGI1R_EL1)
.allPrivileges().exceptUserMode().reads(0)
.faultWrite(EL1, faultIccSgiEL1)
.faultWrite(EL2, faultIccSgiEL2)
.mapsTo(MISCREG_ICC_ASGI1R);
InitReg(MISCREG_ICC_SGI0R_EL1)
.allPrivileges().exceptUserMode().reads(0)
.faultWrite(EL1, faultIccSgiEL1)
.faultWrite(EL2, faultIccSgiEL2)
.mapsTo(MISCREG_ICC_SGI0R);
InitReg(MISCREG_ICC_IAR1_EL1)
.allPrivileges().exceptUserMode().writes(0)
.mapsTo(MISCREG_ICC_IAR1);
InitReg(MISCREG_ICC_EOIR1_EL1)
.res0(0xFF000000) // [31:24]
.allPrivileges().exceptUserMode().reads(0)
.mapsTo(MISCREG_ICC_EOIR1);
InitReg(MISCREG_ICC_HPPIR1_EL1)
.allPrivileges().exceptUserMode().writes(0)
.mapsTo(MISCREG_ICC_HPPIR1);
InitReg(MISCREG_ICC_BPR1_EL1)
.banked64()
.mapsTo(MISCREG_ICC_BPR1);
InitReg(MISCREG_ICC_BPR1_EL1_NS)
.bankedChild()
.res0(0xfffffff8) // [31:3]
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_BPR1_NS);
InitReg(MISCREG_ICC_BPR1_EL1_S)
.bankedChild()
.res0(0xfffffff8) // [31:3]
.secure().exceptUserMode()
.mapsTo(MISCREG_ICC_BPR1_S);
InitReg(MISCREG_ICC_CTLR_EL1)
.banked64()
.mapsTo(MISCREG_ICC_CTLR);
InitReg(MISCREG_ICC_CTLR_EL1_NS)
.bankedChild()
.res0(0xFFFB00BC) // [31:19, 17:16, 7, 5:2]
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_CTLR_NS);
InitReg(MISCREG_ICC_CTLR_EL1_S)
.bankedChild()
.res0(0xFFFB00BC) // [31:19, 17:16, 7, 5:2]
.secure().exceptUserMode()
.mapsTo(MISCREG_ICC_CTLR_S);
InitReg(MISCREG_ICC_SRE_EL1)
.banked()
.mapsTo(MISCREG_ICC_SRE);
InitReg(MISCREG_ICC_SRE_EL1_NS)
.bankedChild()
.res0(0xFFFFFFF8) // [31:3]
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_SRE_NS);
InitReg(MISCREG_ICC_SRE_EL1_S)
.bankedChild()
.res0(0xFFFFFFF8) // [31:3]
.secure().exceptUserMode()
.mapsTo(MISCREG_ICC_SRE_S);
InitReg(MISCREG_ICC_IGRPEN0_EL1)
.res0(0xFFFFFFFE) // [31:1]
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_IGRPEN0);
InitReg(MISCREG_ICC_IGRPEN1_EL1)
.banked64()
.mapsTo(MISCREG_ICC_IGRPEN1);
InitReg(MISCREG_ICC_IGRPEN1_EL1_NS)
.bankedChild()
.res0(0xFFFFFFFE) // [31:1]
.allPrivileges().exceptUserMode()
.mapsTo(MISCREG_ICC_IGRPEN1_NS);
InitReg(MISCREG_ICC_IGRPEN1_EL1_S)
.bankedChild()
.res0(0xFFFFFFFE) // [31:1]
.secure().exceptUserMode()
.mapsTo(MISCREG_ICC_IGRPEN1_S);
InitReg(MISCREG_ICC_SRE_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICC_HSRE);
InitReg(MISCREG_ICC_CTLR_EL3)
.mon()
.mapsTo(MISCREG_ICC_MCTLR);
InitReg(MISCREG_ICC_SRE_EL3)
.mon()
.mapsTo(MISCREG_ICC_MSRE);
InitReg(MISCREG_ICC_IGRPEN1_EL3)
.mon()
.mapsTo(MISCREG_ICC_MGRPEN1);
InitReg(MISCREG_ICH_AP0R0_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_AP0R0);
InitReg(MISCREG_ICH_AP0R1_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_AP0R1);
InitReg(MISCREG_ICH_AP0R2_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_AP0R2);
InitReg(MISCREG_ICH_AP0R3_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_AP0R3);
InitReg(MISCREG_ICH_AP1R0_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_AP1R0);
InitReg(MISCREG_ICH_AP1R1_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_AP1R1);
InitReg(MISCREG_ICH_AP1R2_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_AP1R2);
InitReg(MISCREG_ICH_AP1R3_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_AP1R3);
InitReg(MISCREG_ICH_HCR_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_HCR);
InitReg(MISCREG_ICH_VTR_EL2)
.hyp().mon().writes(0)
.mapsTo(MISCREG_ICH_VTR);
InitReg(MISCREG_ICH_MISR_EL2)
.hyp().mon().writes(0)
.mapsTo(MISCREG_ICH_MISR);
InitReg(MISCREG_ICH_EISR_EL2)
.hyp().mon().writes(0)
.mapsTo(MISCREG_ICH_EISR);
InitReg(MISCREG_ICH_ELRSR_EL2)
.hyp().mon().writes(0)
.mapsTo(MISCREG_ICH_ELRSR);
InitReg(MISCREG_ICH_VMCR_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_VMCR);
InitReg(MISCREG_ICH_LR0_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR0, MISCREG_ICH_LRC0);
InitReg(MISCREG_ICH_LR1_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR1, MISCREG_ICH_LRC1);
InitReg(MISCREG_ICH_LR2_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR2, MISCREG_ICH_LRC2);
InitReg(MISCREG_ICH_LR3_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR3, MISCREG_ICH_LRC3);
InitReg(MISCREG_ICH_LR4_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR4, MISCREG_ICH_LRC4);
InitReg(MISCREG_ICH_LR5_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR5, MISCREG_ICH_LRC5);
InitReg(MISCREG_ICH_LR6_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR6, MISCREG_ICH_LRC6);
InitReg(MISCREG_ICH_LR7_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR7, MISCREG_ICH_LRC7);
InitReg(MISCREG_ICH_LR8_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR8, MISCREG_ICH_LRC8);
InitReg(MISCREG_ICH_LR9_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR9, MISCREG_ICH_LRC9);
InitReg(MISCREG_ICH_LR10_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR10, MISCREG_ICH_LRC10);
InitReg(MISCREG_ICH_LR11_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR11, MISCREG_ICH_LRC11);
InitReg(MISCREG_ICH_LR12_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR12, MISCREG_ICH_LRC12);
InitReg(MISCREG_ICH_LR13_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR13, MISCREG_ICH_LRC13);
InitReg(MISCREG_ICH_LR14_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR14, MISCREG_ICH_LRC14);
InitReg(MISCREG_ICH_LR15_EL2)
.hyp().mon()
.mapsTo(MISCREG_ICH_LR15, MISCREG_ICH_LRC15);
// GICv3 AArch32
InitReg(MISCREG_ICC_AP0R0)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP0R1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP0R2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP0R3)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP1R0)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP1R0_NS)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP1R0_S)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP1R1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP1R1_NS)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP1R1_S)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP1R2)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP1R2_NS)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP1R2_S)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP1R3)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP1R3_NS)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_AP1R3_S)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_ASGI1R)
.allPrivileges().exceptUserMode().reads(0);
InitReg(MISCREG_ICC_BPR0)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_BPR1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_BPR1_NS)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_BPR1_S)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_CTLR)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_CTLR_NS)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_CTLR_S)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_DIR)
.allPrivileges().exceptUserMode().reads(0);
InitReg(MISCREG_ICC_EOIR0)
.allPrivileges().exceptUserMode().reads(0);
InitReg(MISCREG_ICC_EOIR1)
.allPrivileges().exceptUserMode().reads(0);
InitReg(MISCREG_ICC_HPPIR0)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ICC_HPPIR1)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ICC_HSRE)
.hyp().mon();
InitReg(MISCREG_ICC_IAR0)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ICC_IAR1)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ICC_IGRPEN0)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_IGRPEN1)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_IGRPEN1_NS)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_IGRPEN1_S)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_MCTLR)
.mon();
InitReg(MISCREG_ICC_MGRPEN1)
.mon();
InitReg(MISCREG_ICC_MSRE)
.mon();
InitReg(MISCREG_ICC_PMR)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_RPR)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ICC_SGI0R)
.allPrivileges().exceptUserMode().reads(0);
InitReg(MISCREG_ICC_SGI1R)
.allPrivileges().exceptUserMode().reads(0);
InitReg(MISCREG_ICC_SRE)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_SRE_NS)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICC_SRE_S)
.allPrivileges().exceptUserMode();
InitReg(MISCREG_ICH_AP0R0)
.hyp().mon();
InitReg(MISCREG_ICH_AP0R1)
.hyp().mon();
InitReg(MISCREG_ICH_AP0R2)
.hyp().mon();
InitReg(MISCREG_ICH_AP0R3)
.hyp().mon();
InitReg(MISCREG_ICH_AP1R0)
.hyp().mon();
InitReg(MISCREG_ICH_AP1R1)
.hyp().mon();
InitReg(MISCREG_ICH_AP1R2)
.hyp().mon();
InitReg(MISCREG_ICH_AP1R3)
.hyp().mon();
InitReg(MISCREG_ICH_HCR)
.hyp().mon();
InitReg(MISCREG_ICH_VTR)
.hyp().mon().writes(0);
InitReg(MISCREG_ICH_MISR)
.hyp().mon().writes(0);
InitReg(MISCREG_ICH_EISR)
.hyp().mon().writes(0);
InitReg(MISCREG_ICH_ELRSR)
.hyp().mon().writes(0);
InitReg(MISCREG_ICH_VMCR)
.hyp().mon();
InitReg(MISCREG_ICH_LR0)
.hyp().mon();
InitReg(MISCREG_ICH_LR1)
.hyp().mon();
InitReg(MISCREG_ICH_LR2)
.hyp().mon();
InitReg(MISCREG_ICH_LR3)
.hyp().mon();
InitReg(MISCREG_ICH_LR4)
.hyp().mon();
InitReg(MISCREG_ICH_LR5)
.hyp().mon();
InitReg(MISCREG_ICH_LR6)
.hyp().mon();
InitReg(MISCREG_ICH_LR7)
.hyp().mon();
InitReg(MISCREG_ICH_LR8)
.hyp().mon();
InitReg(MISCREG_ICH_LR9)
.hyp().mon();
InitReg(MISCREG_ICH_LR10)
.hyp().mon();
InitReg(MISCREG_ICH_LR11)
.hyp().mon();
InitReg(MISCREG_ICH_LR12)
.hyp().mon();
InitReg(MISCREG_ICH_LR13)
.hyp().mon();
InitReg(MISCREG_ICH_LR14)
.hyp().mon();
InitReg(MISCREG_ICH_LR15)
.hyp().mon();
InitReg(MISCREG_ICH_LRC0)
.hyp().mon();
InitReg(MISCREG_ICH_LRC1)
.hyp().mon();
InitReg(MISCREG_ICH_LRC2)
.hyp().mon();
InitReg(MISCREG_ICH_LRC3)
.hyp().mon();
InitReg(MISCREG_ICH_LRC4)
.hyp().mon();
InitReg(MISCREG_ICH_LRC5)
.hyp().mon();
InitReg(MISCREG_ICH_LRC6)
.hyp().mon();
InitReg(MISCREG_ICH_LRC7)
.hyp().mon();
InitReg(MISCREG_ICH_LRC8)
.hyp().mon();
InitReg(MISCREG_ICH_LRC9)
.hyp().mon();
InitReg(MISCREG_ICH_LRC10)
.hyp().mon();
InitReg(MISCREG_ICH_LRC11)
.hyp().mon();
InitReg(MISCREG_ICH_LRC12)
.hyp().mon();
InitReg(MISCREG_ICH_LRC13)
.hyp().mon();
InitReg(MISCREG_ICH_LRC14)
.hyp().mon();
InitReg(MISCREG_ICH_LRC15)
.hyp().mon();
// SVE
InitReg(MISCREG_ID_AA64ZFR0_EL1)
.faultRead(EL1, HCR_TRAP(tid3))
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_ZCR_EL3)
.fault(EL3, faultZcrEL3)
.mon();
InitReg(MISCREG_ZCR_EL2)
.fault(EL2, faultZcrEL2)
.fault(EL3, faultZcrEL3)
.hyp().mon();
InitReg(MISCREG_ZCR_EL12)
.fault(EL2, defaultFaultE2H_EL2)
.fault(EL3, defaultFaultE2H_EL3)
.mapsTo(MISCREG_ZCR_EL1);
InitReg(MISCREG_ZCR_EL1)
.fault(EL1, faultZcrEL1)
.fault(EL2, faultZcrEL2)
.fault(EL3, faultZcrEL3)
.allPrivileges().exceptUserMode();
// Dummy registers
InitReg(MISCREG_NOP)
.allPrivileges();
InitReg(MISCREG_RAZ)
.allPrivileges().exceptUserMode().writes(0);
InitReg(MISCREG_UNKNOWN);
InitReg(MISCREG_IMPDEF_UNIMPL)
.fault(EL1, faultImpdefUnimplEL1)
.fault(EL2, faultUnimplemented)
.fault(EL3, faultUnimplemented)
.warnNotFail(impdefAsNop);
// RAS extension (unimplemented)
InitReg(MISCREG_ERRIDR_EL1)
.warnNotFail()
.fault(faultUnimplemented);
InitReg(MISCREG_ERRSELR_EL1)
.warnNotFail()
.fault(faultUnimplemented);
InitReg(MISCREG_ERXFR_EL1)
.warnNotFail()
.fault(faultUnimplemented);
InitReg(MISCREG_ERXCTLR_EL1)
.warnNotFail()
.fault(faultUnimplemented);
InitReg(MISCREG_ERXSTATUS_EL1)
.warnNotFail()
.fault(faultUnimplemented);
InitReg(MISCREG_ERXADDR_EL1)
.warnNotFail()
.fault(faultUnimplemented);
InitReg(MISCREG_ERXMISC0_EL1)
.warnNotFail()
.fault(faultUnimplemented);
InitReg(MISCREG_ERXMISC1_EL1)
.warnNotFail()
.fault(faultUnimplemented);
InitReg(MISCREG_DISR_EL1)
.warnNotFail()
.fault(faultUnimplemented);
InitReg(MISCREG_VSESR_EL2)
.warnNotFail()
.fault(faultUnimplemented);
InitReg(MISCREG_VDISR_EL2)
.warnNotFail()
.fault(faultUnimplemented);
// Register mappings for some unimplemented registers:
// ESR_EL1 -> DFSR
// RMR_EL1 -> RMR
// RMR_EL2 -> HRMR
// DBGDTR_EL0 -> DBGDTR{R or T}Xint
// DBGDTRRX_EL0 -> DBGDTRRXint
// DBGDTRTX_EL0 -> DBGDTRRXint
// MDCR_EL3 -> SDCR, NAM D7-2108 (the latter is unimpl. in gem5)
// Populate the idxToMiscRegNum map
assert(idxToMiscRegNum.empty());
for (const auto& [key, val] : miscRegNumToIdx) {
idxToMiscRegNum.insert({val, key});
}
completed = true;
}
} // namespace ArmISA
} // namespace gem5