cregit-Linux how code gets into the kernel

Release 4.18 tools/testing/selftests/powerpc/tm/tm-sigreturn.c

// SPDX-License-Identifier: GPL-2.0

/*
 * Copyright 2015, Laurent Dufour, IBM Corp.
 *
 * Test the kernel's signal returning code to check reclaim is done if the
 * sigreturn() is called while in a transaction (suspended since active is
 * already dropped trough the system call path).
 *
 * The kernel must discard the transaction when entering sigreturn, since
 * restoring the potential TM SPRS from the signal frame is requiring to not be
 * in a transaction.
 */

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#include "tm.h"
#include "utils.h"



void handler(int sig) { uint64_t ret; asm __volatile__( "li 3,1 ;" "tbegin. ;" "beq 1f ;" "li 3,0 ;" "tsuspend. ;" "1: ;" "std%X[ret] 3, %[ret] ;" : [ret] "=m"(ret) : : "memory", "3", "cr0"); if (ret) exit(1); /* * We return from the signal handle while in a suspended transaction */ }

Contributors

PersonTokensPropCommitsCommitProp
Laurent Dufour24100.00%1100.00%
Total24100.00%1100.00%


int tm_sigreturn(void) { struct sigaction sa; uint64_t ret = 0; SKIP_IF(!have_htm()); memset(&sa, 0, sizeof(sa)); sa.sa_handler = handler; sigemptyset(&sa.sa_mask); if (sigaction(SIGSEGV, &sa, NULL)) exit(1); asm __volatile__( "tbegin. ;" "beq 1f ;" "li 3,0 ;" "std 3,0(3) ;" /* trigger SEGV */ "li 3,1 ;" "std%X[ret] 3,%[ret] ;" "tend. ;" "b 2f ;" "1: ;" "li 3,2 ;" "std%X[ret] 3,%[ret] ;" "2: ;" : [ret] "=m"(ret) : : "memory", "3", "cr0"); if (ret != 2) exit(1); exit(0); }

Contributors

PersonTokensPropCommitsCommitProp
Laurent Dufour88100.00%1100.00%
Total88100.00%1100.00%


int main(void) { return test_harness(tm_sigreturn, "tm_sigreturn"); }

Contributors

PersonTokensPropCommitsCommitProp
Laurent Dufour15100.00%1100.00%
Total15100.00%1100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Laurent Dufour156100.00%1100.00%
Total156100.00%1100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.