1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2021 ARM Limited 4 * 5 * Check that the SME vector length reported in signal contexts is the 6 * expected one. 7 */ 8 9 #include <signal.h> 10 #include <ucontext.h> 11 #include <sys/prctl.h> 12 13 #include "test_signals_utils.h" 14 #include "testcases.h" 15 16 struct fake_sigframe sf; 17 unsigned int vl; 18 19 static bool get_sme_vl(struct tdescr *td) 20 { 21 int ret = prctl(PR_SME_GET_VL); 22 if (ret == -1) 23 return false; 24 25 vl = ret; 26 27 return true; 28 } 29 30 static int sme_vl(struct tdescr *td, siginfo_t *si, ucontext_t *uc) 31 { 32 size_t resv_sz, offset; 33 struct _aarch64_ctx *head = GET_SF_RESV_HEAD(sf); 34 struct za_context *za; 35 36 /* Get a signal context which should have a ZA frame in it */ 37 if (!get_current_context(td, &sf.uc, sizeof(sf.uc))) 38 return 1; 39 40 resv_sz = GET_SF_RESV_SIZE(sf); 41 head = get_header(head, ZA_MAGIC, resv_sz, &offset); 42 if (!head) { 43 fprintf(stderr, "No ZA context\n"); 44 return 1; 45 } 46 za = (struct za_context *)head; 47 48 if (za->vl != vl) { 49 fprintf(stderr, "ZA sigframe VL %u, expected %u\n", 50 za->vl, vl); 51 return 1; 52 } else { 53 fprintf(stderr, "got expected VL %u\n", vl); 54 } 55 56 td->pass = 1; 57 58 return 0; 59 } 60 61 struct tdescr tde = { 62 .name = "SME VL", 63 .descr = "Check that we get the right SME VL reported", 64 .feats_required = FEAT_SME, 65 .timeout = 3, 66 .init = get_sme_vl, 67 .run = sme_vl, 68 }; 69