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 16 static union { 17 ucontext_t uc; 18 char buf[1024 * 128]; 19 } context; 20 21 static void enable_za(void) 22 { 23 /* smstart za; real data is TODO */ 24 asm volatile(".inst 0xd503457f" : : : ); 25 } 26 27 int 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 79 struct 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