cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sme_vl.c (1323B)


      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
     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))
     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};