1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Copyright (C) 2021 ARM Limited 4 * 5 * Verify that using an instruction not supported in streaming mode 6 * 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 registers 36 * 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