2929#include <string.h>
3030#include "kvm_util.h"
3131#include "test_util.h"
32+ #include "processor.h"
33+
34+ #ifdef REG_LIST_SVE
35+ #define reg_list_sve () (true)
36+ #else
37+ #define reg_list_sve () (false)
38+ #endif
3239
3340#define REG_MASK (KVM_REG_ARCH_MASK | KVM_REG_SIZE_MASK | KVM_REG_ARM_COPROC_MASK)
3441
4653
4754static struct kvm_reg_list * reg_list ;
4855
49- static __u64 blessed_reg [];
50- static __u64 blessed_n ;
56+ static __u64 base_regs [], vregs [], sve_regs [], rejects_set [];
57+ static __u64 base_regs_n , vregs_n , sve_regs_n , rejects_set_n ;
58+ static __u64 * blessed_reg , blessed_n ;
5159
5260static bool find_reg (__u64 regs [], __u64 nr_regs , __u64 reg )
5361{
@@ -119,6 +127,40 @@ static const char *core_id_to_str(__u64 id)
119127 return NULL ;
120128}
121129
130+ static const char * sve_id_to_str (__u64 id )
131+ {
132+ __u64 sve_off , n , i ;
133+
134+ if (id == KVM_REG_ARM64_SVE_VLS )
135+ return "KVM_REG_ARM64_SVE_VLS" ;
136+
137+ sve_off = id & ~(REG_MASK | ((1ULL << 5 ) - 1 ));
138+ i = id & (KVM_ARM64_SVE_MAX_SLICES - 1 );
139+
140+ TEST_ASSERT (i == 0 , "Currently we don't expect slice > 0, reg id 0x%llx" , id );
141+
142+ switch (sve_off ) {
143+ case KVM_REG_ARM64_SVE_ZREG_BASE ...
144+ KVM_REG_ARM64_SVE_ZREG_BASE + (1ULL << 5 ) * KVM_ARM64_SVE_NUM_ZREGS - 1 :
145+ n = (id >> 5 ) & (KVM_ARM64_SVE_NUM_ZREGS - 1 );
146+ TEST_ASSERT (id == KVM_REG_ARM64_SVE_ZREG (n , 0 ),
147+ "Unexpected bits set in SVE ZREG id: 0x%llx" , id );
148+ return str_with_index ("KVM_REG_ARM64_SVE_ZREG(##, 0)" , n );
149+ case KVM_REG_ARM64_SVE_PREG_BASE ...
150+ KVM_REG_ARM64_SVE_PREG_BASE + (1ULL << 5 ) * KVM_ARM64_SVE_NUM_PREGS - 1 :
151+ n = (id >> 5 ) & (KVM_ARM64_SVE_NUM_PREGS - 1 );
152+ TEST_ASSERT (id == KVM_REG_ARM64_SVE_PREG (n , 0 ),
153+ "Unexpected bits set in SVE PREG id: 0x%llx" , id );
154+ return str_with_index ("KVM_REG_ARM64_SVE_PREG(##, 0)" , n );
155+ case KVM_REG_ARM64_SVE_FFR_BASE :
156+ TEST_ASSERT (id == KVM_REG_ARM64_SVE_FFR (0 ),
157+ "Unexpected bits set in SVE FFR id: 0x%llx" , id );
158+ return "KVM_REG_ARM64_SVE_FFR(0)" ;
159+ }
160+
161+ return NULL ;
162+ }
163+
122164static void print_reg (__u64 id )
123165{
124166 unsigned op0 , op1 , crn , crm , op2 ;
@@ -186,7 +228,10 @@ static void print_reg(__u64 id)
186228 printf ("\tKVM_REG_ARM_FW_REG(%lld),\n" , id & 0xffff );
187229 break ;
188230 case KVM_REG_ARM64_SVE :
189- TEST_FAIL ("KVM_REG_ARM64_SVE is an unexpected coproc type in reg id: 0x%llx" , id );
231+ if (reg_list_sve ())
232+ printf ("\t%s,\n" , sve_id_to_str (id ));
233+ else
234+ TEST_FAIL ("KVM_REG_ARM64_SVE is an unexpected coproc type in reg id: 0x%llx" , id );
190235 break ;
191236 default :
192237 TEST_FAIL ("Unexpected coproc type: 0x%llx in reg id: 0x%llx" ,
@@ -251,12 +296,40 @@ static void core_reg_fixup(void)
251296 reg_list = tmp ;
252297}
253298
299+ static void prepare_vcpu_init (struct kvm_vcpu_init * init )
300+ {
301+ if (reg_list_sve ())
302+ init -> features [0 ] |= 1 << KVM_ARM_VCPU_SVE ;
303+ }
304+
305+ static void finalize_vcpu (struct kvm_vm * vm , uint32_t vcpuid )
306+ {
307+ int feature ;
308+
309+ if (reg_list_sve ()) {
310+ feature = KVM_ARM_VCPU_SVE ;
311+ vcpu_ioctl (vm , vcpuid , KVM_ARM_VCPU_FINALIZE , & feature );
312+ }
313+ }
314+
315+ static void check_supported (void )
316+ {
317+ if (reg_list_sve () && !kvm_check_cap (KVM_CAP_ARM_SVE )) {
318+ fprintf (stderr , "SVE not available, skipping tests\n" );
319+ exit (KSFT_SKIP );
320+ }
321+ }
322+
254323int main (int ac , char * * av )
255324{
325+ struct kvm_vcpu_init init = { .target = -1 , };
256326 int new_regs = 0 , missing_regs = 0 , i ;
257- int failed_get = 0 , failed_set = 0 ;
327+ int failed_get = 0 , failed_set = 0 , failed_reject = 0 ;
258328 bool print_list = false, fixup_core_regs = false;
259329 struct kvm_vm * vm ;
330+ __u64 * vec_regs ;
331+
332+ check_supported ();
260333
261334 for (i = 1 ; i < ac ; ++ i ) {
262335 if (strcmp (av [i ], "--core-reg-fixup" ) == 0 )
@@ -267,7 +340,11 @@ int main(int ac, char **av)
267340 fprintf (stderr , "Ignoring unknown option: %s\n" , av [i ]);
268341 }
269342
270- vm = vm_create_default (0 , 0 , NULL );
343+ vm = vm_create (VM_MODE_DEFAULT , DEFAULT_GUEST_PHY_PAGES , O_RDWR );
344+ prepare_vcpu_init (& init );
345+ aarch64_vcpu_add_default (vm , 0 , & init , NULL );
346+ finalize_vcpu (vm , 0 );
347+
271348 reg_list = vcpu_get_reg_list (vm , 0 );
272349
273350 if (fixup_core_regs )
@@ -307,6 +384,18 @@ int main(int ac, char **av)
307384 ++ failed_get ;
308385 }
309386
387+ /* rejects_set registers are rejected after KVM_ARM_VCPU_FINALIZE */
388+ if (find_reg (rejects_set , rejects_set_n , reg .id )) {
389+ ret = _vcpu_ioctl (vm , 0 , KVM_SET_ONE_REG , & reg );
390+ if (ret != -1 || errno != EPERM ) {
391+ printf ("Failed to reject (ret=%d, errno=%d) " , ret , errno );
392+ print_reg (reg .id );
393+ putchar ('\n' );
394+ ++ failed_reject ;
395+ }
396+ continue ;
397+ }
398+
310399 ret = _vcpu_ioctl (vm , 0 , KVM_SET_ONE_REG , & reg );
311400 if (ret ) {
312401 puts ("Failed to set " );
@@ -316,6 +405,20 @@ int main(int ac, char **av)
316405 }
317406 }
318407
408+ if (reg_list_sve ()) {
409+ blessed_n = base_regs_n + sve_regs_n ;
410+ vec_regs = sve_regs ;
411+ } else {
412+ blessed_n = base_regs_n + vregs_n ;
413+ vec_regs = vregs ;
414+ }
415+
416+ blessed_reg = calloc (blessed_n , sizeof (__u64 ));
417+ for (i = 0 ; i < base_regs_n ; ++ i )
418+ blessed_reg [i ] = base_regs [i ];
419+ for (i = 0 ; i < blessed_n - base_regs_n ; ++ i )
420+ blessed_reg [base_regs_n + i ] = vec_regs [i ];
421+
319422 for_each_new_reg (i )
320423 ++ new_regs ;
321424
@@ -344,9 +447,10 @@ int main(int ac, char **av)
344447 putchar ('\n' );
345448 }
346449
347- TEST_ASSERT (!missing_regs && !failed_get && !failed_set ,
348- "There are %d missing registers; %d registers failed get; %d registers failed set" ,
349- missing_regs , failed_get , failed_set );
450+ TEST_ASSERT (!missing_regs && !failed_get && !failed_set && !failed_reject ,
451+ "There are %d missing registers; "
452+ "%d registers failed get; %d registers failed set; %d registers failed reject" ,
453+ missing_regs , failed_get , failed_set , failed_reject );
350454
351455 return 0 ;
352456}
@@ -355,7 +459,7 @@ int main(int ac, char **av)
355459 * The current blessed list was primed with the output of kernel version
356460 * v4.15 with --core-reg-fixup and then later updated with new registers.
357461 */
358- static __u64 blessed_reg [] = {
462+ static __u64 base_regs [] = {
359463 KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (regs .regs [0 ]),
360464 KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (regs .regs [1 ]),
361465 KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (regs .regs [2 ]),
@@ -397,38 +501,6 @@ static __u64 blessed_reg[] = {
397501 KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (spsr [2 ]),
398502 KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (spsr [3 ]),
399503 KVM_REG_ARM64 | KVM_REG_SIZE_U64 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (spsr [4 ]),
400- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [0 ]),
401- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [1 ]),
402- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [2 ]),
403- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [3 ]),
404- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [4 ]),
405- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [5 ]),
406- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [6 ]),
407- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [7 ]),
408- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [8 ]),
409- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [9 ]),
410- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [10 ]),
411- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [11 ]),
412- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [12 ]),
413- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [13 ]),
414- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [14 ]),
415- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [15 ]),
416- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [16 ]),
417- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [17 ]),
418- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [18 ]),
419- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [19 ]),
420- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [20 ]),
421- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [21 ]),
422- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [22 ]),
423- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [23 ]),
424- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [24 ]),
425- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [25 ]),
426- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [26 ]),
427- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [27 ]),
428- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [28 ]),
429- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [29 ]),
430- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [30 ]),
431- KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [31 ]),
432504 KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .fpsr ),
433505 KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .fpcr ),
434506 KVM_REG_ARM_FW_REG (0 ),
@@ -668,4 +740,102 @@ static __u64 blessed_reg[] = {
668740 KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_DEMUX | KVM_REG_ARM_DEMUX_ID_CCSIDR | 1 ,
669741 KVM_REG_ARM64 | KVM_REG_SIZE_U32 | KVM_REG_ARM_DEMUX | KVM_REG_ARM_DEMUX_ID_CCSIDR | 2 ,
670742};
671- static __u64 blessed_n = ARRAY_SIZE (blessed_reg );
743+ static __u64 base_regs_n = ARRAY_SIZE (base_regs );
744+
745+ static __u64 vregs [] = {
746+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [0 ]),
747+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [1 ]),
748+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [2 ]),
749+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [3 ]),
750+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [4 ]),
751+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [5 ]),
752+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [6 ]),
753+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [7 ]),
754+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [8 ]),
755+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [9 ]),
756+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [10 ]),
757+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [11 ]),
758+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [12 ]),
759+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [13 ]),
760+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [14 ]),
761+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [15 ]),
762+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [16 ]),
763+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [17 ]),
764+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [18 ]),
765+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [19 ]),
766+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [20 ]),
767+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [21 ]),
768+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [22 ]),
769+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [23 ]),
770+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [24 ]),
771+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [25 ]),
772+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [26 ]),
773+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [27 ]),
774+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [28 ]),
775+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [29 ]),
776+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [30 ]),
777+ KVM_REG_ARM64 | KVM_REG_SIZE_U128 | KVM_REG_ARM_CORE | KVM_REG_ARM_CORE_REG (fp_regs .vregs [31 ]),
778+ };
779+ static __u64 vregs_n = ARRAY_SIZE (vregs );
780+
781+ static __u64 sve_regs [] = {
782+ KVM_REG_ARM64_SVE_VLS ,
783+ KVM_REG_ARM64_SVE_ZREG (0 , 0 ),
784+ KVM_REG_ARM64_SVE_ZREG (1 , 0 ),
785+ KVM_REG_ARM64_SVE_ZREG (2 , 0 ),
786+ KVM_REG_ARM64_SVE_ZREG (3 , 0 ),
787+ KVM_REG_ARM64_SVE_ZREG (4 , 0 ),
788+ KVM_REG_ARM64_SVE_ZREG (5 , 0 ),
789+ KVM_REG_ARM64_SVE_ZREG (6 , 0 ),
790+ KVM_REG_ARM64_SVE_ZREG (7 , 0 ),
791+ KVM_REG_ARM64_SVE_ZREG (8 , 0 ),
792+ KVM_REG_ARM64_SVE_ZREG (9 , 0 ),
793+ KVM_REG_ARM64_SVE_ZREG (10 , 0 ),
794+ KVM_REG_ARM64_SVE_ZREG (11 , 0 ),
795+ KVM_REG_ARM64_SVE_ZREG (12 , 0 ),
796+ KVM_REG_ARM64_SVE_ZREG (13 , 0 ),
797+ KVM_REG_ARM64_SVE_ZREG (14 , 0 ),
798+ KVM_REG_ARM64_SVE_ZREG (15 , 0 ),
799+ KVM_REG_ARM64_SVE_ZREG (16 , 0 ),
800+ KVM_REG_ARM64_SVE_ZREG (17 , 0 ),
801+ KVM_REG_ARM64_SVE_ZREG (18 , 0 ),
802+ KVM_REG_ARM64_SVE_ZREG (19 , 0 ),
803+ KVM_REG_ARM64_SVE_ZREG (20 , 0 ),
804+ KVM_REG_ARM64_SVE_ZREG (21 , 0 ),
805+ KVM_REG_ARM64_SVE_ZREG (22 , 0 ),
806+ KVM_REG_ARM64_SVE_ZREG (23 , 0 ),
807+ KVM_REG_ARM64_SVE_ZREG (24 , 0 ),
808+ KVM_REG_ARM64_SVE_ZREG (25 , 0 ),
809+ KVM_REG_ARM64_SVE_ZREG (26 , 0 ),
810+ KVM_REG_ARM64_SVE_ZREG (27 , 0 ),
811+ KVM_REG_ARM64_SVE_ZREG (28 , 0 ),
812+ KVM_REG_ARM64_SVE_ZREG (29 , 0 ),
813+ KVM_REG_ARM64_SVE_ZREG (30 , 0 ),
814+ KVM_REG_ARM64_SVE_ZREG (31 , 0 ),
815+ KVM_REG_ARM64_SVE_PREG (0 , 0 ),
816+ KVM_REG_ARM64_SVE_PREG (1 , 0 ),
817+ KVM_REG_ARM64_SVE_PREG (2 , 0 ),
818+ KVM_REG_ARM64_SVE_PREG (3 , 0 ),
819+ KVM_REG_ARM64_SVE_PREG (4 , 0 ),
820+ KVM_REG_ARM64_SVE_PREG (5 , 0 ),
821+ KVM_REG_ARM64_SVE_PREG (6 , 0 ),
822+ KVM_REG_ARM64_SVE_PREG (7 , 0 ),
823+ KVM_REG_ARM64_SVE_PREG (8 , 0 ),
824+ KVM_REG_ARM64_SVE_PREG (9 , 0 ),
825+ KVM_REG_ARM64_SVE_PREG (10 , 0 ),
826+ KVM_REG_ARM64_SVE_PREG (11 , 0 ),
827+ KVM_REG_ARM64_SVE_PREG (12 , 0 ),
828+ KVM_REG_ARM64_SVE_PREG (13 , 0 ),
829+ KVM_REG_ARM64_SVE_PREG (14 , 0 ),
830+ KVM_REG_ARM64_SVE_PREG (15 , 0 ),
831+ KVM_REG_ARM64_SVE_FFR (0 ),
832+ ARM64_SYS_REG (3 , 0 , 1 , 2 , 0 ), /* ZCR_EL1 */
833+ };
834+ static __u64 sve_regs_n = ARRAY_SIZE (sve_regs );
835+
836+ static __u64 rejects_set [] = {
837+ #ifdef REG_LIST_SVE
838+ KVM_REG_ARM64_SVE_VLS ,
839+ #endif
840+ };
841+ static __u64 rejects_set_n = ARRAY_SIZE (rejects_set );
0 commit comments