sve_vl.c (1329B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2021 ARM Limited 4 * 5 * Check that the SVE 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 16struct fake_sigframe sf; 17unsigned int vl; 18 19static bool get_sve_vl(struct tdescr *td) 20{ 21 int ret = prctl(PR_SVE_GET_VL); 22 if (ret == -1) 23 return false; 24 25 vl = ret; 26 27 return true; 28} 29 30static int sve_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 sve_context *sve; 35 36 /* Get a signal context which should have a SVE frame in it */ 37 if (!get_current_context(td, &sf.uc)) 38 return 1; 39 40 resv_sz = GET_SF_RESV_SIZE(sf); 41 head = get_header(head, SVE_MAGIC, resv_sz, &offset); 42 if (!head) { 43 fprintf(stderr, "No SVE context\n"); 44 return 1; 45 } 46 sve = (struct sve_context *)head; 47 48 if (sve->vl != vl) { 49 fprintf(stderr, "sigframe VL %u, expected %u\n", 50 sve->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 61struct tdescr tde = { 62 .name = "SVE VL", 63 .descr = "Check that we get the right SVE VL reported", 64 .feats_required = FEAT_SVE, 65 .timeout = 3, 66 .init = get_sve_vl, 67 .run = sve_vl, 68};