1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2022 ARM Limited 4 * 5 * Verify that the TPIDR2 register context in signal frames is set up as 6 * expected. 7 */ 8 9 #include <signal.h> 10 #include <ucontext.h> 11 #include <sys/auxv.h> 12 #include <sys/prctl.h> 13 #include <unistd.h> 14 #include <asm/sigcontext.h> 15 16 #include "test_signals_utils.h" 17 #include "testcases.h" 18 19 static union { 20 ucontext_t uc; 21 char buf[1024 * 128]; 22 } context; 23 24 #define SYS_TPIDR2 "S3_3_C13_C0_5" 25 26 static uint64_t get_tpidr2(void) 27 { 28 uint64_t val; 29 30 asm volatile ( 31 "mrs %0, " SYS_TPIDR2 "\n" 32 : "=r"(val) 33 : 34 : "cc"); 35 36 return val; 37 } 38 39 int tpidr2_present(struct tdescr *td, siginfo_t *si, ucontext_t *uc) 40 { 41 struct _aarch64_ctx *head = GET_BUF_RESV_HEAD(context); 42 struct tpidr2_context *tpidr2_ctx; 43 size_t offset; 44 bool in_sigframe; 45 bool have_sme; 46 __u64 orig_tpidr2; 47 48 have_sme = getauxval(AT_HWCAP2) & HWCAP2_SME; 49 if (have_sme) 50 orig_tpidr2 = get_tpidr2(); 51 52 if (!get_current_context(td, &context.uc, sizeof(context))) 53 return 1; 54 55 tpidr2_ctx = (struct tpidr2_context *) 56 get_header(head, TPIDR2_MAGIC, td->live_sz, &offset); 57 58 in_sigframe = tpidr2_ctx != NULL; 59 60 fprintf(stderr, "TPIDR2 sigframe %s on system %s SME\n", 61 in_sigframe ? "present" : "absent", 62 have_sme ? "with" : "without"); 63 64 td->pass = (in_sigframe == have_sme); 65 66 /* 67 * Check that the value we read back was the one present at 68 * the time that the signal was triggered. TPIDR2 is owned by 69 * libc so we can't safely choose the value and it is possible 70 * that we may need to revisit this in future if something 71 * starts deciding to set a new TPIDR2 between us reading and 72 * the signal. 73 */ 74 if (have_sme && tpidr2_ctx) { 75 if (tpidr2_ctx->tpidr2 != orig_tpidr2) { 76 fprintf(stderr, "TPIDR2 in frame is %llx, was %llx\n", 77 tpidr2_ctx->tpidr2, orig_tpidr2); 78 td->pass = false; 79 } 80 } 81 82 return 0; 83 } 84 85 struct tdescr tde = { 86 .name = "TPIDR2", 87 .descr = "Validate that TPIDR2 is present as expected", 88 .timeout = 3, 89 .run = tpidr2_present, 90 }; 91