blob: 400fc1ba7f0ac083fe33d294235715900d442a70 [file] [log] [blame]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ZIRCON_KERNEL_LIB_ARCH_INCLUDE_LIB_ARCH_ARM64_FEATURE_H_
#define ZIRCON_KERNEL_LIB_ARCH_INCLUDE_LIB_ARCH_ARM64_FEATURE_H_
#include <lib/arch/sysreg.h>
#include <hwreg/bitfields.h>
namespace arch {
// [arm/sysreg]/ID_AA64ISAR0_EL1: AArch64 Instruction Set Attribute Register 0
struct ArmIdAa64IsaR0El1 : public SysRegBase<ArmIdAa64IsaR0El1, uint64_t, hwreg::EnablePrinter> {
enum class Rndr : uint8_t {
kNone = 0b0000,
kRng = 0b0001,
};
enum class Tlb : uint8_t {
kNone = 0b0000,
kTlbios = 0b0001,
kkTlbirange = 0b0010,
};
enum class Ts : uint8_t {
kNone = 0b0000,
kFlagM = 0b0001,
kFlagM2 = 0b0010,
};
enum class Fhm : uint8_t {
kNone = 0b0000,
kFhm = 0b0001,
};
enum class DotProd : uint8_t {
kNone = 0b0000,
kDotProd = 0b0001,
};
enum class Sm4 : uint8_t {
kNone = 0b0000,
kSm4 = 0b0001,
};
enum class Sm3 : uint8_t {
kNone = 0b0000,
kSm3 = 0b0001,
};
enum class Sha3 : uint8_t {
kNone = 0b0000,
kSha3 = 0b0001,
};
enum class Rdm : uint8_t {
kNone = 0b0000,
kRdm = 0b0001,
};
enum class Atomic : uint8_t {
kNone = 0b0000,
kLse = 0b0010,
};
enum class Crc32 : uint8_t {
kNone = 0b0000,
kCrc32 = 0b0001,
};
enum class Sha2 : uint8_t {
kNone = 0b0000,
kSha256 = 0b0001,
kSha512 = 0b0010,
};
enum class Sha1 : uint8_t {
kNone = 0b0000,
kSha1 = 0b0001,
};
enum class Aes : uint8_t {
kNone = 0b0000,
kAes = 0b0001,
kPmull = 0b0010,
};
DEF_ENUM_FIELD(Rndr, 63, 60, rndr);
DEF_ENUM_FIELD(Tlb, 59, 56, tlb);
DEF_ENUM_FIELD(Ts, 55, 52, ts);
DEF_ENUM_FIELD(Fhm, 51, 48, fhm);
DEF_ENUM_FIELD(DotProd, 47, 44, dp);
DEF_ENUM_FIELD(Sm4, 43, 40, sm4);
DEF_ENUM_FIELD(Sm3, 39, 36, sm3);
DEF_ENUM_FIELD(Sha3, 35, 32, sha3);
DEF_ENUM_FIELD(Rdm, 31, 28, rdm);
DEF_RSVDZ_FIELD(27, 24);
DEF_ENUM_FIELD(Atomic, 23, 20, atomic);
DEF_ENUM_FIELD(Crc32, 19, 16, crc32);
DEF_ENUM_FIELD(Sha2, 15, 12, sha2);
DEF_ENUM_FIELD(Sha1, 11, 8, sha1);
DEF_ENUM_FIELD(Aes, 7, 4, aes);
DEF_RSVDZ_FIELD(3, 0);
};
ARCH_ARM64_SYSREG(ArmIdAa64IsaR0El1, "ID_AA64ISAR0_EL1");
// [arm/sysreg]/ID_AA64ISAR1_EL1: AArch64 Instruction Set Attribute Register 1
struct ArmIdAa64IsaR1El1 : public SysRegBase<ArmIdAa64IsaR1El1> {
enum class Ls64 : uint8_t {
kNone = 0b0000,
kLs64 = 0b0001,
kLs64V = 0b0010,
kLs64Accdata = 0b0011,
};
enum class Xs : uint8_t {
kNone = 0b0000,
kXs = 0b0001,
};
enum class I8mm : uint8_t {
kNone = 0b0000,
kI8mm = 0b0001,
};
enum class Dgh : uint8_t {
kNone = 0b0000,
kDgh = 0b0001,
};
enum class Bf16 : uint8_t {
kNone = 0b0000,
kBf16 = 0b0001,
};
enum class Specres : uint8_t {
kNone = 0b0000,
kSpecres = 0b0001,
};
enum class Sb : uint8_t {
kNone = 0b0000,
kSb = 0b0001,
};
enum class Frintts : uint8_t {
kNone = 0b0000,
kFrintts = 0b0001,
};
enum class Gpi : uint8_t {
kNone = 0b0000,
kGpi = 0b0001,
};
enum class Gpa : uint8_t {
kNone = 0b0000,
kGpa = 0b0001,
};
enum class Lrcpc : uint8_t {
kNone = 0b0000,
kLrcpc = 0b0001,
kLrcpc2 = 0b0010,
};
enum class Fcma : uint8_t {
kNone = 0b0000,
kFcma = 0b0001,
};
enum class Jscvt : uint8_t {
kNone = 0b0000,
kJscvt = 0b0001,
};
enum class Pauth : uint8_t {
kNone = 0b0000,
kPauth = 0b0001,
kPauthEnhanced = 0b0010,
kPauth2 = 0b0011,
kFpac = 0b0100,
kFpacCombined = 0b0101,
};
enum class Dpb : uint8_t {
kNone = 0b0000,
kDpb = 0b0001,
kDpb2 = 0b0010,
};
DEF_ENUM_FIELD(Ls64, 63, 60, ls64);
DEF_ENUM_FIELD(Xs, 59, 56, xs);
DEF_ENUM_FIELD(I8mm, 55, 52, i8mm);
DEF_ENUM_FIELD(Dgh, 51, 48, dgh);
DEF_ENUM_FIELD(Bf16, 47, 44, bf16);
DEF_ENUM_FIELD(Specres, 43, 40, specres);
DEF_ENUM_FIELD(Sb, 39, 36, sb);
DEF_ENUM_FIELD(Frintts, 35, 32, frintts);
DEF_ENUM_FIELD(Gpi, 31, 28, gpi);
DEF_ENUM_FIELD(Gpa, 27, 24, gpa);
DEF_ENUM_FIELD(Lrcpc, 23, 20, lrcpc);
DEF_ENUM_FIELD(Fcma, 19, 16, fcma);
DEF_ENUM_FIELD(Jscvt, 15, 12, jscvt);
DEF_ENUM_FIELD(Pauth, 11, 8, api);
DEF_ENUM_FIELD(Pauth, 7, 4, apa);
DEF_ENUM_FIELD(Dpb, 3, 0, dpb);
};
ARCH_ARM64_SYSREG(ArmIdAa64IsaR1El1, "ID_AA64ISAR1_EL1");
// [arm/sysreg]/ID_AA64PFR0_EL1: AArch64 Processor Feature Register 0
struct ArmIdAa64Pfr0El1 : public SysRegBase<ArmIdAa64Pfr0El1> {
enum class Csv3 : uint8_t {
kNone = 0b0000,
kCsv3 = 0b0001,
};
enum class Csv2 : uint8_t {
kNone = 0b0000,
kCsv2 = 0b0001,
kCsv2_2 = 0b0010,
};
enum class Dit : uint8_t {
kNone = 0b0000,
kDit = 0b0001,
};
enum class Amu : uint8_t {
kNone = 0b0000,
kAmuv1 = 0b0001,
kAmuv1p1 = 0b0010,
};
enum class Mpam : uint8_t {
kNone = 0b0000,
kMpam = 0b0001,
};
enum class Sel2 : uint8_t {
kNone = 0b0000,
kSel2 = 0b0001,
};
enum class Sve : uint8_t {
kNone = 0b0000,
kSve = 0b0001,
};
enum class Ras : uint8_t {
kNone = 0b0000,
kRas = 0b0001,
kRasv1p1 = 0b0010,
};
enum class Gic : uint8_t {
kNone = 0b0000,
kGic4 = 0b0001,
kGic4_1 = 0b0010,
};
enum class Fp : uint8_t {
kFp = 0b0000,
kFp16 = 0b0001,
kNone = 0b1111,
};
enum class El : uint8_t {
kNone = 0b0000, // EL[23] not implemented.
k64 = 0b0001, // ELn supported in AAarch64 state
k32 = 0b0010, // ELn supported in AAarch64 or AAarch32 state
};
DEF_ENUM_FIELD(Csv3, 63, 60, csv3);
DEF_ENUM_FIELD(Csv2, 59, 56, csv2);
DEF_RSVDZ_FIELD(55, 52);
DEF_ENUM_FIELD(Dit, 51, 48, dit);
DEF_ENUM_FIELD(Amu, 47, 44, amu);
DEF_ENUM_FIELD(Mpam, 43, 40, mpam);
DEF_ENUM_FIELD(Sel2, 39, 36, sel2);
DEF_ENUM_FIELD(Sve, 35, 32, sve);
DEF_ENUM_FIELD(Ras, 31, 28, ras);
DEF_ENUM_FIELD(Gic, 27, 24, gic);
DEF_ENUM_FIELD(Fp, 23, 20, advsimd);
DEF_ENUM_FIELD(Fp, 19, 16, fp);
DEF_ENUM_FIELD(El, 15, 12, el3);
DEF_ENUM_FIELD(El, 11, 8, el2);
DEF_ENUM_FIELD(El, 7, 4, el1);
DEF_ENUM_FIELD(El, 3, 0, el0);
};
ARCH_ARM64_SYSREG(ArmIdAa64Pfr0El1, "ID_AA64PFR0_EL1");
} // namespace arch
#endif // ZIRCON_KERNEL_LIB_ARCH_INCLUDE_LIB_ARCH_ARM64_FEATURE_H_