Path: blob/master/tools/testing/selftests/arm64/signal/testcases/zt_regs.c
26295 views
// SPDX-License-Identifier: GPL-2.01/*2* Copyright (C) 2021 ARM Limited3*4* Verify that using an instruction not supported in streaming mode5* traps when in streaming mode.6*/78#include <signal.h>9#include <ucontext.h>10#include <sys/prctl.h>1112#include "test_signals_utils.h"13#include "testcases.h"1415static union {16ucontext_t uc;17char buf[1024 * 128];18} context;1920static void enable_za(void)21{22/* smstart za; real data is TODO */23asm volatile(".inst 0xd503457f" : : : );24}2526int zt_regs_run(struct tdescr *td, siginfo_t *si, ucontext_t *uc)27{28size_t offset;29struct _aarch64_ctx *head = GET_BUF_RESV_HEAD(context);30struct zt_context *zt;31char *zeros;3233/*34* Get a signal context which should have a ZT frame and registers35* in it.36*/37enable_za();38if (!get_current_context(td, &context.uc, sizeof(context)))39return 1;4041head = get_header(head, ZT_MAGIC, GET_BUF_RESV_SIZE(context), &offset);42if (!head) {43fprintf(stderr, "No ZT context\n");44return 1;45}4647zt = (struct zt_context *)head;48if (zt->nregs == 0) {49fprintf(stderr, "Got context with no registers\n");50return 1;51}5253fprintf(stderr, "Got expected size %u for %d registers\n",54head->size, zt->nregs);5556/* We didn't load any data into ZT so it should be all zeros */57zeros = malloc(ZT_SIG_REGS_SIZE(zt->nregs));58if (!zeros) {59fprintf(stderr, "Out of memory, nregs=%u\n", zt->nregs);60return 1;61}62memset(zeros, 0, ZT_SIG_REGS_SIZE(zt->nregs));6364if (memcmp(zeros, (char *)zt + ZT_SIG_REGS_OFFSET,65ZT_SIG_REGS_SIZE(zt->nregs)) != 0) {66fprintf(stderr, "ZT data invalid\n");67free(zeros);68return 1;69}7071free(zeros);7273td->pass = 1;7475return 0;76}7778struct tdescr tde = {79.name = "ZT register data",80.descr = "Validate that ZT is present and has data when ZA is enabled",81.feats_required = FEAT_SME2,82.timeout = 3,83.sanity_disabled = true,84.run = zt_regs_run,85};868788