87 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Copyright (C) 2021 ARM Limited4 *5 * Verify that using an instruction not supported in streaming mode6 * traps when in streaming mode.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 16static union {17 ucontext_t uc;18 char buf[1024 * 128];19} context;20 21static void enable_za(void)22{23 /* smstart za; real data is TODO */24 asm volatile(".inst 0xd503457f" : : : );25}26 27int zt_regs_run(struct tdescr *td, siginfo_t *si, ucontext_t *uc)28{29 size_t offset;30 struct _aarch64_ctx *head = GET_BUF_RESV_HEAD(context);31 struct zt_context *zt;32 char *zeros;33 34 /*35 * Get a signal context which should have a ZT frame and registers36 * in it.37 */38 enable_za();39 if (!get_current_context(td, &context.uc, sizeof(context)))40 return 1;41 42 head = get_header(head, ZT_MAGIC, GET_BUF_RESV_SIZE(context), &offset);43 if (!head) {44 fprintf(stderr, "No ZT context\n");45 return 1;46 }47 48 zt = (struct zt_context *)head;49 if (zt->nregs == 0) {50 fprintf(stderr, "Got context with no registers\n");51 return 1;52 }53 54 fprintf(stderr, "Got expected size %u for %d registers\n",55 head->size, zt->nregs);56 57 /* We didn't load any data into ZT so it should be all zeros */58 zeros = malloc(ZT_SIG_REGS_SIZE(zt->nregs));59 if (!zeros) {60 fprintf(stderr, "Out of memory, nregs=%u\n", zt->nregs);61 return 1;62 }63 memset(zeros, 0, ZT_SIG_REGS_SIZE(zt->nregs));64 65 if (memcmp(zeros, (char *)zt + ZT_SIG_REGS_OFFSET,66 ZT_SIG_REGS_SIZE(zt->nregs)) != 0) {67 fprintf(stderr, "ZT data invalid\n");68 free(zeros);69 return 1;70 }71 72 free(zeros);73 74 td->pass = 1;75 76 return 0;77}78 79struct tdescr tde = {80 .name = "ZT register data",81 .descr = "Validate that ZT is present and has data when ZA is enabled",82 .feats_required = FEAT_SME2,83 .timeout = 3,84 .sanity_disabled = true,85 .run = zt_regs_run,86};87