(root)/
strace-6.5/
tests-m32/
membarrier.c
       1  /*
       2   * Check decoding of membarrier syscall.
       3   *
       4   * Copyright (c) 2015-2017 Dmitry V. Levin <ldv@strace.io>
       5   * Copyright (c) 2015-2023 The strace developers.
       6   * All rights reserved.
       7   *
       8   * SPDX-License-Identifier: GPL-2.0-or-later
       9   */
      10  
      11  #include "tests.h"
      12  #include "scno.h"
      13  
      14  #include <assert.h>
      15  #include <errno.h>
      16  #include <stdio.h>
      17  #include <unistd.h>
      18  
      19  int
      20  main(void)
      21  {
      22  	assert(syscall(__NR_membarrier, 3, 255, -1) == -1);
      23  	int saved_errno = errno;
      24  	printf("membarrier(0x3 /* MEMBARRIER_CMD_??? */"
      25  	       ", MEMBARRIER_CMD_FLAG_CPU|0xfe, -1) = %s\n",
      26  	       sprintrc(-1));
      27  	if (saved_errno != ENOSYS) {
      28  		const char *text_global;
      29  		const char *text;
      30  		int rc = syscall(__NR_membarrier, 0, 0);
      31  
      32  		assert(rc >= 0);
      33  
      34  		text_global = rc & 1 ? "MEMBARRIER_CMD_GLOBAL" : "";
      35  
      36  		switch (rc & ~1) {
      37  		case 0:
      38  			text = "";
      39  			break;
      40  		case 8:
      41  			text = "MEMBARRIER_CMD_PRIVATE_EXPEDITED";
      42  			break;
      43  		case 8|16:
      44  			text = "MEMBARRIER_CMD_PRIVATE_EXPEDITED|"
      45  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED";
      46  			break;
      47  
      48  		case 2|4|8|16:
      49  			text = "MEMBARRIER_CMD_GLOBAL_EXPEDITED|"
      50  			       "MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED|"
      51  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED|"
      52  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED";
      53  			break;
      54  
      55  		case 2|4|8|16|512:
      56  			text = "MEMBARRIER_CMD_GLOBAL_EXPEDITED|"
      57  			       "MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED|"
      58  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED|"
      59  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED|"
      60  			       "MEMBARRIER_CMD_GET_REGISTRATIONS";
      61  			break;
      62  
      63  		case 2|4|8|16|32|64:
      64  			text = "MEMBARRIER_CMD_GLOBAL_EXPEDITED|"
      65  			       "MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED|"
      66  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED|"
      67  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED|"
      68  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE|"
      69  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE";
      70  			break;
      71  
      72  		case 2|4|8|16|32|64|128|256:
      73  			text = "MEMBARRIER_CMD_GLOBAL_EXPEDITED|"
      74  			       "MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED|"
      75  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED|"
      76  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED|"
      77  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE|"
      78  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE|"
      79  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ|"
      80  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ";
      81  			break;
      82  
      83  		case 2|4|8|16|128|256:
      84  			text = "MEMBARRIER_CMD_GLOBAL_EXPEDITED|"
      85  			       "MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED|"
      86  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED|"
      87  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED|"
      88  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ|"
      89  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ";
      90  			break;
      91  		case 2|4|8|16|128|256|512:
      92  			text = "MEMBARRIER_CMD_GLOBAL_EXPEDITED|"
      93  			       "MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED|"
      94  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED|"
      95  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED|"
      96  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ|"
      97  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ|"
      98  			       "MEMBARRIER_CMD_GET_REGISTRATIONS";
      99  			break;
     100  
     101  		case 2|4|8|16|32|64|128|256|512:
     102  			text = "MEMBARRIER_CMD_GLOBAL_EXPEDITED|"
     103  			       "MEMBARRIER_CMD_REGISTER_GLOBAL_EXPEDITED|"
     104  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED|"
     105  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED|"
     106  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE|"
     107  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE|"
     108  			       "MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ|"
     109  			       "MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ|"
     110  			       "MEMBARRIER_CMD_GET_REGISTRATIONS";
     111  			break;
     112  
     113  		default:
     114  			error_msg_and_fail("membarrier returned %#x, does"
     115  					   " the test have to be updated?", rc);
     116  		}
     117  		printf("membarrier(MEMBARRIER_CMD_QUERY, 0) = %#x (%s%s%s)\n",
     118  		       rc, text_global, text[0] && text_global[0] ? "|" : "",
     119  		       text);
     120  
     121  		rc = syscall(__NR_membarrier, 128, 1, -1);
     122  		printf("membarrier(MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ"
     123  		       ", MEMBARRIER_CMD_FLAG_CPU, -1) = %s\n",
     124  		       sprintrc(rc));
     125  
     126  	}
     127  	puts("+++ exited with 0 +++");
     128  	return 0;
     129  }