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

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