glibc/sysdeps/unix/sysv/linux/semctl.c

384 lines
9.6 KiB
C
Raw Normal View History

/* Copyright (C) 1995-2020 Free Software Foundation, Inc.
Update. 1997-03-25 02:15 Ulrich Drepper <drepper@cygnus.com> * gmon/gmon.c: Optimize a bit by using more sets of records to write in a single writev call. * math/math.h: Add definitions of macros __MATHCALLX and __MATHDECLX. * math/mathcalls.h: Use __MATHCALLX for fabs, infnan, copysign, nan, isnan, nextafter, trunc, __fpclassify and signbit to mark as `const'. Use __MATHDECLX for isinf and finite. * sysdeps/generic/setenv.c [_LIBC]: Define __clearenv and make clearenv a weak alias. Implement complex exponential function. * sysdeps/libm-ieee754/s_cexp.c: New file. * sysdeps/libm-ieee754/s_cexpf.c: New file. * sysdeps/libm-ieee754/s_cexpl.c: New file. * sysdeps/libm-ieee754/s_nan.c: Define function as __nan and make nan a weak alias. * sysdeps/libm-ieee754/s_nanf.c: Likewise for nanf. * sysdeps/libm-ieee754/s_nanl.c: Likewise for nanl. * sysdeps/unix/sysv/linux/iovec.h: Don't use kernel header because of type clashes. Add all definitions here. * sysdeps/unix/sysv/linux/shmat.c: Likewise. Correct types according to XPG4.2. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysvipc/sys/shm.h (shmat, shmdt): Correct types. * sysdeps/unix/sysv/linux/sys/kd.h: Define _LINUX_TYPES_H to avoid use of kernel types. 1997-03-25 00:00 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/linux/netinet/ip.h (struct ip_timestamp): Correct typos. Reported by a sun <asun@zoology.washington.edu>. 1997-03-20 21:58 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/libm-ieee754/s_asinhl.c: Fix sign of result. 1997-03-20 16:20 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/libm-ieee754/e_atan2l.c: Fix typo. 1997-03-20 14:23 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/fpu/__math.h (__logb, logb): Don't define. * sysdeps/m68k/fpu/s_logb.c: Removed. * sysdeps/m68k/fpu/s_logbf.c: Removed. * sysdeps/m68k/fpu/s_logbl.c: Removed. * sysdeps/m68k/fpu/__math.h (__ieee754_atan2, __ieee754_pow): Don't define here. * sysdeps/m68k/fpu/e_atan2.c: Rewritten. * sysdeps/m68k/fpu/e_pow.c: Likewise. * sysdeps/m68k/fpu/e_atan2f.c: Based on e_atan2.c. * sysdeps/m68k/fpu/e_atan2l.c: Likewise. * sysdeps/m68k/fpu/e_powf.c: Based on e_pow.c. * sysdeps/m68k/fpu/e_powl.c: Likewise. * sysdeps/m68k/fpu/s_log2.c: New file. * sysdeps/m68k/fpu/s_log2f.c: New file. * sysdeps/m68k/fpu/s_log2l.c: New file. * sysdeps/m68k/fpu/s_exp2.c: New file. * sysdeps/m68k/fpu/s_exp2f.c: New file. * sysdeps/m68k/fpu/s_exp2l.c: New file. 1997-03-20 14:46 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makeconfig (all): Make sure this is always the default goal. 1997-03-20 11:09 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * math/libm-test.c: Increase epsilon in many places. Fix many typos. Allow optinal argument also for short option. 1997-03-20 11:09 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * math/Makefile ($(objpfx)$(tests)): Link against libm. 1997-03-24 23:14 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-ieee754/s_fpclassifyl.c: Correct recognition of denormalized numbers. * sysdeps/i386/huge_val.h: Remove references to byte order macros. Don't include <endian.h>. 1997-03-19 15:18 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/huge_val.h: Remove references to byte order macros. Don't include <endian.h>. 1997-03-24 23:09 Ulrich Drepper <drepper@cygnus.com> * inet/rcmd.c (iruserok): Use access instead of euidaccess. 1997-03-15 18:08 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * math/cmathcalls.h: Remove whitespace before function name in use of __MATHDECL macro, to make it compilable with a traditional preprocessor. 1997-03-24 15:31 Ulrich Drepper <drepper@cygnus.com> * configure.in: Use AC_PROG_CC instead of AC_PROG_TOOL to find compiler. 1997-03-24 02:34 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-ieee754/s_finitel.c (__finitel): Shift return value by 31 positions to get 0/1 result. Patch by Joe Keane <jgk@jgk.org>. 1997-03-23 12:15 H.J. Lu <hjl@gnu.ai.mit.edu> * posix/getopt.c (__getopt_nonoption_flags): Make it extern to prevent from ld linking in getopt.o even if there is another incompatible one. * posix/getopt_init.c (__getopt_nonoption_flags): Remove extern. 1997-03-23 23:30 Thorsten Kukuk <kukuk@vt.uni-paderborn.de> * nis/nis_call.c (__do_niscall): Print message if cold start file does not exist. * nis/nis_file.c: Don't print error messages. * nis/nis_local_name.c (nis_local_host): Fix pointer errors. * nis/rpcsvc/ypclnt.h: Fix copyright and prototypes. * nis/rpcsvc/nis.h: Likewise. * nis/ypclnt.c: Fix prototypes. 1997-03-24 01:36 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-i387/e_scalb.S: Pop additional result before returning. * sysdeps/libm-i387/e_scalbf.S: Likewise. * sysdeps/libm-i387/e_scalbl.S: Likewise. Reported by Andreas Jaeger <aj@arthur.pfalz.de>. * elf/rtld.c (dl_main): Set main_map->l_opencount to 1 also if dynamic linker was called implicitly by the kernel. Reported by Eric Youngdale <eric@andante.jic.com>. * math/Makefile (CFLAGS-test-float.c, CFLAGS-test-double.c, CFLAGS-test-longdouble.c): New variables. Set to -fno-inline to prevent clever optimizations which corrupt the tests. 1997-03-23 21:33 Andreas Jaeger <aj@arthur.pfalz.de> * math/libm-test.c (scalb_test): New function. (sqrt_test): New function. (scalbn_test): New function. (ilogb_test): New function. (main): Added calls for new test functions. (ldexp_test): Add another test for ldexp(x,0). 1997-03-23 12:35 Andreas Jaeger <aj@arthur.pfalz.de> * math/libm-test.c (remquo_test): Correct messages so that they match the tests. (copysign_test): Likewise. 1997-03-23 16:28 Ulrich Drepper <drepper@cygnus.com> * stdio-common/Makefile (routines): Add printf_size. * stdio-common/printf.h: Add declarations for printf_size and printf_size_info. * stdio-common/printf-parse.h (__printf_arginfo_table): Correct declaration. (parse_one_spec): Test whether __printf_function_table is not NULL before using registered handlers and don't test __printf_arginfo_table. Update nargs also when handler is registered. * stdio-common/vfprintf.c (vfprintf): Count number of specifiers processed in fast loop. * stdio-common/printf_size: New file. 1997-03-22 04:53 Ulgmon_out_readrich Drepper <drepper@cygnus.com>
1997-03-25 01:45:04 +00:00
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
1995-02-18 01:27:10 +00:00
Update. 1997-03-25 02:15 Ulrich Drepper <drepper@cygnus.com> * gmon/gmon.c: Optimize a bit by using more sets of records to write in a single writev call. * math/math.h: Add definitions of macros __MATHCALLX and __MATHDECLX. * math/mathcalls.h: Use __MATHCALLX for fabs, infnan, copysign, nan, isnan, nextafter, trunc, __fpclassify and signbit to mark as `const'. Use __MATHDECLX for isinf and finite. * sysdeps/generic/setenv.c [_LIBC]: Define __clearenv and make clearenv a weak alias. Implement complex exponential function. * sysdeps/libm-ieee754/s_cexp.c: New file. * sysdeps/libm-ieee754/s_cexpf.c: New file. * sysdeps/libm-ieee754/s_cexpl.c: New file. * sysdeps/libm-ieee754/s_nan.c: Define function as __nan and make nan a weak alias. * sysdeps/libm-ieee754/s_nanf.c: Likewise for nanf. * sysdeps/libm-ieee754/s_nanl.c: Likewise for nanl. * sysdeps/unix/sysv/linux/iovec.h: Don't use kernel header because of type clashes. Add all definitions here. * sysdeps/unix/sysv/linux/shmat.c: Likewise. Correct types according to XPG4.2. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysvipc/sys/shm.h (shmat, shmdt): Correct types. * sysdeps/unix/sysv/linux/sys/kd.h: Define _LINUX_TYPES_H to avoid use of kernel types. 1997-03-25 00:00 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/linux/netinet/ip.h (struct ip_timestamp): Correct typos. Reported by a sun <asun@zoology.washington.edu>. 1997-03-20 21:58 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/libm-ieee754/s_asinhl.c: Fix sign of result. 1997-03-20 16:20 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/libm-ieee754/e_atan2l.c: Fix typo. 1997-03-20 14:23 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/fpu/__math.h (__logb, logb): Don't define. * sysdeps/m68k/fpu/s_logb.c: Removed. * sysdeps/m68k/fpu/s_logbf.c: Removed. * sysdeps/m68k/fpu/s_logbl.c: Removed. * sysdeps/m68k/fpu/__math.h (__ieee754_atan2, __ieee754_pow): Don't define here. * sysdeps/m68k/fpu/e_atan2.c: Rewritten. * sysdeps/m68k/fpu/e_pow.c: Likewise. * sysdeps/m68k/fpu/e_atan2f.c: Based on e_atan2.c. * sysdeps/m68k/fpu/e_atan2l.c: Likewise. * sysdeps/m68k/fpu/e_powf.c: Based on e_pow.c. * sysdeps/m68k/fpu/e_powl.c: Likewise. * sysdeps/m68k/fpu/s_log2.c: New file. * sysdeps/m68k/fpu/s_log2f.c: New file. * sysdeps/m68k/fpu/s_log2l.c: New file. * sysdeps/m68k/fpu/s_exp2.c: New file. * sysdeps/m68k/fpu/s_exp2f.c: New file. * sysdeps/m68k/fpu/s_exp2l.c: New file. 1997-03-20 14:46 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makeconfig (all): Make sure this is always the default goal. 1997-03-20 11:09 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * math/libm-test.c: Increase epsilon in many places. Fix many typos. Allow optinal argument also for short option. 1997-03-20 11:09 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * math/Makefile ($(objpfx)$(tests)): Link against libm. 1997-03-24 23:14 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-ieee754/s_fpclassifyl.c: Correct recognition of denormalized numbers. * sysdeps/i386/huge_val.h: Remove references to byte order macros. Don't include <endian.h>. 1997-03-19 15:18 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/huge_val.h: Remove references to byte order macros. Don't include <endian.h>. 1997-03-24 23:09 Ulrich Drepper <drepper@cygnus.com> * inet/rcmd.c (iruserok): Use access instead of euidaccess. 1997-03-15 18:08 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * math/cmathcalls.h: Remove whitespace before function name in use of __MATHDECL macro, to make it compilable with a traditional preprocessor. 1997-03-24 15:31 Ulrich Drepper <drepper@cygnus.com> * configure.in: Use AC_PROG_CC instead of AC_PROG_TOOL to find compiler. 1997-03-24 02:34 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-ieee754/s_finitel.c (__finitel): Shift return value by 31 positions to get 0/1 result. Patch by Joe Keane <jgk@jgk.org>. 1997-03-23 12:15 H.J. Lu <hjl@gnu.ai.mit.edu> * posix/getopt.c (__getopt_nonoption_flags): Make it extern to prevent from ld linking in getopt.o even if there is another incompatible one. * posix/getopt_init.c (__getopt_nonoption_flags): Remove extern. 1997-03-23 23:30 Thorsten Kukuk <kukuk@vt.uni-paderborn.de> * nis/nis_call.c (__do_niscall): Print message if cold start file does not exist. * nis/nis_file.c: Don't print error messages. * nis/nis_local_name.c (nis_local_host): Fix pointer errors. * nis/rpcsvc/ypclnt.h: Fix copyright and prototypes. * nis/rpcsvc/nis.h: Likewise. * nis/ypclnt.c: Fix prototypes. 1997-03-24 01:36 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-i387/e_scalb.S: Pop additional result before returning. * sysdeps/libm-i387/e_scalbf.S: Likewise. * sysdeps/libm-i387/e_scalbl.S: Likewise. Reported by Andreas Jaeger <aj@arthur.pfalz.de>. * elf/rtld.c (dl_main): Set main_map->l_opencount to 1 also if dynamic linker was called implicitly by the kernel. Reported by Eric Youngdale <eric@andante.jic.com>. * math/Makefile (CFLAGS-test-float.c, CFLAGS-test-double.c, CFLAGS-test-longdouble.c): New variables. Set to -fno-inline to prevent clever optimizations which corrupt the tests. 1997-03-23 21:33 Andreas Jaeger <aj@arthur.pfalz.de> * math/libm-test.c (scalb_test): New function. (sqrt_test): New function. (scalbn_test): New function. (ilogb_test): New function. (main): Added calls for new test functions. (ldexp_test): Add another test for ldexp(x,0). 1997-03-23 12:35 Andreas Jaeger <aj@arthur.pfalz.de> * math/libm-test.c (remquo_test): Correct messages so that they match the tests. (copysign_test): Likewise. 1997-03-23 16:28 Ulrich Drepper <drepper@cygnus.com> * stdio-common/Makefile (routines): Add printf_size. * stdio-common/printf.h: Add declarations for printf_size and printf_size_info. * stdio-common/printf-parse.h (__printf_arginfo_table): Correct declaration. (parse_one_spec): Test whether __printf_function_table is not NULL before using registered handlers and don't test __printf_arginfo_table. Update nargs also when handler is registered. * stdio-common/vfprintf.c (vfprintf): Count number of specifiers processed in fast loop. * stdio-common/printf_size: New file. 1997-03-22 04:53 Ulgmon_out_readrich Drepper <drepper@cygnus.com>
1997-03-25 01:45:04 +00:00
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
1995-02-18 01:27:10 +00:00
Update. 1997-03-25 02:15 Ulrich Drepper <drepper@cygnus.com> * gmon/gmon.c: Optimize a bit by using more sets of records to write in a single writev call. * math/math.h: Add definitions of macros __MATHCALLX and __MATHDECLX. * math/mathcalls.h: Use __MATHCALLX for fabs, infnan, copysign, nan, isnan, nextafter, trunc, __fpclassify and signbit to mark as `const'. Use __MATHDECLX for isinf and finite. * sysdeps/generic/setenv.c [_LIBC]: Define __clearenv and make clearenv a weak alias. Implement complex exponential function. * sysdeps/libm-ieee754/s_cexp.c: New file. * sysdeps/libm-ieee754/s_cexpf.c: New file. * sysdeps/libm-ieee754/s_cexpl.c: New file. * sysdeps/libm-ieee754/s_nan.c: Define function as __nan and make nan a weak alias. * sysdeps/libm-ieee754/s_nanf.c: Likewise for nanf. * sysdeps/libm-ieee754/s_nanl.c: Likewise for nanl. * sysdeps/unix/sysv/linux/iovec.h: Don't use kernel header because of type clashes. Add all definitions here. * sysdeps/unix/sysv/linux/shmat.c: Likewise. Correct types according to XPG4.2. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysvipc/sys/shm.h (shmat, shmdt): Correct types. * sysdeps/unix/sysv/linux/sys/kd.h: Define _LINUX_TYPES_H to avoid use of kernel types. 1997-03-25 00:00 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/linux/netinet/ip.h (struct ip_timestamp): Correct typos. Reported by a sun <asun@zoology.washington.edu>. 1997-03-20 21:58 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/libm-ieee754/s_asinhl.c: Fix sign of result. 1997-03-20 16:20 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/libm-ieee754/e_atan2l.c: Fix typo. 1997-03-20 14:23 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/fpu/__math.h (__logb, logb): Don't define. * sysdeps/m68k/fpu/s_logb.c: Removed. * sysdeps/m68k/fpu/s_logbf.c: Removed. * sysdeps/m68k/fpu/s_logbl.c: Removed. * sysdeps/m68k/fpu/__math.h (__ieee754_atan2, __ieee754_pow): Don't define here. * sysdeps/m68k/fpu/e_atan2.c: Rewritten. * sysdeps/m68k/fpu/e_pow.c: Likewise. * sysdeps/m68k/fpu/e_atan2f.c: Based on e_atan2.c. * sysdeps/m68k/fpu/e_atan2l.c: Likewise. * sysdeps/m68k/fpu/e_powf.c: Based on e_pow.c. * sysdeps/m68k/fpu/e_powl.c: Likewise. * sysdeps/m68k/fpu/s_log2.c: New file. * sysdeps/m68k/fpu/s_log2f.c: New file. * sysdeps/m68k/fpu/s_log2l.c: New file. * sysdeps/m68k/fpu/s_exp2.c: New file. * sysdeps/m68k/fpu/s_exp2f.c: New file. * sysdeps/m68k/fpu/s_exp2l.c: New file. 1997-03-20 14:46 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makeconfig (all): Make sure this is always the default goal. 1997-03-20 11:09 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * math/libm-test.c: Increase epsilon in many places. Fix many typos. Allow optinal argument also for short option. 1997-03-20 11:09 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * math/Makefile ($(objpfx)$(tests)): Link against libm. 1997-03-24 23:14 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-ieee754/s_fpclassifyl.c: Correct recognition of denormalized numbers. * sysdeps/i386/huge_val.h: Remove references to byte order macros. Don't include <endian.h>. 1997-03-19 15:18 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * sysdeps/m68k/huge_val.h: Remove references to byte order macros. Don't include <endian.h>. 1997-03-24 23:09 Ulrich Drepper <drepper@cygnus.com> * inet/rcmd.c (iruserok): Use access instead of euidaccess. 1997-03-15 18:08 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * math/cmathcalls.h: Remove whitespace before function name in use of __MATHDECL macro, to make it compilable with a traditional preprocessor. 1997-03-24 15:31 Ulrich Drepper <drepper@cygnus.com> * configure.in: Use AC_PROG_CC instead of AC_PROG_TOOL to find compiler. 1997-03-24 02:34 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-ieee754/s_finitel.c (__finitel): Shift return value by 31 positions to get 0/1 result. Patch by Joe Keane <jgk@jgk.org>. 1997-03-23 12:15 H.J. Lu <hjl@gnu.ai.mit.edu> * posix/getopt.c (__getopt_nonoption_flags): Make it extern to prevent from ld linking in getopt.o even if there is another incompatible one. * posix/getopt_init.c (__getopt_nonoption_flags): Remove extern. 1997-03-23 23:30 Thorsten Kukuk <kukuk@vt.uni-paderborn.de> * nis/nis_call.c (__do_niscall): Print message if cold start file does not exist. * nis/nis_file.c: Don't print error messages. * nis/nis_local_name.c (nis_local_host): Fix pointer errors. * nis/rpcsvc/ypclnt.h: Fix copyright and prototypes. * nis/rpcsvc/nis.h: Likewise. * nis/ypclnt.c: Fix prototypes. 1997-03-24 01:36 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-i387/e_scalb.S: Pop additional result before returning. * sysdeps/libm-i387/e_scalbf.S: Likewise. * sysdeps/libm-i387/e_scalbl.S: Likewise. Reported by Andreas Jaeger <aj@arthur.pfalz.de>. * elf/rtld.c (dl_main): Set main_map->l_opencount to 1 also if dynamic linker was called implicitly by the kernel. Reported by Eric Youngdale <eric@andante.jic.com>. * math/Makefile (CFLAGS-test-float.c, CFLAGS-test-double.c, CFLAGS-test-longdouble.c): New variables. Set to -fno-inline to prevent clever optimizations which corrupt the tests. 1997-03-23 21:33 Andreas Jaeger <aj@arthur.pfalz.de> * math/libm-test.c (scalb_test): New function. (sqrt_test): New function. (scalbn_test): New function. (ilogb_test): New function. (main): Added calls for new test functions. (ldexp_test): Add another test for ldexp(x,0). 1997-03-23 12:35 Andreas Jaeger <aj@arthur.pfalz.de> * math/libm-test.c (remquo_test): Correct messages so that they match the tests. (copysign_test): Likewise. 1997-03-23 16:28 Ulrich Drepper <drepper@cygnus.com> * stdio-common/Makefile (routines): Add printf_size. * stdio-common/printf.h: Add declarations for printf_size and printf_size_info. * stdio-common/printf-parse.h (__printf_arginfo_table): Correct declaration. (parse_one_spec): Test whether __printf_function_table is not NULL before using registered handlers and don't test __printf_arginfo_table. Update nargs also when handler is registered. * stdio-common/vfprintf.c (vfprintf): Count number of specifiers processed in fast loop. * stdio-common/printf_size: New file. 1997-03-22 04:53 Ulgmon_out_readrich Drepper <drepper@cygnus.com>
1997-03-25 01:45:04 +00:00
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
1995-02-18 01:27:10 +00:00
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
Prefer https to http for gnu.org and fsf.org URLs Also, change sources.redhat.com to sourceware.org. This patch was automatically generated by running the following shell script, which uses GNU sed, and which avoids modifying files imported from upstream: sed -ri ' s,(http|ftp)(://(.*\.)?(gnu|fsf|sourceware)\.org($|[^.]|\.[^a-z])),https\2,g s,(http|ftp)(://(.*\.)?)sources\.redhat\.com($|[^.]|\.[^a-z]),https\2sourceware.org\4,g ' \ $(find $(git ls-files) -prune -type f \ ! -name '*.po' \ ! -name 'ChangeLog*' \ ! -path COPYING ! -path COPYING.LIB \ ! -path manual/fdl-1.3.texi ! -path manual/lgpl-2.1.texi \ ! -path manual/texinfo.tex ! -path scripts/config.guess \ ! -path scripts/config.sub ! -path scripts/install-sh \ ! -path scripts/mkinstalldirs ! -path scripts/move-if-change \ ! -path INSTALL ! -path locale/programs/charmap-kw.h \ ! -path po/libc.pot ! -path sysdeps/gnu/errlist.c \ ! '(' -name configure \ -execdir test -f configure.ac -o -f configure.in ';' ')' \ ! '(' -name preconfigure \ -execdir test -f preconfigure.ac ';' ')' \ -print) and then by running 'make dist-prepare' to regenerate files built from the altered files, and then executing the following to cleanup: chmod a+x sysdeps/unix/sysv/linux/riscv/configure # Omit irrelevant whitespace and comment-only changes, # perhaps from a slightly-different Autoconf version. git checkout -f \ sysdeps/csky/configure \ sysdeps/hppa/configure \ sysdeps/riscv/configure \ sysdeps/unix/sysv/linux/csky/configure # Omit changes that caused a pre-commit check to fail like this: # remote: *** error: sysdeps/powerpc/powerpc64/ppc-mcount.S: trailing lines git checkout -f \ sysdeps/powerpc/powerpc64/ppc-mcount.S \ sysdeps/unix/sysv/linux/s390/s390-64/syscall.S # Omit change that caused a pre-commit check to fail like this: # remote: *** error: sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S: last line does not end in newline git checkout -f sysdeps/sparc/sparc64/multiarch/memcpy-ultra3.S
2019-09-07 05:40:42 +00:00
<https://www.gnu.org/licenses/>. */
1995-02-18 01:27:10 +00:00
Document new files for Linux i386/ELF port. Fri Sep 8 16:32:12 1995 Ulrich Drepper <drepper@gnu.ai.mit.edu> * sysdeps/unix/sysv/linux/Implies, sysdeps/unix/sysv/linux/Makefile, sysdeps/unix/sysv/linux/Subdirs, sysdeps/unix/sysv/linux/accept.S, sysdeps/unix/sysv/linux/adjtime.c, sysdeps/unix/sysv/linux/adjtimex.S, sysdeps/unix/sysv/linux/bind.S, sysdeps/unix/sysv/linux/connect.S, sysdeps/unix/sysv/linux/direct.h, sysdeps/unix/sysv/linux/dl-machine.h, sysdeps/unix/sysv/linux/errnos.h, sysdeps/unix/sysv/linux/fork.S, sysdeps/unix/sysv/linux/gethostid.c, sysdeps/unix/sysv/linux/gethostname.C, sysdeps/unix/sysv/linux/getpeername.S, sysdeps/unix/sysv/linux/getpgid.S, sysdeps/unix/sysv/linux/getpgrp.S, sysdeps/unix/sysv/linux/getsockname.S, sysdeps/unix/sysv/linux/getsockopt.S, sysdeps/unix/sysv/linux/gtty.S, sysdeps/unix/sysv/linux/listen.S, sysdeps/unix/sysv/linux/local_lim.h, sysdeps/unix/sysv/linux/madvise.c, sysdeps/unix/sysv/linux/msgctl.c, sysdeps/unix/sysv/linux/msgget.c, sysdeps/unix/sysv/linux/msgrcv.c, sysdeps/unix/sysv/linux/msgsnd.c, sysdeps/unix/sysv/linux/pipe.S, sysdeps/unix/sysv/linux/poll.c, sysdeps/unix/sysv/linux/readv.c, sysdeps/unix/sysv/linux/recv.S, sysdeps/unix/sysv/linux/recvfrom.S, sysdeps/unix/sysv/linux/recvmsg.S, sysdeps/unix/sysv/linux/semctl.c, sysdeps/unix/sysv/linux/semget.c, sysdeps/unix/sysv/linux/semop.c, sysdeps/unix/sysv/linux/send.S, sysdeps/unix/sysv/linux/sendmsg.S, sysdeps/unix/sysv/linux/sendto.S, sysdeps/unix/sysv/linux/setegid.c, sysdeps/unix/sysv/linux/seteuid.c, sysdeps/unix/sysv/linux/sethostid.c, sysdeps/unix/sysv/linux/setpgid.c, sysdeps/unix/sysv/linux/setpgrp.c, sysdeps/unix/sysv/linux/setsid.S, sysdeps/unix/sysv/linux/setsockopt.S, sysdeps/unix/sysv/linux/settimeofday.S, sysdeps/unix/sysv/linux/shmat.c, sysdeps/unix/sysv/linux/shmctl.c, sysdeps/unix/sysv/linux/shmdt.c, sysdeps/unix/sysv/linux/shmget.c, sysdeps/unix/sysv/linux/shutdown.S, sysdeps/unix/sysv/linux/sigaction.S, sysdeps/unix/sysv/linux/signal.S, sysdeps/unix/sysv/linux/sigpending.S, sysdeps/unix/sysv/linux/sigset.h, sysdeps/unix/sysv/linux/sockaddrcom.h, sysdeps/unix/sysv/linux/socketpair.S, sysdeps/unix/sysv/linux/speed.c, sysdeps/unix/sysv/linux/statbuf.h, sysdeps/unix/sysv/linux/stty.S, sysdeps/unix/sysv/linux/syscall.h, sysdeps/unix/sysv/linux/sysconf.c, sysdeps/unix/sysv/linux/tcdrain.c, sysdeps/unix/sysv/linux/tcflow.c, sysdeps/unix/sysv/linux/tcflush.c, sysdeps/unix/sysv/linux/tcgetattr.c, sysdeps/unix/sysv/linux/tcsetattr.c, sysdeps/unix/sysv/linux/termbits.h, sysdeps/unix/sysv/linux/ualarm.c, sysdeps/unix/sysv/linux/ulimit.c, sysdeps/unix/sysv/linux/usleep.c, sysdeps/unix/sysv/linux/utsnamelen.h, sysdeps/unix/sysv/linux/vfork.c, sysdeps/unix/sysv/linux/wait.c, sysdeps/unix/sysv/linux/wait4.S, sysdeps/unix/sysv/linux/waitpid.c, sysdeps/unix/sysv/linux/writev.c: New Linux/ELF specific, architecture independent files. sysdeps/unix/sysv/linux/i386/Dist, sysdeps/unix/sysv/linux/i386/Makefile, sysdeps/unix/sysv/linux/i386/brk.S, sysdeps/unix/sysv/linux/i386/fcntlbits.h, sysdeps/unix/sysv/linux/i386/fpu_control.c, sysdeps/unix/sysv/linux/i386/fpu_control.h, sysdeps/unix/sysv/linux/i386/fstat.S, sysdeps/unix/sysv/linux/i386/fxstat.S, sysdeps/unix/sysv/linux/i386/ieee_fpu.c, sysdeps/unix/sysv/linux/i386/init-first.S, sysdeps/unix/sysv/linux/i386/ipc.S, sysdeps/unix/sysv/linux/i386/lstat.S, sysdeps/unix/sysv/linux/i386/lxstat.S, sysdeps/unix/sysv/linux/i386/mknod.S, sysdeps/unix/sysv/linux/i386/mmap.S, sysdeps/unix/sysv/linux/i386/sbrk.S, sysdeps/unix/sysv/linux/i386/setfpucw.c, sysdeps/unix/sysv/linux/i386/signum.h, sysdeps/unix/sysv/linux/i386/socket.S, sysdeps/unix/sysv/linux/i386/stat.S, sysdeps/unix/sysv/linux/i386/syscall.S, sysdeps/unix/sysv/linux/i386/sysdep.S, sysdeps/unix/sysv/linux/i386/sysdep.h, sysdeps/unix/sysv/linux/i386/xmknod.S, sysdeps/unix/sysv/linux/i386/xstat.S: New Linux i386/ELF specific files. sysdeps/unix/sysv/linux/sys/ipc_buf.h, sysdeps/unix/sysv/linux/sys/mman.h, sysdeps/unix/sysv/linux/sys/msq_buf.h, sysdeps/unix/sysv/linux/sys/sem_buf.h, sysdeps/unix/sysv/linux/sys/shm_buf.h, sysdeps/unix/sysv/linux/sys/socketcall.h, sysdeps/unix/sysv/linux/sys/timex.h: New Linux/ELF specific, architecture independent header files.
1995-09-08 17:02:25 +00:00
#include <sys/sem.h>
#include <stdarg.h>
Update. 2000-01-24 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/linux/Dist: Add ipc_priv.h. * sysdeps/unix/sysv/linux/alpha/Dist: Likewise. 2000-01-24 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/bits/ipc.h: Move private decls... * sysdeps/unix/sysv/linux/ipc_priv.h: ...here. * sysdeps/unix/sysv/linux/bits/msq.h: Move private decls... * sysdeps/unix/sysv/linux/msgctl.c: ...here. Include ipc_priv.h. * sysdeps/unix/sysv/linux/bits/sem.h: Move private decls... * sysdeps/unix/sysv/linux/semctl.c: ...here. Include ipc_priv.h. * sysdeps/unix/sysv/linux/bits/shm.h: Move private decls... * sysdeps/unix/sysv/linux/shmctl.c: ...here. Include ipc_priv.h. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Move private decls... * sysdeps/unix/sysv/linux/alpha/ipc_priv.h: ...here. * sysdeps/unix/sysv/linux/alpha/bits/msq.h: Remove private decls. * sysdeps/unix/sysv/linux/alpha/bits/sem.h: Likewise. * sysdeps/unix/sysv/linux/alpha/bits/shm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/msq.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/sem.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/shm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/msgctl.c: Include ipc_priv.h. * sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/msgget.c: Likewise. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysdeps/unix/sysv/linux/msgsnd.c: Likewise. * sysdeps/unix/sysv/linux/semget.c: Likewise. * sysdeps/unix/sysv/linux/semop.c: Likewise. * sysdeps/unix/sysv/linux/shmat.c: Likewise. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/shmget.c: Likewise.
2000-01-24 12:38:46 +00:00
#include <ipc_priv.h>
#include <sysdep.h>
#include <shlib-compat.h>
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
#include <bits/types/struct_semid64_ds.h> /* For __semid64_ds. */
#include <linux/posix_types.h> /* For __kernel_mode_t. */
Update. 2000-01-24 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/linux/Dist: Add ipc_priv.h. * sysdeps/unix/sysv/linux/alpha/Dist: Likewise. 2000-01-24 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/bits/ipc.h: Move private decls... * sysdeps/unix/sysv/linux/ipc_priv.h: ...here. * sysdeps/unix/sysv/linux/bits/msq.h: Move private decls... * sysdeps/unix/sysv/linux/msgctl.c: ...here. Include ipc_priv.h. * sysdeps/unix/sysv/linux/bits/sem.h: Move private decls... * sysdeps/unix/sysv/linux/semctl.c: ...here. Include ipc_priv.h. * sysdeps/unix/sysv/linux/bits/shm.h: Move private decls... * sysdeps/unix/sysv/linux/shmctl.c: ...here. Include ipc_priv.h. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Move private decls... * sysdeps/unix/sysv/linux/alpha/ipc_priv.h: ...here. * sysdeps/unix/sysv/linux/alpha/bits/msq.h: Remove private decls. * sysdeps/unix/sysv/linux/alpha/bits/sem.h: Likewise. * sysdeps/unix/sysv/linux/alpha/bits/shm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/msq.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/sem.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/shm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/msgctl.c: Include ipc_priv.h. * sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/msgget.c: Likewise. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysdeps/unix/sysv/linux/msgsnd.c: Likewise. * sysdeps/unix/sysv/linux/semget.c: Likewise. * sysdeps/unix/sysv/linux/semop.c: Likewise. * sysdeps/unix/sysv/linux/shmat.c: Likewise. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/shmget.c: Likewise.
2000-01-24 12:38:46 +00:00
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
/* The struct used to issue the syscall. For architectures that assume
64-bit time as default (!__ASSUME_TIME64_SYSCALLS) the syscall will
split the resulting 64-bit sem_{o,c}time in two fields (sem_{o,c}time
and __sem_{o,c}time_high). */
union semun
{
int val; /* value for SETVAL */
struct semid_ds *buf; /* buffer for IPC_STAT & IPC_SET */
unsigned short int *array; /* array for GETALL & SETALL */
struct seminfo *__buf; /* buffer for IPC_INFO */
};
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
#if __IPC_TIME64 == 0
# define semun64 semun
typedef union semun semctl_arg_t;
#else
# include <struct_kernel_semid64_ds.h>
union ksemun64
{
int val;
struct kernel_semid64_ds *buf;
unsigned short int *array;
struct seminfo *__buf;
};
# if __TIMESIZE == 64
# define semun64 semun
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
# else
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
/* The struct used when __semctl64 is called. */
union semun64
{
int val;
struct __semid64_ds *buf;
unsigned short int *array;
struct seminfo *__buf;
};
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
# endif
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
static void
semid64_to_ksemid64 (const struct __semid64_ds *semid64,
struct kernel_semid64_ds *ksemid)
{
ksemid->sem_perm = semid64->sem_perm;
ksemid->sem_otime = semid64->sem_otime;
ksemid->sem_otime_high = semid64->sem_otime >> 32;
ksemid->sem_ctime = semid64->sem_ctime;
ksemid->sem_ctime_high = semid64->sem_ctime >> 32;
ksemid->sem_nsems = semid64->sem_nsems;
}
static void
ksemid64_to_semid64 (const struct kernel_semid64_ds *ksemid,
struct __semid64_ds *semid64)
{
semid64->sem_perm = ksemid->sem_perm;
semid64->sem_otime = ksemid->sem_otime
| ((__time64_t) ksemid->sem_otime_high << 32);
semid64->sem_ctime = ksemid->sem_ctime
| ((__time64_t) ksemid->sem_ctime_high << 32);
semid64->sem_nsems = ksemid->sem_nsems;
}
static union ksemun64
semun64_to_ksemun64 (int cmd, union semun64 semun64,
struct kernel_semid64_ds *buf)
{
union ksemun64 r = { 0 };
switch (cmd)
{
case SETVAL:
r.val = semun64.val;
break;
case GETALL:
case SETALL:
r.array = semun64.array;
break;
case SEM_STAT:
case SEM_STAT_ANY:
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
case IPC_STAT:
case IPC_SET:
r.buf = buf;
semid64_to_ksemid64 (semun64.buf, r.buf);
break;
case IPC_INFO:
case SEM_INFO:
r.__buf = semun64.__buf;
break;
}
return r;
}
typedef union ksemun64 semctl_arg_t;
#endif
1995-02-18 01:27:10 +00:00
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
static int
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
semctl_syscall (int semid, int semnum, int cmd, semctl_arg_t arg)
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
{
#ifdef __ASSUME_DIRECT_SYSVIPC_SYSCALLS
return INLINE_SYSCALL_CALL (semctl, semid, semnum, cmd | __IPC_64,
arg.array);
#else
return INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd | __IPC_64,
SEMCTL_ARG_ADDRESS (arg));
#endif
}
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
/* POSIX states ipc_perm mode should have type of mode_t. */
_Static_assert (sizeof ((struct semid_ds){0}.sem_perm.mode)
== sizeof (mode_t),
"sizeof (msqid_ds.msg_perm.mode) != sizeof (mode_t)");
Document new files for Linux i386/ELF port. Fri Sep 8 16:32:12 1995 Ulrich Drepper <drepper@gnu.ai.mit.edu> * sysdeps/unix/sysv/linux/Implies, sysdeps/unix/sysv/linux/Makefile, sysdeps/unix/sysv/linux/Subdirs, sysdeps/unix/sysv/linux/accept.S, sysdeps/unix/sysv/linux/adjtime.c, sysdeps/unix/sysv/linux/adjtimex.S, sysdeps/unix/sysv/linux/bind.S, sysdeps/unix/sysv/linux/connect.S, sysdeps/unix/sysv/linux/direct.h, sysdeps/unix/sysv/linux/dl-machine.h, sysdeps/unix/sysv/linux/errnos.h, sysdeps/unix/sysv/linux/fork.S, sysdeps/unix/sysv/linux/gethostid.c, sysdeps/unix/sysv/linux/gethostname.C, sysdeps/unix/sysv/linux/getpeername.S, sysdeps/unix/sysv/linux/getpgid.S, sysdeps/unix/sysv/linux/getpgrp.S, sysdeps/unix/sysv/linux/getsockname.S, sysdeps/unix/sysv/linux/getsockopt.S, sysdeps/unix/sysv/linux/gtty.S, sysdeps/unix/sysv/linux/listen.S, sysdeps/unix/sysv/linux/local_lim.h, sysdeps/unix/sysv/linux/madvise.c, sysdeps/unix/sysv/linux/msgctl.c, sysdeps/unix/sysv/linux/msgget.c, sysdeps/unix/sysv/linux/msgrcv.c, sysdeps/unix/sysv/linux/msgsnd.c, sysdeps/unix/sysv/linux/pipe.S, sysdeps/unix/sysv/linux/poll.c, sysdeps/unix/sysv/linux/readv.c, sysdeps/unix/sysv/linux/recv.S, sysdeps/unix/sysv/linux/recvfrom.S, sysdeps/unix/sysv/linux/recvmsg.S, sysdeps/unix/sysv/linux/semctl.c, sysdeps/unix/sysv/linux/semget.c, sysdeps/unix/sysv/linux/semop.c, sysdeps/unix/sysv/linux/send.S, sysdeps/unix/sysv/linux/sendmsg.S, sysdeps/unix/sysv/linux/sendto.S, sysdeps/unix/sysv/linux/setegid.c, sysdeps/unix/sysv/linux/seteuid.c, sysdeps/unix/sysv/linux/sethostid.c, sysdeps/unix/sysv/linux/setpgid.c, sysdeps/unix/sysv/linux/setpgrp.c, sysdeps/unix/sysv/linux/setsid.S, sysdeps/unix/sysv/linux/setsockopt.S, sysdeps/unix/sysv/linux/settimeofday.S, sysdeps/unix/sysv/linux/shmat.c, sysdeps/unix/sysv/linux/shmctl.c, sysdeps/unix/sysv/linux/shmdt.c, sysdeps/unix/sysv/linux/shmget.c, sysdeps/unix/sysv/linux/shutdown.S, sysdeps/unix/sysv/linux/sigaction.S, sysdeps/unix/sysv/linux/signal.S, sysdeps/unix/sysv/linux/sigpending.S, sysdeps/unix/sysv/linux/sigset.h, sysdeps/unix/sysv/linux/sockaddrcom.h, sysdeps/unix/sysv/linux/socketpair.S, sysdeps/unix/sysv/linux/speed.c, sysdeps/unix/sysv/linux/statbuf.h, sysdeps/unix/sysv/linux/stty.S, sysdeps/unix/sysv/linux/syscall.h, sysdeps/unix/sysv/linux/sysconf.c, sysdeps/unix/sysv/linux/tcdrain.c, sysdeps/unix/sysv/linux/tcflow.c, sysdeps/unix/sysv/linux/tcflush.c, sysdeps/unix/sysv/linux/tcgetattr.c, sysdeps/unix/sysv/linux/tcsetattr.c, sysdeps/unix/sysv/linux/termbits.h, sysdeps/unix/sysv/linux/ualarm.c, sysdeps/unix/sysv/linux/ulimit.c, sysdeps/unix/sysv/linux/usleep.c, sysdeps/unix/sysv/linux/utsnamelen.h, sysdeps/unix/sysv/linux/vfork.c, sysdeps/unix/sysv/linux/wait.c, sysdeps/unix/sysv/linux/wait4.S, sysdeps/unix/sysv/linux/waitpid.c, sysdeps/unix/sysv/linux/writev.c: New Linux/ELF specific, architecture independent files. sysdeps/unix/sysv/linux/i386/Dist, sysdeps/unix/sysv/linux/i386/Makefile, sysdeps/unix/sysv/linux/i386/brk.S, sysdeps/unix/sysv/linux/i386/fcntlbits.h, sysdeps/unix/sysv/linux/i386/fpu_control.c, sysdeps/unix/sysv/linux/i386/fpu_control.h, sysdeps/unix/sysv/linux/i386/fstat.S, sysdeps/unix/sysv/linux/i386/fxstat.S, sysdeps/unix/sysv/linux/i386/ieee_fpu.c, sysdeps/unix/sysv/linux/i386/init-first.S, sysdeps/unix/sysv/linux/i386/ipc.S, sysdeps/unix/sysv/linux/i386/lstat.S, sysdeps/unix/sysv/linux/i386/lxstat.S, sysdeps/unix/sysv/linux/i386/mknod.S, sysdeps/unix/sysv/linux/i386/mmap.S, sysdeps/unix/sysv/linux/i386/sbrk.S, sysdeps/unix/sysv/linux/i386/setfpucw.c, sysdeps/unix/sysv/linux/i386/signum.h, sysdeps/unix/sysv/linux/i386/socket.S, sysdeps/unix/sysv/linux/i386/stat.S, sysdeps/unix/sysv/linux/i386/syscall.S, sysdeps/unix/sysv/linux/i386/sysdep.S, sysdeps/unix/sysv/linux/i386/sysdep.h, sysdeps/unix/sysv/linux/i386/xmknod.S, sysdeps/unix/sysv/linux/i386/xstat.S: New Linux i386/ELF specific files. sysdeps/unix/sysv/linux/sys/ipc_buf.h, sysdeps/unix/sysv/linux/sys/mman.h, sysdeps/unix/sysv/linux/sys/msq_buf.h, sysdeps/unix/sysv/linux/sys/sem_buf.h, sysdeps/unix/sysv/linux/sys/shm_buf.h, sysdeps/unix/sysv/linux/sys/socketcall.h, sysdeps/unix/sysv/linux/sys/timex.h: New Linux/ELF specific, architecture independent header files.
1995-09-08 17:02:25 +00:00
int
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
__semctl64 (int semid, int semnum, int cmd, ...)
Document new files for Linux i386/ELF port. Fri Sep 8 16:32:12 1995 Ulrich Drepper <drepper@gnu.ai.mit.edu> * sysdeps/unix/sysv/linux/Implies, sysdeps/unix/sysv/linux/Makefile, sysdeps/unix/sysv/linux/Subdirs, sysdeps/unix/sysv/linux/accept.S, sysdeps/unix/sysv/linux/adjtime.c, sysdeps/unix/sysv/linux/adjtimex.S, sysdeps/unix/sysv/linux/bind.S, sysdeps/unix/sysv/linux/connect.S, sysdeps/unix/sysv/linux/direct.h, sysdeps/unix/sysv/linux/dl-machine.h, sysdeps/unix/sysv/linux/errnos.h, sysdeps/unix/sysv/linux/fork.S, sysdeps/unix/sysv/linux/gethostid.c, sysdeps/unix/sysv/linux/gethostname.C, sysdeps/unix/sysv/linux/getpeername.S, sysdeps/unix/sysv/linux/getpgid.S, sysdeps/unix/sysv/linux/getpgrp.S, sysdeps/unix/sysv/linux/getsockname.S, sysdeps/unix/sysv/linux/getsockopt.S, sysdeps/unix/sysv/linux/gtty.S, sysdeps/unix/sysv/linux/listen.S, sysdeps/unix/sysv/linux/local_lim.h, sysdeps/unix/sysv/linux/madvise.c, sysdeps/unix/sysv/linux/msgctl.c, sysdeps/unix/sysv/linux/msgget.c, sysdeps/unix/sysv/linux/msgrcv.c, sysdeps/unix/sysv/linux/msgsnd.c, sysdeps/unix/sysv/linux/pipe.S, sysdeps/unix/sysv/linux/poll.c, sysdeps/unix/sysv/linux/readv.c, sysdeps/unix/sysv/linux/recv.S, sysdeps/unix/sysv/linux/recvfrom.S, sysdeps/unix/sysv/linux/recvmsg.S, sysdeps/unix/sysv/linux/semctl.c, sysdeps/unix/sysv/linux/semget.c, sysdeps/unix/sysv/linux/semop.c, sysdeps/unix/sysv/linux/send.S, sysdeps/unix/sysv/linux/sendmsg.S, sysdeps/unix/sysv/linux/sendto.S, sysdeps/unix/sysv/linux/setegid.c, sysdeps/unix/sysv/linux/seteuid.c, sysdeps/unix/sysv/linux/sethostid.c, sysdeps/unix/sysv/linux/setpgid.c, sysdeps/unix/sysv/linux/setpgrp.c, sysdeps/unix/sysv/linux/setsid.S, sysdeps/unix/sysv/linux/setsockopt.S, sysdeps/unix/sysv/linux/settimeofday.S, sysdeps/unix/sysv/linux/shmat.c, sysdeps/unix/sysv/linux/shmctl.c, sysdeps/unix/sysv/linux/shmdt.c, sysdeps/unix/sysv/linux/shmget.c, sysdeps/unix/sysv/linux/shutdown.S, sysdeps/unix/sysv/linux/sigaction.S, sysdeps/unix/sysv/linux/signal.S, sysdeps/unix/sysv/linux/sigpending.S, sysdeps/unix/sysv/linux/sigset.h, sysdeps/unix/sysv/linux/sockaddrcom.h, sysdeps/unix/sysv/linux/socketpair.S, sysdeps/unix/sysv/linux/speed.c, sysdeps/unix/sysv/linux/statbuf.h, sysdeps/unix/sysv/linux/stty.S, sysdeps/unix/sysv/linux/syscall.h, sysdeps/unix/sysv/linux/sysconf.c, sysdeps/unix/sysv/linux/tcdrain.c, sysdeps/unix/sysv/linux/tcflow.c, sysdeps/unix/sysv/linux/tcflush.c, sysdeps/unix/sysv/linux/tcgetattr.c, sysdeps/unix/sysv/linux/tcsetattr.c, sysdeps/unix/sysv/linux/termbits.h, sysdeps/unix/sysv/linux/ualarm.c, sysdeps/unix/sysv/linux/ulimit.c, sysdeps/unix/sysv/linux/usleep.c, sysdeps/unix/sysv/linux/utsnamelen.h, sysdeps/unix/sysv/linux/vfork.c, sysdeps/unix/sysv/linux/wait.c, sysdeps/unix/sysv/linux/wait4.S, sysdeps/unix/sysv/linux/waitpid.c, sysdeps/unix/sysv/linux/writev.c: New Linux/ELF specific, architecture independent files. sysdeps/unix/sysv/linux/i386/Dist, sysdeps/unix/sysv/linux/i386/Makefile, sysdeps/unix/sysv/linux/i386/brk.S, sysdeps/unix/sysv/linux/i386/fcntlbits.h, sysdeps/unix/sysv/linux/i386/fpu_control.c, sysdeps/unix/sysv/linux/i386/fpu_control.h, sysdeps/unix/sysv/linux/i386/fstat.S, sysdeps/unix/sysv/linux/i386/fxstat.S, sysdeps/unix/sysv/linux/i386/ieee_fpu.c, sysdeps/unix/sysv/linux/i386/init-first.S, sysdeps/unix/sysv/linux/i386/ipc.S, sysdeps/unix/sysv/linux/i386/lstat.S, sysdeps/unix/sysv/linux/i386/lxstat.S, sysdeps/unix/sysv/linux/i386/mknod.S, sysdeps/unix/sysv/linux/i386/mmap.S, sysdeps/unix/sysv/linux/i386/sbrk.S, sysdeps/unix/sysv/linux/i386/setfpucw.c, sysdeps/unix/sysv/linux/i386/signum.h, sysdeps/unix/sysv/linux/i386/socket.S, sysdeps/unix/sysv/linux/i386/stat.S, sysdeps/unix/sysv/linux/i386/syscall.S, sysdeps/unix/sysv/linux/i386/sysdep.S, sysdeps/unix/sysv/linux/i386/sysdep.h, sysdeps/unix/sysv/linux/i386/xmknod.S, sysdeps/unix/sysv/linux/i386/xstat.S: New Linux i386/ELF specific files. sysdeps/unix/sysv/linux/sys/ipc_buf.h, sysdeps/unix/sysv/linux/sys/mman.h, sysdeps/unix/sysv/linux/sys/msq_buf.h, sysdeps/unix/sysv/linux/sys/sem_buf.h, sysdeps/unix/sysv/linux/sys/shm_buf.h, sysdeps/unix/sysv/linux/sys/socketcall.h, sysdeps/unix/sysv/linux/sys/timex.h: New Linux/ELF specific, architecture independent header files.
1995-09-08 17:02:25 +00:00
{
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
union semun64 arg64 = { 0 };
va_list ap;
Update. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/testdata/EUC-JISX0213: New file. * iconvdata/testdata/EUC-JISX0213..UTF8: New file. * iconvdata/testdata/SHIFT_JISX0213: New file. * iconvdata/testdata/SHIFT_JISX0213..UTF8: New file. * iconvdata/testdata/ISO-2022-JP-3: New file. * iconvdata/testdata/ISO-2022-JP-3..UTF8: New file. * iconvdata/TESTS: Add EUC-JISX0213, SHIFT_JISX0213, ISO-2022-JP-3. * iconvdata/run-iconv-test.sh: Skip the charmap test if the charmap contains comments indicating precomposed characters. 2002-04-21 Bruno Haible <bruno@clisp.org> * iconvdata/iso-2022-jp-3.c: New file. * iconvdata/gconv-modules (ISO-2022-JP-3): New module. * iconvdata/Makefile (modules): Add ISO-2022-JP-3. (LDFLAGS-ISO-2022-JP-3.so): New variable. (ISO-2022-JP-3.so): Depend on libJIS.so and libJISX0213.so. (distribute): Add iso-2022-jp-3.c. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/tst-table-to.c (main): Restore handling of transliterations, broken by last patch. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/TESTS: Add IBM922, IBM1124, IBM1129. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/euc-jisx0213.c (BODY for FROM_LOOP): Don't advance inptr when there is not enough room in the output buffer. * iconvdata/shift_jisx0213.c (BODY for FROM_LOOP): Likewise. 2002-04-20 Bruno Haible <bruno@clisp.org> * iconv/skeleton.c ({FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO}): New macros. (RESET_INPUT_BUFFER): Use them instead of {MIN,MAX}_NEEDED_{FROM,TO}. Also make this macro work if FROM_DIRECTION evaluates to 0. (gconv_init): Use the new macros instead of {MIN,MAX}_NEEDED_{FROM,TO}. (FUNCTION_NAME): Likewise, in the handling of unaligned accesses and of consume_incomplete. * iconvdata/cp1255.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_TO to 4, not 8. * iconvdata/cp1258.c: Likewise. * iconvdata/ibm930.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set TO_LOOP_MAX_NEEDED_TO to 3, not 2. * iconvdata/ibm933.c: Likewise. * iconvdata/ibm935.c: Likewise. * iconvdata/ibm937.c: Likewise. * iconvdata/ibm939.c: Likewise. * iconvdata/iso-2022-cn.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set TO_LOOP_MAX_NEEDED_TO to 6, not 4. * iconvdata/iso-2022-cn-ext.c: Likewise. * iconvdata/iso-2022-jp.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. * iconvdata/tcvn5712-1.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_FROM to 1, not 2. * iconvdata/euc-jisx0213.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_TO to 8, not 4. * iconvdata/shift_jisx0213.c: Likewise. 2002-05-14 Franz Sirl <Franz.Sirl-kernel@lauterbach.com> * sysdeps/powerpc/Makefile (sysdeps_routines): Add divdi3, cmpdi2, shdi3, fixdfdi, fixsfdi in csu dir. (shared-only-routines): Likewise. * sysdeps/wordsize-32/cmpdi2.c: New file. * sysdeps/wordsize-32/shdi3.c: New file. * sysdeps/wordsize-32/fixdfdi.c: New file. * sysdeps/wordsize-32/fixsfdi.c: New file. * sysdeps/powerpc/Versions (__divdi3, __moddi3, __udivdi3, __umoddi3, __ashldi3, __ashrdi3, __lshrdi3, __cmpdi2, __ucmpdi2, __fixdfdi, __fixsfdi, __fixunsdfdi, __fixunssfdi): Export at GLIBC_2.0. * sysdeps/unix/sysv/linux/semctl.c (__old_semctl, __new_semctl): Only use va_arg if the argument will be used [PR libc/3259]. 2002-05-06 Michael A. Schmidt <mmaass@us.ibm.com> * catgets/catgets.c (catopen): Free buffer if internal catalog open fails. 2002-05-14 Ulrich Drepper <drepper@redhat.com> * debug/xtrace.sh: Make more robust. For realtime tracking use non-buffering methods. * debug/pcprofiledump.c: Implement -u option. Patch by Roger Luethi <rl@hellgate.ch>.
2002-05-15 06:02:35 +00:00
/* Get the argument only if required. */
switch (cmd)
{
case SETVAL: /* arg.val */
case GETALL: /* arg.array */
case SETALL:
case IPC_STAT: /* arg.buf */
case IPC_SET:
case SEM_STAT:
case SEM_STAT_ANY:
Update. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/testdata/EUC-JISX0213: New file. * iconvdata/testdata/EUC-JISX0213..UTF8: New file. * iconvdata/testdata/SHIFT_JISX0213: New file. * iconvdata/testdata/SHIFT_JISX0213..UTF8: New file. * iconvdata/testdata/ISO-2022-JP-3: New file. * iconvdata/testdata/ISO-2022-JP-3..UTF8: New file. * iconvdata/TESTS: Add EUC-JISX0213, SHIFT_JISX0213, ISO-2022-JP-3. * iconvdata/run-iconv-test.sh: Skip the charmap test if the charmap contains comments indicating precomposed characters. 2002-04-21 Bruno Haible <bruno@clisp.org> * iconvdata/iso-2022-jp-3.c: New file. * iconvdata/gconv-modules (ISO-2022-JP-3): New module. * iconvdata/Makefile (modules): Add ISO-2022-JP-3. (LDFLAGS-ISO-2022-JP-3.so): New variable. (ISO-2022-JP-3.so): Depend on libJIS.so and libJISX0213.so. (distribute): Add iso-2022-jp-3.c. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/tst-table-to.c (main): Restore handling of transliterations, broken by last patch. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/TESTS: Add IBM922, IBM1124, IBM1129. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/euc-jisx0213.c (BODY for FROM_LOOP): Don't advance inptr when there is not enough room in the output buffer. * iconvdata/shift_jisx0213.c (BODY for FROM_LOOP): Likewise. 2002-04-20 Bruno Haible <bruno@clisp.org> * iconv/skeleton.c ({FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO}): New macros. (RESET_INPUT_BUFFER): Use them instead of {MIN,MAX}_NEEDED_{FROM,TO}. Also make this macro work if FROM_DIRECTION evaluates to 0. (gconv_init): Use the new macros instead of {MIN,MAX}_NEEDED_{FROM,TO}. (FUNCTION_NAME): Likewise, in the handling of unaligned accesses and of consume_incomplete. * iconvdata/cp1255.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_TO to 4, not 8. * iconvdata/cp1258.c: Likewise. * iconvdata/ibm930.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set TO_LOOP_MAX_NEEDED_TO to 3, not 2. * iconvdata/ibm933.c: Likewise. * iconvdata/ibm935.c: Likewise. * iconvdata/ibm937.c: Likewise. * iconvdata/ibm939.c: Likewise. * iconvdata/iso-2022-cn.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set TO_LOOP_MAX_NEEDED_TO to 6, not 4. * iconvdata/iso-2022-cn-ext.c: Likewise. * iconvdata/iso-2022-jp.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. * iconvdata/tcvn5712-1.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_FROM to 1, not 2. * iconvdata/euc-jisx0213.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_TO to 8, not 4. * iconvdata/shift_jisx0213.c: Likewise. 2002-05-14 Franz Sirl <Franz.Sirl-kernel@lauterbach.com> * sysdeps/powerpc/Makefile (sysdeps_routines): Add divdi3, cmpdi2, shdi3, fixdfdi, fixsfdi in csu dir. (shared-only-routines): Likewise. * sysdeps/wordsize-32/cmpdi2.c: New file. * sysdeps/wordsize-32/shdi3.c: New file. * sysdeps/wordsize-32/fixdfdi.c: New file. * sysdeps/wordsize-32/fixsfdi.c: New file. * sysdeps/powerpc/Versions (__divdi3, __moddi3, __udivdi3, __umoddi3, __ashldi3, __ashrdi3, __lshrdi3, __cmpdi2, __ucmpdi2, __fixdfdi, __fixsfdi, __fixunsdfdi, __fixunssfdi): Export at GLIBC_2.0. * sysdeps/unix/sysv/linux/semctl.c (__old_semctl, __new_semctl): Only use va_arg if the argument will be used [PR libc/3259]. 2002-05-06 Michael A. Schmidt <mmaass@us.ibm.com> * catgets/catgets.c (catopen): Free buffer if internal catalog open fails. 2002-05-14 Ulrich Drepper <drepper@redhat.com> * debug/xtrace.sh: Make more robust. For realtime tracking use non-buffering methods. * debug/pcprofiledump.c: Implement -u option. Patch by Roger Luethi <rl@hellgate.ch>.
2002-05-15 06:02:35 +00:00
case IPC_INFO: /* arg.__buf */
case SEM_INFO:
va_start (ap, cmd);
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
arg64 = va_arg (ap, union semun64);
Update. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/testdata/EUC-JISX0213: New file. * iconvdata/testdata/EUC-JISX0213..UTF8: New file. * iconvdata/testdata/SHIFT_JISX0213: New file. * iconvdata/testdata/SHIFT_JISX0213..UTF8: New file. * iconvdata/testdata/ISO-2022-JP-3: New file. * iconvdata/testdata/ISO-2022-JP-3..UTF8: New file. * iconvdata/TESTS: Add EUC-JISX0213, SHIFT_JISX0213, ISO-2022-JP-3. * iconvdata/run-iconv-test.sh: Skip the charmap test if the charmap contains comments indicating precomposed characters. 2002-04-21 Bruno Haible <bruno@clisp.org> * iconvdata/iso-2022-jp-3.c: New file. * iconvdata/gconv-modules (ISO-2022-JP-3): New module. * iconvdata/Makefile (modules): Add ISO-2022-JP-3. (LDFLAGS-ISO-2022-JP-3.so): New variable. (ISO-2022-JP-3.so): Depend on libJIS.so and libJISX0213.so. (distribute): Add iso-2022-jp-3.c. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/tst-table-to.c (main): Restore handling of transliterations, broken by last patch. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/TESTS: Add IBM922, IBM1124, IBM1129. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/euc-jisx0213.c (BODY for FROM_LOOP): Don't advance inptr when there is not enough room in the output buffer. * iconvdata/shift_jisx0213.c (BODY for FROM_LOOP): Likewise. 2002-04-20 Bruno Haible <bruno@clisp.org> * iconv/skeleton.c ({FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO}): New macros. (RESET_INPUT_BUFFER): Use them instead of {MIN,MAX}_NEEDED_{FROM,TO}. Also make this macro work if FROM_DIRECTION evaluates to 0. (gconv_init): Use the new macros instead of {MIN,MAX}_NEEDED_{FROM,TO}. (FUNCTION_NAME): Likewise, in the handling of unaligned accesses and of consume_incomplete. * iconvdata/cp1255.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_TO to 4, not 8. * iconvdata/cp1258.c: Likewise. * iconvdata/ibm930.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set TO_LOOP_MAX_NEEDED_TO to 3, not 2. * iconvdata/ibm933.c: Likewise. * iconvdata/ibm935.c: Likewise. * iconvdata/ibm937.c: Likewise. * iconvdata/ibm939.c: Likewise. * iconvdata/iso-2022-cn.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set TO_LOOP_MAX_NEEDED_TO to 6, not 4. * iconvdata/iso-2022-cn-ext.c: Likewise. * iconvdata/iso-2022-jp.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. * iconvdata/tcvn5712-1.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_FROM to 1, not 2. * iconvdata/euc-jisx0213.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_TO to 8, not 4. * iconvdata/shift_jisx0213.c: Likewise. 2002-05-14 Franz Sirl <Franz.Sirl-kernel@lauterbach.com> * sysdeps/powerpc/Makefile (sysdeps_routines): Add divdi3, cmpdi2, shdi3, fixdfdi, fixsfdi in csu dir. (shared-only-routines): Likewise. * sysdeps/wordsize-32/cmpdi2.c: New file. * sysdeps/wordsize-32/shdi3.c: New file. * sysdeps/wordsize-32/fixdfdi.c: New file. * sysdeps/wordsize-32/fixsfdi.c: New file. * sysdeps/powerpc/Versions (__divdi3, __moddi3, __udivdi3, __umoddi3, __ashldi3, __ashrdi3, __lshrdi3, __cmpdi2, __ucmpdi2, __fixdfdi, __fixsfdi, __fixunsdfdi, __fixunssfdi): Export at GLIBC_2.0. * sysdeps/unix/sysv/linux/semctl.c (__old_semctl, __new_semctl): Only use va_arg if the argument will be used [PR libc/3259]. 2002-05-06 Michael A. Schmidt <mmaass@us.ibm.com> * catgets/catgets.c (catopen): Free buffer if internal catalog open fails. 2002-05-14 Ulrich Drepper <drepper@redhat.com> * debug/xtrace.sh: Make more robust. For realtime tracking use non-buffering methods. * debug/pcprofiledump.c: Implement -u option. Patch by Roger Luethi <rl@hellgate.ch>.
2002-05-15 06:02:35 +00:00
va_end (ap);
break;
}
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
#if __IPC_TIME64
struct kernel_semid64_ds ksemid;
union ksemun64 ksemun = semun64_to_ksemun64 (cmd, arg64, &ksemid);
# ifdef __ASSUME_SYSVIPC_BROKEN_MODE_T
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
if (cmd == IPC_SET)
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
ksemid.sem_perm.mode *= 0x10000U;
# endif
union ksemun64 arg = ksemun;
#else
union semun arg = arg64;
#endif
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
int ret = semctl_syscall (semid, semnum, cmd, arg);
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
if (ret < 0)
return ret;
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
switch (cmd)
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
{
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
case IPC_STAT:
case SEM_STAT:
case SEM_STAT_ANY:
#ifdef __ASSUME_SYSVIPC_BROKEN_MODE_T
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
arg.buf->sem_perm.mode >>= 16;
#else
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
/* Old Linux kernel versions might not clear the mode padding. */
if (sizeof ((struct semid_ds){0}.sem_perm.mode)
!= sizeof (__kernel_mode_t))
arg.buf->sem_perm.mode &= 0xFFFF;
#endif
#if __IPC_TIME64
ksemid64_to_semid64 (arg.buf, arg64.buf);
#endif
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
}
return ret;
}
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
#if __TIMESIZE != 64
libc_hidden_def (__semctl64)
/* The 64-bit time_t semid_ds version might have a different layout and
internal field alignment. */
static void
semid_to_semid64 (struct __semid64_ds *ds64, const struct semid_ds *ds)
{
ds64->sem_perm = ds->sem_perm;
ds64->sem_otime = ds->sem_otime
| ((__time64_t) ds->__sem_otime_high << 32);
ds64->sem_ctime = ds->sem_ctime
| ((__time64_t) ds->__sem_ctime_high << 32);
ds64->sem_nsems = ds->sem_nsems;
}
static void
semid64_to_semid (struct semid_ds *ds, const struct __semid64_ds *ds64)
{
ds->sem_perm = ds64->sem_perm;
ds->sem_otime = ds64->sem_otime;
ds->__sem_otime_high = 0;
ds->sem_ctime = ds64->sem_ctime;
ds->__sem_ctime_high = 0;
ds->sem_nsems = ds64->sem_nsems;
}
static union semun64
semun_to_semun64 (int cmd, union semun semun, struct __semid64_ds *semid64)
{
union semun64 r = { 0 };
switch (cmd)
{
case SETVAL:
r.val = semun.val;
break;
case GETALL:
case SETALL:
r.array = semun.array;
break;
case SEM_STAT:
case SEM_STAT_ANY:
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
case IPC_STAT:
case IPC_SET:
r.buf = semid64;
semid_to_semid64 (r.buf, semun.buf);
break;
case IPC_INFO:
case SEM_INFO:
r.__buf = semun.__buf;
break;
}
return r;
}
int
__semctl (int semid, int semnum, int cmd, ...)
{
union semun arg = { 0 };
va_list ap;
/* Get the argument only if required. */
switch (cmd)
{
case SETVAL: /* arg.val */
case GETALL: /* arg.array */
case SETALL:
case IPC_STAT: /* arg.buf */
case IPC_SET:
case SEM_STAT:
case SEM_STAT_ANY:
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
case IPC_INFO: /* arg.__buf */
case SEM_INFO:
va_start (ap, cmd);
arg = va_arg (ap, union semun);
va_end (ap);
break;
}
struct __semid64_ds semid64;
union semun64 arg64 = semun_to_semun64 (cmd, arg, &semid64);
int ret = __semctl64 (semid, semnum, cmd, arg64);
if (ret < 0)
return ret;
switch (cmd)
{
case IPC_STAT:
case SEM_STAT:
case SEM_STAT_ANY:
semid64_to_semid (arg.buf, arg64.buf);
}
return ret;
}
#endif
#ifndef DEFAULT_VERSION
# ifndef __ASSUME_SYSVIPC_BROKEN_MODE_T
# define DEFAULT_VERSION GLIBC_2_2
# else
# define DEFAULT_VERSION GLIBC_2_31
# endif
#endif
versioned_symbol (libc, __semctl, semctl, DEFAULT_VERSION);
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
#if defined __ASSUME_SYSVIPC_BROKEN_MODE_T \
&& SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_31)
int
attribute_compat_text_section
__semctl_mode16 (int semid, int semnum, int cmd, ...)
{
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
semctl_arg_t arg = { 0 };
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
va_list ap;
/* Get the argument only if required. */
switch (cmd)
{
case SETVAL: /* arg.val */
case GETALL: /* arg.array */
case SETALL:
case IPC_STAT: /* arg.buf */
case IPC_SET:
case SEM_STAT:
case SEM_STAT_ANY:
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
case IPC_INFO: /* arg.__buf */
case SEM_INFO:
va_start (ap, cmd);
sysv: linux: Add 64-bit time_t variant for semctl Different than others 64-bit time_t syscalls, the SysIPC interface does not provide a new set of syscall for y2038 safeness. Instead it uses unused fields in semid_ds structure to return the high bits for the timestamps. To provide a y2038 safe interface a new symbol __semctl64 is added and __semctl is change to call it instead (it adds some extra buffer copying for the 32 bit time_t implementation). Two new structures are added: 1. kernel_semid64_ds: used internally only on 32-bit architectures to issue the syscall. A handful of architectures (hppa, i386, mips, powerpc32, sparc32) require specific implementations due their kernel ABI. 2. semid_ds64: this is only for __TIMESIZE != 64 to use along with the 64-bit semctl. It is different than the kernel struct because the exported 64-bit time_t might require different alignment depending on the architecture ABI. So the resulting implementation does: 1. For 64-bit architectures it assumes semid_ds already contains 64-bit time_t fields and will result in just the __semctl symbol using the __semctl64 code. The semid_ds argument is passed as-is to the syscall. 2. For 32-bit architectures with default 64-bit time_t (newer ABIs such riscv32 or arc), it will also result in only one exported symbol but with the required high/low handling. It might be possible to optimize it further to avoid the kernel_semid64_ds to semun transformation if the exported ABI for the architectures matches the expected kernel ABI, but the implementation is already complex enough and don't think this should be a hotspot in any case. 3. Finally for 32-bit architecture with both 32-bit and 64-bit time_t support we follow the already set way to provide one symbol with 64-bit time_t support and implement the 32-bit time_t support using the 64-bit one. The default 32-bit symbol will allocate and copy the semid_ds over multiple buffers, but this should be deprecated in favor of the __semctl64 anyway. Checked on i686-linux-gnu and x86_64-linux-gnu. I also did some sniff tests on powerpc, powerpc64, mips, mips64, armhf, sparcv9, and sparc64. Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Alistair Francis <alistair.francis@wdc.com> Tested-by: Vineet Gupta <vgupta@synopsys.com> Reviewed-by: Carlos O'Donell <carlos@redhat.com> Tested-by: Carlos O'Donell <carlos@redhat.com>
2020-06-29 16:35:50 +00:00
arg = va_arg (ap, semctl_arg_t);
sysvipc: Set ipc_perm mode as mode_t (BZ#18231) This patch sets the mode field in ipc_perm as mode_t for all architectures, as POSIX specification [1]. The changes required are as follow: 1. It moves the ipc_perm definition out of ipc.h to its own header ipc_perm.h. It also allows consolidate the IPC_* definition on only one header. 2. The generic implementation follow the kernel ipc64_perm size so the syscall can be made directly without temporary buffer copy. However, since glibc defines the MODE field as mode_t, it omits the __PAD1 field (since glibc does not export mode_t as 16-bit for any architecture). It is a two-fold improvement: 2.1. New implementation which follow Linux UAPI will not need to provide an arch-specific ipc-perm.h header neither wrongly use the wrong 16-bit definition from previous default ipc.h (as csky did). 2.1. It allows consolidate ipc_perm definition for architectures that already provide mode_t as 32-bit. 3. All kernel ABIs for the supported architectures already provides the expected padding for mode type extension to 32-bit. However, some architectures the padding has the wrong placement, so it requires the ipc control routines (msgctl, semctl, and shmctl) to adjust the mode field accordingly. Currently they are armeb, microblaze, m68k, s390, and sheb. A new assume is added, __ASSUME_SYSVIPC_BROKEN_MODE_T, which the required ABIs define. 4. For the ABIs that define __ASSUME_SYSVIPC_BROKEN_MODE_T, it also require compat symbols that do not adjust the mode field. Checked on arm-linux-gnueabihf, aarch64-linux-gnu, powerpc64le-linux-gnu, and x86_64-linux-gnu. I also checked the sysvipc tests on hppa-linux-gnu, sh4-linux-gnu, s390x-linux-gnu, and s390-linux-gnu. I also did a sanity test against armeb qemu usermode for the sysvipc tests. [BZ #18231] * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add bits/ipc-perm.h. * sysdeps/unix/sysv/linux/aarch64/bits/ipc.h: Remove file. * sysdeps/unix/sysv/linux/alpha/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/hppa/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/ia64/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/mips/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/powerpc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/s390/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc.h: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h [__BYTE_ORDER == __BIG_ENDIAN] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/sysv/linux/microblaze/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/s390/kernel-features.h [!__s390x__] (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/sh/kernel-features.h (__ASSUME_SYSVIPC_BROKEN_MODE_T): Define. * sysdeps/unix/sysv/linux/m68k/kernel-features.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/powerpc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/sparc/bits/ipc-perm.h: Likewise. * sysdeps/unix/sysv/linux/bits/ipc.h (ipc_perm): Move to bits/ipc-perm.h. * sysdeps/unix/sysv/linux/hppa/bits/ipc-perm.h: New file. * sysdeps/unix/sysv/linux/kernel-features.h: Add comment about __ASSUME_SYSVIPC_BROKEN_MODE_T semantic. * sysdeps/unix/sysv/linux/msgctl.c (DEFAULT_VERSION): Define as 2.31 if __ASSUME_SYSVIPC_BROKEN_MODE_T is defined. (msgctl_syscall, __msgctl_mode16): New symbol. (__new_msgctl): Add bits for __ASSUME_SYSVIPC_BROKEN_MODE_T. * sysdeps/unix/sysv/linux/semctl.c: Likewise. * sysdeps/unix/sysv/linux/shmctl.c: Likewise. * sysdeps/unix/sysv/linux/arm/be/libc.abilist (GLIBC_2.31): Add msgctl, semctl, and shmctl. * sysdeps/sysv/linux/microblaze/be/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist: Likewise. * sysdeps/unix/sysv/linux/sh/be/libc.abilist: Likewise. * conform/data/sys/ipc.h-data: Only xfail {struct ipc_perm} mode_t mode for Hurd. * sysdeps/unix/sysv/linux/m68k/Versions (libc) [GLIBC_2.31]: Add msgctl, semctl, and shmctl. * sysdeps/unix/sysv/linux/arm/be/Versions: New file. * sysdeps/unix/sysv/linux/microblaze/be/Versions: Likewise. * sysdeps/unix/sysv/linux/sh/be/Versions: Likewise. [1] http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/sys_ipc.h.html
2019-10-10 18:13:11 +00:00
va_end (ap);
break;
}
return semctl_syscall (semid, semnum, cmd, arg);
}
compat_symbol (libc, __semctl_mode16, semctl, GLIBC_2_2);
#endif
Update. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/bits/ipc.h: New file. * sysdeps/unix/sysv/linux/bits/sem.h: New file. * sysdeps/unix/sysv/linux/bits/shm.h: New file. * sysdeps/unix/sysv/linux/bits/msg.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/ipc.h: Update for new ipc. * sysdeps/unix/sysv/linux/bits/alpha/sem.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/shm.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/msg.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/ipc.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/sem.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/shm.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/msg.h: New file. * sysdeps/unix/sysv/linux/msgctl.c (__old_msgctl): Renamed from msgctl. (__new_msgctl): New function. * sysdeps/unix/sysv/linux/semctl.c (__old_semctl): Renamed from semctl. (__new_semctl): New function. * sysdeps/unix/sysv/linux/shmctl.c (__old_shmctl): Renamed from shmctl. (__new_shmctl): New function. * sysdeps/unix/sysv/linux/msgget.c: Define __LIBC_IPC_INTERNAL. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysdeps/unix/sysv/linux/semget.c: Likewise. * sysdeps/unix/sysv/linux/msgsnd.c: Likewise. * sysdeps/unix/sysv/linux/semop.c: Likewise. * sysdeps/unix/sysv/linux/shmat.c: Likewise. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/shmget.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/msgctl.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/shmctl.c: New file. * sysdeps/unix/sysv/linux/Versions: Add msgctl, semctl, shmctl. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/sparc/sparc32/seteuid.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/setegid.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/Dist: Remove setres[ug]id. * sysdeps/unix/sysv/linux/sparc/sparc32/mmap64.c: Kill warnings. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list: Define needed syscalls. * sysdeps/unix/sysv/linux/pwrite64.c: Use proper prototype. * sysdeps/unix/sysv/linux/truncate64.c: Likewise. * sysdeps/unix/sysv/linux/kernel-features.h: [gs]etres[ug]id are available on sparc since 2.3.39. * sysdeps/unix/sysv/linux/execve.c: Kill warnings. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/i386/chown.c (__syscall_chown): Use proper prototype. (__real_chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/lchown.c (__lchown): Likewise. * sysdeps/unix/sysv/linux/i386/fchown.c (__fchown): Likewise. * sysdeps/unix/sysv/linux/i386/setresuid.c (__setresuid): Return EINVAL if ruid, euid or suid are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/setresgid.c (__setresgid): Similarly. * sysdeps/unix/sysv/linux/i386/setreuid.c (__setreuid): Simplify. * sysdeps/unix/sysv/linux/i386/setregid.c (__setregid): Likewise. * sysdeps/unix/sysv/linux/m68k/chown.c (__syscall_chown): Use proper prototype. Don't include non-existant header. (__chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list (setresuid, setresgid): Inherit standard linux/syscalls.list definitions. * sysdeps/unix/sysv/linux/sparc/sparc32/setresuid.c: Remove. * sysdeps/unix/sysv/linux/sparc/sparc32/setresgid.c: Remove. * sysdeps/unix/sysv/linux/syscalls.list (setresgid): Provide __setresgid symbol.
2000-01-18 04:33:34 +00:00
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2)
/* Since semctl use a variadic argument for semid_ds there is not need to
define and tie the compatibility symbol to the old 'union semun'
definition. */
Update. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/bits/ipc.h: New file. * sysdeps/unix/sysv/linux/bits/sem.h: New file. * sysdeps/unix/sysv/linux/bits/shm.h: New file. * sysdeps/unix/sysv/linux/bits/msg.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/ipc.h: Update for new ipc. * sysdeps/unix/sysv/linux/bits/alpha/sem.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/shm.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/msg.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/ipc.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/sem.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/shm.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/msg.h: New file. * sysdeps/unix/sysv/linux/msgctl.c (__old_msgctl): Renamed from msgctl. (__new_msgctl): New function. * sysdeps/unix/sysv/linux/semctl.c (__old_semctl): Renamed from semctl. (__new_semctl): New function. * sysdeps/unix/sysv/linux/shmctl.c (__old_shmctl): Renamed from shmctl. (__new_shmctl): New function. * sysdeps/unix/sysv/linux/msgget.c: Define __LIBC_IPC_INTERNAL. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysdeps/unix/sysv/linux/semget.c: Likewise. * sysdeps/unix/sysv/linux/msgsnd.c: Likewise. * sysdeps/unix/sysv/linux/semop.c: Likewise. * sysdeps/unix/sysv/linux/shmat.c: Likewise. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/shmget.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/msgctl.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/shmctl.c: New file. * sysdeps/unix/sysv/linux/Versions: Add msgctl, semctl, shmctl. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/sparc/sparc32/seteuid.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/setegid.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/Dist: Remove setres[ug]id. * sysdeps/unix/sysv/linux/sparc/sparc32/mmap64.c: Kill warnings. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list: Define needed syscalls. * sysdeps/unix/sysv/linux/pwrite64.c: Use proper prototype. * sysdeps/unix/sysv/linux/truncate64.c: Likewise. * sysdeps/unix/sysv/linux/kernel-features.h: [gs]etres[ug]id are available on sparc since 2.3.39. * sysdeps/unix/sysv/linux/execve.c: Kill warnings. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/i386/chown.c (__syscall_chown): Use proper prototype. (__real_chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/lchown.c (__lchown): Likewise. * sysdeps/unix/sysv/linux/i386/fchown.c (__fchown): Likewise. * sysdeps/unix/sysv/linux/i386/setresuid.c (__setresuid): Return EINVAL if ruid, euid or suid are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/setresgid.c (__setresgid): Similarly. * sysdeps/unix/sysv/linux/i386/setreuid.c (__setreuid): Simplify. * sysdeps/unix/sysv/linux/i386/setregid.c (__setregid): Likewise. * sysdeps/unix/sysv/linux/m68k/chown.c (__syscall_chown): Use proper prototype. Don't include non-existant header. (__chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list (setresuid, setresgid): Inherit standard linux/syscalls.list definitions. * sysdeps/unix/sysv/linux/sparc/sparc32/setresuid.c: Remove. * sysdeps/unix/sysv/linux/sparc/sparc32/setresgid.c: Remove. * sysdeps/unix/sysv/linux/syscalls.list (setresgid): Provide __setresgid symbol.
2000-01-18 04:33:34 +00:00
int
attribute_compat_text_section
__old_semctl (int semid, int semnum, int cmd, ...)
Update. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/bits/ipc.h: New file. * sysdeps/unix/sysv/linux/bits/sem.h: New file. * sysdeps/unix/sysv/linux/bits/shm.h: New file. * sysdeps/unix/sysv/linux/bits/msg.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/ipc.h: Update for new ipc. * sysdeps/unix/sysv/linux/bits/alpha/sem.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/shm.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/msg.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/ipc.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/sem.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/shm.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/msg.h: New file. * sysdeps/unix/sysv/linux/msgctl.c (__old_msgctl): Renamed from msgctl. (__new_msgctl): New function. * sysdeps/unix/sysv/linux/semctl.c (__old_semctl): Renamed from semctl. (__new_semctl): New function. * sysdeps/unix/sysv/linux/shmctl.c (__old_shmctl): Renamed from shmctl. (__new_shmctl): New function. * sysdeps/unix/sysv/linux/msgget.c: Define __LIBC_IPC_INTERNAL. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysdeps/unix/sysv/linux/semget.c: Likewise. * sysdeps/unix/sysv/linux/msgsnd.c: Likewise. * sysdeps/unix/sysv/linux/semop.c: Likewise. * sysdeps/unix/sysv/linux/shmat.c: Likewise. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/shmget.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/msgctl.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/shmctl.c: New file. * sysdeps/unix/sysv/linux/Versions: Add msgctl, semctl, shmctl. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/sparc/sparc32/seteuid.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/setegid.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/Dist: Remove setres[ug]id. * sysdeps/unix/sysv/linux/sparc/sparc32/mmap64.c: Kill warnings. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list: Define needed syscalls. * sysdeps/unix/sysv/linux/pwrite64.c: Use proper prototype. * sysdeps/unix/sysv/linux/truncate64.c: Likewise. * sysdeps/unix/sysv/linux/kernel-features.h: [gs]etres[ug]id are available on sparc since 2.3.39. * sysdeps/unix/sysv/linux/execve.c: Kill warnings. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/i386/chown.c (__syscall_chown): Use proper prototype. (__real_chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/lchown.c (__lchown): Likewise. * sysdeps/unix/sysv/linux/i386/fchown.c (__fchown): Likewise. * sysdeps/unix/sysv/linux/i386/setresuid.c (__setresuid): Return EINVAL if ruid, euid or suid are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/setresgid.c (__setresgid): Similarly. * sysdeps/unix/sysv/linux/i386/setreuid.c (__setreuid): Simplify. * sysdeps/unix/sysv/linux/i386/setregid.c (__setregid): Likewise. * sysdeps/unix/sysv/linux/m68k/chown.c (__syscall_chown): Use proper prototype. Don't include non-existant header. (__chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list (setresuid, setresgid): Inherit standard linux/syscalls.list definitions. * sysdeps/unix/sysv/linux/sparc/sparc32/setresuid.c: Remove. * sysdeps/unix/sysv/linux/sparc/sparc32/setresgid.c: Remove. * sysdeps/unix/sysv/linux/syscalls.list (setresgid): Provide __setresgid symbol.
2000-01-18 04:33:34 +00:00
{
union semun arg = { 0 };
Update. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/bits/ipc.h: New file. * sysdeps/unix/sysv/linux/bits/sem.h: New file. * sysdeps/unix/sysv/linux/bits/shm.h: New file. * sysdeps/unix/sysv/linux/bits/msg.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/ipc.h: Update for new ipc. * sysdeps/unix/sysv/linux/bits/alpha/sem.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/shm.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/msg.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/ipc.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/sem.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/shm.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/msg.h: New file. * sysdeps/unix/sysv/linux/msgctl.c (__old_msgctl): Renamed from msgctl. (__new_msgctl): New function. * sysdeps/unix/sysv/linux/semctl.c (__old_semctl): Renamed from semctl. (__new_semctl): New function. * sysdeps/unix/sysv/linux/shmctl.c (__old_shmctl): Renamed from shmctl. (__new_shmctl): New function. * sysdeps/unix/sysv/linux/msgget.c: Define __LIBC_IPC_INTERNAL. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysdeps/unix/sysv/linux/semget.c: Likewise. * sysdeps/unix/sysv/linux/msgsnd.c: Likewise. * sysdeps/unix/sysv/linux/semop.c: Likewise. * sysdeps/unix/sysv/linux/shmat.c: Likewise. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/shmget.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/msgctl.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/shmctl.c: New file. * sysdeps/unix/sysv/linux/Versions: Add msgctl, semctl, shmctl. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/sparc/sparc32/seteuid.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/setegid.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/Dist: Remove setres[ug]id. * sysdeps/unix/sysv/linux/sparc/sparc32/mmap64.c: Kill warnings. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list: Define needed syscalls. * sysdeps/unix/sysv/linux/pwrite64.c: Use proper prototype. * sysdeps/unix/sysv/linux/truncate64.c: Likewise. * sysdeps/unix/sysv/linux/kernel-features.h: [gs]etres[ug]id are available on sparc since 2.3.39. * sysdeps/unix/sysv/linux/execve.c: Kill warnings. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/i386/chown.c (__syscall_chown): Use proper prototype. (__real_chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/lchown.c (__lchown): Likewise. * sysdeps/unix/sysv/linux/i386/fchown.c (__fchown): Likewise. * sysdeps/unix/sysv/linux/i386/setresuid.c (__setresuid): Return EINVAL if ruid, euid or suid are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/setresgid.c (__setresgid): Similarly. * sysdeps/unix/sysv/linux/i386/setreuid.c (__setreuid): Simplify. * sysdeps/unix/sysv/linux/i386/setregid.c (__setregid): Likewise. * sysdeps/unix/sysv/linux/m68k/chown.c (__syscall_chown): Use proper prototype. Don't include non-existant header. (__chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list (setresuid, setresgid): Inherit standard linux/syscalls.list definitions. * sysdeps/unix/sysv/linux/sparc/sparc32/setresuid.c: Remove. * sysdeps/unix/sysv/linux/sparc/sparc32/setresgid.c: Remove. * sysdeps/unix/sysv/linux/syscalls.list (setresgid): Provide __setresgid symbol.
2000-01-18 04:33:34 +00:00
va_list ap;
Update. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/testdata/EUC-JISX0213: New file. * iconvdata/testdata/EUC-JISX0213..UTF8: New file. * iconvdata/testdata/SHIFT_JISX0213: New file. * iconvdata/testdata/SHIFT_JISX0213..UTF8: New file. * iconvdata/testdata/ISO-2022-JP-3: New file. * iconvdata/testdata/ISO-2022-JP-3..UTF8: New file. * iconvdata/TESTS: Add EUC-JISX0213, SHIFT_JISX0213, ISO-2022-JP-3. * iconvdata/run-iconv-test.sh: Skip the charmap test if the charmap contains comments indicating precomposed characters. 2002-04-21 Bruno Haible <bruno@clisp.org> * iconvdata/iso-2022-jp-3.c: New file. * iconvdata/gconv-modules (ISO-2022-JP-3): New module. * iconvdata/Makefile (modules): Add ISO-2022-JP-3. (LDFLAGS-ISO-2022-JP-3.so): New variable. (ISO-2022-JP-3.so): Depend on libJIS.so and libJISX0213.so. (distribute): Add iso-2022-jp-3.c. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/tst-table-to.c (main): Restore handling of transliterations, broken by last patch. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/TESTS: Add IBM922, IBM1124, IBM1129. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/euc-jisx0213.c (BODY for FROM_LOOP): Don't advance inptr when there is not enough room in the output buffer. * iconvdata/shift_jisx0213.c (BODY for FROM_LOOP): Likewise. 2002-04-20 Bruno Haible <bruno@clisp.org> * iconv/skeleton.c ({FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO}): New macros. (RESET_INPUT_BUFFER): Use them instead of {MIN,MAX}_NEEDED_{FROM,TO}. Also make this macro work if FROM_DIRECTION evaluates to 0. (gconv_init): Use the new macros instead of {MIN,MAX}_NEEDED_{FROM,TO}. (FUNCTION_NAME): Likewise, in the handling of unaligned accesses and of consume_incomplete. * iconvdata/cp1255.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_TO to 4, not 8. * iconvdata/cp1258.c: Likewise. * iconvdata/ibm930.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set TO_LOOP_MAX_NEEDED_TO to 3, not 2. * iconvdata/ibm933.c: Likewise. * iconvdata/ibm935.c: Likewise. * iconvdata/ibm937.c: Likewise. * iconvdata/ibm939.c: Likewise. * iconvdata/iso-2022-cn.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set TO_LOOP_MAX_NEEDED_TO to 6, not 4. * iconvdata/iso-2022-cn-ext.c: Likewise. * iconvdata/iso-2022-jp.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. * iconvdata/tcvn5712-1.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_FROM to 1, not 2. * iconvdata/euc-jisx0213.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_TO to 8, not 4. * iconvdata/shift_jisx0213.c: Likewise. 2002-05-14 Franz Sirl <Franz.Sirl-kernel@lauterbach.com> * sysdeps/powerpc/Makefile (sysdeps_routines): Add divdi3, cmpdi2, shdi3, fixdfdi, fixsfdi in csu dir. (shared-only-routines): Likewise. * sysdeps/wordsize-32/cmpdi2.c: New file. * sysdeps/wordsize-32/shdi3.c: New file. * sysdeps/wordsize-32/fixdfdi.c: New file. * sysdeps/wordsize-32/fixsfdi.c: New file. * sysdeps/powerpc/Versions (__divdi3, __moddi3, __udivdi3, __umoddi3, __ashldi3, __ashrdi3, __lshrdi3, __cmpdi2, __ucmpdi2, __fixdfdi, __fixsfdi, __fixunsdfdi, __fixunssfdi): Export at GLIBC_2.0. * sysdeps/unix/sysv/linux/semctl.c (__old_semctl, __new_semctl): Only use va_arg if the argument will be used [PR libc/3259]. 2002-05-06 Michael A. Schmidt <mmaass@us.ibm.com> * catgets/catgets.c (catopen): Free buffer if internal catalog open fails. 2002-05-14 Ulrich Drepper <drepper@redhat.com> * debug/xtrace.sh: Make more robust. For realtime tracking use non-buffering methods. * debug/pcprofiledump.c: Implement -u option. Patch by Roger Luethi <rl@hellgate.ch>.
2002-05-15 06:02:35 +00:00
/* Get the argument only if required. */
switch (cmd)
{
case SETVAL: /* arg.val */
case GETALL: /* arg.array */
case SETALL:
case IPC_STAT: /* arg.buf */
case IPC_SET:
case SEM_STAT:
case SEM_STAT_ANY:
Update. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/testdata/EUC-JISX0213: New file. * iconvdata/testdata/EUC-JISX0213..UTF8: New file. * iconvdata/testdata/SHIFT_JISX0213: New file. * iconvdata/testdata/SHIFT_JISX0213..UTF8: New file. * iconvdata/testdata/ISO-2022-JP-3: New file. * iconvdata/testdata/ISO-2022-JP-3..UTF8: New file. * iconvdata/TESTS: Add EUC-JISX0213, SHIFT_JISX0213, ISO-2022-JP-3. * iconvdata/run-iconv-test.sh: Skip the charmap test if the charmap contains comments indicating precomposed characters. 2002-04-21 Bruno Haible <bruno@clisp.org> * iconvdata/iso-2022-jp-3.c: New file. * iconvdata/gconv-modules (ISO-2022-JP-3): New module. * iconvdata/Makefile (modules): Add ISO-2022-JP-3. (LDFLAGS-ISO-2022-JP-3.so): New variable. (ISO-2022-JP-3.so): Depend on libJIS.so and libJISX0213.so. (distribute): Add iso-2022-jp-3.c. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/tst-table-to.c (main): Restore handling of transliterations, broken by last patch. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/TESTS: Add IBM922, IBM1124, IBM1129. 2002-05-12 Bruno Haible <bruno@clisp.org> * iconvdata/euc-jisx0213.c (BODY for FROM_LOOP): Don't advance inptr when there is not enough room in the output buffer. * iconvdata/shift_jisx0213.c (BODY for FROM_LOOP): Likewise. 2002-04-20 Bruno Haible <bruno@clisp.org> * iconv/skeleton.c ({FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO}): New macros. (RESET_INPUT_BUFFER): Use them instead of {MIN,MAX}_NEEDED_{FROM,TO}. Also make this macro work if FROM_DIRECTION evaluates to 0. (gconv_init): Use the new macros instead of {MIN,MAX}_NEEDED_{FROM,TO}. (FUNCTION_NAME): Likewise, in the handling of unaligned accesses and of consume_incomplete. * iconvdata/cp1255.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_TO to 4, not 8. * iconvdata/cp1258.c: Likewise. * iconvdata/ibm930.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set TO_LOOP_MAX_NEEDED_TO to 3, not 2. * iconvdata/ibm933.c: Likewise. * iconvdata/ibm935.c: Likewise. * iconvdata/ibm937.c: Likewise. * iconvdata/ibm939.c: Likewise. * iconvdata/iso-2022-cn.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set TO_LOOP_MAX_NEEDED_TO to 6, not 4. * iconvdata/iso-2022-cn-ext.c: Likewise. * iconvdata/iso-2022-jp.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. * iconvdata/tcvn5712-1.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_FROM to 1, not 2. * iconvdata/euc-jisx0213.c: Define {FROM,TO}_LOOP_{MIN,MAX}_NEEDED_{FROM,TO} instead of {MIN,MAX}_NEEDED_{FROM,TO}. Set FROM_LOOP_MAX_NEEDED_TO to 8, not 4. * iconvdata/shift_jisx0213.c: Likewise. 2002-05-14 Franz Sirl <Franz.Sirl-kernel@lauterbach.com> * sysdeps/powerpc/Makefile (sysdeps_routines): Add divdi3, cmpdi2, shdi3, fixdfdi, fixsfdi in csu dir. (shared-only-routines): Likewise. * sysdeps/wordsize-32/cmpdi2.c: New file. * sysdeps/wordsize-32/shdi3.c: New file. * sysdeps/wordsize-32/fixdfdi.c: New file. * sysdeps/wordsize-32/fixsfdi.c: New file. * sysdeps/powerpc/Versions (__divdi3, __moddi3, __udivdi3, __umoddi3, __ashldi3, __ashrdi3, __lshrdi3, __cmpdi2, __ucmpdi2, __fixdfdi, __fixsfdi, __fixunsdfdi, __fixunssfdi): Export at GLIBC_2.0. * sysdeps/unix/sysv/linux/semctl.c (__old_semctl, __new_semctl): Only use va_arg if the argument will be used [PR libc/3259]. 2002-05-06 Michael A. Schmidt <mmaass@us.ibm.com> * catgets/catgets.c (catopen): Free buffer if internal catalog open fails. 2002-05-14 Ulrich Drepper <drepper@redhat.com> * debug/xtrace.sh: Make more robust. For realtime tracking use non-buffering methods. * debug/pcprofiledump.c: Implement -u option. Patch by Roger Luethi <rl@hellgate.ch>.
2002-05-15 06:02:35 +00:00
case IPC_INFO: /* arg.__buf */
case SEM_INFO:
va_start (ap, cmd);
arg = va_arg (ap, union semun);
va_end (ap);
break;
}
Update. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/bits/ipc.h: New file. * sysdeps/unix/sysv/linux/bits/sem.h: New file. * sysdeps/unix/sysv/linux/bits/shm.h: New file. * sysdeps/unix/sysv/linux/bits/msg.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/ipc.h: Update for new ipc. * sysdeps/unix/sysv/linux/bits/alpha/sem.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/shm.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/msg.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/ipc.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/sem.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/shm.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/msg.h: New file. * sysdeps/unix/sysv/linux/msgctl.c (__old_msgctl): Renamed from msgctl. (__new_msgctl): New function. * sysdeps/unix/sysv/linux/semctl.c (__old_semctl): Renamed from semctl. (__new_semctl): New function. * sysdeps/unix/sysv/linux/shmctl.c (__old_shmctl): Renamed from shmctl. (__new_shmctl): New function. * sysdeps/unix/sysv/linux/msgget.c: Define __LIBC_IPC_INTERNAL. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysdeps/unix/sysv/linux/semget.c: Likewise. * sysdeps/unix/sysv/linux/msgsnd.c: Likewise. * sysdeps/unix/sysv/linux/semop.c: Likewise. * sysdeps/unix/sysv/linux/shmat.c: Likewise. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/shmget.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/msgctl.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/shmctl.c: New file. * sysdeps/unix/sysv/linux/Versions: Add msgctl, semctl, shmctl. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/sparc/sparc32/seteuid.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/setegid.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/Dist: Remove setres[ug]id. * sysdeps/unix/sysv/linux/sparc/sparc32/mmap64.c: Kill warnings. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list: Define needed syscalls. * sysdeps/unix/sysv/linux/pwrite64.c: Use proper prototype. * sysdeps/unix/sysv/linux/truncate64.c: Likewise. * sysdeps/unix/sysv/linux/kernel-features.h: [gs]etres[ug]id are available on sparc since 2.3.39. * sysdeps/unix/sysv/linux/execve.c: Kill warnings. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/i386/chown.c (__syscall_chown): Use proper prototype. (__real_chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/lchown.c (__lchown): Likewise. * sysdeps/unix/sysv/linux/i386/fchown.c (__fchown): Likewise. * sysdeps/unix/sysv/linux/i386/setresuid.c (__setresuid): Return EINVAL if ruid, euid or suid are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/setresgid.c (__setresgid): Similarly. * sysdeps/unix/sysv/linux/i386/setreuid.c (__setreuid): Simplify. * sysdeps/unix/sysv/linux/i386/setregid.c (__setregid): Likewise. * sysdeps/unix/sysv/linux/m68k/chown.c (__syscall_chown): Use proper prototype. Don't include non-existant header. (__chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list (setresuid, setresgid): Inherit standard linux/syscalls.list definitions. * sysdeps/unix/sysv/linux/sparc/sparc32/setresuid.c: Remove. * sysdeps/unix/sysv/linux/sparc/sparc32/setresgid.c: Remove. * sysdeps/unix/sysv/linux/syscalls.list (setresgid): Provide __setresgid symbol.
2000-01-18 04:33:34 +00:00
#if defined __ASSUME_DIRECT_SYSVIPC_SYSCALLS \
&& !defined __ASSUME_SYSVIPC_DEFAULT_IPC_64
/* For architectures that have wire-up semctl but also have __IPC_64 to a
value different than default (0x0) it means the compat symbol used the
__NR_ipc syscall. */
return INLINE_SYSCALL_CALL (semctl, semid, semnum, cmd, arg.array);
# else
return INLINE_SYSCALL_CALL (ipc, IPCOP_semctl, semid, semnum, cmd,
SEMCTL_ARG_ADDRESS (arg));
# endif
Update. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/bits/ipc.h: New file. * sysdeps/unix/sysv/linux/bits/sem.h: New file. * sysdeps/unix/sysv/linux/bits/shm.h: New file. * sysdeps/unix/sysv/linux/bits/msg.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/ipc.h: Update for new ipc. * sysdeps/unix/sysv/linux/bits/alpha/sem.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/shm.h: New file. * sysdeps/unix/sysv/linux/bits/alpha/msg.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/ipc.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/sem.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/shm.h: New file. * sysdeps/unix/sysv/linux/bits/sparc/msg.h: New file. * sysdeps/unix/sysv/linux/msgctl.c (__old_msgctl): Renamed from msgctl. (__new_msgctl): New function. * sysdeps/unix/sysv/linux/semctl.c (__old_semctl): Renamed from semctl. (__new_semctl): New function. * sysdeps/unix/sysv/linux/shmctl.c (__old_shmctl): Renamed from shmctl. (__new_shmctl): New function. * sysdeps/unix/sysv/linux/msgget.c: Define __LIBC_IPC_INTERNAL. * sysdeps/unix/sysv/linux/msgrcv.c: Likewise. * sysdeps/unix/sysv/linux/semget.c: Likewise. * sysdeps/unix/sysv/linux/msgsnd.c: Likewise. * sysdeps/unix/sysv/linux/semop.c: Likewise. * sysdeps/unix/sysv/linux/shmat.c: Likewise. * sysdeps/unix/sysv/linux/shmdt.c: Likewise. * sysdeps/unix/sysv/linux/shmget.c: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/semctl.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/msgctl.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc64/shmctl.c: New file. * sysdeps/unix/sysv/linux/Versions: Add msgctl, semctl, shmctl. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/sparc/sparc32/seteuid.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/setegid.c: New file. * sysdeps/unix/sysv/linux/sparc/sparc32/Dist: Remove setres[ug]id. * sysdeps/unix/sysv/linux/sparc/sparc32/mmap64.c: Kill warnings. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list: Define needed syscalls. * sysdeps/unix/sysv/linux/pwrite64.c: Use proper prototype. * sysdeps/unix/sysv/linux/truncate64.c: Likewise. * sysdeps/unix/sysv/linux/kernel-features.h: [gs]etres[ug]id are available on sparc since 2.3.39. * sysdeps/unix/sysv/linux/execve.c: Kill warnings. 2000-01-17 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/i386/chown.c (__syscall_chown): Use proper prototype. (__real_chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/lchown.c (__lchown): Likewise. * sysdeps/unix/sysv/linux/i386/fchown.c (__fchown): Likewise. * sysdeps/unix/sysv/linux/i386/setresuid.c (__setresuid): Return EINVAL if ruid, euid or suid are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/i386/setresgid.c (__setresgid): Similarly. * sysdeps/unix/sysv/linux/i386/setreuid.c (__setreuid): Simplify. * sysdeps/unix/sysv/linux/i386/setregid.c (__setregid): Likewise. * sysdeps/unix/sysv/linux/m68k/chown.c (__syscall_chown): Use proper prototype. Don't include non-existant header. (__chown): Return EINVAL if owner or group are out of the range -1U .. 65534. * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list (setresuid, setresgid): Inherit standard linux/syscalls.list definitions. * sysdeps/unix/sysv/linux/sparc/sparc32/setresuid.c: Remove. * sysdeps/unix/sysv/linux/sparc/sparc32/setresgid.c: Remove. * sysdeps/unix/sysv/linux/syscalls.list (setresgid): Provide __setresgid symbol.
2000-01-18 04:33:34 +00:00
}
compat_symbol (libc, __old_semctl, semctl, GLIBC_2_0);
#endif