1*bbb1b6f9SApple OSS Distributions /*
2*bbb1b6f9SApple OSS Distributions * Copyright (c) 2022 Apple Computer, Inc. All rights reserved.
3*bbb1b6f9SApple OSS Distributions *
4*bbb1b6f9SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*bbb1b6f9SApple OSS Distributions *
6*bbb1b6f9SApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code
7*bbb1b6f9SApple OSS Distributions * as defined in and that are subject to the Apple Public Source License
8*bbb1b6f9SApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in
9*bbb1b6f9SApple OSS Distributions * compliance with the License. The rights granted to you under the License
10*bbb1b6f9SApple OSS Distributions * may not be used to create, or enable the creation or redistribution of,
11*bbb1b6f9SApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to
12*bbb1b6f9SApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any
13*bbb1b6f9SApple OSS Distributions * terms of an Apple operating system software license agreement.
14*bbb1b6f9SApple OSS Distributions *
15*bbb1b6f9SApple OSS Distributions * Please obtain a copy of the License at
16*bbb1b6f9SApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*bbb1b6f9SApple OSS Distributions *
18*bbb1b6f9SApple OSS Distributions * The Original Code and all software distributed under the License are
19*bbb1b6f9SApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*bbb1b6f9SApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*bbb1b6f9SApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*bbb1b6f9SApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*bbb1b6f9SApple OSS Distributions * Please see the License for the specific language governing rights and
24*bbb1b6f9SApple OSS Distributions * limitations under the License.
25*bbb1b6f9SApple OSS Distributions *
26*bbb1b6f9SApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*bbb1b6f9SApple OSS Distributions */
28*bbb1b6f9SApple OSS Distributions
29*bbb1b6f9SApple OSS Distributions #include <mach/thread_act.h>
30*bbb1b6f9SApple OSS Distributions #include <stdint.h>
31*bbb1b6f9SApple OSS Distributions #include <stdlib.h>
32*bbb1b6f9SApple OSS Distributions #include <sys/sysctl.h>
33*bbb1b6f9SApple OSS Distributions
34*bbb1b6f9SApple OSS Distributions #include "arm_matrix.h"
35*bbb1b6f9SApple OSS Distributions
36*bbb1b6f9SApple OSS Distributions const static unsigned int SME_Z_VECTORS = 32;
37*bbb1b6f9SApple OSS Distributions const static unsigned int SME_P_VECTORS = 16;
38*bbb1b6f9SApple OSS Distributions
39*bbb1b6f9SApple OSS Distributions static unsigned int
sme_version(void)40*bbb1b6f9SApple OSS Distributions sme_version(void)
41*bbb1b6f9SApple OSS Distributions {
42*bbb1b6f9SApple OSS Distributions static unsigned int ret = 0;
43*bbb1b6f9SApple OSS Distributions static bool already_read = false;
44*bbb1b6f9SApple OSS Distributions
45*bbb1b6f9SApple OSS Distributions if (!already_read) {
46*bbb1b6f9SApple OSS Distributions size_t size = sizeof(unsigned int);
47*bbb1b6f9SApple OSS Distributions unsigned int feat_sme, feat_sme2;
48*bbb1b6f9SApple OSS Distributions sysctlbyname("hw.optional.arm.FEAT_SME", &feat_sme, &size, NULL, 0);
49*bbb1b6f9SApple OSS Distributions sysctlbyname("hw.optional.arm.FEAT_SME2", &feat_sme2, &size, NULL, 0);
50*bbb1b6f9SApple OSS Distributions
51*bbb1b6f9SApple OSS Distributions if (feat_sme2) {
52*bbb1b6f9SApple OSS Distributions ret = 2;
53*bbb1b6f9SApple OSS Distributions } else if (feat_sme) {
54*bbb1b6f9SApple OSS Distributions ret = 1;
55*bbb1b6f9SApple OSS Distributions } else {
56*bbb1b6f9SApple OSS Distributions ret = 0;
57*bbb1b6f9SApple OSS Distributions }
58*bbb1b6f9SApple OSS Distributions
59*bbb1b6f9SApple OSS Distributions already_read = true;
60*bbb1b6f9SApple OSS Distributions }
61*bbb1b6f9SApple OSS Distributions
62*bbb1b6f9SApple OSS Distributions return ret;
63*bbb1b6f9SApple OSS Distributions }
64*bbb1b6f9SApple OSS Distributions
65*bbb1b6f9SApple OSS Distributions static uint16_t
arm_sme_svl_b(void)66*bbb1b6f9SApple OSS Distributions arm_sme_svl_b(void)
67*bbb1b6f9SApple OSS Distributions {
68*bbb1b6f9SApple OSS Distributions uint64_t ret = 0;
69*bbb1b6f9SApple OSS Distributions asm volatile (
70*bbb1b6f9SApple OSS Distributions "rdsvl %[ret], #1"
71*bbb1b6f9SApple OSS Distributions : [ret] "=r"(ret)
72*bbb1b6f9SApple OSS Distributions );
73*bbb1b6f9SApple OSS Distributions return (uint16_t)ret;
74*bbb1b6f9SApple OSS Distributions }
75*bbb1b6f9SApple OSS Distributions
76*bbb1b6f9SApple OSS Distributions static size_t
sme_za_size(void)77*bbb1b6f9SApple OSS Distributions sme_za_size(void)
78*bbb1b6f9SApple OSS Distributions {
79*bbb1b6f9SApple OSS Distributions return arm_sme_svl_b() * arm_sme_svl_b();
80*bbb1b6f9SApple OSS Distributions }
81*bbb1b6f9SApple OSS Distributions
82*bbb1b6f9SApple OSS Distributions static size_t
sme_z_size(void)83*bbb1b6f9SApple OSS Distributions sme_z_size(void)
84*bbb1b6f9SApple OSS Distributions {
85*bbb1b6f9SApple OSS Distributions return arm_sme_svl_b() * SME_Z_VECTORS;
86*bbb1b6f9SApple OSS Distributions }
87*bbb1b6f9SApple OSS Distributions
88*bbb1b6f9SApple OSS Distributions static size_t
sme_p_size(void)89*bbb1b6f9SApple OSS Distributions sme_p_size(void)
90*bbb1b6f9SApple OSS Distributions {
91*bbb1b6f9SApple OSS Distributions return arm_sme_svl_b() * SME_P_VECTORS / 8;
92*bbb1b6f9SApple OSS Distributions }
93*bbb1b6f9SApple OSS Distributions
94*bbb1b6f9SApple OSS Distributions static size_t
sme_zt0_size(void)95*bbb1b6f9SApple OSS Distributions sme_zt0_size(void)
96*bbb1b6f9SApple OSS Distributions {
97*bbb1b6f9SApple OSS Distributions if (sme_version() >= 2) {
98*bbb1b6f9SApple OSS Distributions return 64;
99*bbb1b6f9SApple OSS Distributions } else {
100*bbb1b6f9SApple OSS Distributions return 0;
101*bbb1b6f9SApple OSS Distributions }
102*bbb1b6f9SApple OSS Distributions }
103*bbb1b6f9SApple OSS Distributions
104*bbb1b6f9SApple OSS Distributions static size_t
sme_tpidr2_size(void)105*bbb1b6f9SApple OSS Distributions sme_tpidr2_size(void)
106*bbb1b6f9SApple OSS Distributions {
107*bbb1b6f9SApple OSS Distributions return sizeof(uint64_t);
108*bbb1b6f9SApple OSS Distributions }
109*bbb1b6f9SApple OSS Distributions
110*bbb1b6f9SApple OSS Distributions static inline uint8_t *
sme_za(void * addr)111*bbb1b6f9SApple OSS Distributions sme_za(void *addr)
112*bbb1b6f9SApple OSS Distributions {
113*bbb1b6f9SApple OSS Distributions return addr;
114*bbb1b6f9SApple OSS Distributions }
115*bbb1b6f9SApple OSS Distributions
116*bbb1b6f9SApple OSS Distributions static inline const uint8_t *
const_sme_za(const void * addr)117*bbb1b6f9SApple OSS Distributions const_sme_za(const void *addr)
118*bbb1b6f9SApple OSS Distributions {
119*bbb1b6f9SApple OSS Distributions return addr;
120*bbb1b6f9SApple OSS Distributions }
121*bbb1b6f9SApple OSS Distributions
122*bbb1b6f9SApple OSS Distributions static inline uint8_t *
sme_zt0(void * addr)123*bbb1b6f9SApple OSS Distributions sme_zt0(void *addr)
124*bbb1b6f9SApple OSS Distributions {
125*bbb1b6f9SApple OSS Distributions return sme_za(addr) + sme_za_size();
126*bbb1b6f9SApple OSS Distributions }
127*bbb1b6f9SApple OSS Distributions
128*bbb1b6f9SApple OSS Distributions static inline const uint8_t *
const_sme_zt0(const void * addr)129*bbb1b6f9SApple OSS Distributions const_sme_zt0(const void *addr)
130*bbb1b6f9SApple OSS Distributions {
131*bbb1b6f9SApple OSS Distributions return const_sme_za(addr) + sme_za_size();
132*bbb1b6f9SApple OSS Distributions }
133*bbb1b6f9SApple OSS Distributions
134*bbb1b6f9SApple OSS Distributions static inline uint8_t *
sme_tpidr2_el0(void * addr)135*bbb1b6f9SApple OSS Distributions sme_tpidr2_el0(void *addr)
136*bbb1b6f9SApple OSS Distributions {
137*bbb1b6f9SApple OSS Distributions return sme_zt0(addr) + sme_zt0_size();
138*bbb1b6f9SApple OSS Distributions }
139*bbb1b6f9SApple OSS Distributions
140*bbb1b6f9SApple OSS Distributions static inline const uint8_t *
const_sme_tpidr2_el0(const void * addr)141*bbb1b6f9SApple OSS Distributions const_sme_tpidr2_el0(const void *addr)
142*bbb1b6f9SApple OSS Distributions {
143*bbb1b6f9SApple OSS Distributions return const_sme_zt0(addr) + sme_zt0_size();
144*bbb1b6f9SApple OSS Distributions }
145*bbb1b6f9SApple OSS Distributions
146*bbb1b6f9SApple OSS Distributions static inline uint8_t *
sme_z(void * addr)147*bbb1b6f9SApple OSS Distributions sme_z(void *addr)
148*bbb1b6f9SApple OSS Distributions {
149*bbb1b6f9SApple OSS Distributions return sme_tpidr2_el0(addr) + sizeof(uint64_t);
150*bbb1b6f9SApple OSS Distributions }
151*bbb1b6f9SApple OSS Distributions
152*bbb1b6f9SApple OSS Distributions static inline const uint8_t *
const_sme_z(const void * addr)153*bbb1b6f9SApple OSS Distributions const_sme_z(const void *addr)
154*bbb1b6f9SApple OSS Distributions {
155*bbb1b6f9SApple OSS Distributions return const_sme_tpidr2_el0(addr) + sizeof(uint64_t);
156*bbb1b6f9SApple OSS Distributions }
157*bbb1b6f9SApple OSS Distributions
158*bbb1b6f9SApple OSS Distributions static inline uint8_t *
sme_p(void * addr)159*bbb1b6f9SApple OSS Distributions sme_p(void *addr)
160*bbb1b6f9SApple OSS Distributions {
161*bbb1b6f9SApple OSS Distributions return sme_z(addr) + sme_z_size();
162*bbb1b6f9SApple OSS Distributions }
163*bbb1b6f9SApple OSS Distributions
164*bbb1b6f9SApple OSS Distributions static inline const uint8_t *
const_sme_p(const void * addr)165*bbb1b6f9SApple OSS Distributions const_sme_p(const void *addr)
166*bbb1b6f9SApple OSS Distributions {
167*bbb1b6f9SApple OSS Distributions return const_sme_z(addr) + sme_z_size();
168*bbb1b6f9SApple OSS Distributions }
169*bbb1b6f9SApple OSS Distributions
170*bbb1b6f9SApple OSS Distributions static size_t
sme_data_size(void)171*bbb1b6f9SApple OSS Distributions sme_data_size(void)
172*bbb1b6f9SApple OSS Distributions {
173*bbb1b6f9SApple OSS Distributions return sme_za_size() + sme_zt0_size() + sme_tpidr2_size() + sme_z_size() + sme_p_size();
174*bbb1b6f9SApple OSS Distributions }
175*bbb1b6f9SApple OSS Distributions
176*bbb1b6f9SApple OSS Distributions static size_t
sme_za_data_size(void)177*bbb1b6f9SApple OSS Distributions sme_za_data_size(void)
178*bbb1b6f9SApple OSS Distributions {
179*bbb1b6f9SApple OSS Distributions return sme_za_size() + sme_zt0_size() + sme_tpidr2_size();
180*bbb1b6f9SApple OSS Distributions }
181*bbb1b6f9SApple OSS Distributions
182*bbb1b6f9SApple OSS Distributions static inline void
set_sme_tpidr2_el0(void * addr,uint64_t val)183*bbb1b6f9SApple OSS Distributions set_sme_tpidr2_el0(void *addr, uint64_t val)
184*bbb1b6f9SApple OSS Distributions {
185*bbb1b6f9SApple OSS Distributions uint64_t *ptr = (uint64_t *)(sme_tpidr2_el0(addr));
186*bbb1b6f9SApple OSS Distributions *ptr = val;
187*bbb1b6f9SApple OSS Distributions }
188*bbb1b6f9SApple OSS Distributions
189*bbb1b6f9SApple OSS Distributions static inline uint64_t
get_sme_tpidr2_el0(const void * addr)190*bbb1b6f9SApple OSS Distributions get_sme_tpidr2_el0(const void *addr)
191*bbb1b6f9SApple OSS Distributions {
192*bbb1b6f9SApple OSS Distributions const uint64_t *ptr = (const uint64_t *)(const_sme_tpidr2_el0(addr));
193*bbb1b6f9SApple OSS Distributions return *ptr;
194*bbb1b6f9SApple OSS Distributions }
195*bbb1b6f9SApple OSS Distributions
196*bbb1b6f9SApple OSS Distributions static void *
sme_alloc_data(void)197*bbb1b6f9SApple OSS Distributions sme_alloc_data(void)
198*bbb1b6f9SApple OSS Distributions {
199*bbb1b6f9SApple OSS Distributions return malloc(sme_data_size());
200*bbb1b6f9SApple OSS Distributions }
201*bbb1b6f9SApple OSS Distributions
202*bbb1b6f9SApple OSS Distributions static void *
sme_za_alloc_data(void)203*bbb1b6f9SApple OSS Distributions sme_za_alloc_data(void)
204*bbb1b6f9SApple OSS Distributions {
205*bbb1b6f9SApple OSS Distributions return malloc(sme_za_data_size());
206*bbb1b6f9SApple OSS Distributions }
207*bbb1b6f9SApple OSS Distributions
208*bbb1b6f9SApple OSS Distributions static bool
sme_is_available(void)209*bbb1b6f9SApple OSS Distributions sme_is_available(void)
210*bbb1b6f9SApple OSS Distributions {
211*bbb1b6f9SApple OSS Distributions return sme_version() > 0;
212*bbb1b6f9SApple OSS Distributions }
213*bbb1b6f9SApple OSS Distributions
214*bbb1b6f9SApple OSS Distributions static void
sme_start(void)215*bbb1b6f9SApple OSS Distributions sme_start(void)
216*bbb1b6f9SApple OSS Distributions {
217*bbb1b6f9SApple OSS Distributions asm volatile ("smstart");
218*bbb1b6f9SApple OSS Distributions }
219*bbb1b6f9SApple OSS Distributions
220*bbb1b6f9SApple OSS Distributions static void
sme_za_start(void)221*bbb1b6f9SApple OSS Distributions sme_za_start(void)
222*bbb1b6f9SApple OSS Distributions {
223*bbb1b6f9SApple OSS Distributions asm volatile ("smstart za");
224*bbb1b6f9SApple OSS Distributions }
225*bbb1b6f9SApple OSS Distributions
226*bbb1b6f9SApple OSS Distributions static void
sme_stop(void)227*bbb1b6f9SApple OSS Distributions sme_stop(void)
228*bbb1b6f9SApple OSS Distributions {
229*bbb1b6f9SApple OSS Distributions asm volatile ("smstop");
230*bbb1b6f9SApple OSS Distributions }
231*bbb1b6f9SApple OSS Distributions
232*bbb1b6f9SApple OSS Distributions static void
sme_za_stop(void)233*bbb1b6f9SApple OSS Distributions sme_za_stop(void)
234*bbb1b6f9SApple OSS Distributions {
235*bbb1b6f9SApple OSS Distributions asm volatile ("smstop za");
236*bbb1b6f9SApple OSS Distributions }
237*bbb1b6f9SApple OSS Distributions
238*bbb1b6f9SApple OSS Distributions static void
sme_load_one_vector(const void * addr)239*bbb1b6f9SApple OSS Distributions sme_load_one_vector(const void *addr)
240*bbb1b6f9SApple OSS Distributions {
241*bbb1b6f9SApple OSS Distributions asm volatile (
242*bbb1b6f9SApple OSS Distributions "mov w12, #0" "\n"
243*bbb1b6f9SApple OSS Distributions "ldr za[w12, #0], [%[addr]]" "\n"
244*bbb1b6f9SApple OSS Distributions :
245*bbb1b6f9SApple OSS Distributions : [addr] "r"(addr)
246*bbb1b6f9SApple OSS Distributions : "w12"
247*bbb1b6f9SApple OSS Distributions );
248*bbb1b6f9SApple OSS Distributions }
249*bbb1b6f9SApple OSS Distributions
250*bbb1b6f9SApple OSS Distributions static void
sme_za_load_data(const void * addr)251*bbb1b6f9SApple OSS Distributions sme_za_load_data(const void *addr)
252*bbb1b6f9SApple OSS Distributions {
253*bbb1b6f9SApple OSS Distributions const uint8_t *za = const_sme_za(addr);
254*bbb1b6f9SApple OSS Distributions uint16_t svl_b = arm_sme_svl_b();
255*bbb1b6f9SApple OSS Distributions
256*bbb1b6f9SApple OSS Distributions for (register uint16_t i asm("w12") = 0; i < svl_b; i += 16) {
257*bbb1b6f9SApple OSS Distributions asm volatile (
258*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #0], [%[addr], #0, mul vl]" "\n"
259*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #1], [%[addr], #1, mul vl]" "\n"
260*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #2], [%[addr], #2, mul vl]" "\n"
261*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #3], [%[addr], #3, mul vl]" "\n"
262*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #4], [%[addr], #4, mul vl]" "\n"
263*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #5], [%[addr], #5, mul vl]" "\n"
264*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #6], [%[addr], #6, mul vl]" "\n"
265*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #7], [%[addr], #7, mul vl]" "\n"
266*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #8], [%[addr], #8, mul vl]" "\n"
267*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #9], [%[addr], #9, mul vl]" "\n"
268*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #10], [%[addr], #10, mul vl]" "\n"
269*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #11], [%[addr], #11, mul vl]" "\n"
270*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #12], [%[addr], #12, mul vl]" "\n"
271*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #13], [%[addr], #13, mul vl]" "\n"
272*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #14], [%[addr], #14, mul vl]" "\n"
273*bbb1b6f9SApple OSS Distributions "ldr za[%w[i], #15], [%[addr], #15, mul vl]" "\n"
274*bbb1b6f9SApple OSS Distributions :
275*bbb1b6f9SApple OSS Distributions : [i] "r"(i),
276*bbb1b6f9SApple OSS Distributions [addr] "r"(za + (i * svl_b))
277*bbb1b6f9SApple OSS Distributions );
278*bbb1b6f9SApple OSS Distributions }
279*bbb1b6f9SApple OSS Distributions
280*bbb1b6f9SApple OSS Distributions if (sme_zt0_size()) {
281*bbb1b6f9SApple OSS Distributions const uint8_t *zt0 = const_sme_zt0(addr);
282*bbb1b6f9SApple OSS Distributions asm volatile (
283*bbb1b6f9SApple OSS Distributions "ldr zt0, [%[zt0]]"
284*bbb1b6f9SApple OSS Distributions :
285*bbb1b6f9SApple OSS Distributions : [zt0] "r"(zt0)
286*bbb1b6f9SApple OSS Distributions );
287*bbb1b6f9SApple OSS Distributions }
288*bbb1b6f9SApple OSS Distributions
289*bbb1b6f9SApple OSS Distributions __builtin_arm_wsr64("TPIDR2_EL0", get_sme_tpidr2_el0(addr));
290*bbb1b6f9SApple OSS Distributions }
291*bbb1b6f9SApple OSS Distributions
292*bbb1b6f9SApple OSS Distributions static void
sme_load_data(const void * addr)293*bbb1b6f9SApple OSS Distributions sme_load_data(const void *addr)
294*bbb1b6f9SApple OSS Distributions {
295*bbb1b6f9SApple OSS Distributions const uint8_t *z = const_sme_z(addr);
296*bbb1b6f9SApple OSS Distributions const uint8_t *p = const_sme_p(addr);
297*bbb1b6f9SApple OSS Distributions
298*bbb1b6f9SApple OSS Distributions sme_za_load_data(addr);
299*bbb1b6f9SApple OSS Distributions
300*bbb1b6f9SApple OSS Distributions asm volatile (
301*bbb1b6f9SApple OSS Distributions "ldr z0, [%[z], #0, mul vl]" "\n"
302*bbb1b6f9SApple OSS Distributions "ldr z1, [%[z], #1, mul vl]" "\n"
303*bbb1b6f9SApple OSS Distributions "ldr z2, [%[z], #2, mul vl]" "\n"
304*bbb1b6f9SApple OSS Distributions "ldr z3, [%[z], #3, mul vl]" "\n"
305*bbb1b6f9SApple OSS Distributions "ldr z4, [%[z], #4, mul vl]" "\n"
306*bbb1b6f9SApple OSS Distributions "ldr z5, [%[z], #5, mul vl]" "\n"
307*bbb1b6f9SApple OSS Distributions "ldr z6, [%[z], #6, mul vl]" "\n"
308*bbb1b6f9SApple OSS Distributions "ldr z7, [%[z], #7, mul vl]" "\n"
309*bbb1b6f9SApple OSS Distributions "ldr z8, [%[z], #8, mul vl]" "\n"
310*bbb1b6f9SApple OSS Distributions "ldr z9, [%[z], #9, mul vl]" "\n"
311*bbb1b6f9SApple OSS Distributions "ldr z10, [%[z], #10, mul vl]" "\n"
312*bbb1b6f9SApple OSS Distributions "ldr z11, [%[z], #11, mul vl]" "\n"
313*bbb1b6f9SApple OSS Distributions "ldr z12, [%[z], #12, mul vl]" "\n"
314*bbb1b6f9SApple OSS Distributions "ldr z13, [%[z], #13, mul vl]" "\n"
315*bbb1b6f9SApple OSS Distributions "ldr z14, [%[z], #14, mul vl]" "\n"
316*bbb1b6f9SApple OSS Distributions "ldr z15, [%[z], #15, mul vl]" "\n"
317*bbb1b6f9SApple OSS Distributions "ldr z16, [%[z], #16, mul vl]" "\n"
318*bbb1b6f9SApple OSS Distributions "ldr z17, [%[z], #17, mul vl]" "\n"
319*bbb1b6f9SApple OSS Distributions "ldr z18, [%[z], #18, mul vl]" "\n"
320*bbb1b6f9SApple OSS Distributions "ldr z19, [%[z], #19, mul vl]" "\n"
321*bbb1b6f9SApple OSS Distributions "ldr z20, [%[z], #20, mul vl]" "\n"
322*bbb1b6f9SApple OSS Distributions "ldr z21, [%[z], #21, mul vl]" "\n"
323*bbb1b6f9SApple OSS Distributions "ldr z22, [%[z], #22, mul vl]" "\n"
324*bbb1b6f9SApple OSS Distributions "ldr z23, [%[z], #23, mul vl]" "\n"
325*bbb1b6f9SApple OSS Distributions "ldr z24, [%[z], #24, mul vl]" "\n"
326*bbb1b6f9SApple OSS Distributions "ldr z25, [%[z], #25, mul vl]" "\n"
327*bbb1b6f9SApple OSS Distributions "ldr z26, [%[z], #26, mul vl]" "\n"
328*bbb1b6f9SApple OSS Distributions "ldr z27, [%[z], #27, mul vl]" "\n"
329*bbb1b6f9SApple OSS Distributions "ldr z28, [%[z], #28, mul vl]" "\n"
330*bbb1b6f9SApple OSS Distributions "ldr z29, [%[z], #29, mul vl]" "\n"
331*bbb1b6f9SApple OSS Distributions "ldr z30, [%[z], #30, mul vl]" "\n"
332*bbb1b6f9SApple OSS Distributions "ldr z31, [%[z], #31, mul vl]" "\n"
333*bbb1b6f9SApple OSS Distributions :
334*bbb1b6f9SApple OSS Distributions : [z] "r"(z)
335*bbb1b6f9SApple OSS Distributions );
336*bbb1b6f9SApple OSS Distributions
337*bbb1b6f9SApple OSS Distributions asm volatile (
338*bbb1b6f9SApple OSS Distributions "ldr p0, [%[p], #0, mul vl]" "\n"
339*bbb1b6f9SApple OSS Distributions "ldr p1, [%[p], #1, mul vl]" "\n"
340*bbb1b6f9SApple OSS Distributions "ldr p2, [%[p], #2, mul vl]" "\n"
341*bbb1b6f9SApple OSS Distributions "ldr p3, [%[p], #3, mul vl]" "\n"
342*bbb1b6f9SApple OSS Distributions "ldr p4, [%[p], #4, mul vl]" "\n"
343*bbb1b6f9SApple OSS Distributions "ldr p5, [%[p], #5, mul vl]" "\n"
344*bbb1b6f9SApple OSS Distributions "ldr p6, [%[p], #6, mul vl]" "\n"
345*bbb1b6f9SApple OSS Distributions "ldr p7, [%[p], #7, mul vl]" "\n"
346*bbb1b6f9SApple OSS Distributions "ldr p8, [%[p], #8, mul vl]" "\n"
347*bbb1b6f9SApple OSS Distributions "ldr p9, [%[p], #9, mul vl]" "\n"
348*bbb1b6f9SApple OSS Distributions "ldr p10, [%[p], #10, mul vl]" "\n"
349*bbb1b6f9SApple OSS Distributions "ldr p11, [%[p], #11, mul vl]" "\n"
350*bbb1b6f9SApple OSS Distributions "ldr p12, [%[p], #12, mul vl]" "\n"
351*bbb1b6f9SApple OSS Distributions "ldr p13, [%[p], #13, mul vl]" "\n"
352*bbb1b6f9SApple OSS Distributions "ldr p14, [%[p], #14, mul vl]" "\n"
353*bbb1b6f9SApple OSS Distributions "ldr p15, [%[p], #15, mul vl]" "\n"
354*bbb1b6f9SApple OSS Distributions :
355*bbb1b6f9SApple OSS Distributions : [p] "r"(p)
356*bbb1b6f9SApple OSS Distributions );
357*bbb1b6f9SApple OSS Distributions }
358*bbb1b6f9SApple OSS Distributions
359*bbb1b6f9SApple OSS Distributions static void
sme_za_store_data(void * addr)360*bbb1b6f9SApple OSS Distributions sme_za_store_data(void *addr)
361*bbb1b6f9SApple OSS Distributions {
362*bbb1b6f9SApple OSS Distributions uint8_t *za = sme_za(addr);
363*bbb1b6f9SApple OSS Distributions uint16_t svl_b = arm_sme_svl_b();
364*bbb1b6f9SApple OSS Distributions
365*bbb1b6f9SApple OSS Distributions for (register uint16_t i asm("w12") = 0; i < svl_b; i += 16) {
366*bbb1b6f9SApple OSS Distributions asm volatile (
367*bbb1b6f9SApple OSS Distributions "str za[%w[i], #0], [%[addr], #0, mul vl]" "\n"
368*bbb1b6f9SApple OSS Distributions "str za[%w[i], #1], [%[addr], #1, mul vl]" "\n"
369*bbb1b6f9SApple OSS Distributions "str za[%w[i], #2], [%[addr], #2, mul vl]" "\n"
370*bbb1b6f9SApple OSS Distributions "str za[%w[i], #3], [%[addr], #3, mul vl]" "\n"
371*bbb1b6f9SApple OSS Distributions "str za[%w[i], #4], [%[addr], #4, mul vl]" "\n"
372*bbb1b6f9SApple OSS Distributions "str za[%w[i], #5], [%[addr], #5, mul vl]" "\n"
373*bbb1b6f9SApple OSS Distributions "str za[%w[i], #6], [%[addr], #6, mul vl]" "\n"
374*bbb1b6f9SApple OSS Distributions "str za[%w[i], #7], [%[addr], #7, mul vl]" "\n"
375*bbb1b6f9SApple OSS Distributions "str za[%w[i], #8], [%[addr], #8, mul vl]" "\n"
376*bbb1b6f9SApple OSS Distributions "str za[%w[i], #9], [%[addr], #9, mul vl]" "\n"
377*bbb1b6f9SApple OSS Distributions "str za[%w[i], #10], [%[addr], #10, mul vl]" "\n"
378*bbb1b6f9SApple OSS Distributions "str za[%w[i], #11], [%[addr], #11, mul vl]" "\n"
379*bbb1b6f9SApple OSS Distributions "str za[%w[i], #12], [%[addr], #12, mul vl]" "\n"
380*bbb1b6f9SApple OSS Distributions "str za[%w[i], #13], [%[addr], #13, mul vl]" "\n"
381*bbb1b6f9SApple OSS Distributions "str za[%w[i], #14], [%[addr], #14, mul vl]" "\n"
382*bbb1b6f9SApple OSS Distributions "str za[%w[i], #15], [%[addr], #15, mul vl]" "\n"
383*bbb1b6f9SApple OSS Distributions :
384*bbb1b6f9SApple OSS Distributions : [i] "r"(i),
385*bbb1b6f9SApple OSS Distributions [addr] "r"(za + (i * svl_b))
386*bbb1b6f9SApple OSS Distributions );
387*bbb1b6f9SApple OSS Distributions }
388*bbb1b6f9SApple OSS Distributions
389*bbb1b6f9SApple OSS Distributions if (sme_zt0_size()) {
390*bbb1b6f9SApple OSS Distributions uint8_t *zt0 = sme_zt0(addr);
391*bbb1b6f9SApple OSS Distributions asm volatile (
392*bbb1b6f9SApple OSS Distributions "str zt0, [%[zt0]]"
393*bbb1b6f9SApple OSS Distributions :
394*bbb1b6f9SApple OSS Distributions : [zt0] "r"(zt0)
395*bbb1b6f9SApple OSS Distributions );
396*bbb1b6f9SApple OSS Distributions }
397*bbb1b6f9SApple OSS Distributions
398*bbb1b6f9SApple OSS Distributions set_sme_tpidr2_el0(addr, __builtin_arm_rsr64("TPIDR2_EL0"));
399*bbb1b6f9SApple OSS Distributions }
400*bbb1b6f9SApple OSS Distributions
401*bbb1b6f9SApple OSS Distributions static void
sme_store_data(void * addr)402*bbb1b6f9SApple OSS Distributions sme_store_data(void *addr)
403*bbb1b6f9SApple OSS Distributions {
404*bbb1b6f9SApple OSS Distributions uint8_t *z = sme_z(addr);
405*bbb1b6f9SApple OSS Distributions uint8_t *p = sme_p(addr);
406*bbb1b6f9SApple OSS Distributions
407*bbb1b6f9SApple OSS Distributions sme_za_store_data(addr);
408*bbb1b6f9SApple OSS Distributions
409*bbb1b6f9SApple OSS Distributions asm volatile (
410*bbb1b6f9SApple OSS Distributions "str z0, [%[z], #0, mul vl]" "\n"
411*bbb1b6f9SApple OSS Distributions "str z1, [%[z], #1, mul vl]" "\n"
412*bbb1b6f9SApple OSS Distributions "str z2, [%[z], #2, mul vl]" "\n"
413*bbb1b6f9SApple OSS Distributions "str z3, [%[z], #3, mul vl]" "\n"
414*bbb1b6f9SApple OSS Distributions "str z4, [%[z], #4, mul vl]" "\n"
415*bbb1b6f9SApple OSS Distributions "str z5, [%[z], #5, mul vl]" "\n"
416*bbb1b6f9SApple OSS Distributions "str z6, [%[z], #6, mul vl]" "\n"
417*bbb1b6f9SApple OSS Distributions "str z7, [%[z], #7, mul vl]" "\n"
418*bbb1b6f9SApple OSS Distributions "str z8, [%[z], #8, mul vl]" "\n"
419*bbb1b6f9SApple OSS Distributions "str z9, [%[z], #9, mul vl]" "\n"
420*bbb1b6f9SApple OSS Distributions "str z10, [%[z], #10, mul vl]" "\n"
421*bbb1b6f9SApple OSS Distributions "str z11, [%[z], #11, mul vl]" "\n"
422*bbb1b6f9SApple OSS Distributions "str z12, [%[z], #12, mul vl]" "\n"
423*bbb1b6f9SApple OSS Distributions "str z13, [%[z], #13, mul vl]" "\n"
424*bbb1b6f9SApple OSS Distributions "str z14, [%[z], #14, mul vl]" "\n"
425*bbb1b6f9SApple OSS Distributions "str z15, [%[z], #15, mul vl]" "\n"
426*bbb1b6f9SApple OSS Distributions "str z16, [%[z], #16, mul vl]" "\n"
427*bbb1b6f9SApple OSS Distributions "str z17, [%[z], #17, mul vl]" "\n"
428*bbb1b6f9SApple OSS Distributions "str z18, [%[z], #18, mul vl]" "\n"
429*bbb1b6f9SApple OSS Distributions "str z19, [%[z], #19, mul vl]" "\n"
430*bbb1b6f9SApple OSS Distributions "str z20, [%[z], #20, mul vl]" "\n"
431*bbb1b6f9SApple OSS Distributions "str z21, [%[z], #21, mul vl]" "\n"
432*bbb1b6f9SApple OSS Distributions "str z22, [%[z], #22, mul vl]" "\n"
433*bbb1b6f9SApple OSS Distributions "str z23, [%[z], #23, mul vl]" "\n"
434*bbb1b6f9SApple OSS Distributions "str z24, [%[z], #24, mul vl]" "\n"
435*bbb1b6f9SApple OSS Distributions "str z25, [%[z], #25, mul vl]" "\n"
436*bbb1b6f9SApple OSS Distributions "str z26, [%[z], #26, mul vl]" "\n"
437*bbb1b6f9SApple OSS Distributions "str z27, [%[z], #27, mul vl]" "\n"
438*bbb1b6f9SApple OSS Distributions "str z28, [%[z], #28, mul vl]" "\n"
439*bbb1b6f9SApple OSS Distributions "str z29, [%[z], #29, mul vl]" "\n"
440*bbb1b6f9SApple OSS Distributions "str z30, [%[z], #30, mul vl]" "\n"
441*bbb1b6f9SApple OSS Distributions "str z31, [%[z], #31, mul vl]" "\n"
442*bbb1b6f9SApple OSS Distributions :
443*bbb1b6f9SApple OSS Distributions : [z] "r"(z)
444*bbb1b6f9SApple OSS Distributions );
445*bbb1b6f9SApple OSS Distributions
446*bbb1b6f9SApple OSS Distributions asm volatile (
447*bbb1b6f9SApple OSS Distributions "str p0, [%[p], #0, mul vl]" "\n"
448*bbb1b6f9SApple OSS Distributions "str p1, [%[p], #1, mul vl]" "\n"
449*bbb1b6f9SApple OSS Distributions "str p2, [%[p], #2, mul vl]" "\n"
450*bbb1b6f9SApple OSS Distributions "str p3, [%[p], #3, mul vl]" "\n"
451*bbb1b6f9SApple OSS Distributions "str p4, [%[p], #4, mul vl]" "\n"
452*bbb1b6f9SApple OSS Distributions "str p5, [%[p], #5, mul vl]" "\n"
453*bbb1b6f9SApple OSS Distributions "str p6, [%[p], #6, mul vl]" "\n"
454*bbb1b6f9SApple OSS Distributions "str p7, [%[p], #7, mul vl]" "\n"
455*bbb1b6f9SApple OSS Distributions "str p8, [%[p], #8, mul vl]" "\n"
456*bbb1b6f9SApple OSS Distributions "str p9, [%[p], #9, mul vl]" "\n"
457*bbb1b6f9SApple OSS Distributions "str p10, [%[p], #10, mul vl]" "\n"
458*bbb1b6f9SApple OSS Distributions "str p11, [%[p], #11, mul vl]" "\n"
459*bbb1b6f9SApple OSS Distributions "str p12, [%[p], #12, mul vl]" "\n"
460*bbb1b6f9SApple OSS Distributions "str p13, [%[p], #13, mul vl]" "\n"
461*bbb1b6f9SApple OSS Distributions "str p14, [%[p], #14, mul vl]" "\n"
462*bbb1b6f9SApple OSS Distributions "str p15, [%[p], #15, mul vl]" "\n"
463*bbb1b6f9SApple OSS Distributions :
464*bbb1b6f9SApple OSS Distributions : [p] "r"(p)
465*bbb1b6f9SApple OSS Distributions );
466*bbb1b6f9SApple OSS Distributions }
467*bbb1b6f9SApple OSS Distributions
468*bbb1b6f9SApple OSS Distributions static kern_return_t
sme_thread_get_state(thread_act_t thread,void * addr)469*bbb1b6f9SApple OSS Distributions sme_thread_get_state(thread_act_t thread, void *addr)
470*bbb1b6f9SApple OSS Distributions {
471*bbb1b6f9SApple OSS Distributions uint8_t *za = sme_za(addr);
472*bbb1b6f9SApple OSS Distributions uint8_t *z = sme_z(addr);
473*bbb1b6f9SApple OSS Distributions uint8_t *p = sme_p(addr);
474*bbb1b6f9SApple OSS Distributions uint16_t svl_b = arm_sme_svl_b();
475*bbb1b6f9SApple OSS Distributions
476*bbb1b6f9SApple OSS Distributions arm_sme_state_t sme_state;
477*bbb1b6f9SApple OSS Distributions mach_msg_type_number_t sme_count = ARM_SME_STATE_COUNT;
478*bbb1b6f9SApple OSS Distributions kern_return_t err = thread_get_state(thread, ARM_SME_STATE, (thread_state_t)&sme_state, &sme_count);
479*bbb1b6f9SApple OSS Distributions if (err) {
480*bbb1b6f9SApple OSS Distributions return err;
481*bbb1b6f9SApple OSS Distributions }
482*bbb1b6f9SApple OSS Distributions set_sme_tpidr2_el0(addr, sme_state.__tpidr2_el0);
483*bbb1b6f9SApple OSS Distributions
484*bbb1b6f9SApple OSS Distributions arm_sme_za_state_t za_state;
485*bbb1b6f9SApple OSS Distributions mach_msg_type_number_t za_count = ARM_SME_ZA_STATE_COUNT;
486*bbb1b6f9SApple OSS Distributions err = thread_get_state(thread, ARM_SME_ZA_STATE1, (thread_state_t)&za_state, &za_count);
487*bbb1b6f9SApple OSS Distributions if (err) {
488*bbb1b6f9SApple OSS Distributions return err;
489*bbb1b6f9SApple OSS Distributions }
490*bbb1b6f9SApple OSS Distributions
491*bbb1b6f9SApple OSS Distributions arm_sve_z_state_t z_state1, z_state2;
492*bbb1b6f9SApple OSS Distributions mach_msg_type_number_t z_streaming_count = ARM_SVE_Z_STATE_COUNT;
493*bbb1b6f9SApple OSS Distributions err = thread_get_state(thread, ARM_SVE_Z_STATE1, (thread_state_t)&z_state1, &z_streaming_count);
494*bbb1b6f9SApple OSS Distributions if (err) {
495*bbb1b6f9SApple OSS Distributions return err;
496*bbb1b6f9SApple OSS Distributions }
497*bbb1b6f9SApple OSS Distributions err = thread_get_state(thread, ARM_SVE_Z_STATE2, (thread_state_t)&z_state2, &z_streaming_count);
498*bbb1b6f9SApple OSS Distributions if (err) {
499*bbb1b6f9SApple OSS Distributions return err;
500*bbb1b6f9SApple OSS Distributions }
501*bbb1b6f9SApple OSS Distributions
502*bbb1b6f9SApple OSS Distributions arm_sve_p_state_t p_state;
503*bbb1b6f9SApple OSS Distributions mach_msg_type_number_t p_streaming_count = ARM_SVE_P_STATE_COUNT;
504*bbb1b6f9SApple OSS Distributions err = thread_get_state(thread, ARM_SVE_P_STATE, (thread_state_t)&p_state, &p_streaming_count);
505*bbb1b6f9SApple OSS Distributions if (err) {
506*bbb1b6f9SApple OSS Distributions return err;
507*bbb1b6f9SApple OSS Distributions }
508*bbb1b6f9SApple OSS Distributions
509*bbb1b6f9SApple OSS Distributions memcpy(za, za_state.__za, svl_b * svl_b);
510*bbb1b6f9SApple OSS Distributions
511*bbb1b6f9SApple OSS Distributions size_t z_elem_size = svl_b;
512*bbb1b6f9SApple OSS Distributions for (int i = 0; i < 16; i++) {
513*bbb1b6f9SApple OSS Distributions memcpy(z, z_state1.__z[i], z_elem_size);
514*bbb1b6f9SApple OSS Distributions z += z_elem_size;
515*bbb1b6f9SApple OSS Distributions }
516*bbb1b6f9SApple OSS Distributions for (int i = 0; i < 16; i++) {
517*bbb1b6f9SApple OSS Distributions memcpy(z, z_state2.__z[i], z_elem_size);
518*bbb1b6f9SApple OSS Distributions z += z_elem_size;
519*bbb1b6f9SApple OSS Distributions }
520*bbb1b6f9SApple OSS Distributions
521*bbb1b6f9SApple OSS Distributions size_t p_elem_size = svl_b / 8;
522*bbb1b6f9SApple OSS Distributions for (int i = 0; i < 16; i++) {
523*bbb1b6f9SApple OSS Distributions memcpy(p, p_state.__p[i], p_elem_size);
524*bbb1b6f9SApple OSS Distributions p += p_elem_size;
525*bbb1b6f9SApple OSS Distributions }
526*bbb1b6f9SApple OSS Distributions
527*bbb1b6f9SApple OSS Distributions if (sme_zt0_size()) {
528*bbb1b6f9SApple OSS Distributions uint8_t *zt0 = sme_zt0(addr);
529*bbb1b6f9SApple OSS Distributions
530*bbb1b6f9SApple OSS Distributions arm_sme2_state_t sme2_state;
531*bbb1b6f9SApple OSS Distributions mach_msg_type_number_t sme2_count = ARM_SME2_STATE_COUNT;
532*bbb1b6f9SApple OSS Distributions err = thread_get_state(thread, ARM_SME2_STATE, (thread_state_t)&sme2_state, &sme2_count);
533*bbb1b6f9SApple OSS Distributions if (err) {
534*bbb1b6f9SApple OSS Distributions return err;
535*bbb1b6f9SApple OSS Distributions }
536*bbb1b6f9SApple OSS Distributions
537*bbb1b6f9SApple OSS Distributions memcpy(zt0, sme2_state.__zt0, sizeof(sme2_state.__zt0));
538*bbb1b6f9SApple OSS Distributions }
539*bbb1b6f9SApple OSS Distributions
540*bbb1b6f9SApple OSS Distributions return KERN_SUCCESS;
541*bbb1b6f9SApple OSS Distributions }
542*bbb1b6f9SApple OSS Distributions
543*bbb1b6f9SApple OSS Distributions static kern_return_t
sme_thread_set_state(thread_act_t thread,const void * addr)544*bbb1b6f9SApple OSS Distributions sme_thread_set_state(thread_act_t thread, const void *addr)
545*bbb1b6f9SApple OSS Distributions {
546*bbb1b6f9SApple OSS Distributions const uint8_t *za = const_sme_za(addr);
547*bbb1b6f9SApple OSS Distributions const uint8_t *z = const_sme_z(addr);
548*bbb1b6f9SApple OSS Distributions const uint8_t *p = const_sme_p(addr);
549*bbb1b6f9SApple OSS Distributions uint16_t svl_b = arm_sme_svl_b();
550*bbb1b6f9SApple OSS Distributions
551*bbb1b6f9SApple OSS Distributions arm_sme_state_t sme_state;
552*bbb1b6f9SApple OSS Distributions sme_state.__svcr = 0x3;
553*bbb1b6f9SApple OSS Distributions sme_state.__svl_b = svl_b;
554*bbb1b6f9SApple OSS Distributions sme_state.__tpidr2_el0 = get_sme_tpidr2_el0(addr);
555*bbb1b6f9SApple OSS Distributions
556*bbb1b6f9SApple OSS Distributions arm_sme_za_state_t za_state;
557*bbb1b6f9SApple OSS Distributions memcpy(za_state.__za, za, svl_b * svl_b);
558*bbb1b6f9SApple OSS Distributions
559*bbb1b6f9SApple OSS Distributions arm_sve_z_state_t z_state1, z_state2;
560*bbb1b6f9SApple OSS Distributions size_t z_elem_size = svl_b;
561*bbb1b6f9SApple OSS Distributions for (int i = 0; i < 16; i++) {
562*bbb1b6f9SApple OSS Distributions memcpy(z_state1.__z[i], z, z_elem_size);
563*bbb1b6f9SApple OSS Distributions z += z_elem_size;
564*bbb1b6f9SApple OSS Distributions }
565*bbb1b6f9SApple OSS Distributions for (int i = 0; i < 16; i++) {
566*bbb1b6f9SApple OSS Distributions memcpy(z_state2.__z[i], z, z_elem_size);
567*bbb1b6f9SApple OSS Distributions z += z_elem_size;
568*bbb1b6f9SApple OSS Distributions }
569*bbb1b6f9SApple OSS Distributions
570*bbb1b6f9SApple OSS Distributions arm_sve_p_state_t p_state;
571*bbb1b6f9SApple OSS Distributions size_t p_elem_size = svl_b / 8;
572*bbb1b6f9SApple OSS Distributions for (int i = 0; i < 16; i++) {
573*bbb1b6f9SApple OSS Distributions memcpy(p_state.__p[i], p, p_elem_size);
574*bbb1b6f9SApple OSS Distributions p += p_elem_size;
575*bbb1b6f9SApple OSS Distributions }
576*bbb1b6f9SApple OSS Distributions
577*bbb1b6f9SApple OSS Distributions kern_return_t err = thread_set_state(thread, ARM_SME_STATE, (thread_state_t)&sme_state, ARM_SME_STATE_COUNT);
578*bbb1b6f9SApple OSS Distributions if (err) {
579*bbb1b6f9SApple OSS Distributions return err;
580*bbb1b6f9SApple OSS Distributions }
581*bbb1b6f9SApple OSS Distributions
582*bbb1b6f9SApple OSS Distributions err = thread_set_state(thread, ARM_SVE_Z_STATE1, (thread_state_t)&z_state1, ARM_SVE_Z_STATE_COUNT);
583*bbb1b6f9SApple OSS Distributions if (err) {
584*bbb1b6f9SApple OSS Distributions return err;
585*bbb1b6f9SApple OSS Distributions }
586*bbb1b6f9SApple OSS Distributions
587*bbb1b6f9SApple OSS Distributions err = thread_set_state(thread, ARM_SVE_Z_STATE2, (thread_state_t)&z_state2, ARM_SVE_Z_STATE_COUNT);
588*bbb1b6f9SApple OSS Distributions if (err) {
589*bbb1b6f9SApple OSS Distributions return err;
590*bbb1b6f9SApple OSS Distributions }
591*bbb1b6f9SApple OSS Distributions
592*bbb1b6f9SApple OSS Distributions err = thread_set_state(thread, ARM_SVE_P_STATE, (thread_state_t)&p_state, ARM_SVE_P_STATE_COUNT);
593*bbb1b6f9SApple OSS Distributions if (err) {
594*bbb1b6f9SApple OSS Distributions return err;
595*bbb1b6f9SApple OSS Distributions }
596*bbb1b6f9SApple OSS Distributions
597*bbb1b6f9SApple OSS Distributions err = thread_set_state(thread, ARM_SME_ZA_STATE1, (thread_state_t)&za_state, ARM_SME_ZA_STATE_COUNT);
598*bbb1b6f9SApple OSS Distributions if (err) {
599*bbb1b6f9SApple OSS Distributions return err;
600*bbb1b6f9SApple OSS Distributions }
601*bbb1b6f9SApple OSS Distributions
602*bbb1b6f9SApple OSS Distributions if (sme_zt0_size()) {
603*bbb1b6f9SApple OSS Distributions const uint8_t *zt0 = const_sme_zt0(addr);
604*bbb1b6f9SApple OSS Distributions
605*bbb1b6f9SApple OSS Distributions arm_sme2_state_t sme2_state;
606*bbb1b6f9SApple OSS Distributions memcpy(sme2_state.__zt0, zt0, sizeof(sme2_state.__zt0));
607*bbb1b6f9SApple OSS Distributions
608*bbb1b6f9SApple OSS Distributions err = thread_set_state(thread, ARM_SME2_STATE, (thread_state_t)&sme2_state, ARM_SME2_STATE_COUNT);
609*bbb1b6f9SApple OSS Distributions if (err) {
610*bbb1b6f9SApple OSS Distributions return err;
611*bbb1b6f9SApple OSS Distributions }
612*bbb1b6f9SApple OSS Distributions }
613*bbb1b6f9SApple OSS Distributions
614*bbb1b6f9SApple OSS Distributions return KERN_SUCCESS;
615*bbb1b6f9SApple OSS Distributions }
616*bbb1b6f9SApple OSS Distributions
617*bbb1b6f9SApple OSS Distributions const struct arm_matrix_operations sme_operations = {
618*bbb1b6f9SApple OSS Distributions .name = "SME",
619*bbb1b6f9SApple OSS Distributions
620*bbb1b6f9SApple OSS Distributions .data_size = sme_data_size,
621*bbb1b6f9SApple OSS Distributions .alloc_data = sme_alloc_data,
622*bbb1b6f9SApple OSS Distributions
623*bbb1b6f9SApple OSS Distributions .is_available = sme_is_available,
624*bbb1b6f9SApple OSS Distributions .start = sme_start,
625*bbb1b6f9SApple OSS Distributions .stop = sme_stop,
626*bbb1b6f9SApple OSS Distributions
627*bbb1b6f9SApple OSS Distributions .load_one_vector = sme_load_one_vector,
628*bbb1b6f9SApple OSS Distributions .load_data = sme_load_data,
629*bbb1b6f9SApple OSS Distributions .store_data = sme_store_data,
630*bbb1b6f9SApple OSS Distributions
631*bbb1b6f9SApple OSS Distributions .thread_get_state = sme_thread_get_state,
632*bbb1b6f9SApple OSS Distributions .thread_set_state = sme_thread_set_state,
633*bbb1b6f9SApple OSS Distributions };
634*bbb1b6f9SApple OSS Distributions
635*bbb1b6f9SApple OSS Distributions const struct arm_matrix_operations sme_za_operations = {
636*bbb1b6f9SApple OSS Distributions .name = "SME (SVCR.ZA only)",
637*bbb1b6f9SApple OSS Distributions
638*bbb1b6f9SApple OSS Distributions .data_size = sme_za_data_size,
639*bbb1b6f9SApple OSS Distributions .alloc_data = sme_za_alloc_data,
640*bbb1b6f9SApple OSS Distributions
641*bbb1b6f9SApple OSS Distributions .is_available = sme_is_available,
642*bbb1b6f9SApple OSS Distributions .start = sme_za_start,
643*bbb1b6f9SApple OSS Distributions .stop = sme_za_stop,
644*bbb1b6f9SApple OSS Distributions
645*bbb1b6f9SApple OSS Distributions .load_one_vector = NULL, /* currently unused */
646*bbb1b6f9SApple OSS Distributions .load_data = sme_za_load_data,
647*bbb1b6f9SApple OSS Distributions .store_data = sme_za_store_data,
648*bbb1b6f9SApple OSS Distributions
649*bbb1b6f9SApple OSS Distributions .thread_get_state = NULL, /* currently unused */
650*bbb1b6f9SApple OSS Distributions .thread_set_state = NULL, /* currently unused */
651*bbb1b6f9SApple OSS Distributions };
652