54 #ifndef HWCAP_ATOMICS
55 #define HWCAP_ATOMICS (1<<8)
56 #endif
57
58 #ifndef HWCAP_DCPOP
59 #define HWCAP_DCPOP (1<<16)
60 #endif
61
62 #ifndef HWCAP_SHA3
63 #define HWCAP_SHA3 (1 << 17)
64 #endif
65
66 #ifndef HWCAP_SHA512
67 #define HWCAP_SHA512 (1 << 21)
68 #endif
69
70 #ifndef HWCAP_SVE
71 #define HWCAP_SVE (1 << 22)
72 #endif
73
74 #ifndef HWCAP_PACA
75 #define HWCAP_PACA (1 << 30)
76 #endif
77
78 #ifndef HWCAP_FPHP
79 #define HWCAP_FPHP (1<<9)
80 #endif
81
82 #ifndef HWCAP_ASIMDHP
83 #define HWCAP_ASIMDHP (1<<10)
84 #endif
85
86 #ifndef HWCAP2_SVE2
87 #define HWCAP2_SVE2 (1 << 1)
88 #endif
89
90 #ifndef HWCAP2_SVEBITPERM
91 #define HWCAP2_SVEBITPERM (1 << 4)
92 #endif
93
126 static_assert(CPU_SHA3 == HWCAP_SHA3, "Flag CPU_SHA3 must follow Linux HWCAP");
127 static_assert(CPU_SHA512 == HWCAP_SHA512, "Flag CPU_SHA512 must follow Linux HWCAP");
128 static_assert(CPU_SVE == HWCAP_SVE, "Flag CPU_SVE must follow Linux HWCAP");
129 static_assert(CPU_PACA == HWCAP_PACA, "Flag CPU_PACA must follow Linux HWCAP");
130 static_assert(CPU_FPHP == HWCAP_FPHP, "Flag CPU_FPHP must follow Linux HWCAP");
131 static_assert(CPU_ASIMDHP == HWCAP_ASIMDHP, "Flag CPU_ASIMDHP must follow Linux HWCAP");
132 _features = auxv & (
133 HWCAP_FP |
134 HWCAP_ASIMD |
135 HWCAP_EVTSTRM |
136 HWCAP_AES |
137 HWCAP_PMULL |
138 HWCAP_SHA1 |
139 HWCAP_SHA2 |
140 HWCAP_CRC32 |
141 HWCAP_ATOMICS |
142 HWCAP_DCPOP |
143 HWCAP_SHA3 |
144 HWCAP_SHA512 |
145 HWCAP_SVE |
146 HWCAP_PACA |
147 HWCAP_FPHP |
148 HWCAP_ASIMDHP);
149
150 if (auxv2 & HWCAP2_SVE2) _features |= CPU_SVE2;
151 if (auxv2 & HWCAP2_SVEBITPERM) _features |= CPU_SVEBITPERM;
152
153 uint64_t ctr_el0;
154 uint64_t dczid_el0;
155 __asm__ (
156 "mrs %0, CTR_EL0\n"
157 "mrs %1, DCZID_EL0\n"
158 : "=r"(ctr_el0), "=r"(dczid_el0)
159 );
160
161 _icache_line_size = (1 << (ctr_el0 & 0x0f)) * 4;
162 _dcache_line_size = (1 << ((ctr_el0 >> 16) & 0x0f)) * 4;
163
164 if (!(dczid_el0 & 0x10)) {
165 _zva_length = 4 << (dczid_el0 & 0xf);
|
54 #ifndef HWCAP_ATOMICS
55 #define HWCAP_ATOMICS (1<<8)
56 #endif
57
58 #ifndef HWCAP_DCPOP
59 #define HWCAP_DCPOP (1<<16)
60 #endif
61
62 #ifndef HWCAP_SHA3
63 #define HWCAP_SHA3 (1 << 17)
64 #endif
65
66 #ifndef HWCAP_SHA512
67 #define HWCAP_SHA512 (1 << 21)
68 #endif
69
70 #ifndef HWCAP_SVE
71 #define HWCAP_SVE (1 << 22)
72 #endif
73
74 #ifndef HWCAP_SB
75 #define HWCAP_SB (1 << 29)
76 #endif
77
78 #ifndef HWCAP_PACA
79 #define HWCAP_PACA (1 << 30)
80 #endif
81
82 #ifndef HWCAP_FPHP
83 #define HWCAP_FPHP (1<<9)
84 #endif
85
86 #ifndef HWCAP_ASIMDHP
87 #define HWCAP_ASIMDHP (1<<10)
88 #endif
89
90 #ifndef HWCAP2_SVE2
91 #define HWCAP2_SVE2 (1 << 1)
92 #endif
93
94 #ifndef HWCAP2_SVEBITPERM
95 #define HWCAP2_SVEBITPERM (1 << 4)
96 #endif
97
130 static_assert(CPU_SHA3 == HWCAP_SHA3, "Flag CPU_SHA3 must follow Linux HWCAP");
131 static_assert(CPU_SHA512 == HWCAP_SHA512, "Flag CPU_SHA512 must follow Linux HWCAP");
132 static_assert(CPU_SVE == HWCAP_SVE, "Flag CPU_SVE must follow Linux HWCAP");
133 static_assert(CPU_PACA == HWCAP_PACA, "Flag CPU_PACA must follow Linux HWCAP");
134 static_assert(CPU_FPHP == HWCAP_FPHP, "Flag CPU_FPHP must follow Linux HWCAP");
135 static_assert(CPU_ASIMDHP == HWCAP_ASIMDHP, "Flag CPU_ASIMDHP must follow Linux HWCAP");
136 _features = auxv & (
137 HWCAP_FP |
138 HWCAP_ASIMD |
139 HWCAP_EVTSTRM |
140 HWCAP_AES |
141 HWCAP_PMULL |
142 HWCAP_SHA1 |
143 HWCAP_SHA2 |
144 HWCAP_CRC32 |
145 HWCAP_ATOMICS |
146 HWCAP_DCPOP |
147 HWCAP_SHA3 |
148 HWCAP_SHA512 |
149 HWCAP_SVE |
150 HWCAP_SB |
151 HWCAP_PACA |
152 HWCAP_FPHP |
153 HWCAP_ASIMDHP);
154
155 if (auxv2 & HWCAP2_SVE2) _features |= CPU_SVE2;
156 if (auxv2 & HWCAP2_SVEBITPERM) _features |= CPU_SVEBITPERM;
157
158 uint64_t ctr_el0;
159 uint64_t dczid_el0;
160 __asm__ (
161 "mrs %0, CTR_EL0\n"
162 "mrs %1, DCZID_EL0\n"
163 : "=r"(ctr_el0), "=r"(dczid_el0)
164 );
165
166 _icache_line_size = (1 << (ctr_el0 & 0x0f)) * 4;
167 _dcache_line_size = (1 << ((ctr_el0 >> 16) & 0x0f)) * 4;
168
169 if (!(dczid_el0 & 0x10)) {
170 _zva_length = 4 << (dczid_el0 & 0xf);
|