sembuf.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
  2. #ifndef __ASM_GENERIC_SEMBUF_H
  3. #define __ASM_GENERIC_SEMBUF_H
  4. #include <asm/bitsperlong.h>
  5. /*
  6. * The semid64_ds structure for x86 architecture.
  7. * Note extra padding because this structure is passed back and forth
  8. * between kernel and user space.
  9. *
  10. * semid64_ds was originally meant to be architecture specific, but
  11. * everyone just ended up making identical copies without specific
  12. * optimizations, so we may just as well all use the same one.
  13. *
  14. * 64 bit architectures use a 64-bit __kernel_time_t here, while
  15. * 32 bit architectures have a pair of unsigned long values.
  16. * so they do not need the first two padding words.
  17. *
  18. * On big-endian systems, the padding is in the wrong place for
  19. * historic reasons, so user space has to reconstruct a time_t
  20. * value using
  21. *
  22. * user_semid_ds.sem_otime = kernel_semid64_ds.sem_otime +
  23. * ((long long)kernel_semid64_ds.sem_otime_high << 32)
  24. *
  25. * Pad space is left for 2 miscellaneous 32-bit values
  26. */
  27. struct semid64_ds {
  28. struct ipc64_perm sem_perm; /* permissions .. see ipc.h */
  29. #if __BITS_PER_LONG == 64
  30. __kernel_time_t sem_otime; /* last semop time */
  31. __kernel_time_t sem_ctime; /* last change time */
  32. #else
  33. unsigned long sem_otime; /* last semop time */
  34. unsigned long sem_otime_high;
  35. unsigned long sem_ctime; /* last change time */
  36. unsigned long sem_ctime_high;
  37. #endif
  38. unsigned long sem_nsems; /* no. of semaphores in array */
  39. unsigned long __unused3;
  40. unsigned long __unused4;
  41. };
  42. #endif /* __ASM_GENERIC_SEMBUF_H */