1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#ifndef ARM_CPU_H
21#define ARM_CPU_H
22
23#include "kvm-consts.h"
24#include "hw/registerfields.h"
25#include "cpu-qom.h"
26#include "exec/cpu-defs.h"
27#include "qapi/qapi-types-common.h"
28
29
30#define TCG_GUEST_DEFAULT_MO (0)
31
32#ifdef TARGET_AARCH64
33#define KVM_HAVE_MCE_INJECTION 1
34#endif
35
36#define EXCP_UDEF 1
37#define EXCP_SWI 2
38#define EXCP_PREFETCH_ABORT 3
39#define EXCP_DATA_ABORT 4
40#define EXCP_IRQ 5
41#define EXCP_FIQ 6
42#define EXCP_BKPT 7
43#define EXCP_EXCEPTION_EXIT 8
44#define EXCP_KERNEL_TRAP 9
45#define EXCP_HVC 11
46#define EXCP_HYP_TRAP 12
47#define EXCP_SMC 13
48#define EXCP_VIRQ 14
49#define EXCP_VFIQ 15
50#define EXCP_SEMIHOST 16
51#define EXCP_NOCP 17
52#define EXCP_INVSTATE 18
53#define EXCP_STKOF 19
54#define EXCP_LAZYFP 20
55#define EXCP_LSERR 21
56#define EXCP_UNALIGNED 22
57#define EXCP_DIVBYZERO 23
58
59
60#define ARMV7M_EXCP_RESET 1
61#define ARMV7M_EXCP_NMI 2
62#define ARMV7M_EXCP_HARD 3
63#define ARMV7M_EXCP_MEM 4
64#define ARMV7M_EXCP_BUS 5
65#define ARMV7M_EXCP_USAGE 6
66#define ARMV7M_EXCP_SECURE 7
67#define ARMV7M_EXCP_SVC 11
68#define ARMV7M_EXCP_DEBUG 12
69#define ARMV7M_EXCP_PENDSV 14
70#define ARMV7M_EXCP_SYSTICK 15
71
72
73
74
75
76
77
78
79
80
81enum {
82 M_REG_NS = 0,
83 M_REG_S = 1,
84 M_REG_NUM_BANKS = 2,
85};
86
87
88#define CPU_INTERRUPT_FIQ CPU_INTERRUPT_TGT_EXT_1
89#define CPU_INTERRUPT_VIRQ CPU_INTERRUPT_TGT_EXT_2
90#define CPU_INTERRUPT_VFIQ CPU_INTERRUPT_TGT_EXT_3
91
92
93
94
95
96
97
98#ifdef HOST_WORDS_BIGENDIAN
99#define offsetoflow32(S, M) (offsetof(S, M) + sizeof(uint32_t))
100#define offsetofhigh32(S, M) offsetof(S, M)
101#else
102#define offsetoflow32(S, M) offsetof(S, M)
103#define offsetofhigh32(S, M) (offsetof(S, M) + sizeof(uint32_t))
104#endif
105
106
107#define ARM_CPU_IRQ 0
108#define ARM_CPU_FIQ 1
109#define ARM_CPU_VIRQ 2
110#define ARM_CPU_VFIQ 3
111
112
113
114
115
116#define TARGET_INSN_START_EXTRA_WORDS 2
117
118
119
120
121
122
123#define ARM_INSN_START_WORD2_MASK ((1 << 26) - 1)
124#define ARM_INSN_START_WORD2_SHIFT 14
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143typedef struct DynamicGDBXMLInfo {
144 char *desc;
145 int num;
146 union {
147 struct {
148 uint32_t *keys;
149 } cpregs;
150 } data;
151} DynamicGDBXMLInfo;
152
153
154typedef struct ARMGenericTimer {
155 uint64_t cval;
156 uint64_t ctl;
157} ARMGenericTimer;
158
159#define GTIMER_PHYS 0
160#define GTIMER_VIRT 1
161#define GTIMER_HYP 2
162#define GTIMER_SEC 3
163#define GTIMER_HYPVIRT 4
164#define NUM_GTIMERS 5
165
166typedef struct {
167 uint64_t raw_tcr;
168 uint32_t mask;
169 uint32_t base_mask;
170} TCR;
171
172#define VTCR_NSW (1u << 29)
173#define VTCR_NSA (1u << 30)
174#define VSTCR_SW VTCR_NSW
175#define VSTCR_SA VTCR_NSA
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203#ifdef TARGET_AARCH64
204# define ARM_MAX_VQ 16
205void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp);
206void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp);
207void arm_cpu_lpa2_finalize(ARMCPU *cpu, Error **errp);
208#else
209# define ARM_MAX_VQ 1
210static inline void arm_cpu_sve_finalize(ARMCPU *cpu, Error **errp) { }
211static inline void arm_cpu_pauth_finalize(ARMCPU *cpu, Error **errp) { }
212static inline void arm_cpu_lpa2_finalize(ARMCPU *cpu, Error **errp) { }
213#endif
214
215typedef struct ARMVectorReg {
216 uint64_t d[2 * ARM_MAX_VQ] QEMU_ALIGNED(16);
217} ARMVectorReg;
218
219#ifdef TARGET_AARCH64
220
221typedef struct ARMPredicateReg {
222 uint64_t p[DIV_ROUND_UP(2 * ARM_MAX_VQ, 8)] QEMU_ALIGNED(16);
223} ARMPredicateReg;
224
225
226typedef struct ARMPACKey {
227 uint64_t lo, hi;
228} ARMPACKey;
229#endif
230
231
232typedef struct CPUARMTBFlags {
233 uint32_t flags;
234 target_ulong flags2;
235} CPUARMTBFlags;
236
237typedef struct CPUArchState {
238
239 uint32_t regs[16];
240
241
242
243
244
245
246 uint64_t xregs[32];
247 uint64_t pc;
248
249
250
251
252
253
254
255
256
257
258
259
260 uint32_t pstate;
261 uint32_t aarch64;
262
263
264 CPUARMTBFlags hflags;
265
266
267
268
269 uint32_t uncached_cpsr;
270 uint32_t spsr;
271
272
273 uint64_t banked_spsr[8];
274 uint32_t banked_r13[8];
275 uint32_t banked_r14[8];
276
277
278 uint32_t usr_regs[5];
279 uint32_t fiq_regs[5];
280
281
282 uint32_t CF;
283 uint32_t VF;
284 uint32_t NF;
285 uint32_t ZF;
286 uint32_t QF;
287 uint32_t GE;
288 uint32_t thumb;
289 uint32_t condexec_bits;
290 uint32_t btype;
291 uint64_t daif;
292
293 uint64_t elr_el[4];
294 uint64_t sp_el[4];
295
296
297 struct {
298 uint32_t c0_cpuid;
299 union {
300 struct {
301 uint64_t _unused_csselr0;
302 uint64_t csselr_ns;
303 uint64_t _unused_csselr1;
304 uint64_t csselr_s;
305 };
306 uint64_t csselr_el[4];
307 };
308 union {
309 struct {
310 uint64_t _unused_sctlr;
311 uint64_t sctlr_ns;
312 uint64_t hsctlr;
313 uint64_t sctlr_s;
314 };
315 uint64_t sctlr_el[4];
316 };
317 uint64_t cpacr_el1;
318 uint64_t cptr_el[4];
319 uint32_t c1_xscaleauxcr;
320 uint64_t sder;
321 uint32_t nsacr;
322 union {
323 struct {
324 uint64_t _unused_ttbr0_0;
325 uint64_t ttbr0_ns;
326 uint64_t _unused_ttbr0_1;
327 uint64_t ttbr0_s;
328 };
329 uint64_t ttbr0_el[4];
330 };
331 union {
332 struct {
333 uint64_t _unused_ttbr1_0;
334 uint64_t ttbr1_ns;
335 uint64_t _unused_ttbr1_1;
336 uint64_t ttbr1_s;
337 };
338 uint64_t ttbr1_el[4];
339 };
340 uint64_t vttbr_el2;
341 uint64_t vsttbr_el2;
342
343 TCR tcr_el[4];
344 TCR vtcr_el2;
345 TCR vstcr_el2;
346 uint32_t c2_data;
347 uint32_t c2_insn;
348 union {
349
350
351 struct {
352 uint64_t dacr_ns;
353 uint64_t dacr_s;
354 };
355 struct {
356 uint64_t dacr32_el2;
357 };
358 };
359 uint32_t pmsav5_data_ap;
360 uint32_t pmsav5_insn_ap;
361 uint64_t hcr_el2;
362 uint64_t scr_el3;
363 union {
364 struct {
365 uint64_t ifsr_ns;
366 uint64_t ifsr_s;
367 };
368 struct {
369 uint64_t ifsr32_el2;
370 };
371 };
372 union {
373 struct {
374 uint64_t _unused_dfsr;
375 uint64_t dfsr_ns;
376 uint64_t hsr;
377 uint64_t dfsr_s;
378 };
379 uint64_t esr_el[4];
380 };
381 uint32_t c6_region[8];
382 union {
383 struct {
384 uint64_t _unused_far0;
385#ifdef HOST_WORDS_BIGENDIAN
386 uint32_t ifar_ns;
387 uint32_t dfar_ns;
388 uint32_t ifar_s;
389 uint32_t dfar_s;
390#else
391 uint32_t dfar_ns;
392 uint32_t ifar_ns;
393 uint32_t dfar_s;
394 uint32_t ifar_s;
395#endif
396 uint64_t _unused_far3;
397 };
398 uint64_t far_el[4];
399 };
400 uint64_t hpfar_el2;
401 uint64_t hstr_el2;
402 union {
403 struct {
404 uint64_t _unused_par_0;
405 uint64_t par_ns;
406 uint64_t _unused_par_1;
407 uint64_t par_s;
408 };
409 uint64_t par_el[4];
410 };
411
412 uint32_t c9_insn;
413 uint32_t c9_data;
414 uint64_t c9_pmcr;
415 uint64_t c9_pmcnten;
416 uint64_t c9_pmovsr;
417 uint64_t c9_pmuserenr;
418 uint64_t c9_pmselr;
419 uint64_t c9_pminten;
420 union {
421 struct {
422#ifdef HOST_WORDS_BIGENDIAN
423 uint64_t _unused_mair_0;
424 uint32_t mair1_ns;
425 uint32_t mair0_ns;
426 uint64_t _unused_mair_1;
427 uint32_t mair1_s;
428 uint32_t mair0_s;
429#else
430 uint64_t _unused_mair_0;
431 uint32_t mair0_ns;
432 uint32_t mair1_ns;
433 uint64_t _unused_mair_1;
434 uint32_t mair0_s;
435 uint32_t mair1_s;
436#endif
437 };
438 uint64_t mair_el[4];
439 };
440 union {
441 struct {
442 uint64_t _unused_vbar;
443 uint64_t vbar_ns;
444 uint64_t hvbar;
445 uint64_t vbar_s;
446 };
447 uint64_t vbar_el[4];
448 };
449 uint32_t mvbar;
450 uint64_t rvbar;
451 struct {
452 uint32_t fcseidr_ns;
453 uint32_t fcseidr_s;
454 };
455 union {
456 struct {
457 uint64_t _unused_contextidr_0;
458 uint64_t contextidr_ns;
459 uint64_t _unused_contextidr_1;
460 uint64_t contextidr_s;
461 };
462 uint64_t contextidr_el[4];
463 };
464 union {
465 struct {
466 uint64_t tpidrurw_ns;
467 uint64_t tpidrprw_ns;
468 uint64_t htpidr;
469 uint64_t _tpidr_el3;
470 };
471 uint64_t tpidr_el[4];
472 };
473
474 uint64_t tpidrurw_s;
475 uint64_t tpidrprw_s;
476 uint64_t tpidruro_s;
477
478 union {
479 uint64_t tpidruro_ns;
480 uint64_t tpidrro_el[1];
481 };
482 uint64_t c14_cntfrq;
483 uint64_t c14_cntkctl;
484 uint32_t cnthctl_el2;
485 uint64_t cntvoff_el2;
486 ARMGenericTimer c14_timer[NUM_GTIMERS];
487 uint32_t c15_cpar;
488 uint32_t c15_ticonfig;
489 uint32_t c15_i_max;
490 uint32_t c15_i_min;
491 uint32_t c15_threadid;
492 uint32_t c15_config_base_address;
493 uint32_t c15_diagnostic;
494 uint32_t c15_power_diagnostic;
495 uint32_t c15_power_control;
496 uint64_t dbgbvr[16];
497 uint64_t dbgbcr[16];
498 uint64_t dbgwvr[16];
499 uint64_t dbgwcr[16];
500 uint64_t mdscr_el1;
501 uint64_t oslsr_el1;
502 uint64_t mdcr_el2;
503 uint64_t mdcr_el3;
504
505
506
507
508
509 uint64_t c15_ccnt;
510
511
512
513
514
515
516
517 uint64_t c15_ccnt_delta;
518 uint64_t c14_pmevcntr[31];
519 uint64_t c14_pmevcntr_delta[31];
520 uint64_t c14_pmevtyper[31];
521 uint64_t pmccfiltr_el0;
522 uint64_t vpidr_el2;
523 uint64_t vmpidr_el2;
524 uint64_t tfsr_el[4];
525 uint64_t gcr_el1;
526 uint64_t rgsr_el1;
527 } cp15;
528
529 struct {
530
531
532
533
534
535
536
537
538
539
540
541 uint32_t other_sp;
542 uint32_t other_ss_msp;
543 uint32_t other_ss_psp;
544 uint32_t vecbase[M_REG_NUM_BANKS];
545 uint32_t basepri[M_REG_NUM_BANKS];
546 uint32_t control[M_REG_NUM_BANKS];
547 uint32_t ccr[M_REG_NUM_BANKS];
548 uint32_t cfsr[M_REG_NUM_BANKS];
549 uint32_t hfsr;
550 uint32_t dfsr;
551 uint32_t sfsr;
552 uint32_t mmfar[M_REG_NUM_BANKS];
553 uint32_t bfar;
554 uint32_t sfar;
555 unsigned mpu_ctrl[M_REG_NUM_BANKS];
556 int exception;
557 uint32_t primask[M_REG_NUM_BANKS];
558 uint32_t faultmask[M_REG_NUM_BANKS];
559 uint32_t aircr;
560 uint32_t secure;
561 uint32_t csselr[M_REG_NUM_BANKS];
562 uint32_t scr[M_REG_NUM_BANKS];
563 uint32_t msplim[M_REG_NUM_BANKS];
564 uint32_t psplim[M_REG_NUM_BANKS];
565 uint32_t fpcar[M_REG_NUM_BANKS];
566 uint32_t fpccr[M_REG_NUM_BANKS];
567 uint32_t fpdscr[M_REG_NUM_BANKS];
568 uint32_t cpacr[M_REG_NUM_BANKS];
569 uint32_t nsacr;
570 uint32_t ltpsize;
571 uint32_t vpr;
572 } v7m;
573
574
575
576
577
578
579
580 struct {
581 uint32_t syndrome;
582 uint32_t fsr;
583 uint64_t vaddress;
584 uint32_t target_el;
585
586
587
588 } exception;
589
590
591 struct {
592 uint8_t pending;
593 uint8_t has_esr;
594 uint64_t esr;
595 } serror;
596
597 uint8_t ext_dabt_raised;
598
599
600 uint32_t irq_line_state;
601
602
603 uint32_t teecr;
604 uint32_t teehbr;
605
606
607 struct {
608 ARMVectorReg zregs[32];
609
610#ifdef TARGET_AARCH64
611
612#define FFR_PRED_NUM 16
613 ARMPredicateReg pregs[17];
614
615 ARMPredicateReg preg_tmp;
616#endif
617
618
619 uint32_t qc[4] QEMU_ALIGNED(16);
620 int vec_len;
621 int vec_stride;
622
623 uint32_t xregs[16];
624
625
626 uint32_t scratch[8];
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655 float_status fp_status;
656 float_status fp_status_f16;
657 float_status standard_fp_status;
658 float_status standard_fp_status_f16;
659
660
661 uint64_t zcr_el[4];
662 } vfp;
663 uint64_t exclusive_addr;
664 uint64_t exclusive_val;
665 uint64_t exclusive_high;
666
667
668 struct {
669 uint64_t regs[16];
670 uint64_t val;
671
672 uint32_t cregs[16];
673 } iwmmxt;
674
675#ifdef TARGET_AARCH64
676 struct {
677 ARMPACKey apia;
678 ARMPACKey apib;
679 ARMPACKey apda;
680 ARMPACKey apdb;
681 ARMPACKey apga;
682 } keys;
683#endif
684
685#if defined(CONFIG_USER_ONLY)
686
687 int eabi;
688#endif
689
690 struct CPUBreakpoint *cpu_breakpoint[16];
691 struct CPUWatchpoint *cpu_watchpoint[16];
692
693
694 struct {} end_reset_fields;
695
696
697
698
699 uint64_t features;
700
701
702 struct {
703 uint32_t *drbar;
704 uint32_t *drsr;
705 uint32_t *dracr;
706 uint32_t rnr[M_REG_NUM_BANKS];
707 } pmsav7;
708
709
710 struct {
711
712
713
714
715
716 uint32_t *rbar[M_REG_NUM_BANKS];
717 uint32_t *rlar[M_REG_NUM_BANKS];
718 uint32_t mair0[M_REG_NUM_BANKS];
719 uint32_t mair1[M_REG_NUM_BANKS];
720 } pmsav8;
721
722
723 struct {
724 uint32_t *rbar;
725 uint32_t *rlar;
726 uint32_t rnr;
727 uint32_t ctrl;
728 } sau;
729
730 void *nvic;
731 const struct arm_boot_info *boot_info;
732
733 void *gicv3state;
734
735#ifdef TARGET_TAGGED_ADDRESSES
736
737 bool tagged_addr_enable;
738#endif
739} CPUARMState;
740
741static inline void set_feature(CPUARMState *env, int feature)
742{
743 env->features |= 1ULL << feature;
744}
745
746static inline void unset_feature(CPUARMState *env, int feature)
747{
748 env->features &= ~(1ULL << feature);
749}
750
751
752
753
754
755
756typedef void ARMELChangeHookFn(ARMCPU *cpu, void *opaque);
757typedef struct ARMELChangeHook ARMELChangeHook;
758struct ARMELChangeHook {
759 ARMELChangeHookFn *hook;
760 void *opaque;
761 QLIST_ENTRY(ARMELChangeHook) node;
762};
763
764
765
766typedef enum ARMPSCIState {
767 PSCI_ON = 0,
768 PSCI_OFF = 1,
769 PSCI_ON_PENDING = 2
770} ARMPSCIState;
771
772typedef struct ARMISARegisters ARMISARegisters;
773
774
775
776
777
778
779
780struct ArchCPU {
781
782 CPUState parent_obj;
783
784
785 CPUNegativeOffsetState neg;
786 CPUARMState env;
787
788
789 GHashTable *cp_regs;
790
791
792
793
794
795
796
797 uint64_t *cpreg_indexes;
798
799 uint64_t *cpreg_values;
800
801 int32_t cpreg_array_len;
802
803
804
805
806 uint64_t *cpreg_vmstate_indexes;
807 uint64_t *cpreg_vmstate_values;
808 int32_t cpreg_vmstate_array_len;
809
810 DynamicGDBXMLInfo dyn_sysreg_xml;
811 DynamicGDBXMLInfo dyn_svereg_xml;
812
813
814 QEMUTimer *gt_timer[NUM_GTIMERS];
815
816
817
818
819 QEMUTimer *pmu_timer;
820
821 qemu_irq gt_timer_outputs[NUM_GTIMERS];
822
823 qemu_irq gicv3_maintenance_interrupt;
824
825 qemu_irq pmu_interrupt;
826
827
828 MemoryRegion *secure_memory;
829
830
831 MemoryRegion *tag_memory;
832 MemoryRegion *secure_tag_memory;
833
834
835 Object *idau;
836
837
838 const char *dtb_compatible;
839
840
841
842
843
844 uint32_t psci_version;
845
846
847 ARMPSCIState power_state;
848
849
850 bool has_el2;
851
852 bool has_el3;
853
854 bool has_pmu;
855
856 bool has_vfp;
857
858 bool has_neon;
859
860 bool has_dsp;
861
862
863 bool has_mpu;
864
865 uint32_t pmsav7_dregion;
866
867 uint32_t sau_sregion;
868
869
870
871
872 uint32_t psci_conduit;
873
874
875 uint32_t init_svtor;
876
877 uint32_t init_nsvtor;
878
879
880
881
882 uint32_t kvm_target;
883
884
885 uint32_t kvm_init_features[7];
886
887
888
889
890 bool kvm_adjvtime;
891 bool kvm_vtime_dirty;
892 uint64_t kvm_vtime;
893
894
895 OnOffAuto kvm_steal_time;
896
897
898 bool mp_is_up;
899
900
901
902
903 bool host_cpu_probe_failed;
904
905
906
907
908 int32_t core_count;
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927 struct ARMISARegisters {
928 uint32_t id_isar0;
929 uint32_t id_isar1;
930 uint32_t id_isar2;
931 uint32_t id_isar3;
932 uint32_t id_isar4;
933 uint32_t id_isar5;
934 uint32_t id_isar6;
935 uint32_t id_mmfr0;
936 uint32_t id_mmfr1;
937 uint32_t id_mmfr2;
938 uint32_t id_mmfr3;
939 uint32_t id_mmfr4;
940 uint32_t id_pfr0;
941 uint32_t id_pfr1;
942 uint32_t id_pfr2;
943 uint32_t mvfr0;
944 uint32_t mvfr1;
945 uint32_t mvfr2;
946 uint32_t id_dfr0;
947 uint32_t dbgdidr;
948 uint64_t id_aa64isar0;
949 uint64_t id_aa64isar1;
950 uint64_t id_aa64pfr0;
951 uint64_t id_aa64pfr1;
952 uint64_t id_aa64mmfr0;
953 uint64_t id_aa64mmfr1;
954 uint64_t id_aa64mmfr2;
955 uint64_t id_aa64dfr0;
956 uint64_t id_aa64dfr1;
957 uint64_t id_aa64zfr0;
958 } isar;
959 uint64_t midr;
960 uint32_t revidr;
961 uint32_t reset_fpsid;
962 uint64_t ctr;
963 uint32_t reset_sctlr;
964 uint64_t pmceid0;
965 uint64_t pmceid1;
966 uint32_t id_afr0;
967 uint64_t id_aa64afr0;
968 uint64_t id_aa64afr1;
969 uint64_t clidr;
970 uint64_t mp_affinity;
971
972
973
974 uint64_t ccsidr[16];
975 uint64_t reset_cbar;
976 uint32_t reset_auxcr;
977 bool reset_hivecs;
978
979
980
981
982
983 bool prop_pauth;
984 bool prop_pauth_impdef;
985 bool prop_lpa2;
986
987
988 uint32_t dcz_blocksize;
989 uint64_t rvbar_prop;
990
991
992 int gic_num_lrs;
993 int gic_vpribits;
994 int gic_vprebits;
995
996
997
998
999
1000
1001 bool cfgend;
1002
1003 QLIST_HEAD(, ARMELChangeHook) pre_el_change_hooks;
1004 QLIST_HEAD(, ARMELChangeHook) el_change_hooks;
1005
1006 int32_t node_id;
1007
1008
1009 uint8_t device_irq_level;
1010
1011
1012 uint32_t sve_max_vq;
1013
1014#ifdef CONFIG_USER_ONLY
1015
1016 uint32_t sve_default_vq;
1017#endif
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031 DECLARE_BITMAP(sve_vq_map, ARM_MAX_VQ);
1032 DECLARE_BITMAP(sve_vq_init, ARM_MAX_VQ);
1033 DECLARE_BITMAP(sve_vq_supported, ARM_MAX_VQ);
1034
1035
1036 uint64_t gt_cntfrq_hz;
1037};
1038
1039unsigned int gt_cntfrq_period_ns(ARMCPU *cpu);
1040
1041void arm_cpu_post_init(Object *obj);
1042
1043uint64_t arm_cpu_mp_affinity(int idx, uint8_t clustersz);
1044
1045#ifndef CONFIG_USER_ONLY
1046extern const VMStateDescription vmstate_arm_cpu;
1047
1048void arm_cpu_do_interrupt(CPUState *cpu);
1049void arm_v7m_cpu_do_interrupt(CPUState *cpu);
1050#endif
1051
1052hwaddr arm_cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr,
1053 MemTxAttrs *attrs);
1054
1055int arm_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
1056int arm_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
1057
1058
1059
1060
1061
1062int arm_gen_dynamic_sysreg_xml(CPUState *cpu, int base_reg);
1063int arm_gen_dynamic_svereg_xml(CPUState *cpu, int base_reg);
1064
1065
1066
1067
1068
1069const char *arm_gdb_get_dynamic_xml(CPUState *cpu, const char *xmlname);
1070
1071int arm_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
1072 int cpuid, void *opaque);
1073int arm_cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cs,
1074 int cpuid, void *opaque);
1075
1076#ifdef TARGET_AARCH64
1077int aarch64_cpu_gdb_read_register(CPUState *cpu, GByteArray *buf, int reg);
1078int aarch64_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
1079void aarch64_sve_narrow_vq(CPUARMState *env, unsigned vq);
1080void aarch64_sve_change_el(CPUARMState *env, int old_el,
1081 int new_el, bool el0_a64);
1082void aarch64_add_sve_properties(Object *obj);
1083void aarch64_add_pauth_properties(Object *obj);
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094static inline uint64_t *sve_bswap64(uint64_t *dst, uint64_t *src, int nr)
1095{
1096#ifdef HOST_WORDS_BIGENDIAN
1097 int i;
1098
1099 for (i = 0; i < nr; ++i) {
1100 dst[i] = bswap64(src[i]);
1101 }
1102
1103 return dst;
1104#else
1105 return src;
1106#endif
1107}
1108
1109#else
1110static inline void aarch64_sve_narrow_vq(CPUARMState *env, unsigned vq) { }
1111static inline void aarch64_sve_change_el(CPUARMState *env, int o,
1112 int n, bool a)
1113{ }
1114static inline void aarch64_add_sve_properties(Object *obj) { }
1115#endif
1116
1117void aarch64_sync_32_to_64(CPUARMState *env);
1118void aarch64_sync_64_to_32(CPUARMState *env);
1119
1120int fp_exception_el(CPUARMState *env, int cur_el);
1121int sve_exception_el(CPUARMState *env, int cur_el);
1122uint32_t sve_zcr_len_for_el(CPUARMState *env, int el);
1123
1124static inline bool is_a64(CPUARMState *env)
1125{
1126 return env->aarch64;
1127}
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137void pmu_op_start(CPUARMState *env);
1138void pmu_op_finish(CPUARMState *env);
1139
1140
1141
1142
1143void arm_pmu_timer_cb(void *opaque);
1144
1145
1146
1147
1148void pmu_pre_el_change(ARMCPU *cpu, void *ignored);
1149void pmu_post_el_change(ARMCPU *cpu, void *ignored);
1150
1151
1152
1153
1154
1155
1156
1157
1158void pmu_init(ARMCPU *cpu);
1159
1160
1161
1162
1163
1164
1165
1166#define SCTLR_M (1U << 0)
1167#define SCTLR_A (1U << 1)
1168#define SCTLR_C (1U << 2)
1169#define SCTLR_W (1U << 3)
1170#define SCTLR_nTLSMD_32 (1U << 3)
1171#define SCTLR_SA (1U << 3)
1172#define SCTLR_P (1U << 4)
1173#define SCTLR_LSMAOE_32 (1U << 4)
1174#define SCTLR_SA0 (1U << 4)
1175#define SCTLR_D (1U << 5)
1176#define SCTLR_CP15BEN (1U << 5)
1177#define SCTLR_L (1U << 6)
1178#define SCTLR_nAA (1U << 6)
1179#define SCTLR_B (1U << 7)
1180#define SCTLR_ITD (1U << 7)
1181#define SCTLR_S (1U << 8)
1182#define SCTLR_SED (1U << 8)
1183#define SCTLR_R (1U << 9)
1184#define SCTLR_UMA (1U << 9)
1185#define SCTLR_F (1U << 10)
1186#define SCTLR_SW (1U << 10)
1187#define SCTLR_EnRCTX (1U << 10)
1188#define SCTLR_Z (1U << 11)
1189#define SCTLR_EOS (1U << 11)
1190#define SCTLR_I (1U << 12)
1191#define SCTLR_V (1U << 13)
1192#define SCTLR_EnDB (1U << 13)
1193#define SCTLR_RR (1U << 14)
1194#define SCTLR_DZE (1U << 14)
1195#define SCTLR_L4 (1U << 15)
1196#define SCTLR_UCT (1U << 15)
1197#define SCTLR_DT (1U << 16)
1198#define SCTLR_nTWI (1U << 16)
1199#define SCTLR_HA (1U << 17)
1200#define SCTLR_BR (1U << 17)
1201#define SCTLR_IT (1U << 18)
1202#define SCTLR_nTWE (1U << 18)
1203#define SCTLR_WXN (1U << 19)
1204#define SCTLR_ST (1U << 20)
1205#define SCTLR_UWXN (1U << 20)
1206#define SCTLR_FI (1U << 21)
1207#define SCTLR_IESB (1U << 21)
1208#define SCTLR_U (1U << 22)
1209#define SCTLR_EIS (1U << 22)
1210#define SCTLR_XP (1U << 23)
1211#define SCTLR_SPAN (1U << 23)
1212#define SCTLR_VE (1U << 24)
1213#define SCTLR_E0E (1U << 24)
1214#define SCTLR_EE (1U << 25)
1215#define SCTLR_L2 (1U << 26)
1216#define SCTLR_UCI (1U << 26)
1217#define SCTLR_NMFI (1U << 27)
1218#define SCTLR_EnDA (1U << 27)
1219#define SCTLR_TRE (1U << 28)
1220#define SCTLR_nTLSMD_64 (1U << 28)
1221#define SCTLR_AFE (1U << 29)
1222#define SCTLR_LSMAOE_64 (1U << 29)
1223#define SCTLR_TE (1U << 30)
1224#define SCTLR_EnIB (1U << 30)
1225#define SCTLR_EnIA (1U << 31)
1226#define SCTLR_DSSBS_32 (1U << 31)
1227#define SCTLR_BT0 (1ULL << 35)
1228#define SCTLR_BT1 (1ULL << 36)
1229#define SCTLR_ITFSB (1ULL << 37)
1230#define SCTLR_TCF0 (3ULL << 38)
1231#define SCTLR_TCF (3ULL << 40)
1232#define SCTLR_ATA0 (1ULL << 42)
1233#define SCTLR_ATA (1ULL << 43)
1234#define SCTLR_DSSBS_64 (1ULL << 44)
1235
1236#define CPTR_TCPAC (1U << 31)
1237#define CPTR_TTA (1U << 20)
1238#define CPTR_TFP (1U << 10)
1239#define CPTR_TZ (1U << 8)
1240#define CPTR_EZ (1U << 8)
1241
1242#define MDCR_EPMAD (1U << 21)
1243#define MDCR_EDAD (1U << 20)
1244#define MDCR_SPME (1U << 17)
1245#define MDCR_HPMD (1U << 17)
1246#define MDCR_SDD (1U << 16)
1247#define MDCR_SPD (3U << 14)
1248#define MDCR_TDRA (1U << 11)
1249#define MDCR_TDOSA (1U << 10)
1250#define MDCR_TDA (1U << 9)
1251#define MDCR_TDE (1U << 8)
1252#define MDCR_HPME (1U << 7)
1253#define MDCR_TPM (1U << 6)
1254#define MDCR_TPMCR (1U << 5)
1255#define MDCR_HPMN (0x1fU)
1256
1257
1258#define SDCR_VALID_MASK (MDCR_EPMAD | MDCR_EDAD | MDCR_SPME | MDCR_SPD)
1259
1260#define CPSR_M (0x1fU)
1261#define CPSR_T (1U << 5)
1262#define CPSR_F (1U << 6)
1263#define CPSR_I (1U << 7)
1264#define CPSR_A (1U << 8)
1265#define CPSR_E (1U << 9)
1266#define CPSR_IT_2_7 (0xfc00U)
1267#define CPSR_GE (0xfU << 16)
1268#define CPSR_IL (1U << 20)
1269#define CPSR_DIT (1U << 21)
1270#define CPSR_PAN (1U << 22)
1271#define CPSR_SSBS (1U << 23)
1272#define CPSR_J (1U << 24)
1273#define CPSR_IT_0_1 (3U << 25)
1274#define CPSR_Q (1U << 27)
1275#define CPSR_V (1U << 28)
1276#define CPSR_C (1U << 29)
1277#define CPSR_Z (1U << 30)
1278#define CPSR_N (1U << 31)
1279#define CPSR_NZCV (CPSR_N | CPSR_Z | CPSR_C | CPSR_V)
1280#define CPSR_AIF (CPSR_A | CPSR_I | CPSR_F)
1281
1282#define CPSR_IT (CPSR_IT_0_1 | CPSR_IT_2_7)
1283#define CACHED_CPSR_BITS (CPSR_T | CPSR_AIF | CPSR_GE | CPSR_IT | CPSR_Q \
1284 | CPSR_NZCV)
1285
1286#define CPSR_USER (CPSR_NZCV | CPSR_Q | CPSR_GE | CPSR_E)
1287
1288#define CPSR_EXEC (CPSR_T | CPSR_IT | CPSR_J | CPSR_IL)
1289
1290
1291#define XPSR_EXCP 0x1ffU
1292#define XPSR_SPREALIGN (1U << 9)
1293#define XPSR_IT_2_7 CPSR_IT_2_7
1294#define XPSR_GE CPSR_GE
1295#define XPSR_SFPA (1U << 20)
1296#define XPSR_T (1U << 24)
1297#define XPSR_IT_0_1 CPSR_IT_0_1
1298#define XPSR_Q CPSR_Q
1299#define XPSR_V CPSR_V
1300#define XPSR_C CPSR_C
1301#define XPSR_Z CPSR_Z
1302#define XPSR_N CPSR_N
1303#define XPSR_NZCV CPSR_NZCV
1304#define XPSR_IT CPSR_IT
1305
1306#define TTBCR_N (7U << 0)
1307#define TTBCR_T0SZ (7U << 0)
1308#define TTBCR_PD0 (1U << 4)
1309#define TTBCR_PD1 (1U << 5)
1310#define TTBCR_EPD0 (1U << 7)
1311#define TTBCR_IRGN0 (3U << 8)
1312#define TTBCR_ORGN0 (3U << 10)
1313#define TTBCR_SH0 (3U << 12)
1314#define TTBCR_T1SZ (3U << 16)
1315#define TTBCR_A1 (1U << 22)
1316#define TTBCR_EPD1 (1U << 23)
1317#define TTBCR_IRGN1 (3U << 24)
1318#define TTBCR_ORGN1 (3U << 26)
1319#define TTBCR_SH1 (1U << 28)
1320#define TTBCR_EAE (1U << 31)
1321
1322
1323
1324
1325
1326#define PSTATE_SP (1U)
1327#define PSTATE_M (0xFU)
1328#define PSTATE_nRW (1U << 4)
1329#define PSTATE_F (1U << 6)
1330#define PSTATE_I (1U << 7)
1331#define PSTATE_A (1U << 8)
1332#define PSTATE_D (1U << 9)
1333#define PSTATE_BTYPE (3U << 10)
1334#define PSTATE_SSBS (1U << 12)
1335#define PSTATE_IL (1U << 20)
1336#define PSTATE_SS (1U << 21)
1337#define PSTATE_PAN (1U << 22)
1338#define PSTATE_UAO (1U << 23)
1339#define PSTATE_DIT (1U << 24)
1340#define PSTATE_TCO (1U << 25)
1341#define PSTATE_V (1U << 28)
1342#define PSTATE_C (1U << 29)
1343#define PSTATE_Z (1U << 30)
1344#define PSTATE_N (1U << 31)
1345#define PSTATE_NZCV (PSTATE_N | PSTATE_Z | PSTATE_C | PSTATE_V)
1346#define PSTATE_DAIF (PSTATE_D | PSTATE_A | PSTATE_I | PSTATE_F)
1347#define CACHED_PSTATE_BITS (PSTATE_NZCV | PSTATE_DAIF | PSTATE_BTYPE)
1348
1349#define PSTATE_MODE_EL3h 13
1350#define PSTATE_MODE_EL3t 12
1351#define PSTATE_MODE_EL2h 9
1352#define PSTATE_MODE_EL2t 8
1353#define PSTATE_MODE_EL1h 5
1354#define PSTATE_MODE_EL1t 4
1355#define PSTATE_MODE_EL0t 0
1356
1357
1358
1359
1360void write_v7m_exception(CPUARMState *env, uint32_t new_exc);
1361
1362
1363static inline unsigned int aarch64_pstate_mode(unsigned int el, bool handler)
1364{
1365 return (el << 2) | handler;
1366}
1367
1368
1369
1370
1371
1372static inline uint32_t pstate_read(CPUARMState *env)
1373{
1374 int ZF;
1375
1376 ZF = (env->ZF == 0);
1377 return (env->NF & 0x80000000) | (ZF << 30)
1378 | (env->CF << 29) | ((env->VF & 0x80000000) >> 3)
1379 | env->pstate | env->daif | (env->btype << 10);
1380}
1381
1382static inline void pstate_write(CPUARMState *env, uint32_t val)
1383{
1384 env->ZF = (~val) & PSTATE_Z;
1385 env->NF = val;
1386 env->CF = (val >> 29) & 1;
1387 env->VF = (val << 3) & 0x80000000;
1388 env->daif = val & PSTATE_DAIF;
1389 env->btype = (val >> 10) & 3;
1390 env->pstate = val & ~CACHED_PSTATE_BITS;
1391}
1392
1393
1394uint32_t cpsr_read(CPUARMState *env);
1395
1396typedef enum CPSRWriteType {
1397 CPSRWriteByInstr = 0,
1398 CPSRWriteExceptionReturn = 1,
1399 CPSRWriteRaw = 2,
1400
1401 CPSRWriteByGDBStub = 3,
1402} CPSRWriteType;
1403
1404
1405
1406
1407
1408
1409
1410void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask,
1411 CPSRWriteType write_type);
1412
1413
1414static inline uint32_t xpsr_read(CPUARMState *env)
1415{
1416 int ZF;
1417 ZF = (env->ZF == 0);
1418 return (env->NF & 0x80000000) | (ZF << 30)
1419 | (env->CF << 29) | ((env->VF & 0x80000000) >> 3) | (env->QF << 27)
1420 | (env->thumb << 24) | ((env->condexec_bits & 3) << 25)
1421 | ((env->condexec_bits & 0xfc) << 8)
1422 | (env->GE << 16)
1423 | env->v7m.exception;
1424}
1425
1426
1427static inline void xpsr_write(CPUARMState *env, uint32_t val, uint32_t mask)
1428{
1429 if (mask & XPSR_NZCV) {
1430 env->ZF = (~val) & XPSR_Z;
1431 env->NF = val;
1432 env->CF = (val >> 29) & 1;
1433 env->VF = (val << 3) & 0x80000000;
1434 }
1435 if (mask & XPSR_Q) {
1436 env->QF = ((val & XPSR_Q) != 0);
1437 }
1438 if (mask & XPSR_GE) {
1439 env->GE = (val & XPSR_GE) >> 16;
1440 }
1441#ifndef CONFIG_USER_ONLY
1442 if (mask & XPSR_T) {
1443 env->thumb = ((val & XPSR_T) != 0);
1444 }
1445 if (mask & XPSR_IT_0_1) {
1446 env->condexec_bits &= ~3;
1447 env->condexec_bits |= (val >> 25) & 3;
1448 }
1449 if (mask & XPSR_IT_2_7) {
1450 env->condexec_bits &= 3;
1451 env->condexec_bits |= (val >> 8) & 0xfc;
1452 }
1453 if (mask & XPSR_EXCP) {
1454
1455 write_v7m_exception(env, val & XPSR_EXCP);
1456 }
1457#endif
1458}
1459
1460#define HCR_VM (1ULL << 0)
1461#define HCR_SWIO (1ULL << 1)
1462#define HCR_PTW (1ULL << 2)
1463#define HCR_FMO (1ULL << 3)
1464#define HCR_IMO (1ULL << 4)
1465#define HCR_AMO (1ULL << 5)
1466#define HCR_VF (1ULL << 6)
1467#define HCR_VI (1ULL << 7)
1468#define HCR_VSE (1ULL << 8)
1469#define HCR_FB (1ULL << 9)
1470#define HCR_BSU_MASK (3ULL << 10)
1471#define HCR_DC (1ULL << 12)
1472#define HCR_TWI (1ULL << 13)
1473#define HCR_TWE (1ULL << 14)
1474#define HCR_TID0 (1ULL << 15)
1475#define HCR_TID1 (1ULL << 16)
1476#define HCR_TID2 (1ULL << 17)
1477#define HCR_TID3 (1ULL << 18)
1478#define HCR_TSC (1ULL << 19)
1479#define HCR_TIDCP (1ULL << 20)
1480#define HCR_TACR (1ULL << 21)
1481#define HCR_TSW (1ULL << 22)
1482#define HCR_TPCP (1ULL << 23)
1483#define HCR_TPU (1ULL << 24)
1484#define HCR_TTLB (1ULL << 25)
1485#define HCR_TVM (1ULL << 26)
1486#define HCR_TGE (1ULL << 27)
1487#define HCR_TDZ (1ULL << 28)
1488#define HCR_HCD (1ULL << 29)
1489#define HCR_TRVM (1ULL << 30)
1490#define HCR_RW (1ULL << 31)
1491#define HCR_CD (1ULL << 32)
1492#define HCR_ID (1ULL << 33)
1493#define HCR_E2H (1ULL << 34)
1494#define HCR_TLOR (1ULL << 35)
1495#define HCR_TERR (1ULL << 36)
1496#define HCR_TEA (1ULL << 37)
1497#define HCR_MIOCNCE (1ULL << 38)
1498
1499#define HCR_APK (1ULL << 40)
1500#define HCR_API (1ULL << 41)
1501#define HCR_NV (1ULL << 42)
1502#define HCR_NV1 (1ULL << 43)
1503#define HCR_AT (1ULL << 44)
1504#define HCR_NV2 (1ULL << 45)
1505#define HCR_FWB (1ULL << 46)
1506#define HCR_FIEN (1ULL << 47)
1507
1508#define HCR_TID4 (1ULL << 49)
1509#define HCR_TICAB (1ULL << 50)
1510#define HCR_AMVOFFEN (1ULL << 51)
1511#define HCR_TOCU (1ULL << 52)
1512#define HCR_ENSCXT (1ULL << 53)
1513#define HCR_TTLBIS (1ULL << 54)
1514#define HCR_TTLBOS (1ULL << 55)
1515#define HCR_ATA (1ULL << 56)
1516#define HCR_DCT (1ULL << 57)
1517#define HCR_TID5 (1ULL << 58)
1518#define HCR_TWEDEN (1ULL << 59)
1519#define HCR_TWEDEL MAKE_64BIT_MASK(60, 4)
1520
1521#define HPFAR_NS (1ULL << 63)
1522
1523#define SCR_NS (1U << 0)
1524#define SCR_IRQ (1U << 1)
1525#define SCR_FIQ (1U << 2)
1526#define SCR_EA (1U << 3)
1527#define SCR_FW (1U << 4)
1528#define SCR_AW (1U << 5)
1529#define SCR_NET (1U << 6)
1530#define SCR_SMD (1U << 7)
1531#define SCR_HCE (1U << 8)
1532#define SCR_SIF (1U << 9)
1533#define SCR_RW (1U << 10)
1534#define SCR_ST (1U << 11)
1535#define SCR_TWI (1U << 12)
1536#define SCR_TWE (1U << 13)
1537#define SCR_TLOR (1U << 14)
1538#define SCR_TERR (1U << 15)
1539#define SCR_APK (1U << 16)
1540#define SCR_API (1U << 17)
1541#define SCR_EEL2 (1U << 18)
1542#define SCR_EASE (1U << 19)
1543#define SCR_NMEA (1U << 20)
1544#define SCR_FIEN (1U << 21)
1545#define SCR_ENSCXT (1U << 25)
1546#define SCR_ATA (1U << 26)
1547
1548#define HSTR_TTEE (1 << 16)
1549#define HSTR_TJDBX (1 << 17)
1550
1551
1552uint32_t vfp_get_fpscr(CPUARMState *env);
1553void vfp_set_fpscr(CPUARMState *env, uint32_t val);
1554
1555
1556
1557
1558
1559
1560
1561
1562#define FPSR_MASK 0xf800009f
1563#define FPCR_MASK 0x07ff9f00
1564
1565#define FPCR_IOE (1 << 8)
1566#define FPCR_DZE (1 << 9)
1567#define FPCR_OFE (1 << 10)
1568#define FPCR_UFE (1 << 11)
1569#define FPCR_IXE (1 << 12)
1570#define FPCR_IDE (1 << 15)
1571#define FPCR_FZ16 (1 << 19)
1572#define FPCR_RMODE_MASK (3 << 22)
1573#define FPCR_FZ (1 << 24)
1574#define FPCR_DN (1 << 25)
1575#define FPCR_AHP (1 << 26)
1576#define FPCR_QC (1 << 27)
1577#define FPCR_V (1 << 28)
1578#define FPCR_C (1 << 29)
1579#define FPCR_Z (1 << 30)
1580#define FPCR_N (1 << 31)
1581
1582#define FPCR_LTPSIZE_SHIFT 16
1583#define FPCR_LTPSIZE_MASK (7 << FPCR_LTPSIZE_SHIFT)
1584#define FPCR_LTPSIZE_LENGTH 3
1585
1586#define FPCR_NZCV_MASK (FPCR_N | FPCR_Z | FPCR_C | FPCR_V)
1587#define FPCR_NZCVQC_MASK (FPCR_NZCV_MASK | FPCR_QC)
1588
1589static inline uint32_t vfp_get_fpsr(CPUARMState *env)
1590{
1591 return vfp_get_fpscr(env) & FPSR_MASK;
1592}
1593
1594static inline void vfp_set_fpsr(CPUARMState *env, uint32_t val)
1595{
1596 uint32_t new_fpscr = (vfp_get_fpscr(env) & ~FPSR_MASK) | (val & FPSR_MASK);
1597 vfp_set_fpscr(env, new_fpscr);
1598}
1599
1600static inline uint32_t vfp_get_fpcr(CPUARMState *env)
1601{
1602 return vfp_get_fpscr(env) & FPCR_MASK;
1603}
1604
1605static inline void vfp_set_fpcr(CPUARMState *env, uint32_t val)
1606{
1607 uint32_t new_fpscr = (vfp_get_fpscr(env) & ~FPCR_MASK) | (val & FPCR_MASK);
1608 vfp_set_fpscr(env, new_fpscr);
1609}
1610
1611enum arm_cpu_mode {
1612 ARM_CPU_MODE_USR = 0x10,
1613 ARM_CPU_MODE_FIQ = 0x11,
1614 ARM_CPU_MODE_IRQ = 0x12,
1615 ARM_CPU_MODE_SVC = 0x13,
1616 ARM_CPU_MODE_MON = 0x16,
1617 ARM_CPU_MODE_ABT = 0x17,
1618 ARM_CPU_MODE_HYP = 0x1a,
1619 ARM_CPU_MODE_UND = 0x1b,
1620 ARM_CPU_MODE_SYS = 0x1f
1621};
1622
1623
1624#define ARM_VFP_FPSID 0
1625#define ARM_VFP_FPSCR 1
1626#define ARM_VFP_MVFR2 5
1627#define ARM_VFP_MVFR1 6
1628#define ARM_VFP_MVFR0 7
1629#define ARM_VFP_FPEXC 8
1630#define ARM_VFP_FPINST 9
1631#define ARM_VFP_FPINST2 10
1632
1633#define ARM_VFP_FPSCR_NZCVQC 2
1634#define ARM_VFP_VPR 12
1635#define ARM_VFP_P0 13
1636#define ARM_VFP_FPCXT_NS 14
1637#define ARM_VFP_FPCXT_S 15
1638
1639
1640#define QEMU_VFP_FPSCR_NZCV 0xffff
1641
1642
1643#define ARM_IWMMXT_wCID 0
1644#define ARM_IWMMXT_wCon 1
1645#define ARM_IWMMXT_wCSSF 2
1646#define ARM_IWMMXT_wCASF 3
1647#define ARM_IWMMXT_wCGR0 8
1648#define ARM_IWMMXT_wCGR1 9
1649#define ARM_IWMMXT_wCGR2 10
1650#define ARM_IWMMXT_wCGR3 11
1651
1652
1653FIELD(V7M_CCR, NONBASETHRDENA, 0, 1)
1654FIELD(V7M_CCR, USERSETMPEND, 1, 1)
1655FIELD(V7M_CCR, UNALIGN_TRP, 3, 1)
1656FIELD(V7M_CCR, DIV_0_TRP, 4, 1)
1657FIELD(V7M_CCR, BFHFNMIGN, 8, 1)
1658FIELD(V7M_CCR, STKALIGN, 9, 1)
1659FIELD(V7M_CCR, STKOFHFNMIGN, 10, 1)
1660FIELD(V7M_CCR, DC, 16, 1)
1661FIELD(V7M_CCR, IC, 17, 1)
1662FIELD(V7M_CCR, BP, 18, 1)
1663FIELD(V7M_CCR, LOB, 19, 1)
1664FIELD(V7M_CCR, TRD, 20, 1)
1665
1666
1667FIELD(V7M_SCR, SLEEPONEXIT, 1, 1)
1668FIELD(V7M_SCR, SLEEPDEEP, 2, 1)
1669FIELD(V7M_SCR, SLEEPDEEPS, 3, 1)
1670FIELD(V7M_SCR, SEVONPEND, 4, 1)
1671
1672
1673FIELD(V7M_AIRCR, VECTRESET, 0, 1)
1674FIELD(V7M_AIRCR, VECTCLRACTIVE, 1, 1)
1675FIELD(V7M_AIRCR, SYSRESETREQ, 2, 1)
1676FIELD(V7M_AIRCR, SYSRESETREQS, 3, 1)
1677FIELD(V7M_AIRCR, PRIGROUP, 8, 3)
1678FIELD(V7M_AIRCR, BFHFNMINS, 13, 1)
1679FIELD(V7M_AIRCR, PRIS, 14, 1)
1680FIELD(V7M_AIRCR, ENDIANNESS, 15, 1)
1681FIELD(V7M_AIRCR, VECTKEY, 16, 16)
1682
1683
1684FIELD(V7M_CFSR, IACCVIOL, 0, 1)
1685FIELD(V7M_CFSR, DACCVIOL, 1, 1)
1686FIELD(V7M_CFSR, MUNSTKERR, 3, 1)
1687FIELD(V7M_CFSR, MSTKERR, 4, 1)
1688FIELD(V7M_CFSR, MLSPERR, 5, 1)
1689FIELD(V7M_CFSR, MMARVALID, 7, 1)
1690
1691
1692FIELD(V7M_CFSR, IBUSERR, 8 + 0, 1)
1693FIELD(V7M_CFSR, PRECISERR, 8 + 1, 1)
1694FIELD(V7M_CFSR, IMPRECISERR, 8 + 2, 1)
1695FIELD(V7M_CFSR, UNSTKERR, 8 + 3, 1)
1696FIELD(V7M_CFSR, STKERR, 8 + 4, 1)
1697FIELD(V7M_CFSR, LSPERR, 8 + 5, 1)
1698FIELD(V7M_CFSR, BFARVALID, 8 + 7, 1)
1699
1700
1701FIELD(V7M_CFSR, UNDEFINSTR, 16 + 0, 1)
1702FIELD(V7M_CFSR, INVSTATE, 16 + 1, 1)
1703FIELD(V7M_CFSR, INVPC, 16 + 2, 1)
1704FIELD(V7M_CFSR, NOCP, 16 + 3, 1)
1705FIELD(V7M_CFSR, STKOF, 16 + 4, 1)
1706FIELD(V7M_CFSR, UNALIGNED, 16 + 8, 1)
1707FIELD(V7M_CFSR, DIVBYZERO, 16 + 9, 1)
1708
1709
1710FIELD(V7M_CFSR, MMFSR, 0, 8)
1711FIELD(V7M_CFSR, BFSR, 8, 8)
1712FIELD(V7M_CFSR, UFSR, 16, 16)
1713
1714
1715FIELD(V7M_HFSR, VECTTBL, 1, 1)
1716FIELD(V7M_HFSR, FORCED, 30, 1)
1717FIELD(V7M_HFSR, DEBUGEVT, 31, 1)
1718
1719
1720FIELD(V7M_DFSR, HALTED, 0, 1)
1721FIELD(V7M_DFSR, BKPT, 1, 1)
1722FIELD(V7M_DFSR, DWTTRAP, 2, 1)
1723FIELD(V7M_DFSR, VCATCH, 3, 1)
1724FIELD(V7M_DFSR, EXTERNAL, 4, 1)
1725
1726
1727FIELD(V7M_SFSR, INVEP, 0, 1)
1728FIELD(V7M_SFSR, INVIS, 1, 1)
1729FIELD(V7M_SFSR, INVER, 2, 1)
1730FIELD(V7M_SFSR, AUVIOL, 3, 1)
1731FIELD(V7M_SFSR, INVTRAN, 4, 1)
1732FIELD(V7M_SFSR, LSPERR, 5, 1)
1733FIELD(V7M_SFSR, SFARVALID, 6, 1)
1734FIELD(V7M_SFSR, LSERR, 7, 1)
1735
1736
1737FIELD(V7M_MPU_CTRL, ENABLE, 0, 1)
1738FIELD(V7M_MPU_CTRL, HFNMIENA, 1, 1)
1739FIELD(V7M_MPU_CTRL, PRIVDEFENA, 2, 1)
1740
1741
1742FIELD(V7M_CLIDR, CTYPE_ALL, 0, 21)
1743FIELD(V7M_CLIDR, LOUIS, 21, 3)
1744FIELD(V7M_CLIDR, LOC, 24, 3)
1745FIELD(V7M_CLIDR, LOUU, 27, 3)
1746FIELD(V7M_CLIDR, ICB, 30, 2)
1747
1748FIELD(V7M_CSSELR, IND, 0, 1)
1749FIELD(V7M_CSSELR, LEVEL, 1, 3)
1750
1751
1752
1753
1754FIELD(V7M_CSSELR, INDEX, 0, 4)
1755
1756
1757FIELD(V7M_FPCCR, LSPACT, 0, 1)
1758FIELD(V7M_FPCCR, USER, 1, 1)
1759FIELD(V7M_FPCCR, S, 2, 1)
1760FIELD(V7M_FPCCR, THREAD, 3, 1)
1761FIELD(V7M_FPCCR, HFRDY, 4, 1)
1762FIELD(V7M_FPCCR, MMRDY, 5, 1)
1763FIELD(V7M_FPCCR, BFRDY, 6, 1)
1764FIELD(V7M_FPCCR, SFRDY, 7, 1)
1765FIELD(V7M_FPCCR, MONRDY, 8, 1)
1766FIELD(V7M_FPCCR, SPLIMVIOL, 9, 1)
1767FIELD(V7M_FPCCR, UFRDY, 10, 1)
1768FIELD(V7M_FPCCR, RES0, 11, 15)
1769FIELD(V7M_FPCCR, TS, 26, 1)
1770FIELD(V7M_FPCCR, CLRONRETS, 27, 1)
1771FIELD(V7M_FPCCR, CLRONRET, 28, 1)
1772FIELD(V7M_FPCCR, LSPENS, 29, 1)
1773FIELD(V7M_FPCCR, LSPEN, 30, 1)
1774FIELD(V7M_FPCCR, ASPEN, 31, 1)
1775
1776#define R_V7M_FPCCR_BANKED_MASK \
1777 (R_V7M_FPCCR_LSPACT_MASK | \
1778 R_V7M_FPCCR_USER_MASK | \
1779 R_V7M_FPCCR_THREAD_MASK | \
1780 R_V7M_FPCCR_MMRDY_MASK | \
1781 R_V7M_FPCCR_SPLIMVIOL_MASK | \
1782 R_V7M_FPCCR_UFRDY_MASK | \
1783 R_V7M_FPCCR_ASPEN_MASK)
1784
1785
1786FIELD(V7M_VPR, P0, 0, 16)
1787FIELD(V7M_VPR, MASK01, 16, 4)
1788FIELD(V7M_VPR, MASK23, 20, 4)
1789
1790
1791
1792
1793FIELD(CLIDR_EL1, CTYPE1, 0, 3)
1794FIELD(CLIDR_EL1, CTYPE2, 3, 3)
1795FIELD(CLIDR_EL1, CTYPE3, 6, 3)
1796FIELD(CLIDR_EL1, CTYPE4, 9, 3)
1797FIELD(CLIDR_EL1, CTYPE5, 12, 3)
1798FIELD(CLIDR_EL1, CTYPE6, 15, 3)
1799FIELD(CLIDR_EL1, CTYPE7, 18, 3)
1800FIELD(CLIDR_EL1, LOUIS, 21, 3)
1801FIELD(CLIDR_EL1, LOC, 24, 3)
1802FIELD(CLIDR_EL1, LOUU, 27, 3)
1803FIELD(CLIDR_EL1, ICB, 30, 3)
1804
1805
1806FIELD(CCSIDR_EL1, CCIDX_LINESIZE, 0, 3)
1807FIELD(CCSIDR_EL1, CCIDX_ASSOCIATIVITY, 3, 21)
1808FIELD(CCSIDR_EL1, CCIDX_NUMSETS, 32, 24)
1809
1810
1811FIELD(CCSIDR_EL1, LINESIZE, 0, 3)
1812FIELD(CCSIDR_EL1, ASSOCIATIVITY, 3, 10)
1813FIELD(CCSIDR_EL1, NUMSETS, 13, 15)
1814
1815FIELD(CTR_EL0, IMINLINE, 0, 4)
1816FIELD(CTR_EL0, L1IP, 14, 2)
1817FIELD(CTR_EL0, DMINLINE, 16, 4)
1818FIELD(CTR_EL0, ERG, 20, 4)
1819FIELD(CTR_EL0, CWG, 24, 4)
1820FIELD(CTR_EL0, IDC, 28, 1)
1821FIELD(CTR_EL0, DIC, 29, 1)
1822FIELD(CTR_EL0, TMINLINE, 32, 6)
1823
1824FIELD(MIDR_EL1, REVISION, 0, 4)
1825FIELD(MIDR_EL1, PARTNUM, 4, 12)
1826FIELD(MIDR_EL1, ARCHITECTURE, 16, 4)
1827FIELD(MIDR_EL1, VARIANT, 20, 4)
1828FIELD(MIDR_EL1, IMPLEMENTER, 24, 8)
1829
1830FIELD(ID_ISAR0, SWAP, 0, 4)
1831FIELD(ID_ISAR0, BITCOUNT, 4, 4)
1832FIELD(ID_ISAR0, BITFIELD, 8, 4)
1833FIELD(ID_ISAR0, CMPBRANCH, 12, 4)
1834FIELD(ID_ISAR0, COPROC, 16, 4)
1835FIELD(ID_ISAR0, DEBUG, 20, 4)
1836FIELD(ID_ISAR0, DIVIDE, 24, 4)
1837
1838FIELD(ID_ISAR1, ENDIAN, 0, 4)
1839FIELD(ID_ISAR1, EXCEPT, 4, 4)
1840FIELD(ID_ISAR1, EXCEPT_AR, 8, 4)
1841FIELD(ID_ISAR1, EXTEND, 12, 4)
1842FIELD(ID_ISAR1, IFTHEN, 16, 4)
1843FIELD(ID_ISAR1, IMMEDIATE, 20, 4)
1844FIELD(ID_ISAR1, INTERWORK, 24, 4)
1845FIELD(ID_ISAR1, JAZELLE, 28, 4)
1846
1847FIELD(ID_ISAR2, LOADSTORE, 0, 4)
1848FIELD(ID_ISAR2, MEMHINT, 4, 4)
1849FIELD(ID_ISAR2, MULTIACCESSINT, 8, 4)
1850FIELD(ID_ISAR2, MULT, 12, 4)
1851FIELD(ID_ISAR2, MULTS, 16, 4)
1852FIELD(ID_ISAR2, MULTU, 20, 4)
1853FIELD(ID_ISAR2, PSR_AR, 24, 4)
1854FIELD(ID_ISAR2, REVERSAL, 28, 4)
1855
1856FIELD(ID_ISAR3, SATURATE, 0, 4)
1857FIELD(ID_ISAR3, SIMD, 4, 4)
1858FIELD(ID_ISAR3, SVC, 8, 4)
1859FIELD(ID_ISAR3, SYNCHPRIM, 12, 4)
1860FIELD(ID_ISAR3, TABBRANCH, 16, 4)
1861FIELD(ID_ISAR3, T32COPY, 20, 4)
1862FIELD(ID_ISAR3, TRUENOP, 24, 4)
1863FIELD(ID_ISAR3, T32EE, 28, 4)
1864
1865FIELD(ID_ISAR4, UNPRIV, 0, 4)
1866FIELD(ID_ISAR4, WITHSHIFTS, 4, 4)
1867FIELD(ID_ISAR4, WRITEBACK, 8, 4)
1868FIELD(ID_ISAR4, SMC, 12, 4)
1869FIELD(ID_ISAR4, BARRIER, 16, 4)
1870FIELD(ID_ISAR4, SYNCHPRIM_FRAC, 20, 4)
1871FIELD(ID_ISAR4, PSR_M, 24, 4)
1872FIELD(ID_ISAR4, SWP_FRAC, 28, 4)
1873
1874FIELD(ID_ISAR5, SEVL, 0, 4)
1875FIELD(ID_ISAR5, AES, 4, 4)
1876FIELD(ID_ISAR5, SHA1, 8, 4)
1877FIELD(ID_ISAR5, SHA2, 12, 4)
1878FIELD(ID_ISAR5, CRC32, 16, 4)
1879FIELD(ID_ISAR5, RDM, 24, 4)
1880FIELD(ID_ISAR5, VCMA, 28, 4)
1881
1882FIELD(ID_ISAR6, JSCVT, 0, 4)
1883FIELD(ID_ISAR6, DP, 4, 4)
1884FIELD(ID_ISAR6, FHM, 8, 4)
1885FIELD(ID_ISAR6, SB, 12, 4)
1886FIELD(ID_ISAR6, SPECRES, 16, 4)
1887FIELD(ID_ISAR6, BF16, 20, 4)
1888FIELD(ID_ISAR6, I8MM, 24, 4)
1889
1890FIELD(ID_MMFR0, VMSA, 0, 4)
1891FIELD(ID_MMFR0, PMSA, 4, 4)
1892FIELD(ID_MMFR0, OUTERSHR, 8, 4)
1893FIELD(ID_MMFR0, SHARELVL, 12, 4)
1894FIELD(ID_MMFR0, TCM, 16, 4)
1895FIELD(ID_MMFR0, AUXREG, 20, 4)
1896FIELD(ID_MMFR0, FCSE, 24, 4)
1897FIELD(ID_MMFR0, INNERSHR, 28, 4)
1898
1899FIELD(ID_MMFR1, L1HVDVA, 0, 4)
1900FIELD(ID_MMFR1, L1UNIVA, 4, 4)
1901FIELD(ID_MMFR1, L1HVDSW, 8, 4)
1902FIELD(ID_MMFR1, L1UNISW, 12, 4)
1903FIELD(ID_MMFR1, L1HVD, 16, 4)
1904FIELD(ID_MMFR1, L1UNI, 20, 4)
1905FIELD(ID_MMFR1, L1TSTCLN, 24, 4)
1906FIELD(ID_MMFR1, BPRED, 28, 4)
1907
1908FIELD(ID_MMFR2, L1HVDFG, 0, 4)
1909FIELD(ID_MMFR2, L1HVDBG, 4, 4)
1910FIELD(ID_MMFR2, L1HVDRNG, 8, 4)
1911FIELD(ID_MMFR2, HVDTLB, 12, 4)
1912FIELD(ID_MMFR2, UNITLB, 16, 4)
1913FIELD(ID_MMFR2, MEMBARR, 20, 4)
1914FIELD(ID_MMFR2, WFISTALL, 24, 4)
1915FIELD(ID_MMFR2, HWACCFLG, 28, 4)
1916
1917FIELD(ID_MMFR3, CMAINTVA, 0, 4)
1918FIELD(ID_MMFR3, CMAINTSW, 4, 4)
1919FIELD(ID_MMFR3, BPMAINT, 8, 4)
1920FIELD(ID_MMFR3, MAINTBCST, 12, 4)
1921FIELD(ID_MMFR3, PAN, 16, 4)
1922FIELD(ID_MMFR3, COHWALK, 20, 4)
1923FIELD(ID_MMFR3, CMEMSZ, 24, 4)
1924FIELD(ID_MMFR3, SUPERSEC, 28, 4)
1925
1926FIELD(ID_MMFR4, SPECSEI, 0, 4)
1927FIELD(ID_MMFR4, AC2, 4, 4)
1928FIELD(ID_MMFR4, XNX, 8, 4)
1929FIELD(ID_MMFR4, CNP, 12, 4)
1930FIELD(ID_MMFR4, HPDS, 16, 4)
1931FIELD(ID_MMFR4, LSM, 20, 4)
1932FIELD(ID_MMFR4, CCIDX, 24, 4)
1933FIELD(ID_MMFR4, EVT, 28, 4)
1934
1935FIELD(ID_MMFR5, ETS, 0, 4)
1936
1937FIELD(ID_PFR0, STATE0, 0, 4)
1938FIELD(ID_PFR0, STATE1, 4, 4)
1939FIELD(ID_PFR0, STATE2, 8, 4)
1940FIELD(ID_PFR0, STATE3, 12, 4)
1941FIELD(ID_PFR0, CSV2, 16, 4)
1942FIELD(ID_PFR0, AMU, 20, 4)
1943FIELD(ID_PFR0, DIT, 24, 4)
1944FIELD(ID_PFR0, RAS, 28, 4)
1945
1946FIELD(ID_PFR1, PROGMOD, 0, 4)
1947FIELD(ID_PFR1, SECURITY, 4, 4)
1948FIELD(ID_PFR1, MPROGMOD, 8, 4)
1949FIELD(ID_PFR1, VIRTUALIZATION, 12, 4)
1950FIELD(ID_PFR1, GENTIMER, 16, 4)
1951FIELD(ID_PFR1, SEC_FRAC, 20, 4)
1952FIELD(ID_PFR1, VIRT_FRAC, 24, 4)
1953FIELD(ID_PFR1, GIC, 28, 4)
1954
1955FIELD(ID_PFR2, CSV3, 0, 4)
1956FIELD(ID_PFR2, SSBS, 4, 4)
1957FIELD(ID_PFR2, RAS_FRAC, 8, 4)
1958
1959FIELD(ID_AA64ISAR0, AES, 4, 4)
1960FIELD(ID_AA64ISAR0, SHA1, 8, 4)
1961FIELD(ID_AA64ISAR0, SHA2, 12, 4)
1962FIELD(ID_AA64ISAR0, CRC32, 16, 4)
1963FIELD(ID_AA64ISAR0, ATOMIC, 20, 4)
1964FIELD(ID_AA64ISAR0, RDM, 28, 4)
1965FIELD(ID_AA64ISAR0, SHA3, 32, 4)
1966FIELD(ID_AA64ISAR0, SM3, 36, 4)
1967FIELD(ID_AA64ISAR0, SM4, 40, 4)
1968FIELD(ID_AA64ISAR0, DP, 44, 4)
1969FIELD(ID_AA64ISAR0, FHM, 48, 4)
1970FIELD(ID_AA64ISAR0, TS, 52, 4)
1971FIELD(ID_AA64ISAR0, TLB, 56, 4)
1972FIELD(ID_AA64ISAR0, RNDR, 60, 4)
1973
1974FIELD(ID_AA64ISAR1, DPB, 0, 4)
1975FIELD(ID_AA64ISAR1, APA, 4, 4)
1976FIELD(ID_AA64ISAR1, API, 8, 4)
1977FIELD(ID_AA64ISAR1, JSCVT, 12, 4)
1978FIELD(ID_AA64ISAR1, FCMA, 16, 4)
1979FIELD(ID_AA64ISAR1, LRCPC, 20, 4)
1980FIELD(ID_AA64ISAR1, GPA, 24, 4)
1981FIELD(ID_AA64ISAR1, GPI, 28, 4)
1982FIELD(ID_AA64ISAR1, FRINTTS, 32, 4)
1983FIELD(ID_AA64ISAR1, SB, 36, 4)
1984FIELD(ID_AA64ISAR1, SPECRES, 40, 4)
1985FIELD(ID_AA64ISAR1, BF16, 44, 4)
1986FIELD(ID_AA64ISAR1, DGH, 48, 4)
1987FIELD(ID_AA64ISAR1, I8MM, 52, 4)
1988
1989FIELD(ID_AA64PFR0, EL0, 0, 4)
1990FIELD(ID_AA64PFR0, EL1, 4, 4)
1991FIELD(ID_AA64PFR0, EL2, 8, 4)
1992FIELD(ID_AA64PFR0, EL3, 12, 4)
1993FIELD(ID_AA64PFR0, FP, 16, 4)
1994FIELD(ID_AA64PFR0, ADVSIMD, 20, 4)
1995FIELD(ID_AA64PFR0, GIC, 24, 4)
1996FIELD(ID_AA64PFR0, RAS, 28, 4)
1997FIELD(ID_AA64PFR0, SVE, 32, 4)
1998FIELD(ID_AA64PFR0, SEL2, 36, 4)
1999FIELD(ID_AA64PFR0, MPAM, 40, 4)
2000FIELD(ID_AA64PFR0, AMU, 44, 4)
2001FIELD(ID_AA64PFR0, DIT, 48, 4)
2002FIELD(ID_AA64PFR0, CSV2, 56, 4)
2003FIELD(ID_AA64PFR0, CSV3, 60, 4)
2004
2005FIELD(ID_AA64PFR1, BT, 0, 4)
2006FIELD(ID_AA64PFR1, SSBS, 4, 4)
2007FIELD(ID_AA64PFR1, MTE, 8, 4)
2008FIELD(ID_AA64PFR1, RAS_FRAC, 12, 4)
2009FIELD(ID_AA64PFR1, MPAM_FRAC, 16, 4)
2010
2011FIELD(ID_AA64MMFR0, PARANGE, 0, 4)
2012FIELD(ID_AA64MMFR0, ASIDBITS, 4, 4)
2013FIELD(ID_AA64MMFR0, BIGEND, 8, 4)
2014FIELD(ID_AA64MMFR0, SNSMEM, 12, 4)
2015FIELD(ID_AA64MMFR0, BIGENDEL0, 16, 4)
2016FIELD(ID_AA64MMFR0, TGRAN16, 20, 4)
2017FIELD(ID_AA64MMFR0, TGRAN64, 24, 4)
2018FIELD(ID_AA64MMFR0, TGRAN4, 28, 4)
2019FIELD(ID_AA64MMFR0, TGRAN16_2, 32, 4)
2020FIELD(ID_AA64MMFR0, TGRAN64_2, 36, 4)
2021FIELD(ID_AA64MMFR0, TGRAN4_2, 40, 4)
2022FIELD(ID_AA64MMFR0, EXS, 44, 4)
2023FIELD(ID_AA64MMFR0, FGT, 56, 4)
2024FIELD(ID_AA64MMFR0, ECV, 60, 4)
2025
2026FIELD(ID_AA64MMFR1, HAFDBS, 0, 4)
2027FIELD(ID_AA64MMFR1, VMIDBITS, 4, 4)
2028FIELD(ID_AA64MMFR1, VH, 8, 4)
2029FIELD(ID_AA64MMFR1, HPDS, 12, 4)
2030FIELD(ID_AA64MMFR1, LO, 16, 4)
2031FIELD(ID_AA64MMFR1, PAN, 20, 4)
2032FIELD(ID_AA64MMFR1, SPECSEI, 24, 4)
2033FIELD(ID_AA64MMFR1, XNX, 28, 4)
2034FIELD(ID_AA64MMFR1, TWED, 32, 4)
2035FIELD(ID_AA64MMFR1, ETS, 36, 4)
2036
2037FIELD(ID_AA64MMFR2, CNP, 0, 4)
2038FIELD(ID_AA64MMFR2, UAO, 4, 4)
2039FIELD(ID_AA64MMFR2, LSM, 8, 4)
2040FIELD(ID_AA64MMFR2, IESB, 12, 4)
2041FIELD(ID_AA64MMFR2, VARANGE, 16, 4)
2042FIELD(ID_AA64MMFR2, CCIDX, 20, 4)
2043FIELD(ID_AA64MMFR2, NV, 24, 4)
2044FIELD(ID_AA64MMFR2, ST, 28, 4)
2045FIELD(ID_AA64MMFR2, AT, 32, 4)
2046FIELD(ID_AA64MMFR2, IDS, 36, 4)
2047FIELD(ID_AA64MMFR2, FWB, 40, 4)
2048FIELD(ID_AA64MMFR2, TTL, 48, 4)
2049FIELD(ID_AA64MMFR2, BBM, 52, 4)
2050FIELD(ID_AA64MMFR2, EVT, 56, 4)
2051FIELD(ID_AA64MMFR2, E0PD, 60, 4)
2052
2053FIELD(ID_AA64DFR0, DEBUGVER, 0, 4)
2054FIELD(ID_AA64DFR0, TRACEVER, 4, 4)
2055FIELD(ID_AA64DFR0, PMUVER, 8, 4)
2056FIELD(ID_AA64DFR0, BRPS, 12, 4)
2057FIELD(ID_AA64DFR0, WRPS, 20, 4)
2058FIELD(ID_AA64DFR0, CTX_CMPS, 28, 4)
2059FIELD(ID_AA64DFR0, PMSVER, 32, 4)
2060FIELD(ID_AA64DFR0, DOUBLELOCK, 36, 4)
2061FIELD(ID_AA64DFR0, TRACEFILT, 40, 4)
2062FIELD(ID_AA64DFR0, MTPMU, 48, 4)
2063
2064FIELD(ID_AA64ZFR0, SVEVER, 0, 4)
2065FIELD(ID_AA64ZFR0, AES, 4, 4)
2066FIELD(ID_AA64ZFR0, BITPERM, 16, 4)
2067FIELD(ID_AA64ZFR0, BFLOAT16, 20, 4)
2068FIELD(ID_AA64ZFR0, SHA3, 32, 4)
2069FIELD(ID_AA64ZFR0, SM4, 40, 4)
2070FIELD(ID_AA64ZFR0, I8MM, 44, 4)
2071FIELD(ID_AA64ZFR0, F32MM, 52, 4)
2072FIELD(ID_AA64ZFR0, F64MM, 56, 4)
2073
2074FIELD(ID_DFR0, COPDBG, 0, 4)
2075FIELD(ID_DFR0, COPSDBG, 4, 4)
2076FIELD(ID_DFR0, MMAPDBG, 8, 4)
2077FIELD(ID_DFR0, COPTRC, 12, 4)
2078FIELD(ID_DFR0, MMAPTRC, 16, 4)
2079FIELD(ID_DFR0, MPROFDBG, 20, 4)
2080FIELD(ID_DFR0, PERFMON, 24, 4)
2081FIELD(ID_DFR0, TRACEFILT, 28, 4)
2082
2083FIELD(ID_DFR1, MTPMU, 0, 4)
2084
2085FIELD(DBGDIDR, SE_IMP, 12, 1)
2086FIELD(DBGDIDR, NSUHD_IMP, 14, 1)
2087FIELD(DBGDIDR, VERSION, 16, 4)
2088FIELD(DBGDIDR, CTX_CMPS, 20, 4)
2089FIELD(DBGDIDR, BRPS, 24, 4)
2090FIELD(DBGDIDR, WRPS, 28, 4)
2091
2092FIELD(MVFR0, SIMDREG, 0, 4)
2093FIELD(MVFR0, FPSP, 4, 4)
2094FIELD(MVFR0, FPDP, 8, 4)
2095FIELD(MVFR0, FPTRAP, 12, 4)
2096FIELD(MVFR0, FPDIVIDE, 16, 4)
2097FIELD(MVFR0, FPSQRT, 20, 4)
2098FIELD(MVFR0, FPSHVEC, 24, 4)
2099FIELD(MVFR0, FPROUND, 28, 4)
2100
2101FIELD(MVFR1, FPFTZ, 0, 4)
2102FIELD(MVFR1, FPDNAN, 4, 4)
2103FIELD(MVFR1, SIMDLS, 8, 4)
2104FIELD(MVFR1, SIMDINT, 12, 4)
2105FIELD(MVFR1, SIMDSP, 16, 4)
2106FIELD(MVFR1, SIMDHP, 20, 4)
2107FIELD(MVFR1, MVE, 8, 4)
2108FIELD(MVFR1, FP16, 20, 4)
2109FIELD(MVFR1, FPHP, 24, 4)
2110FIELD(MVFR1, SIMDFMAC, 28, 4)
2111
2112FIELD(MVFR2, SIMDMISC, 0, 4)
2113FIELD(MVFR2, FPMISC, 4, 4)
2114
2115QEMU_BUILD_BUG_ON(ARRAY_SIZE(((ARMCPU *)0)->ccsidr) <= R_V7M_CSSELR_INDEX_MASK);
2116
2117
2118
2119
2120
2121enum arm_features {
2122 ARM_FEATURE_AUXCR,
2123 ARM_FEATURE_XSCALE,
2124 ARM_FEATURE_IWMMXT,
2125 ARM_FEATURE_V6,
2126 ARM_FEATURE_V6K,
2127 ARM_FEATURE_V7,
2128 ARM_FEATURE_THUMB2,
2129 ARM_FEATURE_PMSA,
2130 ARM_FEATURE_NEON,
2131 ARM_FEATURE_M,
2132 ARM_FEATURE_OMAPCP,
2133 ARM_FEATURE_THUMB2EE,
2134 ARM_FEATURE_V7MP,
2135 ARM_FEATURE_V7VE,
2136 ARM_FEATURE_V4T,
2137 ARM_FEATURE_V5,
2138 ARM_FEATURE_STRONGARM,
2139 ARM_FEATURE_VAPA,
2140 ARM_FEATURE_GENERIC_TIMER,
2141 ARM_FEATURE_MVFR,
2142 ARM_FEATURE_DUMMY_C15_REGS,
2143 ARM_FEATURE_CACHE_TEST_CLEAN,
2144 ARM_FEATURE_CACHE_DIRTY_REG,
2145 ARM_FEATURE_CACHE_BLOCK_OPS,
2146 ARM_FEATURE_MPIDR,
2147 ARM_FEATURE_LPAE,
2148 ARM_FEATURE_V8,
2149 ARM_FEATURE_AARCH64,
2150 ARM_FEATURE_CBAR,
2151 ARM_FEATURE_CBAR_RO,
2152 ARM_FEATURE_EL2,
2153 ARM_FEATURE_EL3,
2154 ARM_FEATURE_THUMB_DSP,
2155 ARM_FEATURE_PMU,
2156 ARM_FEATURE_VBAR,
2157 ARM_FEATURE_M_SECURITY,
2158 ARM_FEATURE_M_MAIN,
2159 ARM_FEATURE_V8_1M,
2160};
2161
2162static inline int arm_feature(CPUARMState *env, int feature)
2163{
2164 return (env->features & (1ULL << feature)) != 0;
2165}
2166
2167void arm_cpu_finalize_features(ARMCPU *cpu, Error **errp);
2168
2169#if !defined(CONFIG_USER_ONLY)
2170
2171
2172
2173
2174
2175
2176static inline bool arm_is_secure_below_el3(CPUARMState *env)
2177{
2178 if (arm_feature(env, ARM_FEATURE_EL3)) {
2179 return !(env->cp15.scr_el3 & SCR_NS);
2180 } else {
2181
2182
2183
2184 return false;
2185 }
2186}
2187
2188
2189static inline bool arm_is_el3_or_mon(CPUARMState *env)
2190{
2191 if (arm_feature(env, ARM_FEATURE_EL3)) {
2192 if (is_a64(env) && extract32(env->pstate, 2, 2) == 3) {
2193
2194 return true;
2195 } else if (!is_a64(env) &&
2196 (env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_MON) {
2197
2198 return true;
2199 }
2200 }
2201 return false;
2202}
2203
2204
2205static inline bool arm_is_secure(CPUARMState *env)
2206{
2207 if (arm_is_el3_or_mon(env)) {
2208 return true;
2209 }
2210 return arm_is_secure_below_el3(env);
2211}
2212
2213
2214
2215
2216
2217static inline bool arm_is_el2_enabled(CPUARMState *env)
2218{
2219 if (arm_feature(env, ARM_FEATURE_EL2)) {
2220 if (arm_is_secure_below_el3(env)) {
2221 return (env->cp15.scr_el3 & SCR_EEL2) != 0;
2222 }
2223 return true;
2224 }
2225 return false;
2226}
2227
2228#else
2229static inline bool arm_is_secure_below_el3(CPUARMState *env)
2230{
2231 return false;
2232}
2233
2234static inline bool arm_is_secure(CPUARMState *env)
2235{
2236 return false;
2237}
2238
2239static inline bool arm_is_el2_enabled(CPUARMState *env)
2240{
2241 return false;
2242}
2243#endif
2244
2245
2246
2247
2248
2249
2250
2251uint64_t arm_hcr_el2_eff(CPUARMState *env);
2252
2253
2254static inline bool arm_el_is_aa64(CPUARMState *env, int el)
2255{
2256
2257
2258
2259 assert(el >= 1 && el <= 3);
2260 bool aa64 = arm_feature(env, ARM_FEATURE_AARCH64);
2261
2262
2263
2264
2265
2266 if (el == 3) {
2267 return aa64;
2268 }
2269
2270 if (arm_feature(env, ARM_FEATURE_EL3) &&
2271 ((env->cp15.scr_el3 & SCR_NS) || !(env->cp15.scr_el3 & SCR_EEL2))) {
2272 aa64 = aa64 && (env->cp15.scr_el3 & SCR_RW);
2273 }
2274
2275 if (el == 2) {
2276 return aa64;
2277 }
2278
2279 if (arm_is_el2_enabled(env)) {
2280 aa64 = aa64 && (env->cp15.hcr_el2 & HCR_RW);
2281 }
2282
2283 return aa64;
2284}
2285
2286
2287
2288
2289
2290
2291
2292
2293static inline bool access_secure_reg(CPUARMState *env)
2294{
2295 bool ret = (arm_feature(env, ARM_FEATURE_EL3) &&
2296 !arm_el_is_aa64(env, 3) &&
2297 !(env->cp15.scr_el3 & SCR_NS));
2298
2299 return ret;
2300}
2301
2302
2303#define A32_BANKED_REG_GET(_env, _regname, _secure) \
2304 ((_secure) ? (_env)->cp15._regname##_s : (_env)->cp15._regname##_ns)
2305
2306#define A32_BANKED_REG_SET(_env, _regname, _secure, _val) \
2307 do { \
2308 if (_secure) { \
2309 (_env)->cp15._regname##_s = (_val); \
2310 } else { \
2311 (_env)->cp15._regname##_ns = (_val); \
2312 } \
2313 } while (0)
2314
2315
2316
2317
2318
2319
2320#define A32_BANKED_CURRENT_REG_GET(_env, _regname) \
2321 A32_BANKED_REG_GET((_env), _regname, \
2322 (arm_is_secure(_env) && !arm_el_is_aa64((_env), 3)))
2323
2324#define A32_BANKED_CURRENT_REG_SET(_env, _regname, _val) \
2325 A32_BANKED_REG_SET((_env), _regname, \
2326 (arm_is_secure(_env) && !arm_el_is_aa64((_env), 3)), \
2327 (_val))
2328
2329void arm_cpu_list(void);
2330uint32_t arm_phys_excp_target_el(CPUState *cs, uint32_t excp_idx,
2331 uint32_t cur_el, bool secure);
2332
2333
2334#ifndef CONFIG_USER_ONLY
2335bool armv7m_nvic_can_take_pending_exception(void *opaque);
2336#else
2337static inline bool armv7m_nvic_can_take_pending_exception(void *opaque)
2338{
2339 return true;
2340}
2341#endif
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354void armv7m_nvic_set_pending(void *opaque, int irq, bool secure);
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367void armv7m_nvic_set_pending_derived(void *opaque, int irq, bool secure);
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379void armv7m_nvic_set_pending_lazyfp(void *opaque, int irq, bool secure);
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393void armv7m_nvic_get_pending_irq_info(void *opaque, int *pirq,
2394 bool *ptargets_secure);
2395
2396
2397
2398
2399
2400
2401
2402
2403void armv7m_nvic_acknowledge_irq(void *opaque);
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415int armv7m_nvic_complete_irq(void *opaque, int irq, bool secure);
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429bool armv7m_nvic_get_ready_status(void *opaque, int irq, bool secure);
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439int armv7m_nvic_raw_execution_priority(void *opaque);
2440
2441
2442
2443
2444
2445
2446
2447#ifndef CONFIG_USER_ONLY
2448bool armv7m_nvic_neg_prio_requested(void *opaque, bool secure);
2449#else
2450static inline bool armv7m_nvic_neg_prio_requested(void *opaque, bool secure)
2451{
2452 return false;
2453}
2454#endif
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482#define CP_REG_AA64_SHIFT 28
2483#define CP_REG_AA64_MASK (1 << CP_REG_AA64_SHIFT)
2484
2485
2486
2487
2488
2489#define CP_REG_NS_SHIFT 29
2490#define CP_REG_NS_MASK (1 << CP_REG_NS_SHIFT)
2491
2492#define ENCODE_CP_REG(cp, is64, ns, crn, crm, opc1, opc2) \
2493 ((ns) << CP_REG_NS_SHIFT | ((cp) << 16) | ((is64) << 15) | \
2494 ((crn) << 11) | ((crm) << 7) | ((opc1) << 3) | (opc2))
2495
2496#define ENCODE_AA64_CP_REG(cp, crn, crm, op0, op1, op2) \
2497 (CP_REG_AA64_MASK | \
2498 ((cp) << CP_REG_ARM_COPROC_SHIFT) | \
2499 ((op0) << CP_REG_ARM64_SYSREG_OP0_SHIFT) | \
2500 ((op1) << CP_REG_ARM64_SYSREG_OP1_SHIFT) | \
2501 ((crn) << CP_REG_ARM64_SYSREG_CRN_SHIFT) | \
2502 ((crm) << CP_REG_ARM64_SYSREG_CRM_SHIFT) | \
2503 ((op2) << CP_REG_ARM64_SYSREG_OP2_SHIFT))
2504
2505
2506
2507
2508static inline uint32_t kvm_to_cpreg_id(uint64_t kvmid)
2509{
2510 uint32_t cpregid = kvmid;
2511 if ((kvmid & CP_REG_ARCH_MASK) == CP_REG_ARM64) {
2512 cpregid |= CP_REG_AA64_MASK;
2513 } else {
2514 if ((kvmid & CP_REG_SIZE_MASK) == CP_REG_SIZE_U64) {
2515 cpregid |= (1 << 15);
2516 }
2517
2518
2519
2520
2521 cpregid |= 1 << CP_REG_NS_SHIFT;
2522 }
2523 return cpregid;
2524}
2525
2526
2527
2528
2529static inline uint64_t cpreg_to_kvm_id(uint32_t cpregid)
2530{
2531 uint64_t kvmid;
2532
2533 if (cpregid & CP_REG_AA64_MASK) {
2534 kvmid = cpregid & ~CP_REG_AA64_MASK;
2535 kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM64;
2536 } else {
2537 kvmid = cpregid & ~(1 << 15);
2538 if (cpregid & (1 << 15)) {
2539 kvmid |= CP_REG_SIZE_U64 | CP_REG_ARM;
2540 } else {
2541 kvmid |= CP_REG_SIZE_U32 | CP_REG_ARM;
2542 }
2543 }
2544 return kvmid;
2545}
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575#define ARM_CP_SPECIAL 0x0001
2576#define ARM_CP_CONST 0x0002
2577#define ARM_CP_64BIT 0x0004
2578#define ARM_CP_SUPPRESS_TB_END 0x0008
2579#define ARM_CP_OVERRIDE 0x0010
2580#define ARM_CP_ALIAS 0x0020
2581#define ARM_CP_IO 0x0040
2582#define ARM_CP_NO_RAW 0x0080
2583#define ARM_CP_NOP (ARM_CP_SPECIAL | 0x0100)
2584#define ARM_CP_WFI (ARM_CP_SPECIAL | 0x0200)
2585#define ARM_CP_NZCV (ARM_CP_SPECIAL | 0x0300)
2586#define ARM_CP_CURRENTEL (ARM_CP_SPECIAL | 0x0400)
2587#define ARM_CP_DC_ZVA (ARM_CP_SPECIAL | 0x0500)
2588#define ARM_CP_DC_GVA (ARM_CP_SPECIAL | 0x0600)
2589#define ARM_CP_DC_GZVA (ARM_CP_SPECIAL | 0x0700)
2590#define ARM_LAST_SPECIAL ARM_CP_DC_GZVA
2591#define ARM_CP_FPU 0x1000
2592#define ARM_CP_SVE 0x2000
2593#define ARM_CP_NO_GDB 0x4000
2594#define ARM_CP_RAISES_EXC 0x8000
2595#define ARM_CP_NEWEL 0x10000
2596
2597#define ARM_CP_SENTINEL 0xfffff
2598
2599#define ARM_CP_FLAG_MASK 0x1f0ff
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610enum {
2611 ARM_CP_STATE_AA32 = 0,
2612 ARM_CP_STATE_AA64 = 1,
2613 ARM_CP_STATE_BOTH = 2,
2614};
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626enum {
2627 ARM_CP_SECSTATE_S = (1 << 0),
2628 ARM_CP_SECSTATE_NS = (1 << 1),
2629};
2630
2631
2632
2633
2634
2635static inline bool cptype_valid(int cptype)
2636{
2637 return ((cptype & ~ARM_CP_FLAG_MASK) == 0)
2638 || ((cptype & ARM_CP_SPECIAL) &&
2639 ((cptype & ~ARM_CP_FLAG_MASK) <= ARM_LAST_SPECIAL));
2640}
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659#define PL3_R 0x80
2660#define PL3_W 0x40
2661#define PL2_R (0x20 | PL3_R)
2662#define PL2_W (0x10 | PL3_W)
2663#define PL1_R (0x08 | PL2_R)
2664#define PL1_W (0x04 | PL2_W)
2665#define PL0_R (0x02 | PL1_R)
2666#define PL0_W (0x01 | PL1_W)
2667
2668
2669
2670
2671
2672
2673
2674#ifdef CONFIG_USER_ONLY
2675#define PL0U_R PL0_R
2676#else
2677#define PL0U_R PL1_R
2678#endif
2679
2680#define PL3_RW (PL3_R | PL3_W)
2681#define PL2_RW (PL2_R | PL2_W)
2682#define PL1_RW (PL1_R | PL1_W)
2683#define PL0_RW (PL0_R | PL0_W)
2684
2685
2686static inline int arm_highest_el(CPUARMState *env)
2687{
2688 if (arm_feature(env, ARM_FEATURE_EL3)) {
2689 return 3;
2690 }
2691 if (arm_feature(env, ARM_FEATURE_EL2)) {
2692 return 2;
2693 }
2694 return 1;
2695}
2696
2697
2698static inline bool arm_v7m_is_handler_mode(CPUARMState *env)
2699{
2700 return env->v7m.exception != 0;
2701}
2702
2703
2704
2705
2706static inline int arm_current_el(CPUARMState *env)
2707{
2708 if (arm_feature(env, ARM_FEATURE_M)) {
2709 return arm_v7m_is_handler_mode(env) ||
2710 !(env->v7m.control[env->v7m.secure] & 1);
2711 }
2712
2713 if (is_a64(env)) {
2714 return extract32(env->pstate, 2, 2);
2715 }
2716
2717 switch (env->uncached_cpsr & 0x1f) {
2718 case ARM_CPU_MODE_USR:
2719 return 0;
2720 case ARM_CPU_MODE_HYP:
2721 return 2;
2722 case ARM_CPU_MODE_MON:
2723 return 3;
2724 default:
2725 if (arm_is_secure(env) && !arm_el_is_aa64(env, 3)) {
2726
2727
2728
2729 return 3;
2730 }
2731
2732 return 1;
2733 }
2734}
2735
2736typedef struct ARMCPRegInfo ARMCPRegInfo;
2737
2738typedef enum CPAccessResult {
2739
2740 CP_ACCESS_OK = 0,
2741
2742
2743
2744
2745
2746
2747 CP_ACCESS_TRAP = 1,
2748
2749
2750
2751
2752 CP_ACCESS_TRAP_UNCATEGORIZED = 2,
2753
2754 CP_ACCESS_TRAP_EL2 = 3,
2755 CP_ACCESS_TRAP_EL3 = 4,
2756
2757 CP_ACCESS_TRAP_UNCATEGORIZED_EL2 = 5,
2758 CP_ACCESS_TRAP_UNCATEGORIZED_EL3 = 6,
2759
2760
2761
2762 CP_ACCESS_TRAP_FP_EL2 = 7,
2763 CP_ACCESS_TRAP_FP_EL3 = 8,
2764} CPAccessResult;
2765
2766
2767
2768
2769typedef uint64_t CPReadFn(CPUARMState *env, const ARMCPRegInfo *opaque);
2770typedef void CPWriteFn(CPUARMState *env, const ARMCPRegInfo *opaque,
2771 uint64_t value);
2772
2773typedef CPAccessResult CPAccessFn(CPUARMState *env,
2774 const ARMCPRegInfo *opaque,
2775 bool isread);
2776
2777typedef void CPResetFn(CPUARMState *env, const ARMCPRegInfo *opaque);
2778
2779#define CP_ANY 0xff
2780
2781
2782struct ARMCPRegInfo {
2783
2784 const char *name;
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802 uint8_t cp;
2803 uint8_t crn;
2804 uint8_t crm;
2805 uint8_t opc0;
2806 uint8_t opc1;
2807 uint8_t opc2;
2808
2809 int state;
2810
2811 int type;
2812
2813 int access;
2814
2815 int secure;
2816
2817
2818
2819
2820 void *opaque;
2821
2822
2823
2824 uint64_t resetvalue;
2825
2826
2827
2828
2829
2830
2831 ptrdiff_t fieldoffset;
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844 ptrdiff_t bank_fieldoffsets[2];
2845
2846
2847
2848
2849
2850
2851 CPAccessFn *accessfn;
2852
2853
2854
2855
2856 CPReadFn *readfn;
2857
2858
2859
2860
2861 CPWriteFn *writefn;
2862
2863
2864
2865
2866
2867 CPReadFn *raw_readfn;
2868
2869
2870
2871
2872
2873
2874 CPWriteFn *raw_writefn;
2875
2876
2877
2878
2879 CPResetFn *resetfn;
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891 CPReadFn *orig_readfn;
2892 CPWriteFn *orig_writefn;
2893};
2894
2895
2896
2897
2898#define CPREG_FIELD32(env, ri) \
2899 (*(uint32_t *)((char *)(env) + (ri)->fieldoffset))
2900#define CPREG_FIELD64(env, ri) \
2901 (*(uint64_t *)((char *)(env) + (ri)->fieldoffset))
2902
2903#define REGINFO_SENTINEL { .type = ARM_CP_SENTINEL }
2904
2905void define_arm_cp_regs_with_opaque(ARMCPU *cpu,
2906 const ARMCPRegInfo *regs, void *opaque);
2907void define_one_arm_cp_reg_with_opaque(ARMCPU *cpu,
2908 const ARMCPRegInfo *regs, void *opaque);
2909static inline void define_arm_cp_regs(ARMCPU *cpu, const ARMCPRegInfo *regs)
2910{
2911 define_arm_cp_regs_with_opaque(cpu, regs, 0);
2912}
2913static inline void define_one_arm_cp_reg(ARMCPU *cpu, const ARMCPRegInfo *regs)
2914{
2915 define_one_arm_cp_reg_with_opaque(cpu, regs, 0);
2916}
2917const ARMCPRegInfo *get_arm_cp_reginfo(GHashTable *cpregs, uint32_t encoded_cp);
2918
2919
2920
2921
2922
2923
2924
2925typedef struct ARMCPRegUserSpaceInfo {
2926
2927 const char *name;
2928
2929
2930 bool is_glob;
2931
2932
2933 uint64_t exported_bits;
2934
2935
2936 uint64_t fixed_bits;
2937} ARMCPRegUserSpaceInfo;
2938
2939#define REGUSERINFO_SENTINEL { .name = NULL }
2940
2941void modify_arm_cp_regs(ARMCPRegInfo *regs, const ARMCPRegUserSpaceInfo *mods);
2942
2943
2944void arm_cp_write_ignore(CPUARMState *env, const ARMCPRegInfo *ri,
2945 uint64_t value);
2946
2947uint64_t arm_cp_read_zero(CPUARMState *env, const ARMCPRegInfo *ri);
2948
2949
2950
2951
2952void arm_cp_reset_ignore(CPUARMState *env, const ARMCPRegInfo *opaque);
2953
2954
2955
2956
2957static inline bool cpreg_field_is_64bit(const ARMCPRegInfo *ri)
2958{
2959 return (ri->state == ARM_CP_STATE_AA64) || (ri->type & ARM_CP_64BIT);
2960}
2961
2962static inline bool cp_access_ok(int current_el,
2963 const ARMCPRegInfo *ri, int isread)
2964{
2965 return (ri->access >> ((current_el * 2) + isread)) & 1;
2966}
2967
2968
2969uint64_t read_raw_cp_reg(CPUARMState *env, const ARMCPRegInfo *ri);
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985bool write_list_to_cpustate(ARMCPU *cpu);
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008bool write_cpustate_to_list(ARMCPU *cpu, bool kvm_sync);
3009
3010#define ARM_CPUID_TI915T 0x54029152
3011#define ARM_CPUID_TI925T 0x54029252
3012
3013#define ARM_CPU_TYPE_SUFFIX "-" TYPE_ARM_CPU
3014#define ARM_CPU_TYPE_NAME(name) (name ARM_CPU_TYPE_SUFFIX)
3015#define CPU_RESOLVING_TYPE TYPE_ARM_CPU
3016
3017#define TYPE_ARM_HOST_CPU "host-" TYPE_ARM_CPU
3018
3019#define cpu_list arm_cpu_list
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115#define ARM_MMU_IDX_A 0x10
3116#define ARM_MMU_IDX_NOTLB 0x20
3117#define ARM_MMU_IDX_M 0x40
3118
3119
3120#define ARM_MMU_IDX_A_NS 0x8
3121
3122
3123#define ARM_MMU_IDX_M_PRIV 0x1
3124#define ARM_MMU_IDX_M_NEGPRI 0x2
3125#define ARM_MMU_IDX_M_S 0x4
3126
3127#define ARM_MMU_IDX_TYPE_MASK \
3128 (ARM_MMU_IDX_A | ARM_MMU_IDX_M | ARM_MMU_IDX_NOTLB)
3129#define ARM_MMU_IDX_COREIDX_MASK 0xf
3130
3131typedef enum ARMMMUIdx {
3132
3133
3134
3135 ARMMMUIdx_SE10_0 = 0 | ARM_MMU_IDX_A,
3136 ARMMMUIdx_SE20_0 = 1 | ARM_MMU_IDX_A,
3137 ARMMMUIdx_SE10_1 = 2 | ARM_MMU_IDX_A,
3138 ARMMMUIdx_SE20_2 = 3 | ARM_MMU_IDX_A,
3139 ARMMMUIdx_SE10_1_PAN = 4 | ARM_MMU_IDX_A,
3140 ARMMMUIdx_SE20_2_PAN = 5 | ARM_MMU_IDX_A,
3141 ARMMMUIdx_SE2 = 6 | ARM_MMU_IDX_A,
3142 ARMMMUIdx_SE3 = 7 | ARM_MMU_IDX_A,
3143
3144 ARMMMUIdx_E10_0 = ARMMMUIdx_SE10_0 | ARM_MMU_IDX_A_NS,
3145 ARMMMUIdx_E20_0 = ARMMMUIdx_SE20_0 | ARM_MMU_IDX_A_NS,
3146 ARMMMUIdx_E10_1 = ARMMMUIdx_SE10_1 | ARM_MMU_IDX_A_NS,
3147 ARMMMUIdx_E20_2 = ARMMMUIdx_SE20_2 | ARM_MMU_IDX_A_NS,
3148 ARMMMUIdx_E10_1_PAN = ARMMMUIdx_SE10_1_PAN | ARM_MMU_IDX_A_NS,
3149 ARMMMUIdx_E20_2_PAN = ARMMMUIdx_SE20_2_PAN | ARM_MMU_IDX_A_NS,
3150 ARMMMUIdx_E2 = ARMMMUIdx_SE2 | ARM_MMU_IDX_A_NS,
3151
3152
3153
3154
3155
3156 ARMMMUIdx_Stage1_E0 = 0 | ARM_MMU_IDX_NOTLB,
3157 ARMMMUIdx_Stage1_E1 = 1 | ARM_MMU_IDX_NOTLB,
3158 ARMMMUIdx_Stage1_E1_PAN = 2 | ARM_MMU_IDX_NOTLB,
3159 ARMMMUIdx_Stage1_SE0 = 3 | ARM_MMU_IDX_NOTLB,
3160 ARMMMUIdx_Stage1_SE1 = 4 | ARM_MMU_IDX_NOTLB,
3161 ARMMMUIdx_Stage1_SE1_PAN = 5 | ARM_MMU_IDX_NOTLB,
3162
3163
3164
3165
3166
3167
3168
3169 ARMMMUIdx_Stage2 = 6 | ARM_MMU_IDX_NOTLB,
3170 ARMMMUIdx_Stage2_S = 7 | ARM_MMU_IDX_NOTLB,
3171
3172
3173
3174
3175 ARMMMUIdx_MUser = ARM_MMU_IDX_M,
3176 ARMMMUIdx_MPriv = ARM_MMU_IDX_M | ARM_MMU_IDX_M_PRIV,
3177 ARMMMUIdx_MUserNegPri = ARMMMUIdx_MUser | ARM_MMU_IDX_M_NEGPRI,
3178 ARMMMUIdx_MPrivNegPri = ARMMMUIdx_MPriv | ARM_MMU_IDX_M_NEGPRI,
3179 ARMMMUIdx_MSUser = ARMMMUIdx_MUser | ARM_MMU_IDX_M_S,
3180 ARMMMUIdx_MSPriv = ARMMMUIdx_MPriv | ARM_MMU_IDX_M_S,
3181 ARMMMUIdx_MSUserNegPri = ARMMMUIdx_MUserNegPri | ARM_MMU_IDX_M_S,
3182 ARMMMUIdx_MSPrivNegPri = ARMMMUIdx_MPrivNegPri | ARM_MMU_IDX_M_S,
3183} ARMMMUIdx;
3184
3185
3186
3187
3188
3189#define TO_CORE_BIT(NAME) \
3190 ARMMMUIdxBit_##NAME = 1 << (ARMMMUIdx_##NAME & ARM_MMU_IDX_COREIDX_MASK)
3191
3192typedef enum ARMMMUIdxBit {
3193 TO_CORE_BIT(E10_0),
3194 TO_CORE_BIT(E20_0),
3195 TO_CORE_BIT(E10_1),
3196 TO_CORE_BIT(E10_1_PAN),
3197 TO_CORE_BIT(E2),
3198 TO_CORE_BIT(E20_2),
3199 TO_CORE_BIT(E20_2_PAN),
3200 TO_CORE_BIT(SE10_0),
3201 TO_CORE_BIT(SE20_0),
3202 TO_CORE_BIT(SE10_1),
3203 TO_CORE_BIT(SE20_2),
3204 TO_CORE_BIT(SE10_1_PAN),
3205 TO_CORE_BIT(SE20_2_PAN),
3206 TO_CORE_BIT(SE2),
3207 TO_CORE_BIT(SE3),
3208
3209 TO_CORE_BIT(MUser),
3210 TO_CORE_BIT(MPriv),
3211 TO_CORE_BIT(MUserNegPri),
3212 TO_CORE_BIT(MPrivNegPri),
3213 TO_CORE_BIT(MSUser),
3214 TO_CORE_BIT(MSPriv),
3215 TO_CORE_BIT(MSUserNegPri),
3216 TO_CORE_BIT(MSPrivNegPri),
3217} ARMMMUIdxBit;
3218
3219#undef TO_CORE_BIT
3220
3221#define MMU_USER_IDX 0
3222
3223
3224typedef enum ARMASIdx {
3225 ARMASIdx_NS = 0,
3226 ARMASIdx_S = 1,
3227 ARMASIdx_TagNS = 2,
3228 ARMASIdx_TagS = 3,
3229} ARMASIdx;
3230
3231
3232static inline int arm_debug_target_el(CPUARMState *env)
3233{
3234 bool secure = arm_is_secure(env);
3235 bool route_to_el2 = false;
3236
3237 if (arm_is_el2_enabled(env)) {
3238 route_to_el2 = env->cp15.hcr_el2 & HCR_TGE ||
3239 env->cp15.mdcr_el2 & MDCR_TDE;
3240 }
3241
3242 if (route_to_el2) {
3243 return 2;
3244 } else if (arm_feature(env, ARM_FEATURE_EL3) &&
3245 !arm_el_is_aa64(env, 3) && secure) {
3246 return 3;
3247 } else {
3248 return 1;
3249 }
3250}
3251
3252static inline bool arm_v7m_csselr_razwi(ARMCPU *cpu)
3253{
3254
3255
3256
3257 return (cpu->clidr & R_V7M_CLIDR_CTYPE_ALL_MASK) != 0;
3258}
3259
3260
3261static inline bool aa64_generate_debug_exceptions(CPUARMState *env)
3262{
3263 int cur_el = arm_current_el(env);
3264 int debug_el;
3265
3266 if (cur_el == 3) {
3267 return false;
3268 }
3269
3270
3271 if (arm_is_secure_below_el3(env)
3272 && extract32(env->cp15.mdcr_el3, 16, 1)) {
3273 return false;
3274 }
3275
3276
3277
3278
3279
3280 debug_el = arm_debug_target_el(env);
3281
3282 if (cur_el == debug_el) {
3283 return extract32(env->cp15.mdscr_el1, 13, 1)
3284 && !(env->daif & PSTATE_D);
3285 }
3286
3287
3288 return debug_el > cur_el;
3289}
3290
3291static inline bool aa32_generate_debug_exceptions(CPUARMState *env)
3292{
3293 int el = arm_current_el(env);
3294
3295 if (el == 0 && arm_el_is_aa64(env, 1)) {
3296 return aa64_generate_debug_exceptions(env);
3297 }
3298
3299 if (arm_is_secure(env)) {
3300 int spd;
3301
3302 if (el == 0 && (env->cp15.sder & 1)) {
3303
3304
3305
3306
3307 return true;
3308 }
3309
3310 spd = extract32(env->cp15.mdcr_el3, 14, 2);
3311 switch (spd) {
3312 case 1:
3313
3314 case 0:
3315
3316
3317
3318
3319
3320 return true;
3321 case 2:
3322 return false;
3323 case 3:
3324 return true;
3325 }
3326 }
3327
3328 return el != 2;
3329}
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342static inline bool arm_generate_debug_exceptions(CPUARMState *env)
3343{
3344 if (env->aarch64) {
3345 return aa64_generate_debug_exceptions(env);
3346 } else {
3347 return aa32_generate_debug_exceptions(env);
3348 }
3349}
3350
3351
3352
3353
3354static inline bool arm_singlestep_active(CPUARMState *env)
3355{
3356 return extract32(env->cp15.mdscr_el1, 0, 1)
3357 && arm_el_is_aa64(env, arm_debug_target_el(env))
3358 && arm_generate_debug_exceptions(env);
3359}
3360
3361static inline bool arm_sctlr_b(CPUARMState *env)
3362{
3363 return
3364
3365
3366
3367
3368#ifndef CONFIG_USER_ONLY
3369 !arm_feature(env, ARM_FEATURE_V7) &&
3370#endif
3371 (env->cp15.sctlr_el[1] & SCTLR_B) != 0;
3372}
3373
3374uint64_t arm_sctlr(CPUARMState *env, int el);
3375
3376static inline bool arm_cpu_data_is_big_endian_a32(CPUARMState *env,
3377 bool sctlr_b)
3378{
3379#ifdef CONFIG_USER_ONLY
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392 if (sctlr_b) {
3393 return true;
3394 }
3395#endif
3396
3397 return env->uncached_cpsr & CPSR_E;
3398}
3399
3400static inline bool arm_cpu_data_is_big_endian_a64(int el, uint64_t sctlr)
3401{
3402 return sctlr & (el ? SCTLR_EE : SCTLR_E0E);
3403}
3404
3405
3406static inline bool arm_cpu_data_is_big_endian(CPUARMState *env)
3407{
3408 if (!is_a64(env)) {
3409 return arm_cpu_data_is_big_endian_a32(env, arm_sctlr_b(env));
3410 } else {
3411 int cur_el = arm_current_el(env);
3412 uint64_t sctlr = arm_sctlr(env, cur_el);
3413 return arm_cpu_data_is_big_endian_a64(cur_el, sctlr);
3414 }
3415}
3416
3417#include "exec/cpu-all.h"
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443FIELD(TBFLAG_ANY, AARCH64_STATE, 0, 1)
3444FIELD(TBFLAG_ANY, SS_ACTIVE, 1, 1)
3445FIELD(TBFLAG_ANY, PSTATE__SS, 2, 1)
3446FIELD(TBFLAG_ANY, BE_DATA, 3, 1)
3447FIELD(TBFLAG_ANY, MMUIDX, 4, 4)
3448
3449FIELD(TBFLAG_ANY, FPEXC_EL, 8, 2)
3450
3451FIELD(TBFLAG_ANY, DEBUG_TARGET_EL, 10, 2)
3452
3453FIELD(TBFLAG_ANY, ALIGN_MEM, 12, 1)
3454FIELD(TBFLAG_ANY, PSTATE__IL, 13, 1)
3455
3456
3457
3458
3459FIELD(TBFLAG_AM32, CONDEXEC, 24, 8)
3460FIELD(TBFLAG_AM32, THUMB, 23, 1)
3461
3462
3463
3464
3465FIELD(TBFLAG_A32, VECLEN, 0, 3)
3466FIELD(TBFLAG_A32, VECSTRIDE, 3, 2)
3467
3468
3469
3470
3471
3472
3473FIELD(TBFLAG_A32, XSCALE_CPAR, 5, 2)
3474FIELD(TBFLAG_A32, VFPEN, 7, 1)
3475FIELD(TBFLAG_A32, SCTLR__B, 8, 1)
3476FIELD(TBFLAG_A32, HSTR_ACTIVE, 9, 1)
3477
3478
3479
3480
3481
3482FIELD(TBFLAG_A32, NS, 10, 1)
3483
3484
3485
3486
3487
3488FIELD(TBFLAG_M32, HANDLER, 0, 1)
3489
3490FIELD(TBFLAG_M32, STACKCHECK, 1, 1)
3491
3492FIELD(TBFLAG_M32, LSPACT, 2, 1)
3493
3494FIELD(TBFLAG_M32, NEW_FP_CTXT_NEEDED, 3, 1)
3495
3496FIELD(TBFLAG_M32, FPCCR_S_WRONG, 4, 1)
3497
3498FIELD(TBFLAG_M32, MVE_NO_PRED, 5, 1)
3499
3500
3501
3502
3503FIELD(TBFLAG_A64, TBII, 0, 2)
3504FIELD(TBFLAG_A64, SVEEXC_EL, 2, 2)
3505FIELD(TBFLAG_A64, ZCR_LEN, 4, 4)
3506FIELD(TBFLAG_A64, PAUTH_ACTIVE, 8, 1)
3507FIELD(TBFLAG_A64, BT, 9, 1)
3508FIELD(TBFLAG_A64, BTYPE, 10, 2)
3509FIELD(TBFLAG_A64, TBID, 12, 2)
3510FIELD(TBFLAG_A64, UNPRIV, 14, 1)
3511FIELD(TBFLAG_A64, ATA, 15, 1)
3512FIELD(TBFLAG_A64, TCMA, 16, 2)
3513FIELD(TBFLAG_A64, MTE_ACTIVE, 18, 1)
3514FIELD(TBFLAG_A64, MTE0_ACTIVE, 19, 1)
3515
3516
3517
3518
3519#define DP_TBFLAG_ANY(DST, WHICH, VAL) \
3520 (DST.flags = FIELD_DP32(DST.flags, TBFLAG_ANY, WHICH, VAL))
3521#define DP_TBFLAG_A64(DST, WHICH, VAL) \
3522 (DST.flags2 = FIELD_DP32(DST.flags2, TBFLAG_A64, WHICH, VAL))
3523#define DP_TBFLAG_A32(DST, WHICH, VAL) \
3524 (DST.flags2 = FIELD_DP32(DST.flags2, TBFLAG_A32, WHICH, VAL))
3525#define DP_TBFLAG_M32(DST, WHICH, VAL) \
3526 (DST.flags2 = FIELD_DP32(DST.flags2, TBFLAG_M32, WHICH, VAL))
3527#define DP_TBFLAG_AM32(DST, WHICH, VAL) \
3528 (DST.flags2 = FIELD_DP32(DST.flags2, TBFLAG_AM32, WHICH, VAL))
3529
3530#define EX_TBFLAG_ANY(IN, WHICH) FIELD_EX32(IN.flags, TBFLAG_ANY, WHICH)
3531#define EX_TBFLAG_A64(IN, WHICH) FIELD_EX32(IN.flags2, TBFLAG_A64, WHICH)
3532#define EX_TBFLAG_A32(IN, WHICH) FIELD_EX32(IN.flags2, TBFLAG_A32, WHICH)
3533#define EX_TBFLAG_M32(IN, WHICH) FIELD_EX32(IN.flags2, TBFLAG_M32, WHICH)
3534#define EX_TBFLAG_AM32(IN, WHICH) FIELD_EX32(IN.flags2, TBFLAG_AM32, WHICH)
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544static inline int cpu_mmu_index(CPUARMState *env, bool ifetch)
3545{
3546 return EX_TBFLAG_ANY(env->hflags, MMUIDX);
3547}
3548
3549static inline bool bswap_code(bool sctlr_b)
3550{
3551#ifdef CONFIG_USER_ONLY
3552
3553
3554
3555
3556 return
3557#ifdef TARGET_WORDS_BIGENDIAN
3558 1 ^
3559#endif
3560 sctlr_b;
3561#else
3562
3563
3564
3565 return 0;
3566#endif
3567}
3568
3569#ifdef CONFIG_USER_ONLY
3570static inline bool arm_cpu_bswap_data(CPUARMState *env)
3571{
3572 return
3573#ifdef TARGET_WORDS_BIGENDIAN
3574 1 ^
3575#endif
3576 arm_cpu_data_is_big_endian(env);
3577}
3578#endif
3579
3580void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc,
3581 target_ulong *cs_base, uint32_t *flags);
3582
3583enum {
3584 QEMU_PSCI_CONDUIT_DISABLED = 0,
3585 QEMU_PSCI_CONDUIT_SMC = 1,
3586 QEMU_PSCI_CONDUIT_HVC = 2,
3587};
3588
3589#ifndef CONFIG_USER_ONLY
3590
3591static inline int arm_asidx_from_attrs(CPUState *cs, MemTxAttrs attrs)
3592{
3593 return attrs.secure ? ARMASIdx_S : ARMASIdx_NS;
3594}
3595
3596
3597
3598
3599
3600static inline AddressSpace *arm_addressspace(CPUState *cs, MemTxAttrs attrs)
3601{
3602 return cpu_get_address_space(cs, arm_asidx_from_attrs(cs, attrs));
3603}
3604#endif
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616void arm_register_pre_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook,
3617 void *opaque);
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628void arm_register_el_change_hook(ARMCPU *cpu, ARMELChangeHookFn *hook, void
3629 *opaque);
3630
3631
3632
3633
3634
3635void arm_rebuild_hflags(CPUARMState *env);
3636
3637
3638
3639
3640
3641static inline uint64_t *aa32_vfp_dreg(CPUARMState *env, unsigned regno)
3642{
3643 return &env->vfp.zregs[regno >> 1].d[regno & 1];
3644}
3645
3646
3647
3648
3649
3650static inline uint64_t *aa32_vfp_qreg(CPUARMState *env, unsigned regno)
3651{
3652 return &env->vfp.zregs[regno].d[0];
3653}
3654
3655
3656
3657
3658
3659static inline uint64_t *aa64_vfp_qreg(CPUARMState *env, unsigned regno)
3660{
3661 return &env->vfp.zregs[regno].d[0];
3662}
3663
3664
3665extern const uint64_t pred_esz_masks[4];
3666
3667
3668static inline MemTxAttrs *typecheck_memtxattrs(MemTxAttrs *x)
3669{
3670 return x;
3671}
3672
3673
3674
3675
3676
3677
3678#define arm_tlb_bti_gp(x) (typecheck_memtxattrs(x)->target_tlb_bit0)
3679#define arm_tlb_mte_tagged(x) (typecheck_memtxattrs(x)->target_tlb_bit1)
3680
3681
3682
3683
3684#define PAGE_BTI PAGE_TARGET_1
3685#define PAGE_MTE PAGE_TARGET_2
3686
3687#ifdef TARGET_TAGGED_ADDRESSES
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699static inline target_ulong cpu_untagged_addr(CPUState *cs, target_ulong x)
3700{
3701 ARMCPU *cpu = ARM_CPU(cs);
3702 if (cpu->env.tagged_addr_enable) {
3703
3704
3705
3706
3707 x &= sextract64(x, 0, 56);
3708 }
3709 return x;
3710}
3711#endif
3712
3713
3714
3715
3716
3717
3718
3719
3720
3721
3722
3723
3724
3725
3726
3727
3728
3729
3730
3731
3732static inline bool isar_feature_aa32_thumb_div(const ARMISARegisters *id)
3733{
3734 return FIELD_EX32(id->id_isar0, ID_ISAR0, DIVIDE) != 0;
3735}
3736
3737static inline bool isar_feature_aa32_arm_div(const ARMISARegisters *id)
3738{
3739 return FIELD_EX32(id->id_isar0, ID_ISAR0, DIVIDE) > 1;
3740}
3741
3742static inline bool isar_feature_aa32_lob(const ARMISARegisters *id)
3743{
3744
3745 return FIELD_EX32(id->id_isar0, ID_ISAR0, CMPBRANCH) >= 3;
3746}
3747
3748static inline bool isar_feature_aa32_jazelle(const ARMISARegisters *id)
3749{
3750 return FIELD_EX32(id->id_isar1, ID_ISAR1, JAZELLE) != 0;
3751}
3752
3753static inline bool isar_feature_aa32_aes(const ARMISARegisters *id)
3754{
3755 return FIELD_EX32(id->id_isar5, ID_ISAR5, AES) != 0;
3756}
3757
3758static inline bool isar_feature_aa32_pmull(const ARMISARegisters *id)
3759{
3760 return FIELD_EX32(id->id_isar5, ID_ISAR5, AES) > 1;
3761}
3762
3763static inline bool isar_feature_aa32_sha1(const ARMISARegisters *id)
3764{
3765 return FIELD_EX32(id->id_isar5, ID_ISAR5, SHA1) != 0;
3766}
3767
3768static inline bool isar_feature_aa32_sha2(const ARMISARegisters *id)
3769{
3770 return FIELD_EX32(id->id_isar5, ID_ISAR5, SHA2) != 0;
3771}
3772
3773static inline bool isar_feature_aa32_crc32(const ARMISARegisters *id)
3774{
3775 return FIELD_EX32(id->id_isar5, ID_ISAR5, CRC32) != 0;
3776}
3777
3778static inline bool isar_feature_aa32_rdm(const ARMISARegisters *id)
3779{
3780 return FIELD_EX32(id->id_isar5, ID_ISAR5, RDM) != 0;
3781}
3782
3783static inline bool isar_feature_aa32_vcma(const ARMISARegisters *id)
3784{
3785 return FIELD_EX32(id->id_isar5, ID_ISAR5, VCMA) != 0;
3786}
3787
3788static inline bool isar_feature_aa32_jscvt(const ARMISARegisters *id)
3789{
3790 return FIELD_EX32(id->id_isar6, ID_ISAR6, JSCVT) != 0;
3791}
3792
3793static inline bool isar_feature_aa32_dp(const ARMISARegisters *id)
3794{
3795 return FIELD_EX32(id->id_isar6, ID_ISAR6, DP) != 0;
3796}
3797
3798static inline bool isar_feature_aa32_fhm(const ARMISARegisters *id)
3799{
3800 return FIELD_EX32(id->id_isar6, ID_ISAR6, FHM) != 0;
3801}
3802
3803static inline bool isar_feature_aa32_sb(const ARMISARegisters *id)
3804{
3805 return FIELD_EX32(id->id_isar6, ID_ISAR6, SB) != 0;
3806}
3807
3808static inline bool isar_feature_aa32_predinv(const ARMISARegisters *id)
3809{
3810 return FIELD_EX32(id->id_isar6, ID_ISAR6, SPECRES) != 0;
3811}
3812
3813static inline bool isar_feature_aa32_bf16(const ARMISARegisters *id)
3814{
3815 return FIELD_EX32(id->id_isar6, ID_ISAR6, BF16) != 0;
3816}
3817
3818static inline bool isar_feature_aa32_i8mm(const ARMISARegisters *id)
3819{
3820 return FIELD_EX32(id->id_isar6, ID_ISAR6, I8MM) != 0;
3821}
3822
3823static inline bool isar_feature_aa32_ras(const ARMISARegisters *id)
3824{
3825 return FIELD_EX32(id->id_pfr0, ID_PFR0, RAS) != 0;
3826}
3827
3828static inline bool isar_feature_aa32_mprofile(const ARMISARegisters *id)
3829{
3830 return FIELD_EX32(id->id_pfr1, ID_PFR1, MPROGMOD) != 0;
3831}
3832
3833static inline bool isar_feature_aa32_m_sec_state(const ARMISARegisters *id)
3834{
3835
3836
3837
3838
3839 return FIELD_EX32(id->id_pfr1, ID_PFR1, SECURITY) >= 3;
3840}
3841
3842static inline bool isar_feature_aa32_fp16_arith(const ARMISARegisters *id)
3843{
3844
3845 if (isar_feature_aa32_mprofile(id)) {
3846 return FIELD_EX32(id->mvfr1, MVFR1, FP16) > 0;
3847 } else {
3848 return FIELD_EX32(id->mvfr1, MVFR1, FPHP) >= 3;
3849 }
3850}
3851
3852static inline bool isar_feature_aa32_mve(const ARMISARegisters *id)
3853{
3854
3855
3856
3857
3858
3859 return isar_feature_aa32_mprofile(id) &&
3860 FIELD_EX32(id->mvfr1, MVFR1, MVE) > 0;
3861}
3862
3863static inline bool isar_feature_aa32_mve_fp(const ARMISARegisters *id)
3864{
3865
3866
3867
3868
3869
3870 return isar_feature_aa32_mprofile(id) &&
3871 FIELD_EX32(id->mvfr1, MVFR1, MVE) >= 2;
3872}
3873
3874static inline bool isar_feature_aa32_vfp_simd(const ARMISARegisters *id)
3875{
3876
3877
3878
3879
3880 return FIELD_EX32(id->mvfr0, MVFR0, SIMDREG) > 0;
3881}
3882
3883static inline bool isar_feature_aa32_simd_r32(const ARMISARegisters *id)
3884{
3885
3886 return FIELD_EX32(id->mvfr0, MVFR0, SIMDREG) >= 2;
3887}
3888
3889static inline bool isar_feature_aa32_fpshvec(const ARMISARegisters *id)
3890{
3891 return FIELD_EX32(id->mvfr0, MVFR0, FPSHVEC) > 0;
3892}
3893
3894static inline bool isar_feature_aa32_fpsp_v2(const ARMISARegisters *id)
3895{
3896
3897 return FIELD_EX32(id->mvfr0, MVFR0, FPSP) > 0;
3898}
3899
3900static inline bool isar_feature_aa32_fpsp_v3(const ARMISARegisters *id)
3901{
3902
3903 return FIELD_EX32(id->mvfr0, MVFR0, FPSP) >= 2;
3904}
3905
3906static inline bool isar_feature_aa32_fpdp_v2(const ARMISARegisters *id)
3907{
3908
3909 return FIELD_EX32(id->mvfr0, MVFR0, FPDP) > 0;
3910}
3911
3912static inline bool isar_feature_aa32_fpdp_v3(const ARMISARegisters *id)
3913{
3914
3915 return FIELD_EX32(id->mvfr0, MVFR0, FPDP) >= 2;
3916}
3917
3918static inline bool isar_feature_aa32_vfp(const ARMISARegisters *id)
3919{
3920 return isar_feature_aa32_fpsp_v2(id) || isar_feature_aa32_fpdp_v2(id);
3921}
3922
3923
3924
3925
3926
3927
3928static inline bool isar_feature_aa32_fp16_spconv(const ARMISARegisters *id)
3929{
3930 return FIELD_EX32(id->mvfr1, MVFR1, FPHP) > 0;
3931}
3932
3933static inline bool isar_feature_aa32_fp16_dpconv(const ARMISARegisters *id)
3934{
3935 return FIELD_EX32(id->mvfr1, MVFR1, FPHP) > 1;
3936}
3937
3938
3939
3940
3941
3942
3943
3944
3945static inline bool isar_feature_aa32_simdfmac(const ARMISARegisters *id)
3946{
3947 return FIELD_EX32(id->mvfr1, MVFR1, SIMDFMAC) != 0;
3948}
3949
3950static inline bool isar_feature_aa32_vsel(const ARMISARegisters *id)
3951{
3952 return FIELD_EX32(id->mvfr2, MVFR2, FPMISC) >= 1;
3953}
3954
3955static inline bool isar_feature_aa32_vcvt_dr(const ARMISARegisters *id)
3956{
3957 return FIELD_EX32(id->mvfr2, MVFR2, FPMISC) >= 2;
3958}
3959
3960static inline bool isar_feature_aa32_vrint(const ARMISARegisters *id)
3961{
3962 return FIELD_EX32(id->mvfr2, MVFR2, FPMISC) >= 3;
3963}
3964
3965static inline bool isar_feature_aa32_vminmaxnm(const ARMISARegisters *id)
3966{
3967 return FIELD_EX32(id->mvfr2, MVFR2, FPMISC) >= 4;
3968}
3969
3970static inline bool isar_feature_aa32_pxn(const ARMISARegisters *id)
3971{
3972 return FIELD_EX32(id->id_mmfr0, ID_MMFR0, VMSA) >= 4;
3973}
3974
3975static inline bool isar_feature_aa32_pan(const ARMISARegisters *id)
3976{
3977 return FIELD_EX32(id->id_mmfr3, ID_MMFR3, PAN) != 0;
3978}
3979
3980static inline bool isar_feature_aa32_ats1e1(const ARMISARegisters *id)
3981{
3982 return FIELD_EX32(id->id_mmfr3, ID_MMFR3, PAN) >= 2;
3983}
3984
3985static inline bool isar_feature_aa32_pmu_8_1(const ARMISARegisters *id)
3986{
3987
3988 return FIELD_EX32(id->id_dfr0, ID_DFR0, PERFMON) >= 4 &&
3989 FIELD_EX32(id->id_dfr0, ID_DFR0, PERFMON) != 0xf;
3990}
3991
3992static inline bool isar_feature_aa32_pmu_8_4(const ARMISARegisters *id)
3993{
3994
3995 return FIELD_EX32(id->id_dfr0, ID_DFR0, PERFMON) >= 5 &&
3996 FIELD_EX32(id->id_dfr0, ID_DFR0, PERFMON) != 0xf;
3997}
3998
3999static inline bool isar_feature_aa32_hpd(const ARMISARegisters *id)
4000{
4001 return FIELD_EX32(id->id_mmfr4, ID_MMFR4, HPDS) != 0;
4002}
4003
4004static inline bool isar_feature_aa32_ac2(const ARMISARegisters *id)
4005{
4006 return FIELD_EX32(id->id_mmfr4, ID_MMFR4, AC2) != 0;
4007}
4008
4009static inline bool isar_feature_aa32_ccidx(const ARMISARegisters *id)
4010{
4011 return FIELD_EX32(id->id_mmfr4, ID_MMFR4, CCIDX) != 0;
4012}
4013
4014static inline bool isar_feature_aa32_tts2uxn(const ARMISARegisters *id)
4015{
4016 return FIELD_EX32(id->id_mmfr4, ID_MMFR4, XNX) != 0;
4017}
4018
4019static inline bool isar_feature_aa32_dit(const ARMISARegisters *id)
4020{
4021 return FIELD_EX32(id->id_pfr0, ID_PFR0, DIT) != 0;
4022}
4023
4024static inline bool isar_feature_aa32_ssbs(const ARMISARegisters *id)
4025{
4026 return FIELD_EX32(id->id_pfr2, ID_PFR2, SSBS) != 0;
4027}
4028
4029
4030
4031
4032static inline bool isar_feature_aa64_aes(const ARMISARegisters *id)
4033{
4034 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, AES) != 0;
4035}
4036
4037static inline bool isar_feature_aa64_pmull(const ARMISARegisters *id)
4038{
4039 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, AES) > 1;
4040}
4041
4042static inline bool isar_feature_aa64_sha1(const ARMISARegisters *id)
4043{
4044 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, SHA1) != 0;
4045}
4046
4047static inline bool isar_feature_aa64_sha256(const ARMISARegisters *id)
4048{
4049 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, SHA2) != 0;
4050}
4051
4052static inline bool isar_feature_aa64_sha512(const ARMISARegisters *id)
4053{
4054 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, SHA2) > 1;
4055}
4056
4057static inline bool isar_feature_aa64_crc32(const ARMISARegisters *id)
4058{
4059 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, CRC32) != 0;
4060}
4061
4062static inline bool isar_feature_aa64_atomics(const ARMISARegisters *id)
4063{
4064 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, ATOMIC) != 0;
4065}
4066
4067static inline bool isar_feature_aa64_rdm(const ARMISARegisters *id)
4068{
4069 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, RDM) != 0;
4070}
4071
4072static inline bool isar_feature_aa64_sha3(const ARMISARegisters *id)
4073{
4074 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, SHA3) != 0;
4075}
4076
4077static inline bool isar_feature_aa64_sm3(const ARMISARegisters *id)
4078{
4079 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, SM3) != 0;
4080}
4081
4082static inline bool isar_feature_aa64_sm4(const ARMISARegisters *id)
4083{
4084 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, SM4) != 0;
4085}
4086
4087static inline bool isar_feature_aa64_dp(const ARMISARegisters *id)
4088{
4089 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, DP) != 0;
4090}
4091
4092static inline bool isar_feature_aa64_fhm(const ARMISARegisters *id)
4093{
4094 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, FHM) != 0;
4095}
4096
4097static inline bool isar_feature_aa64_condm_4(const ARMISARegisters *id)
4098{
4099 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, TS) != 0;
4100}
4101
4102static inline bool isar_feature_aa64_condm_5(const ARMISARegisters *id)
4103{
4104 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, TS) >= 2;
4105}
4106
4107static inline bool isar_feature_aa64_rndr(const ARMISARegisters *id)
4108{
4109 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, RNDR) != 0;
4110}
4111
4112static inline bool isar_feature_aa64_jscvt(const ARMISARegisters *id)
4113{
4114 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, JSCVT) != 0;
4115}
4116
4117static inline bool isar_feature_aa64_fcma(const ARMISARegisters *id)
4118{
4119 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, FCMA) != 0;
4120}
4121
4122static inline bool isar_feature_aa64_pauth(const ARMISARegisters *id)
4123{
4124
4125
4126
4127
4128 return (id->id_aa64isar1 &
4129 (FIELD_DP64(0, ID_AA64ISAR1, APA, 0xf) |
4130 FIELD_DP64(0, ID_AA64ISAR1, API, 0xf) |
4131 FIELD_DP64(0, ID_AA64ISAR1, GPA, 0xf) |
4132 FIELD_DP64(0, ID_AA64ISAR1, GPI, 0xf))) != 0;
4133}
4134
4135static inline bool isar_feature_aa64_pauth_arch(const ARMISARegisters *id)
4136{
4137
4138
4139
4140
4141 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, APA) != 0;
4142}
4143
4144static inline bool isar_feature_aa64_tlbirange(const ARMISARegisters *id)
4145{
4146 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, TLB) == 2;
4147}
4148
4149static inline bool isar_feature_aa64_tlbios(const ARMISARegisters *id)
4150{
4151 return FIELD_EX64(id->id_aa64isar0, ID_AA64ISAR0, TLB) != 0;
4152}
4153
4154static inline bool isar_feature_aa64_sb(const ARMISARegisters *id)
4155{
4156 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, SB) != 0;
4157}
4158
4159static inline bool isar_feature_aa64_predinv(const ARMISARegisters *id)
4160{
4161 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, SPECRES) != 0;
4162}
4163
4164static inline bool isar_feature_aa64_frint(const ARMISARegisters *id)
4165{
4166 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, FRINTTS) != 0;
4167}
4168
4169static inline bool isar_feature_aa64_dcpop(const ARMISARegisters *id)
4170{
4171 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, DPB) != 0;
4172}
4173
4174static inline bool isar_feature_aa64_dcpodp(const ARMISARegisters *id)
4175{
4176 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, DPB) >= 2;
4177}
4178
4179static inline bool isar_feature_aa64_bf16(const ARMISARegisters *id)
4180{
4181 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, BF16) != 0;
4182}
4183
4184static inline bool isar_feature_aa64_fp_simd(const ARMISARegisters *id)
4185{
4186
4187 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, FP) != 0xf;
4188}
4189
4190static inline bool isar_feature_aa64_fp16(const ARMISARegisters *id)
4191{
4192
4193 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, FP) == 1;
4194}
4195
4196static inline bool isar_feature_aa64_aa32(const ARMISARegisters *id)
4197{
4198 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, EL0) >= 2;
4199}
4200
4201static inline bool isar_feature_aa64_aa32_el1(const ARMISARegisters *id)
4202{
4203 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, EL1) >= 2;
4204}
4205
4206static inline bool isar_feature_aa64_sve(const ARMISARegisters *id)
4207{
4208 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, SVE) != 0;
4209}
4210
4211static inline bool isar_feature_aa64_sel2(const ARMISARegisters *id)
4212{
4213 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, SEL2) != 0;
4214}
4215
4216static inline bool isar_feature_aa64_vh(const ARMISARegisters *id)
4217{
4218 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, VH) != 0;
4219}
4220
4221static inline bool isar_feature_aa64_lor(const ARMISARegisters *id)
4222{
4223 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, LO) != 0;
4224}
4225
4226static inline bool isar_feature_aa64_pan(const ARMISARegisters *id)
4227{
4228 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) != 0;
4229}
4230
4231static inline bool isar_feature_aa64_ats1e1(const ARMISARegisters *id)
4232{
4233 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, PAN) >= 2;
4234}
4235
4236static inline bool isar_feature_aa64_uao(const ARMISARegisters *id)
4237{
4238 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, UAO) != 0;
4239}
4240
4241static inline bool isar_feature_aa64_st(const ARMISARegisters *id)
4242{
4243 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, ST) != 0;
4244}
4245
4246static inline bool isar_feature_aa64_bti(const ARMISARegisters *id)
4247{
4248 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, BT) != 0;
4249}
4250
4251static inline bool isar_feature_aa64_mte_insn_reg(const ARMISARegisters *id)
4252{
4253 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, MTE) != 0;
4254}
4255
4256static inline bool isar_feature_aa64_mte(const ARMISARegisters *id)
4257{
4258 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, MTE) >= 2;
4259}
4260
4261static inline bool isar_feature_aa64_pmu_8_1(const ARMISARegisters *id)
4262{
4263 return FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) >= 4 &&
4264 FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) != 0xf;
4265}
4266
4267static inline bool isar_feature_aa64_pmu_8_4(const ARMISARegisters *id)
4268{
4269 return FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) >= 5 &&
4270 FIELD_EX64(id->id_aa64dfr0, ID_AA64DFR0, PMUVER) != 0xf;
4271}
4272
4273static inline bool isar_feature_aa64_rcpc_8_3(const ARMISARegisters *id)
4274{
4275 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, LRCPC) != 0;
4276}
4277
4278static inline bool isar_feature_aa64_rcpc_8_4(const ARMISARegisters *id)
4279{
4280 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, LRCPC) >= 2;
4281}
4282
4283static inline bool isar_feature_aa64_i8mm(const ARMISARegisters *id)
4284{
4285 return FIELD_EX64(id->id_aa64isar1, ID_AA64ISAR1, I8MM) != 0;
4286}
4287
4288static inline bool isar_feature_aa64_tgran4_lpa2(const ARMISARegisters *id)
4289{
4290 return FIELD_SEX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN4) >= 1;
4291}
4292
4293static inline bool isar_feature_aa64_tgran4_2_lpa2(const ARMISARegisters *id)
4294{
4295 unsigned t = FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN4_2);
4296 return t >= 3 || (t == 0 && isar_feature_aa64_tgran4_lpa2(id));
4297}
4298
4299static inline bool isar_feature_aa64_tgran16_lpa2(const ARMISARegisters *id)
4300{
4301 return FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN16) >= 2;
4302}
4303
4304static inline bool isar_feature_aa64_tgran16_2_lpa2(const ARMISARegisters *id)
4305{
4306 unsigned t = FIELD_EX64(id->id_aa64mmfr0, ID_AA64MMFR0, TGRAN16_2);
4307 return t >= 3 || (t == 0 && isar_feature_aa64_tgran16_lpa2(id));
4308}
4309
4310static inline bool isar_feature_aa64_ccidx(const ARMISARegisters *id)
4311{
4312 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, CCIDX) != 0;
4313}
4314
4315static inline bool isar_feature_aa64_lva(const ARMISARegisters *id)
4316{
4317 return FIELD_EX64(id->id_aa64mmfr2, ID_AA64MMFR2, VARANGE) != 0;
4318}
4319
4320static inline bool isar_feature_aa64_tts2uxn(const ARMISARegisters *id)
4321{
4322 return FIELD_EX64(id->id_aa64mmfr1, ID_AA64MMFR1, XNX) != 0;
4323}
4324
4325static inline bool isar_feature_aa64_dit(const ARMISARegisters *id)
4326{
4327 return FIELD_EX64(id->id_aa64pfr0, ID_AA64PFR0, DIT) != 0;
4328}
4329
4330static inline bool isar_feature_aa64_ssbs(const ARMISARegisters *id)
4331{
4332 return FIELD_EX64(id->id_aa64pfr1, ID_AA64PFR1, SSBS) != 0;
4333}
4334
4335static inline bool isar_feature_aa64_sve2(const ARMISARegisters *id)
4336{
4337 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, SVEVER) != 0;
4338}
4339
4340static inline bool isar_feature_aa64_sve2_aes(const ARMISARegisters *id)
4341{
4342 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, AES) != 0;
4343}
4344
4345static inline bool isar_feature_aa64_sve2_pmull128(const ARMISARegisters *id)
4346{
4347 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, AES) >= 2;
4348}
4349
4350static inline bool isar_feature_aa64_sve2_bitperm(const ARMISARegisters *id)
4351{
4352 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, BITPERM) != 0;
4353}
4354
4355static inline bool isar_feature_aa64_sve_bf16(const ARMISARegisters *id)
4356{
4357 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, BFLOAT16) != 0;
4358}
4359
4360static inline bool isar_feature_aa64_sve2_sha3(const ARMISARegisters *id)
4361{
4362 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, SHA3) != 0;
4363}
4364
4365static inline bool isar_feature_aa64_sve2_sm4(const ARMISARegisters *id)
4366{
4367 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, SM4) != 0;
4368}
4369
4370static inline bool isar_feature_aa64_sve_i8mm(const ARMISARegisters *id)
4371{
4372 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, I8MM) != 0;
4373}
4374
4375static inline bool isar_feature_aa64_sve_f32mm(const ARMISARegisters *id)
4376{
4377 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, F32MM) != 0;
4378}
4379
4380static inline bool isar_feature_aa64_sve_f64mm(const ARMISARegisters *id)
4381{
4382 return FIELD_EX64(id->id_aa64zfr0, ID_AA64ZFR0, F64MM) != 0;
4383}
4384
4385
4386
4387
4388static inline bool isar_feature_any_fp16(const ARMISARegisters *id)
4389{
4390 return isar_feature_aa64_fp16(id) || isar_feature_aa32_fp16_arith(id);
4391}
4392
4393static inline bool isar_feature_any_predinv(const ARMISARegisters *id)
4394{
4395 return isar_feature_aa64_predinv(id) || isar_feature_aa32_predinv(id);
4396}
4397
4398static inline bool isar_feature_any_pmu_8_1(const ARMISARegisters *id)
4399{
4400 return isar_feature_aa64_pmu_8_1(id) || isar_feature_aa32_pmu_8_1(id);
4401}
4402
4403static inline bool isar_feature_any_pmu_8_4(const ARMISARegisters *id)
4404{
4405 return isar_feature_aa64_pmu_8_4(id) || isar_feature_aa32_pmu_8_4(id);
4406}
4407
4408static inline bool isar_feature_any_ccidx(const ARMISARegisters *id)
4409{
4410 return isar_feature_aa64_ccidx(id) || isar_feature_aa32_ccidx(id);
4411}
4412
4413static inline bool isar_feature_any_tts2uxn(const ARMISARegisters *id)
4414{
4415 return isar_feature_aa64_tts2uxn(id) || isar_feature_aa32_tts2uxn(id);
4416}
4417
4418
4419
4420
4421#define cpu_isar_feature(name, cpu) \
4422 ({ ARMCPU *cpu_ = (cpu); isar_feature_##name(&cpu_->isar); })
4423
4424#endif
4425