cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

sve-ioctls.c (1770B)


      1/*
      2 * SVE ioctls tests
      3 *
      4 * Test the SVE width setting ioctls work and provide a base for
      5 * testing the gdbstub.
      6 *
      7 * Copyright (c) 2019 Linaro Ltd
      8 *
      9 * SPDX-License-Identifier: GPL-2.0-or-later
     10 */
     11#include <sys/prctl.h>
     12#include <asm/hwcap.h>
     13#include <stdio.h>
     14#include <sys/auxv.h>
     15#include <stdint.h>
     16#include <stdlib.h>
     17
     18#ifndef HWCAP_CPUID
     19#define HWCAP_CPUID (1 << 11)
     20#endif
     21
     22#define SVE_MAX_QUADS  (2048 / 128)
     23#define BYTES_PER_QUAD (128 / 8)
     24
     25#define get_cpu_reg(id) ({                                      \
     26            unsigned long __val;                                \
     27            asm("mrs %0, "#id : "=r" (__val));                  \
     28            __val;                                              \
     29        })
     30
     31static int do_sve_ioctl_test(void)
     32{
     33    int i, res, init_vq;
     34
     35    res = prctl(PR_SVE_GET_VL, 0, 0, 0, 0);
     36    if (res < 0) {
     37        printf("FAILED to PR_SVE_GET_VL (%d)", res);
     38        return -1;
     39    }
     40    init_vq = res & PR_SVE_VL_LEN_MASK;
     41
     42    for (i = init_vq; i > 15; i /= 2) {
     43        printf("Checking PR_SVE_SET_VL=%d\n", i);
     44        res = prctl(PR_SVE_SET_VL, i, 0, 0, 0, 0);
     45        if (res < 0) {
     46            printf("FAILED to PR_SVE_SET_VL (%d)", res);
     47            return -1;
     48        }
     49        asm("index z0.b, #0, #1\n"
     50            ".global __sve_ld_done\n"
     51            "__sve_ld_done:\n"
     52            "mov z0.b, #0\n"
     53            : /* no outputs kept */
     54            : /* no inputs */
     55            : "memory", "z0");
     56    }
     57    printf("PASS\n");
     58    return 0;
     59}
     60
     61int main(int argc, char **argv)
     62{
     63    /* we also need to probe for the ioctl support */
     64    if (getauxval(AT_HWCAP) & HWCAP_SVE) {
     65        return do_sve_ioctl_test();
     66    } else {
     67        printf("SKIP: no HWCAP_SVE on this system\n");
     68        return 0;
     69    }
     70}