(root)/
strace-6.5/
tests-m32/
segv_pkuerr.c
       1  /*
       2   * Check decoding of SEGV_PKUERR.
       3   *
       4   * Copyright (c) 2022 Dmitry V. Levin <ldv@strace.io>
       5   * All rights reserved.
       6   *
       7   * SPDX-License-Identifier: GPL-2.0-or-later
       8   */
       9  
      10  #include "tests.h"
      11  #include <signal.h>
      12  
      13  #if defined HAVE_SIGINFO_T_SI_PKEY && defined SEGV_PKUERR
      14  
      15  # include <stdio.h>
      16  # include <stdlib.h>
      17  # include <unistd.h>
      18  # include <sys/mman.h>
      19  
      20  static void
      21  handler(int sig, siginfo_t *info, void *ucontext)
      22  {
      23  	if (info->si_code != SEGV_PKUERR)
      24  		error_msg_and_skip("SIGSEGV: si_code = %d", info->si_code);
      25  
      26  	printf("--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_PKUERR"
      27  	       ", si_addr=%p, si_pkey=%u} ---\n",
      28  	       info->si_addr, info->si_pkey);
      29  	exit(0);
      30  }
      31  
      32  int
      33  main(void) {
      34  	int *p = mmap(NULL, get_page_size(), PROT_EXEC,
      35  		      MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
      36  	if (p == MAP_FAILED)
      37  		perror_msg_and_fail("mmap");
      38  
      39  	const struct sigaction act = {
      40  		.sa_sigaction = handler,
      41  		.sa_flags = SA_SIGINFO | SA_RESETHAND
      42  	};
      43  	if (sigaction(SIGSEGV, &act, NULL))
      44  		perror_msg_and_fail("sigaction");
      45  
      46  	__asm__ volatile("":: "r" (*p));
      47  
      48  	error_msg_and_skip("PROT_EXEC page is readable");
      49  }
      50  
      51  #else
      52  
      53  SKIP_MAIN_UNDEFINED("HAVE_SIGINFO_T_SI_PKEY && SEGV_PKUERR")
      54  
      55  #endif