1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Copyright (c) 2020 Linaro Limited. All rights reserved. 4 * Author: Viresh Kumar <viresh.kumar@linaro.org> 5 */ 6 7 #ifndef LAPI_SHMBUF_H__ 8 #define LAPI_SHMBUF_H__ 9 10 #include "lapi/posix_types.h" 11 #include <sys/sem.h> 12 #include "tst_timer.h" 13 #include "ipcbuf.h" 14 15 #ifndef HAVE_SHMID64_DS 16 17 #if defined(__mips__) 18 #define HAVE_SHMID64_DS 19 /* 20 * The shmid64_ds structure for the MIPS architecture. 21 * Note extra padding because this structure is passed back and forth 22 * between kernel and user space. 23 * 24 * As MIPS was lacking proper padding after shm_?time, we use 48 bits 25 * of the padding at the end to store a few additional bits of the time. 26 * libc implementations need to take care to convert this into a proper 27 * data structure when moving to 64-bit time_t. 28 */ 29 30 #if __BITS_PER_LONG == 64 31 struct shmid64_ds { 32 struct ipc64_perm shm_perm; /* operation perms */ 33 size_t shm_segsz; /* size of segment (bytes) */ 34 long shm_atime; /* last attach time */ 35 long shm_dtime; /* last detach time */ 36 long shm_ctime; /* last change time */ 37 __kernel_pid_t shm_cpid; /* pid of creator */ 38 __kernel_pid_t shm_lpid; /* pid of last operator */ 39 unsigned long shm_nattch; /* no. of current attaches */ 40 unsigned long __unused1; 41 unsigned long __unused2; 42 }; 43 #else 44 #define HAVE_SHMID64_DS_TIME_HIGH 45 struct shmid64_ds { 46 struct ipc64_perm shm_perm; /* operation perms */ 47 size_t shm_segsz; /* size of segment (bytes) */ 48 unsigned long shm_atime; /* last attach time */ 49 unsigned long shm_dtime; /* last detach time */ 50 unsigned long shm_ctime; /* last change time */ 51 __kernel_pid_t shm_cpid; /* pid of creator */ 52 __kernel_pid_t shm_lpid; /* pid of last operator */ 53 unsigned long shm_nattch; /* no. of current attaches */ 54 unsigned short shm_atime_high; 55 unsigned short shm_dtime_high; 56 unsigned short shm_ctime_high; 57 unsigned short __unused1; 58 }; 59 #endif 60 61 #endif /* __mips__ */ 62 63 #if defined(__hppa__) 64 #define HAVE_SHMID64_DS 65 /* 66 * The shmid64_ds structure for parisc architecture. 67 * Note extra padding because this structure is passed back and forth 68 * between kernel and user space. 69 * 70 * Pad space is left for: 71 * - 2 miscellaneous 32-bit values 72 */ 73 74 struct shmid64_ds { 75 struct ipc64_perm shm_perm; /* operation perms */ 76 #if __BITS_PER_LONG == 64 77 long shm_atime; /* last attach time */ 78 long shm_dtime; /* last detach time */ 79 long shm_ctime; /* last change time */ 80 #else 81 #define HAVE_SHMID64_DS_TIME_HIGH 82 unsigned long shm_atime_high; 83 unsigned long shm_atime; /* last attach time */ 84 unsigned long shm_dtime_high; 85 unsigned long shm_dtime; /* last detach time */ 86 unsigned long shm_ctime_high; 87 unsigned long shm_ctime; /* last change time */ 88 unsigned int __pad4; 89 #endif 90 __kernel_size_t shm_segsz; /* size of segment (bytes) */ 91 __kernel_pid_t shm_cpid; /* pid of creator */ 92 __kernel_pid_t shm_lpid; /* pid of last operator */ 93 unsigned long shm_nattch; /* no. of current attaches */ 94 unsigned long __unused1; 95 unsigned long __unused2; 96 }; 97 #endif /* __hppa__ */ 98 99 #if defined(__powerpc__) || defined(__powerpc64__) 100 #define HAVE_SHMID64_DS 101 /* 102 * The shmid64_ds structure for PPC architecture. 103 * 104 * Note extra padding because this structure is passed back and forth 105 * between kernel and user space. 106 * 107 * Pad space is left for: 108 * - 2 miscellaneous 32-bit values 109 */ 110 111 struct shmid64_ds { 112 struct ipc64_perm shm_perm; /* operation perms */ 113 #ifdef __powerpc64__ 114 long shm_atime; /* last attach time */ 115 long shm_dtime; /* last detach time */ 116 long shm_ctime; /* last change time */ 117 #else 118 #define HAVE_SHMID64_DS_TIME_HIGH 119 unsigned long shm_atime_high; 120 unsigned long shm_atime; /* last attach time */ 121 unsigned long shm_dtime_high; 122 unsigned long shm_dtime; /* last detach time */ 123 unsigned long shm_ctime_high; 124 unsigned long shm_ctime; /* last change time */ 125 unsigned long __unused4; 126 #endif 127 size_t shm_segsz; /* size of segment (bytes) */ 128 __kernel_pid_t shm_cpid; /* pid of creator */ 129 __kernel_pid_t shm_lpid; /* pid of last operator */ 130 unsigned long shm_nattch; /* no. of current attaches */ 131 unsigned long __unused5; 132 unsigned long __unused6; 133 }; 134 135 #endif /* defined(__powerpc__) || defined(__powerpc64__) */ 136 137 #if defined(__sparc__) 138 #define HAVE_SHMID64_DS 139 /* 140 * The shmid64_ds structure for sparc architecture. 141 * Note extra padding because this structure is passed back and forth 142 * between kernel and user space. 143 * 144 * Pad space is left for: 145 * - 2 miscellaneous 32-bit values 146 */ 147 148 struct shmid64_ds { 149 struct ipc64_perm shm_perm; /* operation perms */ 150 #if defined(__arch64__) 151 long shm_atime; /* last attach time */ 152 long shm_dtime; /* last detach time */ 153 long shm_ctime; /* last change time */ 154 #else 155 #define HAVE_SHMID64_DS_TIME_HIGH 156 unsigned long shm_atime_high; 157 unsigned long shm_atime; /* last attach time */ 158 unsigned long shm_dtime_high; 159 unsigned long shm_dtime; /* last detach time */ 160 unsigned long shm_ctime_high; 161 unsigned long shm_ctime; /* last change time */ 162 #endif 163 size_t shm_segsz; /* size of segment (bytes) */ 164 __kernel_pid_t shm_cpid; /* pid of creator */ 165 __kernel_pid_t shm_lpid; /* pid of last operator */ 166 unsigned long shm_nattch; /* no. of current attaches */ 167 unsigned long __unused1; 168 unsigned long __unused2; 169 }; 170 171 #endif /* __sparc__ */ 172 173 #if defined(__x86_64__) && defined(__ILP32__) 174 #define HAVE_SHMID64_DS 175 /* 176 * The shmid64_ds structure for x86 architecture with x32 ABI. 177 * 178 * On x86-32 and x86-64 we can just use the generic definition, but 179 * x32 uses the same binary layout as x86_64, which is differnet 180 * from other 32-bit architectures. 181 */ 182 183 struct shmid64_ds { 184 struct ipc64_perm shm_perm; /* operation perms */ 185 size_t shm_segsz; /* size of segment (bytes) */ 186 __kernel_long_t shm_atime; /* last attach time */ 187 __kernel_long_t shm_dtime; /* last detach time */ 188 __kernel_long_t shm_ctime; /* last change time */ 189 __kernel_pid_t shm_cpid; /* pid of creator */ 190 __kernel_pid_t shm_lpid; /* pid of last operator */ 191 __kernel_ulong_t shm_nattch; /* no. of current attaches */ 192 __kernel_ulong_t __unused4; 193 __kernel_ulong_t __unused5; 194 }; 195 #endif /* defined(__x86_64__) && defined(__ILP32__) */ 196 197 #if defined(__xtensa__) 198 #define HAVE_SHMID64_DS 199 #define HAVE_SHMID64_DS_TIME_HIGH 200 /* 201 * The shmid64_ds structure for Xtensa architecture. 202 * Note extra padding because this structure is passed back and forth 203 * between kernel and user space, but the padding is on the wrong 204 * side for big-endian xtensa, for historic reasons. 205 * 206 * Pad space is left for: 207 * - 2 miscellaneous 32-bit values 208 */ 209 210 struct shmid64_ds { 211 struct ipc64_perm shm_perm; /* operation perms */ 212 size_t shm_segsz; /* size of segment (bytes) */ 213 unsigned long shm_atime; /* last attach time */ 214 unsigned long shm_atime_high; 215 unsigned long shm_dtime; /* last detach time */ 216 unsigned long shm_dtime_high; 217 unsigned long shm_ctime; /* last change time */ 218 unsigned long shm_ctime_high; 219 __kernel_pid_t shm_cpid; /* pid of creator */ 220 __kernel_pid_t shm_lpid; /* pid of last operator */ 221 unsigned long shm_nattch; /* no. of current attaches */ 222 unsigned long __unused4; 223 unsigned long __unused5; 224 }; 225 226 #endif /* __xtensa__ */ 227 228 #ifndef HAVE_SHMID64_DS 229 /* 230 * The shmid64_ds structure for most architectures (though it came 231 * from x86_32 originally). Note extra padding because this structure 232 * is passed back and forth between kernel and user space. 233 * 234 * shmid64_ds was originally meant to be architecture specific, but 235 * everyone just ended up making identical copies without specific 236 * optimizations, so we may just as well all use the same one. 237 * 238 * 64 bit architectures use a 64-bit long time field here, while 239 * 32 bit architectures have a pair of unsigned long values. 240 * On big-endian systems, the lower half is in the wrong place. 241 * 242 * 243 * Pad space is left for: 244 * - 2 miscellaneous 32-bit values 245 */ 246 247 struct shmid64_ds { 248 struct ipc64_perm shm_perm; /* operation perms */ 249 size_t shm_segsz; /* size of segment (bytes) */ 250 #if __BITS_PER_LONG == 64 251 long shm_atime; /* last attach time */ 252 long shm_dtime; /* last detach time */ 253 long shm_ctime; /* last change time */ 254 #else 255 #define HAVE_SHMID64_DS_TIME_HIGH 256 unsigned long shm_atime; /* last attach time */ 257 unsigned long shm_atime_high; 258 unsigned long shm_dtime; /* last detach time */ 259 unsigned long shm_dtime_high; 260 unsigned long shm_ctime; /* last change time */ 261 unsigned long shm_ctime_high; 262 #endif 263 __kernel_pid_t shm_cpid; /* pid of creator */ 264 __kernel_pid_t shm_lpid; /* pid of last operator */ 265 unsigned long shm_nattch; /* no. of current attaches */ 266 unsigned long __unused4; 267 unsigned long __unused5; 268 }; 269 #endif /* shmid64_ds */ 270 271 #endif /* HAVE_SHMID64_DS */ 272 273 #endif /* LAPI_SHMBUF_H__ */ 274