1 /* 2 * Copyright (c) 1993 Ulrich Pegelow <pegelow (at) moorea.uni-muenster.de> 3 * Copyright (c) 1993 Branko Lankester <branko (at) hacktic.nl> 4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs (at) world.std.com> 5 * Copyright (c) 1996-1999 Wichert Akkerman <wichert (at) cistron.nl> 6 * Copyright (c) 2003-2006 Roland McGrath <roland (at) redhat.com> 7 * Copyright (c) 2006-2015 Dmitry V. Levin <ldv (at) altlinux.org> 8 * All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. The name of the author may not be used to endorse or promote products 19 * derived from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #include "defs.h" 34 #include "ipc_defs.h" 35 36 #ifdef HAVE_SYS_SEM_H 37 # include <sys/sem.h> 38 #elif defined HAVE_LINUX_SEM_H 39 # include <linux/sem.h> 40 #endif 41 42 #include "xlat/semctl_flags.h" 43 #include "xlat/semop_flags.h" 44 45 #if defined HAVE_SYS_SEM_H || defined HAVE_LINUX_SEM_H 46 static bool 47 print_sembuf(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data) 48 { 49 const struct sembuf *sb = elem_buf; 50 51 tprintf("{%u, %d, ", sb->sem_num, sb->sem_op); 52 printflags(semop_flags, (unsigned short) sb->sem_flg, "SEM_???"); 53 tprints("}"); 54 55 return true; 56 } 57 #endif 58 59 static void 60 tprint_sembuf_array(struct tcb *const tcp, const kernel_ulong_t addr, 61 const unsigned int count) 62 { 63 #if defined HAVE_SYS_SEM_H || defined HAVE_LINUX_SEM_H 64 struct sembuf sb; 65 print_array(tcp, addr, count, &sb, sizeof(sb), 66 umoven_or_printaddr, print_sembuf, 0); 67 #else 68 printaddr(addr); 69 #endif 70 tprintf(", %u", count); 71 } 72 73 SYS_FUNC(semop) 74 { 75 tprintf("%d, ", (int) tcp->u_arg[0]); 76 if (indirect_ipccall(tcp)) { 77 tprint_sembuf_array(tcp, tcp->u_arg[3], tcp->u_arg[1]); 78 } else { 79 tprint_sembuf_array(tcp, tcp->u_arg[1], tcp->u_arg[2]); 80 } 81 return RVAL_DECODED; 82 } 83 84 SYS_FUNC(semtimedop) 85 { 86 tprintf("%d, ", (int) tcp->u_arg[0]); 87 if (indirect_ipccall(tcp)) { 88 tprint_sembuf_array(tcp, tcp->u_arg[3], tcp->u_arg[1]); 89 tprints(", "); 90 #if defined(S390) || defined(S390X) 91 print_timespec(tcp, tcp->u_arg[2]); 92 #else 93 print_timespec(tcp, tcp->u_arg[4]); 94 #endif 95 } else { 96 tprint_sembuf_array(tcp, tcp->u_arg[1], tcp->u_arg[2]); 97 tprints(", "); 98 print_timespec(tcp, tcp->u_arg[3]); 99 } 100 return RVAL_DECODED; 101 } 102 103 SYS_FUNC(semget) 104 { 105 const int key = (int) tcp->u_arg[0]; 106 if (key) 107 tprintf("%#x", key); 108 else 109 tprints("IPC_PRIVATE"); 110 tprintf(", %d, ", (int) tcp->u_arg[1]); 111 if (printflags(resource_flags, tcp->u_arg[2] & ~0777, NULL) != 0) 112 tprints("|"); 113 print_numeric_umode_t(tcp->u_arg[2] & 0777); 114 return RVAL_DECODED; 115 } 116 117 SYS_FUNC(semctl) 118 { 119 tprintf("%d, %d, ", (int) tcp->u_arg[0], (int) tcp->u_arg[1]); 120 PRINTCTL(semctl_flags, tcp->u_arg[2], "SEM_???"); 121 tprints(", "); 122 if (indirect_ipccall(tcp) 123 #ifdef SPARC64 124 && current_personality != 0 125 #endif 126 ) { 127 printnum_ptr(tcp, tcp->u_arg[3]); 128 } else { 129 printaddr(tcp->u_arg[3]); 130 } 131 return RVAL_DECODED; 132 } 133