config.c 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (C) 2025 Google LLC
  4. * Author: Marc Zyngier <maz@kernel.org>
  5. */
  6. #include <linux/kvm_host.h>
  7. #include <asm/kvm_emulate.h>
  8. #include <asm/kvm_nested.h>
  9. #include <asm/sysreg.h>
  10. /*
  11. * Describes the dependencies between a set of bits (or the negation
  12. * of a set of RES0 bits) and a feature. The flags indicate how the
  13. * data is interpreted.
  14. */
  15. struct reg_bits_to_feat_map {
  16. union {
  17. u64 bits;
  18. struct fgt_masks *masks;
  19. };
  20. #define NEVER_FGU BIT(0) /* Can trap, but never UNDEF */
  21. #define CALL_FUNC BIT(1) /* Needs to evaluate tons of crap */
  22. #define FORCE_RESx BIT(2) /* Unconditional RESx */
  23. #define MASKS_POINTER BIT(3) /* Pointer to fgt_masks struct instead of bits */
  24. #define AS_RES1 BIT(4) /* RES1 when not supported */
  25. #define REQUIRES_E2H1 BIT(5) /* Add HCR_EL2.E2H RES1 as a pre-condition */
  26. #define RES1_WHEN_E2H0 BIT(6) /* RES1 when E2H=0 and not supported */
  27. #define RES1_WHEN_E2H1 BIT(7) /* RES1 when E2H=1 and not supported */
  28. unsigned long flags;
  29. union {
  30. struct {
  31. u8 regidx;
  32. u8 shift;
  33. u8 width;
  34. bool sign;
  35. s8 lo_lim;
  36. };
  37. bool (*match)(struct kvm *);
  38. };
  39. };
  40. /*
  41. * Describes the dependencies for a given register:
  42. *
  43. * @feat_map describes the dependency for the whole register. If the
  44. * features the register depends on are not present, the whole
  45. * register is effectively RES0.
  46. *
  47. * @bit_feat_map describes the dependencies for a set of bits in that
  48. * register. If the features these bits depend on are not present, the
  49. * bits are effectively RES0.
  50. */
  51. struct reg_feat_map_desc {
  52. const char *name;
  53. const struct reg_bits_to_feat_map feat_map;
  54. const struct reg_bits_to_feat_map *bit_feat_map;
  55. const unsigned int bit_feat_map_sz;
  56. };
  57. #define __NEEDS_FEAT_3(m, f, w, id, fld, lim) \
  58. { \
  59. .w = (m), \
  60. .flags = (f), \
  61. .regidx = IDREG_IDX(SYS_ ## id), \
  62. .shift = id ##_## fld ## _SHIFT, \
  63. .width = id ##_## fld ## _WIDTH, \
  64. .sign = id ##_## fld ## _SIGNED, \
  65. .lo_lim = id ##_## fld ##_## lim \
  66. }
  67. #define __NEEDS_FEAT_1(m, f, w, fun) \
  68. { \
  69. .w = (m), \
  70. .flags = (f) | CALL_FUNC, \
  71. .match = (fun), \
  72. }
  73. #define __NEEDS_FEAT_0(m, f, w, ...) \
  74. { \
  75. .w = (m), \
  76. .flags = (f), \
  77. }
  78. #define __NEEDS_FEAT_FLAG(m, f, w, ...) \
  79. CONCATENATE(__NEEDS_FEAT_, COUNT_ARGS(__VA_ARGS__))(m, f, w, __VA_ARGS__)
  80. #define NEEDS_FEAT_FLAG(m, f, ...) \
  81. __NEEDS_FEAT_FLAG(m, f, bits, __VA_ARGS__)
  82. #define NEEDS_FEAT_MASKS(p, ...) \
  83. __NEEDS_FEAT_FLAG(p, MASKS_POINTER, masks, __VA_ARGS__)
  84. /*
  85. * Declare the dependency between a set of bits and a set of features,
  86. * generating a struct reg_bit_to_feat_map.
  87. */
  88. #define NEEDS_FEAT(m, ...) NEEDS_FEAT_FLAG(m, 0, __VA_ARGS__)
  89. /* Declare fixed RESx bits */
  90. #define FORCE_RES0(m) NEEDS_FEAT_FLAG(m, FORCE_RESx)
  91. #define FORCE_RES1(m) NEEDS_FEAT_FLAG(m, FORCE_RESx | AS_RES1)
  92. /*
  93. * Declare the dependency between a non-FGT register, a set of features,
  94. * and the set of individual bits it contains. This generates a struct
  95. * reg_feat_map_desc.
  96. */
  97. #define DECLARE_FEAT_MAP(n, r, m, f) \
  98. struct reg_feat_map_desc n = { \
  99. .name = #r, \
  100. .feat_map = NEEDS_FEAT(~(r##_RES0 | \
  101. r##_RES1), f), \
  102. .bit_feat_map = m, \
  103. .bit_feat_map_sz = ARRAY_SIZE(m), \
  104. }
  105. /*
  106. * Specialised version of the above for FGT registers that have their
  107. * RESx masks described as struct fgt_masks.
  108. */
  109. #define DECLARE_FEAT_MAP_FGT(n, msk, m, f) \
  110. struct reg_feat_map_desc n = { \
  111. .name = #msk, \
  112. .feat_map = NEEDS_FEAT_MASKS(&msk, f), \
  113. .bit_feat_map = m, \
  114. .bit_feat_map_sz = ARRAY_SIZE(m), \
  115. }
  116. #define FEAT_SPE ID_AA64DFR0_EL1, PMSVer, IMP
  117. #define FEAT_SPE_FnE ID_AA64DFR0_EL1, PMSVer, V1P2
  118. #define FEAT_BRBE ID_AA64DFR0_EL1, BRBE, IMP
  119. #define FEAT_TRC_SR ID_AA64DFR0_EL1, TraceVer, IMP
  120. #define FEAT_PMUv3 ID_AA64DFR0_EL1, PMUVer, IMP
  121. #define FEAT_TRBE ID_AA64DFR0_EL1, TraceBuffer, IMP
  122. #define FEAT_TRBEv1p1 ID_AA64DFR0_EL1, TraceBuffer, TRBE_V1P1
  123. #define FEAT_DoubleLock ID_AA64DFR0_EL1, DoubleLock, IMP
  124. #define FEAT_TRF ID_AA64DFR0_EL1, TraceFilt, IMP
  125. #define FEAT_AA32EL0 ID_AA64PFR0_EL1, EL0, AARCH32
  126. #define FEAT_AA32EL1 ID_AA64PFR0_EL1, EL1, AARCH32
  127. #define FEAT_AA64EL1 ID_AA64PFR0_EL1, EL1, IMP
  128. #define FEAT_AA64EL2 ID_AA64PFR0_EL1, EL2, IMP
  129. #define FEAT_AA64EL3 ID_AA64PFR0_EL1, EL3, IMP
  130. #define FEAT_SEL2 ID_AA64PFR0_EL1, SEL2, IMP
  131. #define FEAT_AIE ID_AA64MMFR3_EL1, AIE, IMP
  132. #define FEAT_S2POE ID_AA64MMFR3_EL1, S2POE, IMP
  133. #define FEAT_S1POE ID_AA64MMFR3_EL1, S1POE, IMP
  134. #define FEAT_S1PIE ID_AA64MMFR3_EL1, S1PIE, IMP
  135. #define FEAT_THE ID_AA64PFR1_EL1, THE, IMP
  136. #define FEAT_SME ID_AA64PFR1_EL1, SME, IMP
  137. #define FEAT_GCS ID_AA64PFR1_EL1, GCS, IMP
  138. #define FEAT_LS64 ID_AA64ISAR1_EL1, LS64, LS64
  139. #define FEAT_LS64_V ID_AA64ISAR1_EL1, LS64, LS64_V
  140. #define FEAT_LS64_ACCDATA ID_AA64ISAR1_EL1, LS64, LS64_ACCDATA
  141. #define FEAT_RAS ID_AA64PFR0_EL1, RAS, IMP
  142. #define FEAT_RASv2 ID_AA64PFR0_EL1, RAS, V2
  143. #define FEAT_GICv3 ID_AA64PFR0_EL1, GIC, IMP
  144. #define FEAT_LOR ID_AA64MMFR1_EL1, LO, IMP
  145. #define FEAT_SPEv1p2 ID_AA64DFR0_EL1, PMSVer, V1P2
  146. #define FEAT_SPEv1p4 ID_AA64DFR0_EL1, PMSVer, V1P4
  147. #define FEAT_SPEv1p5 ID_AA64DFR0_EL1, PMSVer, V1P5
  148. #define FEAT_ATS1A ID_AA64ISAR2_EL1, ATS1A, IMP
  149. #define FEAT_SPECRES2 ID_AA64ISAR1_EL1, SPECRES, COSP_RCTX
  150. #define FEAT_SPECRES ID_AA64ISAR1_EL1, SPECRES, IMP
  151. #define FEAT_TLBIRANGE ID_AA64ISAR0_EL1, TLB, RANGE
  152. #define FEAT_TLBIOS ID_AA64ISAR0_EL1, TLB, OS
  153. #define FEAT_PAN2 ID_AA64MMFR1_EL1, PAN, PAN2
  154. #define FEAT_DPB2 ID_AA64ISAR1_EL1, DPB, DPB2
  155. #define FEAT_AMUv1 ID_AA64PFR0_EL1, AMU, IMP
  156. #define FEAT_AMUv1p1 ID_AA64PFR0_EL1, AMU, V1P1
  157. #define FEAT_CMOW ID_AA64MMFR1_EL1, CMOW, IMP
  158. #define FEAT_D128 ID_AA64MMFR3_EL1, D128, IMP
  159. #define FEAT_DoubleFault2 ID_AA64PFR1_EL1, DF2, IMP
  160. #define FEAT_FPMR ID_AA64PFR2_EL1, FPMR, IMP
  161. #define FEAT_MOPS ID_AA64ISAR2_EL1, MOPS, IMP
  162. #define FEAT_NMI ID_AA64PFR1_EL1, NMI, IMP
  163. #define FEAT_SCTLR2 ID_AA64MMFR3_EL1, SCTLRX, IMP
  164. #define FEAT_SYSREG128 ID_AA64ISAR2_EL1, SYSREG_128, IMP
  165. #define FEAT_TCR2 ID_AA64MMFR3_EL1, TCRX, IMP
  166. #define FEAT_XS ID_AA64ISAR1_EL1, XS, IMP
  167. #define FEAT_EVT ID_AA64MMFR2_EL1, EVT, IMP
  168. #define FEAT_EVT_TTLBxS ID_AA64MMFR2_EL1, EVT, TTLBxS
  169. #define FEAT_MTE2 ID_AA64PFR1_EL1, MTE, MTE2
  170. #define FEAT_RME ID_AA64PFR0_EL1, RME, IMP
  171. #define FEAT_MPAM ID_AA64PFR0_EL1, MPAM, 1
  172. #define FEAT_S2FWB ID_AA64MMFR2_EL1, FWB, IMP
  173. #define FEAT_TWED ID_AA64MMFR1_EL1, TWED, IMP
  174. #define FEAT_E2H0 ID_AA64MMFR4_EL1, E2H0, IMP
  175. #define FEAT_SRMASK ID_AA64MMFR4_EL1, SRMASK, IMP
  176. #define FEAT_PoPS ID_AA64MMFR4_EL1, PoPS, IMP
  177. #define FEAT_PFAR ID_AA64PFR1_EL1, PFAR, IMP
  178. #define FEAT_Debugv8p9 ID_AA64DFR0_EL1, PMUVer, V3P9
  179. #define FEAT_PMUv3_SS ID_AA64DFR0_EL1, PMSS, IMP
  180. #define FEAT_SEBEP ID_AA64DFR0_EL1, SEBEP, IMP
  181. #define FEAT_EBEP ID_AA64DFR1_EL1, EBEP, IMP
  182. #define FEAT_ITE ID_AA64DFR1_EL1, ITE, IMP
  183. #define FEAT_PMUv3_ICNTR ID_AA64DFR1_EL1, PMICNTR, IMP
  184. #define FEAT_SPMU ID_AA64DFR1_EL1, SPMU, IMP
  185. #define FEAT_SPE_nVM ID_AA64DFR2_EL1, SPE_nVM, IMP
  186. #define FEAT_STEP2 ID_AA64DFR2_EL1, STEP, IMP
  187. #define FEAT_CPA2 ID_AA64ISAR3_EL1, CPA, CPA2
  188. #define FEAT_ASID2 ID_AA64MMFR4_EL1, ASID2, IMP
  189. #define FEAT_MEC ID_AA64MMFR3_EL1, MEC, IMP
  190. #define FEAT_HAFT ID_AA64MMFR1_EL1, HAFDBS, HAFT
  191. #define FEAT_HDBSS ID_AA64MMFR1_EL1, HAFDBS, HDBSS
  192. #define FEAT_HPDS2 ID_AA64MMFR1_EL1, HPDS, HPDS2
  193. #define FEAT_BTI ID_AA64PFR1_EL1, BT, IMP
  194. #define FEAT_ExS ID_AA64MMFR0_EL1, EXS, IMP
  195. #define FEAT_IESB ID_AA64MMFR2_EL1, IESB, IMP
  196. #define FEAT_LSE2 ID_AA64MMFR2_EL1, AT, IMP
  197. #define FEAT_LSMAOC ID_AA64MMFR2_EL1, LSM, IMP
  198. #define FEAT_MixedEnd ID_AA64MMFR0_EL1, BIGEND, IMP
  199. #define FEAT_MixedEndEL0 ID_AA64MMFR0_EL1, BIGENDEL0, IMP
  200. #define FEAT_MTE_ASYNC ID_AA64PFR1_EL1, MTE_frac, ASYNC
  201. #define FEAT_MTE_STORE_ONLY ID_AA64PFR2_EL1, MTESTOREONLY, IMP
  202. #define FEAT_PAN ID_AA64MMFR1_EL1, PAN, IMP
  203. #define FEAT_PAN3 ID_AA64MMFR1_EL1, PAN, PAN3
  204. #define FEAT_SSBS ID_AA64PFR1_EL1, SSBS, IMP
  205. #define FEAT_TIDCP1 ID_AA64MMFR1_EL1, TIDCP1, IMP
  206. #define FEAT_FGT ID_AA64MMFR0_EL1, FGT, IMP
  207. #define FEAT_FGT2 ID_AA64MMFR0_EL1, FGT, FGT2
  208. #define FEAT_MTPMU ID_AA64DFR0_EL1, MTPMU, IMP
  209. #define FEAT_HCX ID_AA64MMFR1_EL1, HCX, IMP
  210. #define FEAT_S2PIE ID_AA64MMFR3_EL1, S2PIE, IMP
  211. static bool not_feat_aa64el3(struct kvm *kvm)
  212. {
  213. return !kvm_has_feat(kvm, FEAT_AA64EL3);
  214. }
  215. static bool feat_nv2(struct kvm *kvm)
  216. {
  217. return ((kvm_has_feat(kvm, ID_AA64MMFR4_EL1, NV_frac, NV2_ONLY) &&
  218. kvm_has_feat_enum(kvm, ID_AA64MMFR2_EL1, NV, NI)) ||
  219. kvm_has_feat(kvm, ID_AA64MMFR2_EL1, NV, NV2));
  220. }
  221. static bool feat_nv2_e2h0_ni(struct kvm *kvm)
  222. {
  223. return feat_nv2(kvm) && !kvm_has_feat(kvm, FEAT_E2H0);
  224. }
  225. static bool feat_rasv1p1(struct kvm *kvm)
  226. {
  227. return (kvm_has_feat(kvm, ID_AA64PFR0_EL1, RAS, V1P1) ||
  228. (kvm_has_feat_enum(kvm, ID_AA64PFR0_EL1, RAS, IMP) &&
  229. kvm_has_feat(kvm, ID_AA64PFR1_EL1, RAS_frac, RASv1p1)));
  230. }
  231. static bool feat_csv2_2_csv2_1p2(struct kvm *kvm)
  232. {
  233. return (kvm_has_feat(kvm, ID_AA64PFR0_EL1, CSV2, CSV2_2) ||
  234. (kvm_has_feat(kvm, ID_AA64PFR1_EL1, CSV2_frac, CSV2_1p2) &&
  235. kvm_has_feat_enum(kvm, ID_AA64PFR0_EL1, CSV2, IMP)));
  236. }
  237. static bool feat_pauth(struct kvm *kvm)
  238. {
  239. return kvm_has_pauth(kvm, PAuth);
  240. }
  241. static bool feat_pauth_lr(struct kvm *kvm)
  242. {
  243. return kvm_has_pauth(kvm, PAuth_LR);
  244. }
  245. static bool feat_aderr(struct kvm *kvm)
  246. {
  247. return (kvm_has_feat(kvm, ID_AA64MMFR3_EL1, ADERR, FEAT_ADERR) &&
  248. kvm_has_feat(kvm, ID_AA64MMFR3_EL1, SDERR, FEAT_ADERR));
  249. }
  250. static bool feat_anerr(struct kvm *kvm)
  251. {
  252. return (kvm_has_feat(kvm, ID_AA64MMFR3_EL1, ANERR, FEAT_ANERR) &&
  253. kvm_has_feat(kvm, ID_AA64MMFR3_EL1, SNERR, FEAT_ANERR));
  254. }
  255. static bool feat_sme_smps(struct kvm *kvm)
  256. {
  257. /*
  258. * Revists this if KVM ever supports SME -- this really should
  259. * look at the guest's view of SMIDR_EL1. Funnily enough, this
  260. * is not captured in the JSON file, but only as a note in the
  261. * ARM ARM.
  262. */
  263. return (kvm_has_feat(kvm, FEAT_SME) &&
  264. (read_sysreg_s(SYS_SMIDR_EL1) & SMIDR_EL1_SMPS));
  265. }
  266. static bool feat_spe_fds(struct kvm *kvm)
  267. {
  268. /*
  269. * Revists this if KVM ever supports SPE -- this really should
  270. * look at the guest's view of PMSIDR_EL1.
  271. */
  272. return (kvm_has_feat(kvm, FEAT_SPEv1p4) &&
  273. (read_sysreg_s(SYS_PMSIDR_EL1) & PMSIDR_EL1_FDS));
  274. }
  275. static bool feat_trbe_mpam(struct kvm *kvm)
  276. {
  277. /*
  278. * Revists this if KVM ever supports both MPAM and TRBE --
  279. * this really should look at the guest's view of TRBIDR_EL1.
  280. */
  281. return (kvm_has_feat(kvm, FEAT_TRBE) &&
  282. kvm_has_feat(kvm, FEAT_MPAM) &&
  283. (read_sysreg_s(SYS_TRBIDR_EL1) & TRBIDR_EL1_MPAM));
  284. }
  285. static bool feat_ebep_pmuv3_ss(struct kvm *kvm)
  286. {
  287. return kvm_has_feat(kvm, FEAT_EBEP) || kvm_has_feat(kvm, FEAT_PMUv3_SS);
  288. }
  289. static bool feat_mixedendel0(struct kvm *kvm)
  290. {
  291. return kvm_has_feat(kvm, FEAT_MixedEnd) || kvm_has_feat(kvm, FEAT_MixedEndEL0);
  292. }
  293. static bool feat_mte_async(struct kvm *kvm)
  294. {
  295. return kvm_has_feat(kvm, FEAT_MTE2) && kvm_has_feat_enum(kvm, FEAT_MTE_ASYNC);
  296. }
  297. #define check_pmu_revision(k, r) \
  298. ({ \
  299. (kvm_has_feat((k), ID_AA64DFR0_EL1, PMUVer, r) && \
  300. !kvm_has_feat((k), ID_AA64DFR0_EL1, PMUVer, IMP_DEF)); \
  301. })
  302. static bool feat_pmuv3p1(struct kvm *kvm)
  303. {
  304. return check_pmu_revision(kvm, V3P1);
  305. }
  306. static bool feat_pmuv3p5(struct kvm *kvm)
  307. {
  308. return check_pmu_revision(kvm, V3P5);
  309. }
  310. static bool feat_pmuv3p7(struct kvm *kvm)
  311. {
  312. return check_pmu_revision(kvm, V3P7);
  313. }
  314. static bool feat_pmuv3p9(struct kvm *kvm)
  315. {
  316. return check_pmu_revision(kvm, V3P9);
  317. }
  318. #define has_feat_s2tgran(k, s) \
  319. ((kvm_has_feat_enum(kvm, ID_AA64MMFR0_EL1, TGRAN##s##_2, TGRAN##s) && \
  320. kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN##s, IMP)) || \
  321. kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN##s##_2, IMP))
  322. static bool feat_lpa2(struct kvm *kvm)
  323. {
  324. return ((kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN4, 52_BIT) ||
  325. !kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN4, IMP)) &&
  326. (kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN16, 52_BIT) ||
  327. !kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN16, IMP)) &&
  328. (kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN4_2, 52_BIT) ||
  329. !has_feat_s2tgran(kvm, 4)) &&
  330. (kvm_has_feat(kvm, ID_AA64MMFR0_EL1, TGRAN16_2, 52_BIT) ||
  331. !has_feat_s2tgran(kvm, 16)));
  332. }
  333. static bool feat_vmid16(struct kvm *kvm)
  334. {
  335. return kvm_has_feat_enum(kvm, ID_AA64MMFR1_EL1, VMIDBits, 16);
  336. }
  337. static const struct reg_bits_to_feat_map hfgrtr_feat_map[] = {
  338. NEEDS_FEAT(HFGRTR_EL2_nAMAIR2_EL1 |
  339. HFGRTR_EL2_nMAIR2_EL1,
  340. FEAT_AIE),
  341. NEEDS_FEAT(HFGRTR_EL2_nS2POR_EL1, FEAT_S2POE),
  342. NEEDS_FEAT(HFGRTR_EL2_nPOR_EL1 |
  343. HFGRTR_EL2_nPOR_EL0,
  344. FEAT_S1POE),
  345. NEEDS_FEAT(HFGRTR_EL2_nPIR_EL1 |
  346. HFGRTR_EL2_nPIRE0_EL1,
  347. FEAT_S1PIE),
  348. NEEDS_FEAT(HFGRTR_EL2_nRCWMASK_EL1, FEAT_THE),
  349. NEEDS_FEAT(HFGRTR_EL2_nTPIDR2_EL0 |
  350. HFGRTR_EL2_nSMPRI_EL1,
  351. FEAT_SME),
  352. NEEDS_FEAT(HFGRTR_EL2_nGCS_EL1 |
  353. HFGRTR_EL2_nGCS_EL0,
  354. FEAT_GCS),
  355. NEEDS_FEAT(HFGRTR_EL2_nACCDATA_EL1, FEAT_LS64_ACCDATA),
  356. NEEDS_FEAT(HFGRTR_EL2_ERXADDR_EL1 |
  357. HFGRTR_EL2_ERXMISCn_EL1 |
  358. HFGRTR_EL2_ERXSTATUS_EL1 |
  359. HFGRTR_EL2_ERXCTLR_EL1 |
  360. HFGRTR_EL2_ERXFR_EL1 |
  361. HFGRTR_EL2_ERRSELR_EL1 |
  362. HFGRTR_EL2_ERRIDR_EL1,
  363. FEAT_RAS),
  364. NEEDS_FEAT(HFGRTR_EL2_ERXPFGCDN_EL1 |
  365. HFGRTR_EL2_ERXPFGCTL_EL1 |
  366. HFGRTR_EL2_ERXPFGF_EL1,
  367. feat_rasv1p1),
  368. NEEDS_FEAT(HFGRTR_EL2_ICC_IGRPENn_EL1, FEAT_GICv3),
  369. NEEDS_FEAT(HFGRTR_EL2_SCXTNUM_EL0 |
  370. HFGRTR_EL2_SCXTNUM_EL1,
  371. feat_csv2_2_csv2_1p2),
  372. NEEDS_FEAT(HFGRTR_EL2_LORSA_EL1 |
  373. HFGRTR_EL2_LORN_EL1 |
  374. HFGRTR_EL2_LORID_EL1 |
  375. HFGRTR_EL2_LOREA_EL1 |
  376. HFGRTR_EL2_LORC_EL1,
  377. FEAT_LOR),
  378. NEEDS_FEAT(HFGRTR_EL2_APIBKey |
  379. HFGRTR_EL2_APIAKey |
  380. HFGRTR_EL2_APGAKey |
  381. HFGRTR_EL2_APDBKey |
  382. HFGRTR_EL2_APDAKey,
  383. feat_pauth),
  384. NEEDS_FEAT_FLAG(HFGRTR_EL2_VBAR_EL1 |
  385. HFGRTR_EL2_TTBR1_EL1 |
  386. HFGRTR_EL2_TTBR0_EL1 |
  387. HFGRTR_EL2_TPIDR_EL0 |
  388. HFGRTR_EL2_TPIDRRO_EL0 |
  389. HFGRTR_EL2_TPIDR_EL1 |
  390. HFGRTR_EL2_TCR_EL1 |
  391. HFGRTR_EL2_SCTLR_EL1 |
  392. HFGRTR_EL2_REVIDR_EL1 |
  393. HFGRTR_EL2_PAR_EL1 |
  394. HFGRTR_EL2_MPIDR_EL1 |
  395. HFGRTR_EL2_MIDR_EL1 |
  396. HFGRTR_EL2_MAIR_EL1 |
  397. HFGRTR_EL2_ISR_EL1 |
  398. HFGRTR_EL2_FAR_EL1 |
  399. HFGRTR_EL2_ESR_EL1 |
  400. HFGRTR_EL2_DCZID_EL0 |
  401. HFGRTR_EL2_CTR_EL0 |
  402. HFGRTR_EL2_CSSELR_EL1 |
  403. HFGRTR_EL2_CPACR_EL1 |
  404. HFGRTR_EL2_CONTEXTIDR_EL1|
  405. HFGRTR_EL2_CLIDR_EL1 |
  406. HFGRTR_EL2_CCSIDR_EL1 |
  407. HFGRTR_EL2_AMAIR_EL1 |
  408. HFGRTR_EL2_AIDR_EL1 |
  409. HFGRTR_EL2_AFSR1_EL1 |
  410. HFGRTR_EL2_AFSR0_EL1,
  411. NEVER_FGU, FEAT_AA64EL1),
  412. };
  413. static const DECLARE_FEAT_MAP_FGT(hfgrtr_desc, hfgrtr_masks,
  414. hfgrtr_feat_map, FEAT_FGT);
  415. static const struct reg_bits_to_feat_map hfgwtr_feat_map[] = {
  416. NEEDS_FEAT(HFGWTR_EL2_nAMAIR2_EL1 |
  417. HFGWTR_EL2_nMAIR2_EL1,
  418. FEAT_AIE),
  419. NEEDS_FEAT(HFGWTR_EL2_nS2POR_EL1, FEAT_S2POE),
  420. NEEDS_FEAT(HFGWTR_EL2_nPOR_EL1 |
  421. HFGWTR_EL2_nPOR_EL0,
  422. FEAT_S1POE),
  423. NEEDS_FEAT(HFGWTR_EL2_nPIR_EL1 |
  424. HFGWTR_EL2_nPIRE0_EL1,
  425. FEAT_S1PIE),
  426. NEEDS_FEAT(HFGWTR_EL2_nRCWMASK_EL1, FEAT_THE),
  427. NEEDS_FEAT(HFGWTR_EL2_nTPIDR2_EL0 |
  428. HFGWTR_EL2_nSMPRI_EL1,
  429. FEAT_SME),
  430. NEEDS_FEAT(HFGWTR_EL2_nGCS_EL1 |
  431. HFGWTR_EL2_nGCS_EL0,
  432. FEAT_GCS),
  433. NEEDS_FEAT(HFGWTR_EL2_nACCDATA_EL1, FEAT_LS64_ACCDATA),
  434. NEEDS_FEAT(HFGWTR_EL2_ERXADDR_EL1 |
  435. HFGWTR_EL2_ERXMISCn_EL1 |
  436. HFGWTR_EL2_ERXSTATUS_EL1 |
  437. HFGWTR_EL2_ERXCTLR_EL1 |
  438. HFGWTR_EL2_ERRSELR_EL1,
  439. FEAT_RAS),
  440. NEEDS_FEAT(HFGWTR_EL2_ERXPFGCDN_EL1 |
  441. HFGWTR_EL2_ERXPFGCTL_EL1,
  442. feat_rasv1p1),
  443. NEEDS_FEAT(HFGWTR_EL2_ICC_IGRPENn_EL1, FEAT_GICv3),
  444. NEEDS_FEAT(HFGWTR_EL2_SCXTNUM_EL0 |
  445. HFGWTR_EL2_SCXTNUM_EL1,
  446. feat_csv2_2_csv2_1p2),
  447. NEEDS_FEAT(HFGWTR_EL2_LORSA_EL1 |
  448. HFGWTR_EL2_LORN_EL1 |
  449. HFGWTR_EL2_LOREA_EL1 |
  450. HFGWTR_EL2_LORC_EL1,
  451. FEAT_LOR),
  452. NEEDS_FEAT(HFGWTR_EL2_APIBKey |
  453. HFGWTR_EL2_APIAKey |
  454. HFGWTR_EL2_APGAKey |
  455. HFGWTR_EL2_APDBKey |
  456. HFGWTR_EL2_APDAKey,
  457. feat_pauth),
  458. NEEDS_FEAT_FLAG(HFGWTR_EL2_VBAR_EL1 |
  459. HFGWTR_EL2_TTBR1_EL1 |
  460. HFGWTR_EL2_TTBR0_EL1 |
  461. HFGWTR_EL2_TPIDR_EL0 |
  462. HFGWTR_EL2_TPIDRRO_EL0 |
  463. HFGWTR_EL2_TPIDR_EL1 |
  464. HFGWTR_EL2_TCR_EL1 |
  465. HFGWTR_EL2_SCTLR_EL1 |
  466. HFGWTR_EL2_PAR_EL1 |
  467. HFGWTR_EL2_MAIR_EL1 |
  468. HFGWTR_EL2_FAR_EL1 |
  469. HFGWTR_EL2_ESR_EL1 |
  470. HFGWTR_EL2_CSSELR_EL1 |
  471. HFGWTR_EL2_CPACR_EL1 |
  472. HFGWTR_EL2_CONTEXTIDR_EL1|
  473. HFGWTR_EL2_AMAIR_EL1 |
  474. HFGWTR_EL2_AFSR1_EL1 |
  475. HFGWTR_EL2_AFSR0_EL1,
  476. NEVER_FGU, FEAT_AA64EL1),
  477. };
  478. static const DECLARE_FEAT_MAP_FGT(hfgwtr_desc, hfgwtr_masks,
  479. hfgwtr_feat_map, FEAT_FGT);
  480. static const struct reg_bits_to_feat_map hdfgrtr_feat_map[] = {
  481. NEEDS_FEAT(HDFGRTR_EL2_PMBIDR_EL1 |
  482. HDFGRTR_EL2_PMSLATFR_EL1 |
  483. HDFGRTR_EL2_PMSIRR_EL1 |
  484. HDFGRTR_EL2_PMSIDR_EL1 |
  485. HDFGRTR_EL2_PMSICR_EL1 |
  486. HDFGRTR_EL2_PMSFCR_EL1 |
  487. HDFGRTR_EL2_PMSEVFR_EL1 |
  488. HDFGRTR_EL2_PMSCR_EL1 |
  489. HDFGRTR_EL2_PMBSR_EL1 |
  490. HDFGRTR_EL2_PMBPTR_EL1 |
  491. HDFGRTR_EL2_PMBLIMITR_EL1,
  492. FEAT_SPE),
  493. NEEDS_FEAT(HDFGRTR_EL2_nPMSNEVFR_EL1, FEAT_SPE_FnE),
  494. NEEDS_FEAT(HDFGRTR_EL2_nBRBDATA |
  495. HDFGRTR_EL2_nBRBCTL |
  496. HDFGRTR_EL2_nBRBIDR,
  497. FEAT_BRBE),
  498. NEEDS_FEAT(HDFGRTR_EL2_TRCVICTLR |
  499. HDFGRTR_EL2_TRCSTATR |
  500. HDFGRTR_EL2_TRCSSCSRn |
  501. HDFGRTR_EL2_TRCSEQSTR |
  502. HDFGRTR_EL2_TRCPRGCTLR |
  503. HDFGRTR_EL2_TRCOSLSR |
  504. HDFGRTR_EL2_TRCIMSPECn |
  505. HDFGRTR_EL2_TRCID |
  506. HDFGRTR_EL2_TRCCNTVRn |
  507. HDFGRTR_EL2_TRCCLAIM |
  508. HDFGRTR_EL2_TRCAUXCTLR |
  509. HDFGRTR_EL2_TRCAUTHSTATUS |
  510. HDFGRTR_EL2_TRC,
  511. FEAT_TRC_SR),
  512. NEEDS_FEAT(HDFGRTR_EL2_PMCEIDn_EL0 |
  513. HDFGRTR_EL2_PMUSERENR_EL0 |
  514. HDFGRTR_EL2_PMMIR_EL1 |
  515. HDFGRTR_EL2_PMSELR_EL0 |
  516. HDFGRTR_EL2_PMOVS |
  517. HDFGRTR_EL2_PMINTEN |
  518. HDFGRTR_EL2_PMCNTEN |
  519. HDFGRTR_EL2_PMCCNTR_EL0 |
  520. HDFGRTR_EL2_PMCCFILTR_EL0 |
  521. HDFGRTR_EL2_PMEVTYPERn_EL0 |
  522. HDFGRTR_EL2_PMEVCNTRn_EL0,
  523. FEAT_PMUv3),
  524. NEEDS_FEAT(HDFGRTR_EL2_TRBTRG_EL1 |
  525. HDFGRTR_EL2_TRBSR_EL1 |
  526. HDFGRTR_EL2_TRBPTR_EL1 |
  527. HDFGRTR_EL2_TRBMAR_EL1 |
  528. HDFGRTR_EL2_TRBLIMITR_EL1 |
  529. HDFGRTR_EL2_TRBIDR_EL1 |
  530. HDFGRTR_EL2_TRBBASER_EL1,
  531. FEAT_TRBE),
  532. NEEDS_FEAT_FLAG(HDFGRTR_EL2_OSDLR_EL1, NEVER_FGU,
  533. FEAT_DoubleLock),
  534. NEEDS_FEAT_FLAG(HDFGRTR_EL2_OSECCR_EL1 |
  535. HDFGRTR_EL2_OSLSR_EL1 |
  536. HDFGRTR_EL2_DBGPRCR_EL1 |
  537. HDFGRTR_EL2_DBGAUTHSTATUS_EL1|
  538. HDFGRTR_EL2_DBGCLAIM |
  539. HDFGRTR_EL2_MDSCR_EL1 |
  540. HDFGRTR_EL2_DBGWVRn_EL1 |
  541. HDFGRTR_EL2_DBGWCRn_EL1 |
  542. HDFGRTR_EL2_DBGBVRn_EL1 |
  543. HDFGRTR_EL2_DBGBCRn_EL1,
  544. NEVER_FGU, FEAT_AA64EL1)
  545. };
  546. static const DECLARE_FEAT_MAP_FGT(hdfgrtr_desc, hdfgrtr_masks,
  547. hdfgrtr_feat_map, FEAT_FGT);
  548. static const struct reg_bits_to_feat_map hdfgwtr_feat_map[] = {
  549. NEEDS_FEAT(HDFGWTR_EL2_PMSLATFR_EL1 |
  550. HDFGWTR_EL2_PMSIRR_EL1 |
  551. HDFGWTR_EL2_PMSICR_EL1 |
  552. HDFGWTR_EL2_PMSFCR_EL1 |
  553. HDFGWTR_EL2_PMSEVFR_EL1 |
  554. HDFGWTR_EL2_PMSCR_EL1 |
  555. HDFGWTR_EL2_PMBSR_EL1 |
  556. HDFGWTR_EL2_PMBPTR_EL1 |
  557. HDFGWTR_EL2_PMBLIMITR_EL1,
  558. FEAT_SPE),
  559. NEEDS_FEAT(HDFGWTR_EL2_nPMSNEVFR_EL1, FEAT_SPE_FnE),
  560. NEEDS_FEAT(HDFGWTR_EL2_nBRBDATA |
  561. HDFGWTR_EL2_nBRBCTL,
  562. FEAT_BRBE),
  563. NEEDS_FEAT(HDFGWTR_EL2_TRCVICTLR |
  564. HDFGWTR_EL2_TRCSSCSRn |
  565. HDFGWTR_EL2_TRCSEQSTR |
  566. HDFGWTR_EL2_TRCPRGCTLR |
  567. HDFGWTR_EL2_TRCOSLAR |
  568. HDFGWTR_EL2_TRCIMSPECn |
  569. HDFGWTR_EL2_TRCCNTVRn |
  570. HDFGWTR_EL2_TRCCLAIM |
  571. HDFGWTR_EL2_TRCAUXCTLR |
  572. HDFGWTR_EL2_TRC,
  573. FEAT_TRC_SR),
  574. NEEDS_FEAT(HDFGWTR_EL2_PMUSERENR_EL0 |
  575. HDFGWTR_EL2_PMCR_EL0 |
  576. HDFGWTR_EL2_PMSWINC_EL0 |
  577. HDFGWTR_EL2_PMSELR_EL0 |
  578. HDFGWTR_EL2_PMOVS |
  579. HDFGWTR_EL2_PMINTEN |
  580. HDFGWTR_EL2_PMCNTEN |
  581. HDFGWTR_EL2_PMCCNTR_EL0 |
  582. HDFGWTR_EL2_PMCCFILTR_EL0 |
  583. HDFGWTR_EL2_PMEVTYPERn_EL0 |
  584. HDFGWTR_EL2_PMEVCNTRn_EL0,
  585. FEAT_PMUv3),
  586. NEEDS_FEAT(HDFGWTR_EL2_TRBTRG_EL1 |
  587. HDFGWTR_EL2_TRBSR_EL1 |
  588. HDFGWTR_EL2_TRBPTR_EL1 |
  589. HDFGWTR_EL2_TRBMAR_EL1 |
  590. HDFGWTR_EL2_TRBLIMITR_EL1 |
  591. HDFGWTR_EL2_TRBBASER_EL1,
  592. FEAT_TRBE),
  593. NEEDS_FEAT_FLAG(HDFGWTR_EL2_OSDLR_EL1,
  594. NEVER_FGU, FEAT_DoubleLock),
  595. NEEDS_FEAT_FLAG(HDFGWTR_EL2_OSECCR_EL1 |
  596. HDFGWTR_EL2_OSLAR_EL1 |
  597. HDFGWTR_EL2_DBGPRCR_EL1 |
  598. HDFGWTR_EL2_DBGCLAIM |
  599. HDFGWTR_EL2_MDSCR_EL1 |
  600. HDFGWTR_EL2_DBGWVRn_EL1 |
  601. HDFGWTR_EL2_DBGWCRn_EL1 |
  602. HDFGWTR_EL2_DBGBVRn_EL1 |
  603. HDFGWTR_EL2_DBGBCRn_EL1,
  604. NEVER_FGU, FEAT_AA64EL1),
  605. NEEDS_FEAT(HDFGWTR_EL2_TRFCR_EL1, FEAT_TRF),
  606. };
  607. static const DECLARE_FEAT_MAP_FGT(hdfgwtr_desc, hdfgwtr_masks,
  608. hdfgwtr_feat_map, FEAT_FGT);
  609. static const struct reg_bits_to_feat_map hfgitr_feat_map[] = {
  610. NEEDS_FEAT(HFGITR_EL2_PSBCSYNC, FEAT_SPEv1p5),
  611. NEEDS_FEAT(HFGITR_EL2_ATS1E1A, FEAT_ATS1A),
  612. NEEDS_FEAT(HFGITR_EL2_COSPRCTX, FEAT_SPECRES2),
  613. NEEDS_FEAT(HFGITR_EL2_nGCSEPP |
  614. HFGITR_EL2_nGCSSTR_EL1 |
  615. HFGITR_EL2_nGCSPUSHM_EL1,
  616. FEAT_GCS),
  617. NEEDS_FEAT(HFGITR_EL2_nBRBIALL |
  618. HFGITR_EL2_nBRBINJ,
  619. FEAT_BRBE),
  620. NEEDS_FEAT(HFGITR_EL2_CPPRCTX |
  621. HFGITR_EL2_DVPRCTX |
  622. HFGITR_EL2_CFPRCTX,
  623. FEAT_SPECRES),
  624. NEEDS_FEAT(HFGITR_EL2_TLBIRVAALE1 |
  625. HFGITR_EL2_TLBIRVALE1 |
  626. HFGITR_EL2_TLBIRVAAE1 |
  627. HFGITR_EL2_TLBIRVAE1 |
  628. HFGITR_EL2_TLBIRVAALE1IS |
  629. HFGITR_EL2_TLBIRVALE1IS |
  630. HFGITR_EL2_TLBIRVAAE1IS |
  631. HFGITR_EL2_TLBIRVAE1IS |
  632. HFGITR_EL2_TLBIRVAALE1OS |
  633. HFGITR_EL2_TLBIRVALE1OS |
  634. HFGITR_EL2_TLBIRVAAE1OS |
  635. HFGITR_EL2_TLBIRVAE1OS,
  636. FEAT_TLBIRANGE),
  637. NEEDS_FEAT(HFGITR_EL2_TLBIVAALE1OS |
  638. HFGITR_EL2_TLBIVALE1OS |
  639. HFGITR_EL2_TLBIVAAE1OS |
  640. HFGITR_EL2_TLBIASIDE1OS |
  641. HFGITR_EL2_TLBIVAE1OS |
  642. HFGITR_EL2_TLBIVMALLE1OS,
  643. FEAT_TLBIOS),
  644. NEEDS_FEAT(HFGITR_EL2_ATS1E1WP |
  645. HFGITR_EL2_ATS1E1RP,
  646. FEAT_PAN2),
  647. NEEDS_FEAT(HFGITR_EL2_DCCVADP, FEAT_DPB2),
  648. NEEDS_FEAT_FLAG(HFGITR_EL2_DCCVAC |
  649. HFGITR_EL2_SVC_EL1 |
  650. HFGITR_EL2_SVC_EL0 |
  651. HFGITR_EL2_ERET |
  652. HFGITR_EL2_TLBIVAALE1 |
  653. HFGITR_EL2_TLBIVALE1 |
  654. HFGITR_EL2_TLBIVAAE1 |
  655. HFGITR_EL2_TLBIASIDE1 |
  656. HFGITR_EL2_TLBIVAE1 |
  657. HFGITR_EL2_TLBIVMALLE1 |
  658. HFGITR_EL2_TLBIVAALE1IS |
  659. HFGITR_EL2_TLBIVALE1IS |
  660. HFGITR_EL2_TLBIVAAE1IS |
  661. HFGITR_EL2_TLBIASIDE1IS |
  662. HFGITR_EL2_TLBIVAE1IS |
  663. HFGITR_EL2_TLBIVMALLE1IS|
  664. HFGITR_EL2_ATS1E0W |
  665. HFGITR_EL2_ATS1E0R |
  666. HFGITR_EL2_ATS1E1W |
  667. HFGITR_EL2_ATS1E1R |
  668. HFGITR_EL2_DCZVA |
  669. HFGITR_EL2_DCCIVAC |
  670. HFGITR_EL2_DCCVAP |
  671. HFGITR_EL2_DCCVAU |
  672. HFGITR_EL2_DCCISW |
  673. HFGITR_EL2_DCCSW |
  674. HFGITR_EL2_DCISW |
  675. HFGITR_EL2_DCIVAC |
  676. HFGITR_EL2_ICIVAU |
  677. HFGITR_EL2_ICIALLU |
  678. HFGITR_EL2_ICIALLUIS,
  679. NEVER_FGU, FEAT_AA64EL1),
  680. };
  681. static const DECLARE_FEAT_MAP_FGT(hfgitr_desc, hfgitr_masks,
  682. hfgitr_feat_map, FEAT_FGT);
  683. static const struct reg_bits_to_feat_map hafgrtr_feat_map[] = {
  684. NEEDS_FEAT(HAFGRTR_EL2_AMEVTYPER115_EL0 |
  685. HAFGRTR_EL2_AMEVTYPER114_EL0 |
  686. HAFGRTR_EL2_AMEVTYPER113_EL0 |
  687. HAFGRTR_EL2_AMEVTYPER112_EL0 |
  688. HAFGRTR_EL2_AMEVTYPER111_EL0 |
  689. HAFGRTR_EL2_AMEVTYPER110_EL0 |
  690. HAFGRTR_EL2_AMEVTYPER19_EL0 |
  691. HAFGRTR_EL2_AMEVTYPER18_EL0 |
  692. HAFGRTR_EL2_AMEVTYPER17_EL0 |
  693. HAFGRTR_EL2_AMEVTYPER16_EL0 |
  694. HAFGRTR_EL2_AMEVTYPER15_EL0 |
  695. HAFGRTR_EL2_AMEVTYPER14_EL0 |
  696. HAFGRTR_EL2_AMEVTYPER13_EL0 |
  697. HAFGRTR_EL2_AMEVTYPER12_EL0 |
  698. HAFGRTR_EL2_AMEVTYPER11_EL0 |
  699. HAFGRTR_EL2_AMEVTYPER10_EL0 |
  700. HAFGRTR_EL2_AMEVCNTR115_EL0 |
  701. HAFGRTR_EL2_AMEVCNTR114_EL0 |
  702. HAFGRTR_EL2_AMEVCNTR113_EL0 |
  703. HAFGRTR_EL2_AMEVCNTR112_EL0 |
  704. HAFGRTR_EL2_AMEVCNTR111_EL0 |
  705. HAFGRTR_EL2_AMEVCNTR110_EL0 |
  706. HAFGRTR_EL2_AMEVCNTR19_EL0 |
  707. HAFGRTR_EL2_AMEVCNTR18_EL0 |
  708. HAFGRTR_EL2_AMEVCNTR17_EL0 |
  709. HAFGRTR_EL2_AMEVCNTR16_EL0 |
  710. HAFGRTR_EL2_AMEVCNTR15_EL0 |
  711. HAFGRTR_EL2_AMEVCNTR14_EL0 |
  712. HAFGRTR_EL2_AMEVCNTR13_EL0 |
  713. HAFGRTR_EL2_AMEVCNTR12_EL0 |
  714. HAFGRTR_EL2_AMEVCNTR11_EL0 |
  715. HAFGRTR_EL2_AMEVCNTR10_EL0 |
  716. HAFGRTR_EL2_AMCNTEN1 |
  717. HAFGRTR_EL2_AMCNTEN0 |
  718. HAFGRTR_EL2_AMEVCNTR03_EL0 |
  719. HAFGRTR_EL2_AMEVCNTR02_EL0 |
  720. HAFGRTR_EL2_AMEVCNTR01_EL0 |
  721. HAFGRTR_EL2_AMEVCNTR00_EL0,
  722. FEAT_AMUv1),
  723. };
  724. static const DECLARE_FEAT_MAP_FGT(hafgrtr_desc, hafgrtr_masks,
  725. hafgrtr_feat_map, FEAT_FGT);
  726. static const struct reg_bits_to_feat_map hfgitr2_feat_map[] = {
  727. NEEDS_FEAT(HFGITR2_EL2_nDCCIVAPS, FEAT_PoPS),
  728. NEEDS_FEAT(HFGITR2_EL2_TSBCSYNC, FEAT_TRBEv1p1)
  729. };
  730. static const DECLARE_FEAT_MAP_FGT(hfgitr2_desc, hfgitr2_masks,
  731. hfgitr2_feat_map, FEAT_FGT2);
  732. static const struct reg_bits_to_feat_map hfgrtr2_feat_map[] = {
  733. NEEDS_FEAT(HFGRTR2_EL2_nPFAR_EL1, FEAT_PFAR),
  734. NEEDS_FEAT(HFGRTR2_EL2_nERXGSR_EL1, FEAT_RASv2),
  735. NEEDS_FEAT(HFGRTR2_EL2_nACTLRALIAS_EL1 |
  736. HFGRTR2_EL2_nACTLRMASK_EL1 |
  737. HFGRTR2_EL2_nCPACRALIAS_EL1 |
  738. HFGRTR2_EL2_nCPACRMASK_EL1 |
  739. HFGRTR2_EL2_nSCTLR2MASK_EL1 |
  740. HFGRTR2_EL2_nSCTLRALIAS2_EL1 |
  741. HFGRTR2_EL2_nSCTLRALIAS_EL1 |
  742. HFGRTR2_EL2_nSCTLRMASK_EL1 |
  743. HFGRTR2_EL2_nTCR2ALIAS_EL1 |
  744. HFGRTR2_EL2_nTCR2MASK_EL1 |
  745. HFGRTR2_EL2_nTCRALIAS_EL1 |
  746. HFGRTR2_EL2_nTCRMASK_EL1,
  747. FEAT_SRMASK),
  748. NEEDS_FEAT(HFGRTR2_EL2_nRCWSMASK_EL1, FEAT_THE),
  749. };
  750. static const DECLARE_FEAT_MAP_FGT(hfgrtr2_desc, hfgrtr2_masks,
  751. hfgrtr2_feat_map, FEAT_FGT2);
  752. static const struct reg_bits_to_feat_map hfgwtr2_feat_map[] = {
  753. NEEDS_FEAT(HFGWTR2_EL2_nPFAR_EL1, FEAT_PFAR),
  754. NEEDS_FEAT(HFGWTR2_EL2_nACTLRALIAS_EL1 |
  755. HFGWTR2_EL2_nACTLRMASK_EL1 |
  756. HFGWTR2_EL2_nCPACRALIAS_EL1 |
  757. HFGWTR2_EL2_nCPACRMASK_EL1 |
  758. HFGWTR2_EL2_nSCTLR2MASK_EL1 |
  759. HFGWTR2_EL2_nSCTLRALIAS2_EL1 |
  760. HFGWTR2_EL2_nSCTLRALIAS_EL1 |
  761. HFGWTR2_EL2_nSCTLRMASK_EL1 |
  762. HFGWTR2_EL2_nTCR2ALIAS_EL1 |
  763. HFGWTR2_EL2_nTCR2MASK_EL1 |
  764. HFGWTR2_EL2_nTCRALIAS_EL1 |
  765. HFGWTR2_EL2_nTCRMASK_EL1,
  766. FEAT_SRMASK),
  767. NEEDS_FEAT(HFGWTR2_EL2_nRCWSMASK_EL1, FEAT_THE),
  768. };
  769. static const DECLARE_FEAT_MAP_FGT(hfgwtr2_desc, hfgwtr2_masks,
  770. hfgwtr2_feat_map, FEAT_FGT2);
  771. static const struct reg_bits_to_feat_map hdfgrtr2_feat_map[] = {
  772. NEEDS_FEAT(HDFGRTR2_EL2_nMDSELR_EL1, FEAT_Debugv8p9),
  773. NEEDS_FEAT(HDFGRTR2_EL2_nPMECR_EL1, feat_ebep_pmuv3_ss),
  774. NEEDS_FEAT(HDFGRTR2_EL2_nTRCITECR_EL1, FEAT_ITE),
  775. NEEDS_FEAT(HDFGRTR2_EL2_nPMICFILTR_EL0 |
  776. HDFGRTR2_EL2_nPMICNTR_EL0,
  777. FEAT_PMUv3_ICNTR),
  778. NEEDS_FEAT(HDFGRTR2_EL2_nPMUACR_EL1, feat_pmuv3p9),
  779. NEEDS_FEAT(HDFGRTR2_EL2_nPMSSCR_EL1 |
  780. HDFGRTR2_EL2_nPMSSDATA,
  781. FEAT_PMUv3_SS),
  782. NEEDS_FEAT(HDFGRTR2_EL2_nPMIAR_EL1, FEAT_SEBEP),
  783. NEEDS_FEAT(HDFGRTR2_EL2_nPMSDSFR_EL1, feat_spe_fds),
  784. NEEDS_FEAT(HDFGRTR2_EL2_nPMBMAR_EL1, FEAT_SPE_nVM),
  785. NEEDS_FEAT(HDFGRTR2_EL2_nSPMACCESSR_EL1 |
  786. HDFGRTR2_EL2_nSPMCNTEN |
  787. HDFGRTR2_EL2_nSPMCR_EL0 |
  788. HDFGRTR2_EL2_nSPMDEVAFF_EL1 |
  789. HDFGRTR2_EL2_nSPMEVCNTRn_EL0 |
  790. HDFGRTR2_EL2_nSPMEVTYPERn_EL0|
  791. HDFGRTR2_EL2_nSPMID |
  792. HDFGRTR2_EL2_nSPMINTEN |
  793. HDFGRTR2_EL2_nSPMOVS |
  794. HDFGRTR2_EL2_nSPMSCR_EL1 |
  795. HDFGRTR2_EL2_nSPMSELR_EL0,
  796. FEAT_SPMU),
  797. NEEDS_FEAT(HDFGRTR2_EL2_nMDSTEPOP_EL1, FEAT_STEP2),
  798. NEEDS_FEAT(HDFGRTR2_EL2_nTRBMPAM_EL1, feat_trbe_mpam),
  799. };
  800. static const DECLARE_FEAT_MAP_FGT(hdfgrtr2_desc, hdfgrtr2_masks,
  801. hdfgrtr2_feat_map, FEAT_FGT2);
  802. static const struct reg_bits_to_feat_map hdfgwtr2_feat_map[] = {
  803. NEEDS_FEAT(HDFGWTR2_EL2_nMDSELR_EL1, FEAT_Debugv8p9),
  804. NEEDS_FEAT(HDFGWTR2_EL2_nPMECR_EL1, feat_ebep_pmuv3_ss),
  805. NEEDS_FEAT(HDFGWTR2_EL2_nTRCITECR_EL1, FEAT_ITE),
  806. NEEDS_FEAT(HDFGWTR2_EL2_nPMICFILTR_EL0 |
  807. HDFGWTR2_EL2_nPMICNTR_EL0,
  808. FEAT_PMUv3_ICNTR),
  809. NEEDS_FEAT(HDFGWTR2_EL2_nPMUACR_EL1 |
  810. HDFGWTR2_EL2_nPMZR_EL0,
  811. feat_pmuv3p9),
  812. NEEDS_FEAT(HDFGWTR2_EL2_nPMSSCR_EL1, FEAT_PMUv3_SS),
  813. NEEDS_FEAT(HDFGWTR2_EL2_nPMIAR_EL1, FEAT_SEBEP),
  814. NEEDS_FEAT(HDFGWTR2_EL2_nPMSDSFR_EL1, feat_spe_fds),
  815. NEEDS_FEAT(HDFGWTR2_EL2_nPMBMAR_EL1, FEAT_SPE_nVM),
  816. NEEDS_FEAT(HDFGWTR2_EL2_nSPMACCESSR_EL1 |
  817. HDFGWTR2_EL2_nSPMCNTEN |
  818. HDFGWTR2_EL2_nSPMCR_EL0 |
  819. HDFGWTR2_EL2_nSPMEVCNTRn_EL0 |
  820. HDFGWTR2_EL2_nSPMEVTYPERn_EL0|
  821. HDFGWTR2_EL2_nSPMINTEN |
  822. HDFGWTR2_EL2_nSPMOVS |
  823. HDFGWTR2_EL2_nSPMSCR_EL1 |
  824. HDFGWTR2_EL2_nSPMSELR_EL0,
  825. FEAT_SPMU),
  826. NEEDS_FEAT(HDFGWTR2_EL2_nMDSTEPOP_EL1, FEAT_STEP2),
  827. NEEDS_FEAT(HDFGWTR2_EL2_nTRBMPAM_EL1, feat_trbe_mpam),
  828. };
  829. static const DECLARE_FEAT_MAP_FGT(hdfgwtr2_desc, hdfgwtr2_masks,
  830. hdfgwtr2_feat_map, FEAT_FGT2);
  831. static const struct reg_bits_to_feat_map hcrx_feat_map[] = {
  832. NEEDS_FEAT(HCRX_EL2_PACMEn, feat_pauth_lr),
  833. NEEDS_FEAT(HCRX_EL2_EnFPM, FEAT_FPMR),
  834. NEEDS_FEAT(HCRX_EL2_GCSEn, FEAT_GCS),
  835. NEEDS_FEAT(HCRX_EL2_EnIDCP128, FEAT_SYSREG128),
  836. NEEDS_FEAT(HCRX_EL2_EnSDERR, feat_aderr),
  837. NEEDS_FEAT(HCRX_EL2_TMEA, FEAT_DoubleFault2),
  838. NEEDS_FEAT(HCRX_EL2_EnSNERR, feat_anerr),
  839. NEEDS_FEAT(HCRX_EL2_D128En, FEAT_D128),
  840. NEEDS_FEAT(HCRX_EL2_PTTWI, FEAT_THE),
  841. NEEDS_FEAT(HCRX_EL2_SCTLR2En, FEAT_SCTLR2),
  842. NEEDS_FEAT(HCRX_EL2_TCR2En, FEAT_TCR2),
  843. NEEDS_FEAT(HCRX_EL2_MSCEn |
  844. HCRX_EL2_MCE2,
  845. FEAT_MOPS),
  846. NEEDS_FEAT(HCRX_EL2_CMOW, FEAT_CMOW),
  847. NEEDS_FEAT(HCRX_EL2_VFNMI |
  848. HCRX_EL2_VINMI |
  849. HCRX_EL2_TALLINT,
  850. FEAT_NMI),
  851. NEEDS_FEAT(HCRX_EL2_SMPME, feat_sme_smps),
  852. NEEDS_FEAT(HCRX_EL2_FGTnXS |
  853. HCRX_EL2_FnXS,
  854. FEAT_XS),
  855. NEEDS_FEAT(HCRX_EL2_EnASR, FEAT_LS64_V),
  856. NEEDS_FEAT(HCRX_EL2_EnALS, FEAT_LS64),
  857. NEEDS_FEAT(HCRX_EL2_EnAS0, FEAT_LS64_ACCDATA),
  858. };
  859. static const DECLARE_FEAT_MAP(hcrx_desc, __HCRX_EL2,
  860. hcrx_feat_map, FEAT_HCX);
  861. static const struct reg_bits_to_feat_map hcr_feat_map[] = {
  862. NEEDS_FEAT(HCR_EL2_TID0, FEAT_AA32EL0),
  863. NEEDS_FEAT_FLAG(HCR_EL2_RW, AS_RES1, FEAT_AA32EL1),
  864. NEEDS_FEAT(HCR_EL2_HCD, not_feat_aa64el3),
  865. NEEDS_FEAT(HCR_EL2_AMO |
  866. HCR_EL2_BSU |
  867. HCR_EL2_CD |
  868. HCR_EL2_DC |
  869. HCR_EL2_FB |
  870. HCR_EL2_FMO |
  871. HCR_EL2_ID |
  872. HCR_EL2_IMO |
  873. HCR_EL2_PTW |
  874. HCR_EL2_SWIO |
  875. HCR_EL2_TACR |
  876. HCR_EL2_TDZ |
  877. HCR_EL2_TGE |
  878. HCR_EL2_TID1 |
  879. HCR_EL2_TID2 |
  880. HCR_EL2_TID3 |
  881. HCR_EL2_TIDCP |
  882. HCR_EL2_TPCP |
  883. HCR_EL2_TPU |
  884. HCR_EL2_TRVM |
  885. HCR_EL2_TSC |
  886. HCR_EL2_TSW |
  887. HCR_EL2_TTLB |
  888. HCR_EL2_TVM |
  889. HCR_EL2_TWE |
  890. HCR_EL2_TWI |
  891. HCR_EL2_VF |
  892. HCR_EL2_VI |
  893. HCR_EL2_VM |
  894. HCR_EL2_VSE,
  895. FEAT_AA64EL1),
  896. NEEDS_FEAT(HCR_EL2_AMVOFFEN, FEAT_AMUv1p1),
  897. NEEDS_FEAT(HCR_EL2_EnSCXT, feat_csv2_2_csv2_1p2),
  898. NEEDS_FEAT(HCR_EL2_TICAB |
  899. HCR_EL2_TID4 |
  900. HCR_EL2_TOCU,
  901. FEAT_EVT),
  902. NEEDS_FEAT(HCR_EL2_TTLBIS |
  903. HCR_EL2_TTLBOS,
  904. FEAT_EVT_TTLBxS),
  905. NEEDS_FEAT(HCR_EL2_TLOR, FEAT_LOR),
  906. NEEDS_FEAT(HCR_EL2_ATA |
  907. HCR_EL2_DCT |
  908. HCR_EL2_TID5,
  909. FEAT_MTE2),
  910. NEEDS_FEAT(HCR_EL2_AT | /* Ignore the original FEAT_NV */
  911. HCR_EL2_NV2 |
  912. HCR_EL2_NV,
  913. feat_nv2),
  914. NEEDS_FEAT(HCR_EL2_NV1, feat_nv2_e2h0_ni), /* Missing from JSON */
  915. NEEDS_FEAT(HCR_EL2_API |
  916. HCR_EL2_APK,
  917. feat_pauth),
  918. NEEDS_FEAT(HCR_EL2_TEA |
  919. HCR_EL2_TERR,
  920. FEAT_RAS),
  921. NEEDS_FEAT(HCR_EL2_FIEN, feat_rasv1p1),
  922. NEEDS_FEAT(HCR_EL2_GPF, FEAT_RME),
  923. NEEDS_FEAT(HCR_EL2_FWB, FEAT_S2FWB),
  924. NEEDS_FEAT(HCR_EL2_TWEDEL |
  925. HCR_EL2_TWEDEn,
  926. FEAT_TWED),
  927. NEEDS_FEAT_FLAG(HCR_EL2_E2H, RES1_WHEN_E2H1 | FORCE_RESx),
  928. FORCE_RES0(HCR_EL2_RES0),
  929. FORCE_RES1(HCR_EL2_RES1),
  930. };
  931. static const DECLARE_FEAT_MAP(hcr_desc, HCR_EL2,
  932. hcr_feat_map, FEAT_AA64EL2);
  933. static const struct reg_bits_to_feat_map sctlr2_feat_map[] = {
  934. NEEDS_FEAT(SCTLR2_EL1_NMEA |
  935. SCTLR2_EL1_EASE,
  936. FEAT_DoubleFault2),
  937. NEEDS_FEAT(SCTLR2_EL1_EnADERR, feat_aderr),
  938. NEEDS_FEAT(SCTLR2_EL1_EnANERR, feat_anerr),
  939. NEEDS_FEAT(SCTLR2_EL1_EnIDCP128, FEAT_SYSREG128),
  940. NEEDS_FEAT(SCTLR2_EL1_EnPACM |
  941. SCTLR2_EL1_EnPACM0,
  942. feat_pauth_lr),
  943. NEEDS_FEAT(SCTLR2_EL1_CPTA |
  944. SCTLR2_EL1_CPTA0 |
  945. SCTLR2_EL1_CPTM |
  946. SCTLR2_EL1_CPTM0,
  947. FEAT_CPA2),
  948. FORCE_RES0(SCTLR2_EL1_RES0),
  949. FORCE_RES1(SCTLR2_EL1_RES1),
  950. };
  951. static const DECLARE_FEAT_MAP(sctlr2_desc, SCTLR2_EL1,
  952. sctlr2_feat_map, FEAT_SCTLR2);
  953. static const struct reg_bits_to_feat_map tcr2_el2_feat_map[] = {
  954. NEEDS_FEAT_FLAG(TCR2_EL2_FNG1 |
  955. TCR2_EL2_FNG0 |
  956. TCR2_EL2_A2,
  957. REQUIRES_E2H1, FEAT_ASID2),
  958. NEEDS_FEAT_FLAG(TCR2_EL2_DisCH1 |
  959. TCR2_EL2_DisCH0 |
  960. TCR2_EL2_D128,
  961. REQUIRES_E2H1, FEAT_D128),
  962. NEEDS_FEAT_FLAG(TCR2_EL2_AMEC1, REQUIRES_E2H1, FEAT_MEC),
  963. NEEDS_FEAT(TCR2_EL2_AMEC0, FEAT_MEC),
  964. NEEDS_FEAT(TCR2_EL2_HAFT, FEAT_HAFT),
  965. NEEDS_FEAT(TCR2_EL2_PTTWI |
  966. TCR2_EL2_PnCH,
  967. FEAT_THE),
  968. NEEDS_FEAT(TCR2_EL2_AIE, FEAT_AIE),
  969. NEEDS_FEAT(TCR2_EL2_POE |
  970. TCR2_EL2_E0POE,
  971. FEAT_S1POE),
  972. NEEDS_FEAT(TCR2_EL2_PIE, FEAT_S1PIE),
  973. FORCE_RES0(TCR2_EL2_RES0),
  974. FORCE_RES1(TCR2_EL2_RES1),
  975. };
  976. static const DECLARE_FEAT_MAP(tcr2_el2_desc, TCR2_EL2,
  977. tcr2_el2_feat_map, FEAT_TCR2);
  978. static const struct reg_bits_to_feat_map sctlr_el1_feat_map[] = {
  979. NEEDS_FEAT(SCTLR_EL1_CP15BEN, FEAT_AA32EL0),
  980. NEEDS_FEAT_FLAG(SCTLR_EL1_ITD |
  981. SCTLR_EL1_SED,
  982. AS_RES1, FEAT_AA32EL0),
  983. NEEDS_FEAT(SCTLR_EL1_BT0 |
  984. SCTLR_EL1_BT1,
  985. FEAT_BTI),
  986. NEEDS_FEAT(SCTLR_EL1_CMOW, FEAT_CMOW),
  987. NEEDS_FEAT_FLAG(SCTLR_EL1_TSCXT,
  988. AS_RES1, feat_csv2_2_csv2_1p2),
  989. NEEDS_FEAT_FLAG(SCTLR_EL1_EIS |
  990. SCTLR_EL1_EOS,
  991. AS_RES1, FEAT_ExS),
  992. NEEDS_FEAT(SCTLR_EL1_EnFPM, FEAT_FPMR),
  993. NEEDS_FEAT(SCTLR_EL1_IESB, FEAT_IESB),
  994. NEEDS_FEAT(SCTLR_EL1_EnALS, FEAT_LS64),
  995. NEEDS_FEAT(SCTLR_EL1_EnAS0, FEAT_LS64_ACCDATA),
  996. NEEDS_FEAT(SCTLR_EL1_EnASR, FEAT_LS64_V),
  997. NEEDS_FEAT(SCTLR_EL1_nAA, FEAT_LSE2),
  998. NEEDS_FEAT_FLAG(SCTLR_EL1_LSMAOE |
  999. SCTLR_EL1_nTLSMD,
  1000. AS_RES1, FEAT_LSMAOC),
  1001. NEEDS_FEAT(SCTLR_EL1_EE, FEAT_MixedEnd),
  1002. NEEDS_FEAT(SCTLR_EL1_E0E, feat_mixedendel0),
  1003. NEEDS_FEAT(SCTLR_EL1_MSCEn, FEAT_MOPS),
  1004. NEEDS_FEAT(SCTLR_EL1_ATA0 |
  1005. SCTLR_EL1_ATA |
  1006. SCTLR_EL1_TCF0 |
  1007. SCTLR_EL1_TCF,
  1008. FEAT_MTE2),
  1009. NEEDS_FEAT(SCTLR_EL1_ITFSB, feat_mte_async),
  1010. NEEDS_FEAT(SCTLR_EL1_TCSO0 |
  1011. SCTLR_EL1_TCSO,
  1012. FEAT_MTE_STORE_ONLY),
  1013. NEEDS_FEAT(SCTLR_EL1_NMI |
  1014. SCTLR_EL1_SPINTMASK,
  1015. FEAT_NMI),
  1016. NEEDS_FEAT_FLAG(SCTLR_EL1_SPAN,
  1017. AS_RES1, FEAT_PAN),
  1018. NEEDS_FEAT(SCTLR_EL1_EPAN, FEAT_PAN3),
  1019. NEEDS_FEAT(SCTLR_EL1_EnDA |
  1020. SCTLR_EL1_EnDB |
  1021. SCTLR_EL1_EnIA |
  1022. SCTLR_EL1_EnIB,
  1023. feat_pauth),
  1024. NEEDS_FEAT(SCTLR_EL1_EnTP2, FEAT_SME),
  1025. NEEDS_FEAT(SCTLR_EL1_EnRCTX, FEAT_SPECRES),
  1026. NEEDS_FEAT(SCTLR_EL1_DSSBS, FEAT_SSBS),
  1027. NEEDS_FEAT(SCTLR_EL1_TIDCP, FEAT_TIDCP1),
  1028. NEEDS_FEAT(SCTLR_EL1_TWEDEL |
  1029. SCTLR_EL1_TWEDEn,
  1030. FEAT_TWED),
  1031. NEEDS_FEAT(SCTLR_EL1_UCI |
  1032. SCTLR_EL1_WXN |
  1033. SCTLR_EL1_nTWE |
  1034. SCTLR_EL1_nTWI |
  1035. SCTLR_EL1_UCT |
  1036. SCTLR_EL1_DZE |
  1037. SCTLR_EL1_I |
  1038. SCTLR_EL1_UMA |
  1039. SCTLR_EL1_SA0 |
  1040. SCTLR_EL1_SA |
  1041. SCTLR_EL1_C |
  1042. SCTLR_EL1_A |
  1043. SCTLR_EL1_M,
  1044. FEAT_AA64EL1),
  1045. FORCE_RES0(SCTLR_EL1_RES0),
  1046. FORCE_RES1(SCTLR_EL1_RES1),
  1047. };
  1048. static const DECLARE_FEAT_MAP(sctlr_el1_desc, SCTLR_EL1,
  1049. sctlr_el1_feat_map, FEAT_AA64EL1);
  1050. static const struct reg_bits_to_feat_map sctlr_el2_feat_map[] = {
  1051. NEEDS_FEAT_FLAG(SCTLR_EL2_CP15BEN,
  1052. RES1_WHEN_E2H0 | REQUIRES_E2H1,
  1053. FEAT_AA32EL0),
  1054. NEEDS_FEAT_FLAG(SCTLR_EL2_ITD |
  1055. SCTLR_EL2_SED,
  1056. RES1_WHEN_E2H1 | REQUIRES_E2H1,
  1057. FEAT_AA32EL0),
  1058. NEEDS_FEAT_FLAG(SCTLR_EL2_BT0, REQUIRES_E2H1, FEAT_BTI),
  1059. NEEDS_FEAT(SCTLR_EL2_BT, FEAT_BTI),
  1060. NEEDS_FEAT_FLAG(SCTLR_EL2_CMOW, REQUIRES_E2H1, FEAT_CMOW),
  1061. NEEDS_FEAT_FLAG(SCTLR_EL2_TSCXT,
  1062. RES1_WHEN_E2H1 | REQUIRES_E2H1,
  1063. feat_csv2_2_csv2_1p2),
  1064. NEEDS_FEAT_FLAG(SCTLR_EL2_EIS |
  1065. SCTLR_EL2_EOS,
  1066. AS_RES1, FEAT_ExS),
  1067. NEEDS_FEAT(SCTLR_EL2_EnFPM, FEAT_FPMR),
  1068. NEEDS_FEAT(SCTLR_EL2_IESB, FEAT_IESB),
  1069. NEEDS_FEAT_FLAG(SCTLR_EL2_EnALS, REQUIRES_E2H1, FEAT_LS64),
  1070. NEEDS_FEAT_FLAG(SCTLR_EL2_EnAS0, REQUIRES_E2H1, FEAT_LS64_ACCDATA),
  1071. NEEDS_FEAT_FLAG(SCTLR_EL2_EnASR, REQUIRES_E2H1, FEAT_LS64_V),
  1072. NEEDS_FEAT(SCTLR_EL2_nAA, FEAT_LSE2),
  1073. NEEDS_FEAT_FLAG(SCTLR_EL2_LSMAOE |
  1074. SCTLR_EL2_nTLSMD,
  1075. AS_RES1 | REQUIRES_E2H1, FEAT_LSMAOC),
  1076. NEEDS_FEAT(SCTLR_EL2_EE, FEAT_MixedEnd),
  1077. NEEDS_FEAT_FLAG(SCTLR_EL2_E0E, REQUIRES_E2H1, feat_mixedendel0),
  1078. NEEDS_FEAT_FLAG(SCTLR_EL2_MSCEn, REQUIRES_E2H1, FEAT_MOPS),
  1079. NEEDS_FEAT_FLAG(SCTLR_EL2_ATA0 |
  1080. SCTLR_EL2_TCF0,
  1081. REQUIRES_E2H1, FEAT_MTE2),
  1082. NEEDS_FEAT(SCTLR_EL2_ATA |
  1083. SCTLR_EL2_TCF,
  1084. FEAT_MTE2),
  1085. NEEDS_FEAT(SCTLR_EL2_ITFSB, feat_mte_async),
  1086. NEEDS_FEAT_FLAG(SCTLR_EL2_TCSO0, REQUIRES_E2H1, FEAT_MTE_STORE_ONLY),
  1087. NEEDS_FEAT(SCTLR_EL2_TCSO,
  1088. FEAT_MTE_STORE_ONLY),
  1089. NEEDS_FEAT(SCTLR_EL2_NMI |
  1090. SCTLR_EL2_SPINTMASK,
  1091. FEAT_NMI),
  1092. NEEDS_FEAT_FLAG(SCTLR_EL2_SPAN, AS_RES1 | REQUIRES_E2H1, FEAT_PAN),
  1093. NEEDS_FEAT_FLAG(SCTLR_EL2_EPAN, REQUIRES_E2H1, FEAT_PAN3),
  1094. NEEDS_FEAT(SCTLR_EL2_EnDA |
  1095. SCTLR_EL2_EnDB |
  1096. SCTLR_EL2_EnIA |
  1097. SCTLR_EL2_EnIB,
  1098. feat_pauth),
  1099. NEEDS_FEAT_FLAG(SCTLR_EL2_EnTP2, REQUIRES_E2H1, FEAT_SME),
  1100. NEEDS_FEAT(SCTLR_EL2_EnRCTX, FEAT_SPECRES),
  1101. NEEDS_FEAT(SCTLR_EL2_DSSBS, FEAT_SSBS),
  1102. NEEDS_FEAT_FLAG(SCTLR_EL2_TIDCP, REQUIRES_E2H1, FEAT_TIDCP1),
  1103. NEEDS_FEAT_FLAG(SCTLR_EL2_TWEDEL |
  1104. SCTLR_EL2_TWEDEn,
  1105. REQUIRES_E2H1, FEAT_TWED),
  1106. NEEDS_FEAT_FLAG(SCTLR_EL2_nTWE |
  1107. SCTLR_EL2_nTWI,
  1108. AS_RES1 | REQUIRES_E2H1, FEAT_AA64EL2),
  1109. NEEDS_FEAT_FLAG(SCTLR_EL2_UCI |
  1110. SCTLR_EL2_UCT |
  1111. SCTLR_EL2_DZE |
  1112. SCTLR_EL2_SA0,
  1113. REQUIRES_E2H1, FEAT_AA64EL2),
  1114. NEEDS_FEAT(SCTLR_EL2_WXN |
  1115. SCTLR_EL2_I |
  1116. SCTLR_EL2_SA |
  1117. SCTLR_EL2_C |
  1118. SCTLR_EL2_A |
  1119. SCTLR_EL2_M,
  1120. FEAT_AA64EL2),
  1121. FORCE_RES0(SCTLR_EL2_RES0),
  1122. FORCE_RES1(SCTLR_EL2_RES1),
  1123. };
  1124. static const DECLARE_FEAT_MAP(sctlr_el2_desc, SCTLR_EL2,
  1125. sctlr_el2_feat_map, FEAT_AA64EL2);
  1126. static const struct reg_bits_to_feat_map mdcr_el2_feat_map[] = {
  1127. NEEDS_FEAT(MDCR_EL2_EBWE, FEAT_Debugv8p9),
  1128. NEEDS_FEAT(MDCR_EL2_TDOSA, FEAT_DoubleLock),
  1129. NEEDS_FEAT(MDCR_EL2_PMEE, FEAT_EBEP),
  1130. NEEDS_FEAT(MDCR_EL2_TDCC, FEAT_FGT),
  1131. NEEDS_FEAT(MDCR_EL2_MTPME, FEAT_MTPMU),
  1132. NEEDS_FEAT(MDCR_EL2_HPME |
  1133. MDCR_EL2_HPMN |
  1134. MDCR_EL2_TPMCR |
  1135. MDCR_EL2_TPM,
  1136. FEAT_PMUv3),
  1137. NEEDS_FEAT(MDCR_EL2_HPMD, feat_pmuv3p1),
  1138. NEEDS_FEAT(MDCR_EL2_HCCD |
  1139. MDCR_EL2_HLP,
  1140. feat_pmuv3p5),
  1141. NEEDS_FEAT(MDCR_EL2_HPMFZO, feat_pmuv3p7),
  1142. NEEDS_FEAT(MDCR_EL2_PMSSE, FEAT_PMUv3_SS),
  1143. NEEDS_FEAT(MDCR_EL2_E2PB |
  1144. MDCR_EL2_TPMS,
  1145. FEAT_SPE),
  1146. NEEDS_FEAT(MDCR_EL2_HPMFZS, FEAT_SPEv1p2),
  1147. NEEDS_FEAT(MDCR_EL2_EnSPM, FEAT_SPMU),
  1148. NEEDS_FEAT(MDCR_EL2_EnSTEPOP, FEAT_STEP2),
  1149. NEEDS_FEAT(MDCR_EL2_E2TB, FEAT_TRBE),
  1150. NEEDS_FEAT(MDCR_EL2_TTRF, FEAT_TRF),
  1151. NEEDS_FEAT(MDCR_EL2_TDA |
  1152. MDCR_EL2_TDE |
  1153. MDCR_EL2_TDRA,
  1154. FEAT_AA64EL1),
  1155. FORCE_RES0(MDCR_EL2_RES0),
  1156. FORCE_RES1(MDCR_EL2_RES1),
  1157. };
  1158. static const DECLARE_FEAT_MAP(mdcr_el2_desc, MDCR_EL2,
  1159. mdcr_el2_feat_map, FEAT_AA64EL2);
  1160. static const struct reg_bits_to_feat_map vtcr_el2_feat_map[] = {
  1161. NEEDS_FEAT(VTCR_EL2_HDBSS, FEAT_HDBSS),
  1162. NEEDS_FEAT(VTCR_EL2_HAFT, FEAT_HAFT),
  1163. NEEDS_FEAT(VTCR_EL2_TL0 |
  1164. VTCR_EL2_TL1 |
  1165. VTCR_EL2_AssuredOnly |
  1166. VTCR_EL2_GCSH,
  1167. FEAT_THE),
  1168. NEEDS_FEAT(VTCR_EL2_D128, FEAT_D128),
  1169. NEEDS_FEAT(VTCR_EL2_S2POE, FEAT_S2POE),
  1170. NEEDS_FEAT(VTCR_EL2_S2PIE, FEAT_S2PIE),
  1171. NEEDS_FEAT(VTCR_EL2_SL2 |
  1172. VTCR_EL2_DS,
  1173. feat_lpa2),
  1174. NEEDS_FEAT(VTCR_EL2_NSA |
  1175. VTCR_EL2_NSW,
  1176. FEAT_SEL2),
  1177. NEEDS_FEAT(VTCR_EL2_HWU62 |
  1178. VTCR_EL2_HWU61 |
  1179. VTCR_EL2_HWU60 |
  1180. VTCR_EL2_HWU59,
  1181. FEAT_HPDS2),
  1182. NEEDS_FEAT(VTCR_EL2_HD, ID_AA64MMFR1_EL1, HAFDBS, DBM),
  1183. NEEDS_FEAT(VTCR_EL2_HA, ID_AA64MMFR1_EL1, HAFDBS, AF),
  1184. NEEDS_FEAT(VTCR_EL2_VS, feat_vmid16),
  1185. NEEDS_FEAT(VTCR_EL2_PS |
  1186. VTCR_EL2_TG0 |
  1187. VTCR_EL2_SH0 |
  1188. VTCR_EL2_ORGN0 |
  1189. VTCR_EL2_IRGN0 |
  1190. VTCR_EL2_SL0 |
  1191. VTCR_EL2_T0SZ,
  1192. FEAT_AA64EL1),
  1193. FORCE_RES0(VTCR_EL2_RES0),
  1194. FORCE_RES1(VTCR_EL2_RES1),
  1195. };
  1196. static const DECLARE_FEAT_MAP(vtcr_el2_desc, VTCR_EL2,
  1197. vtcr_el2_feat_map, FEAT_AA64EL2);
  1198. static void __init check_feat_map(const struct reg_bits_to_feat_map *map,
  1199. int map_size, u64 resx, const char *str)
  1200. {
  1201. u64 mask = 0;
  1202. /*
  1203. * Don't account for FORCE_RESx that are architectural, and
  1204. * therefore part of the resx parameter. Other FORCE_RESx bits
  1205. * are implementation choices, and therefore accounted for.
  1206. */
  1207. for (int i = 0; i < map_size; i++)
  1208. if (!((map[i].flags & FORCE_RESx) && (map[i].bits & resx)))
  1209. mask |= map[i].bits;
  1210. if (mask != ~resx)
  1211. kvm_err("Undefined %s behaviour, bits %016llx\n",
  1212. str, mask ^ ~resx);
  1213. }
  1214. static u64 reg_feat_map_bits(const struct reg_bits_to_feat_map *map)
  1215. {
  1216. return map->flags & MASKS_POINTER ? (map->masks->mask | map->masks->nmask) : map->bits;
  1217. }
  1218. static void __init check_reg_desc(const struct reg_feat_map_desc *r)
  1219. {
  1220. check_feat_map(r->bit_feat_map, r->bit_feat_map_sz,
  1221. ~reg_feat_map_bits(&r->feat_map), r->name);
  1222. }
  1223. void __init check_feature_map(void)
  1224. {
  1225. check_reg_desc(&hfgrtr_desc);
  1226. check_reg_desc(&hfgwtr_desc);
  1227. check_reg_desc(&hfgitr_desc);
  1228. check_reg_desc(&hdfgrtr_desc);
  1229. check_reg_desc(&hdfgwtr_desc);
  1230. check_reg_desc(&hafgrtr_desc);
  1231. check_reg_desc(&hfgrtr2_desc);
  1232. check_reg_desc(&hfgwtr2_desc);
  1233. check_reg_desc(&hfgitr2_desc);
  1234. check_reg_desc(&hdfgrtr2_desc);
  1235. check_reg_desc(&hdfgwtr2_desc);
  1236. check_reg_desc(&hcrx_desc);
  1237. check_reg_desc(&hcr_desc);
  1238. check_reg_desc(&sctlr2_desc);
  1239. check_reg_desc(&tcr2_el2_desc);
  1240. check_reg_desc(&sctlr_el1_desc);
  1241. check_reg_desc(&sctlr_el2_desc);
  1242. check_reg_desc(&mdcr_el2_desc);
  1243. check_reg_desc(&vtcr_el2_desc);
  1244. }
  1245. static bool idreg_feat_match(struct kvm *kvm, const struct reg_bits_to_feat_map *map)
  1246. {
  1247. u64 regval = kvm->arch.id_regs[map->regidx];
  1248. u64 regfld = (regval >> map->shift) & GENMASK(map->width - 1, 0);
  1249. if (map->sign) {
  1250. s64 sfld = sign_extend64(regfld, map->width - 1);
  1251. s64 slim = sign_extend64(map->lo_lim, map->width - 1);
  1252. return sfld >= slim;
  1253. } else {
  1254. return regfld >= map->lo_lim;
  1255. }
  1256. }
  1257. static struct resx compute_resx_bits(struct kvm *kvm,
  1258. const struct reg_bits_to_feat_map *map,
  1259. int map_size,
  1260. unsigned long require,
  1261. unsigned long exclude)
  1262. {
  1263. bool e2h0 = kvm_has_feat(kvm, FEAT_E2H0);
  1264. struct resx resx = {};
  1265. for (int i = 0; i < map_size; i++) {
  1266. bool match;
  1267. if ((map[i].flags & require) != require)
  1268. continue;
  1269. if (map[i].flags & exclude)
  1270. continue;
  1271. if (map[i].flags & FORCE_RESx)
  1272. match = false;
  1273. else if (map[i].flags & CALL_FUNC)
  1274. match = map[i].match(kvm);
  1275. else
  1276. match = idreg_feat_match(kvm, &map[i]);
  1277. if (map[i].flags & REQUIRES_E2H1)
  1278. match &= !e2h0;
  1279. if (!match) {
  1280. u64 bits = reg_feat_map_bits(&map[i]);
  1281. if ((map[i].flags & AS_RES1) ||
  1282. (e2h0 && (map[i].flags & RES1_WHEN_E2H0)) ||
  1283. (!e2h0 && (map[i].flags & RES1_WHEN_E2H1)))
  1284. resx.res1 |= bits;
  1285. else
  1286. resx.res0 |= bits;
  1287. }
  1288. }
  1289. return resx;
  1290. }
  1291. static struct resx compute_reg_resx_bits(struct kvm *kvm,
  1292. const struct reg_feat_map_desc *r,
  1293. unsigned long require,
  1294. unsigned long exclude)
  1295. {
  1296. struct resx resx;
  1297. resx = compute_resx_bits(kvm, r->bit_feat_map, r->bit_feat_map_sz,
  1298. require, exclude);
  1299. if (r->feat_map.flags & MASKS_POINTER) {
  1300. resx.res0 |= r->feat_map.masks->res0;
  1301. resx.res1 |= r->feat_map.masks->res1;
  1302. }
  1303. /*
  1304. * If the register itself was not valid, all the non-RESx bits are
  1305. * now considered RES0 (this matches the behaviour of registers such
  1306. * as SCTLR2 and TCR2). Weed out any potential (though unlikely)
  1307. * overlap with RES1 bits coming from the previous computation.
  1308. */
  1309. resx.res0 |= compute_resx_bits(kvm, &r->feat_map, 1, require, exclude).res0;
  1310. resx.res1 &= ~resx.res0;
  1311. return resx;
  1312. }
  1313. static u64 compute_fgu_bits(struct kvm *kvm, const struct reg_feat_map_desc *r)
  1314. {
  1315. struct resx resx;
  1316. /*
  1317. * If computing FGUs, we collect the unsupported feature bits as
  1318. * RESx bits, but don't take the actual RESx bits or register
  1319. * existence into account -- we're not computing bits for the
  1320. * register itself.
  1321. */
  1322. resx = compute_resx_bits(kvm, r->bit_feat_map, r->bit_feat_map_sz,
  1323. 0, NEVER_FGU);
  1324. return resx.res0 | resx.res1;
  1325. }
  1326. void compute_fgu(struct kvm *kvm, enum fgt_group_id fgt)
  1327. {
  1328. u64 val = 0;
  1329. switch (fgt) {
  1330. case HFGRTR_GROUP:
  1331. val |= compute_fgu_bits(kvm, &hfgrtr_desc);
  1332. val |= compute_fgu_bits(kvm, &hfgwtr_desc);
  1333. break;
  1334. case HFGITR_GROUP:
  1335. val |= compute_fgu_bits(kvm, &hfgitr_desc);
  1336. break;
  1337. case HDFGRTR_GROUP:
  1338. val |= compute_fgu_bits(kvm, &hdfgrtr_desc);
  1339. val |= compute_fgu_bits(kvm, &hdfgwtr_desc);
  1340. break;
  1341. case HAFGRTR_GROUP:
  1342. val |= compute_fgu_bits(kvm, &hafgrtr_desc);
  1343. break;
  1344. case HFGRTR2_GROUP:
  1345. val |= compute_fgu_bits(kvm, &hfgrtr2_desc);
  1346. val |= compute_fgu_bits(kvm, &hfgwtr2_desc);
  1347. break;
  1348. case HFGITR2_GROUP:
  1349. val |= compute_fgu_bits(kvm, &hfgitr2_desc);
  1350. break;
  1351. case HDFGRTR2_GROUP:
  1352. val |= compute_fgu_bits(kvm, &hdfgrtr2_desc);
  1353. val |= compute_fgu_bits(kvm, &hdfgwtr2_desc);
  1354. break;
  1355. default:
  1356. BUG();
  1357. }
  1358. kvm->arch.fgu[fgt] = val;
  1359. }
  1360. struct resx get_reg_fixed_bits(struct kvm *kvm, enum vcpu_sysreg reg)
  1361. {
  1362. struct resx resx;
  1363. switch (reg) {
  1364. case HFGRTR_EL2:
  1365. resx = compute_reg_resx_bits(kvm, &hfgrtr_desc, 0, 0);
  1366. break;
  1367. case HFGWTR_EL2:
  1368. resx = compute_reg_resx_bits(kvm, &hfgwtr_desc, 0, 0);
  1369. break;
  1370. case HFGITR_EL2:
  1371. resx = compute_reg_resx_bits(kvm, &hfgitr_desc, 0, 0);
  1372. break;
  1373. case HDFGRTR_EL2:
  1374. resx = compute_reg_resx_bits(kvm, &hdfgrtr_desc, 0, 0);
  1375. break;
  1376. case HDFGWTR_EL2:
  1377. resx = compute_reg_resx_bits(kvm, &hdfgwtr_desc, 0, 0);
  1378. break;
  1379. case HAFGRTR_EL2:
  1380. resx = compute_reg_resx_bits(kvm, &hafgrtr_desc, 0, 0);
  1381. break;
  1382. case HFGRTR2_EL2:
  1383. resx = compute_reg_resx_bits(kvm, &hfgrtr2_desc, 0, 0);
  1384. break;
  1385. case HFGWTR2_EL2:
  1386. resx = compute_reg_resx_bits(kvm, &hfgwtr2_desc, 0, 0);
  1387. break;
  1388. case HFGITR2_EL2:
  1389. resx = compute_reg_resx_bits(kvm, &hfgitr2_desc, 0, 0);
  1390. break;
  1391. case HDFGRTR2_EL2:
  1392. resx = compute_reg_resx_bits(kvm, &hdfgrtr2_desc, 0, 0);
  1393. break;
  1394. case HDFGWTR2_EL2:
  1395. resx = compute_reg_resx_bits(kvm, &hdfgwtr2_desc, 0, 0);
  1396. break;
  1397. case HCRX_EL2:
  1398. resx = compute_reg_resx_bits(kvm, &hcrx_desc, 0, 0);
  1399. resx.res1 |= __HCRX_EL2_RES1;
  1400. break;
  1401. case HCR_EL2:
  1402. resx = compute_reg_resx_bits(kvm, &hcr_desc, 0, 0);
  1403. break;
  1404. case SCTLR2_EL1:
  1405. case SCTLR2_EL2:
  1406. resx = compute_reg_resx_bits(kvm, &sctlr2_desc, 0, 0);
  1407. break;
  1408. case TCR2_EL2:
  1409. resx = compute_reg_resx_bits(kvm, &tcr2_el2_desc, 0, 0);
  1410. break;
  1411. case SCTLR_EL1:
  1412. resx = compute_reg_resx_bits(kvm, &sctlr_el1_desc, 0, 0);
  1413. break;
  1414. case SCTLR_EL2:
  1415. resx = compute_reg_resx_bits(kvm, &sctlr_el2_desc, 0, 0);
  1416. break;
  1417. case MDCR_EL2:
  1418. resx = compute_reg_resx_bits(kvm, &mdcr_el2_desc, 0, 0);
  1419. break;
  1420. case VTCR_EL2:
  1421. resx = compute_reg_resx_bits(kvm, &vtcr_el2_desc, 0, 0);
  1422. break;
  1423. default:
  1424. WARN_ON_ONCE(1);
  1425. resx = (typeof(resx)){};
  1426. break;
  1427. }
  1428. return resx;
  1429. }
  1430. static __always_inline struct fgt_masks *__fgt_reg_to_masks(enum vcpu_sysreg reg)
  1431. {
  1432. switch (reg) {
  1433. case HFGRTR_EL2:
  1434. return &hfgrtr_masks;
  1435. case HFGWTR_EL2:
  1436. return &hfgwtr_masks;
  1437. case HFGITR_EL2:
  1438. return &hfgitr_masks;
  1439. case HDFGRTR_EL2:
  1440. return &hdfgrtr_masks;
  1441. case HDFGWTR_EL2:
  1442. return &hdfgwtr_masks;
  1443. case HAFGRTR_EL2:
  1444. return &hafgrtr_masks;
  1445. case HFGRTR2_EL2:
  1446. return &hfgrtr2_masks;
  1447. case HFGWTR2_EL2:
  1448. return &hfgwtr2_masks;
  1449. case HFGITR2_EL2:
  1450. return &hfgitr2_masks;
  1451. case HDFGRTR2_EL2:
  1452. return &hdfgrtr2_masks;
  1453. case HDFGWTR2_EL2:
  1454. return &hdfgwtr2_masks;
  1455. default:
  1456. BUILD_BUG_ON(1);
  1457. }
  1458. }
  1459. static __always_inline void __compute_fgt(struct kvm_vcpu *vcpu, enum vcpu_sysreg reg)
  1460. {
  1461. u64 fgu = vcpu->kvm->arch.fgu[__fgt_reg_to_group_id(reg)];
  1462. struct fgt_masks *m = __fgt_reg_to_masks(reg);
  1463. u64 clear = 0, set = 0, val = m->nmask;
  1464. set |= fgu & m->mask;
  1465. clear |= fgu & m->nmask;
  1466. if (is_nested_ctxt(vcpu)) {
  1467. u64 nested = __vcpu_sys_reg(vcpu, reg);
  1468. set |= nested & m->mask;
  1469. clear |= ~nested & m->nmask;
  1470. }
  1471. val |= set;
  1472. val &= ~clear;
  1473. *vcpu_fgt(vcpu, reg) = val;
  1474. }
  1475. static void __compute_hfgwtr(struct kvm_vcpu *vcpu)
  1476. {
  1477. __compute_fgt(vcpu, HFGWTR_EL2);
  1478. if (cpus_have_final_cap(ARM64_WORKAROUND_AMPERE_AC03_CPU_38))
  1479. *vcpu_fgt(vcpu, HFGWTR_EL2) |= HFGWTR_EL2_TCR_EL1;
  1480. }
  1481. static void __compute_hdfgwtr(struct kvm_vcpu *vcpu)
  1482. {
  1483. __compute_fgt(vcpu, HDFGWTR_EL2);
  1484. if (is_hyp_ctxt(vcpu))
  1485. *vcpu_fgt(vcpu, HDFGWTR_EL2) |= HDFGWTR_EL2_MDSCR_EL1;
  1486. }
  1487. void kvm_vcpu_load_fgt(struct kvm_vcpu *vcpu)
  1488. {
  1489. if (!cpus_have_final_cap(ARM64_HAS_FGT))
  1490. return;
  1491. __compute_fgt(vcpu, HFGRTR_EL2);
  1492. __compute_hfgwtr(vcpu);
  1493. __compute_fgt(vcpu, HFGITR_EL2);
  1494. __compute_fgt(vcpu, HDFGRTR_EL2);
  1495. __compute_hdfgwtr(vcpu);
  1496. __compute_fgt(vcpu, HAFGRTR_EL2);
  1497. if (!cpus_have_final_cap(ARM64_HAS_FGT2))
  1498. return;
  1499. __compute_fgt(vcpu, HFGRTR2_EL2);
  1500. __compute_fgt(vcpu, HFGWTR2_EL2);
  1501. __compute_fgt(vcpu, HFGITR2_EL2);
  1502. __compute_fgt(vcpu, HDFGRTR2_EL2);
  1503. __compute_fgt(vcpu, HDFGWTR2_EL2);
  1504. }