(root)/
strace-6.5/
src/
ipc_shm.c
       1  /*
       2   * Copyright (c) 1993 Ulrich Pegelow <pegelow@moorea.uni-muenster.de>
       3   * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl>
       4   * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com>
       5   * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl>
       6   * Copyright (c) 2003-2006 Roland McGrath <roland@redhat.com>
       7   * Copyright (c) 2006-2015 Dmitry V. Levin <ldv@strace.io>
       8   * Copyright (c) 2015-2022 The strace developers.
       9   * All rights reserved.
      10   *
      11   * SPDX-License-Identifier: LGPL-2.1-or-later
      12   */
      13  
      14  #include "defs.h"
      15  #include "ipc_defs.h"
      16  
      17  #include SHM_H_PROVIDER
      18  
      19  #ifndef SHM_HUGE_SHIFT
      20  # define SHM_HUGE_SHIFT 26
      21  #endif
      22  
      23  #ifndef SHM_HUGE_MASK
      24  # define SHM_HUGE_MASK 0x3f
      25  #endif
      26  
      27  #include "xlat/shm_resource_flags.h"
      28  #include "xlat/shm_flags.h"
      29  
      30  SYS_FUNC(shmget)
      31  {
      32  	/* key */
      33  	printxval(ipc_private, (unsigned int) tcp->u_arg[0], NULL);
      34  	tprint_arg_next();
      35  
      36  	/* size */
      37  	PRINT_VAL_U(tcp->u_arg[1]);
      38  	tprint_arg_next();
      39  
      40  	/* shmflg */
      41  	unsigned int flags = tcp->u_arg[2] & ~0777;
      42  	const unsigned int mask = SHM_HUGE_MASK << SHM_HUGE_SHIFT;
      43  	const unsigned int hugetlb_value = flags & mask;
      44  
      45  	flags &= ~mask;
      46  	tprint_flags_begin();
      47  	if (flags || !hugetlb_value)
      48  		printflags_in(shm_resource_flags, flags, NULL);
      49  
      50  	if (hugetlb_value) {
      51  		if (flags)
      52  			tprint_flags_or();
      53  		tprint_shift_begin();
      54  		PRINT_VAL_U(hugetlb_value >> SHM_HUGE_SHIFT);
      55  		tprint_shift();
      56  		print_xlat_u(SHM_HUGE_SHIFT);
      57  		tprint_shift_end();
      58  	}
      59  
      60  	if (flags || hugetlb_value)
      61  		tprint_flags_or();
      62  	print_numeric_umode_t(tcp->u_arg[2] & 0777);
      63  	tprint_flags_end();
      64  
      65  	return RVAL_DECODED;
      66  }
      67  
      68  static void
      69  print_shmaddr_shmflg(const kernel_ulong_t shmaddr, const unsigned int shmflg)
      70  {
      71  	/* shmaddr */
      72  	printaddr(shmaddr);
      73  	tprint_arg_next();
      74  
      75  	/* shmflg */
      76  	printflags(shm_flags, shmflg, "SHM_???");
      77  }
      78  
      79  SYS_FUNC(shmat)
      80  {
      81  	if (entering(tcp)) {
      82  		/* shmid */
      83  		PRINT_VAL_D((int) tcp->u_arg[0]);
      84  		tprint_arg_next();
      85  
      86  		if (indirect_ipccall(tcp))
      87  			print_shmaddr_shmflg(tcp->u_arg[3], tcp->u_arg[1]);
      88  		else
      89  			print_shmaddr_shmflg(tcp->u_arg[1], tcp->u_arg[2]);
      90  		return 0;
      91  	} else {
      92  		if (syserror(tcp))
      93  			return 0;
      94  		if (indirect_ipccall(tcp)) {
      95  			union {
      96  				uint64_t r64;
      97  				uint32_t r32;
      98  			} u;
      99  			if (umoven(tcp, tcp->u_arg[2], current_wordsize, &u) < 0)
     100  				return RVAL_NONE;
     101  			tcp->u_rval = (sizeof(u.r32) == current_wordsize)
     102  				      ? u.r32 : u.r64;
     103  		}
     104  		return RVAL_HEX;
     105  	}
     106  }
     107  
     108  SYS_FUNC(shmdt)
     109  {
     110  	/* shmaddr */
     111  	printaddr(tcp->u_arg[indirect_ipccall(tcp) ? 3 : 0]);
     112  	return RVAL_DECODED;
     113  }