// SPDX-License-Identifier: GPL-2.0 /* * Copyright 2018, Breno Leitao, Gustavo Romero, IBM Corp. * * A test case that creates a signal and starts a suspended transaction * inside the signal handler. * * It returns from the signal handler with the CPU at suspended state, but * without setting usercontext MSR Transaction State (TS) fields. */ #define _GNU_SOURCE #include <stdlib.h> #include <signal.h> #include "utils.h" void trap_signal_handler(int signo, siginfo_t *si, void *uc) { ucontext_t *ucp = (ucontext_t *) uc; asm("tbegin.; tsuspend.;"); /* Skip 'trap' instruction if it succeed */ ucp->uc_mcontext.regs->nip += 4; } int tm_signal_sigreturn_nt(void) { struct sigaction trap_sa; trap_sa.sa_flags = SA_SIGINFO; trap_sa.sa_sigaction = trap_signal_handler; sigaction(SIGTRAP, &trap_sa, NULL); raise(SIGTRAP); return EXIT_SUCCESS; } int main(int argc, char **argv) { test_harness(tm_signal_sigreturn_nt, "tm_signal_sigreturn_nt"); } |