69 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright (C) 2021 ARM Limited4 *5 * Check that the SME vector length reported in signal contexts is the6 * 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_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 30static 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 61struct 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