63eb8df85a
Presently sys/sysmacros.h is entirely defined in sysdeps. This would mean that the deprecation logic coming up in the next patch would have to be written twice (in generic/ and unix/sysv/linux/). To avoid that, hoist all but the unavoidably system-dependent logic to misc/, leaving a bits/ header behind. This also promotes the Linux-specific encoding of dev_t, which accommodates 32-bit major and minor numbers in a 64-bit dev_t, to generic, as glibc's dev_t is always 64 bits wide. The former Linux implementation used inline functions to avoid evaluating arguments more than once. After this change, all platforms use inline functions, which means that three new symbols are added to the generic ABI. (These symbols are in the user namespace, which is how they have always been on Linux. They begin with "gnu_dev_", so collisions with user code are pretty unlikely.) New ports henceforth need only provide a bits/sysmacros.h defining internal macros __SYSMACROS_{DECLARE,DEFINE}_{MAJOR,MINOR,MAKEDEV}. This is only necessary if the kernel encoding is incompatible with the now-generic encoding (for instance, it would be necessary for FreeBSD). While I was at it, I added a basic round-trip test for these functions. * sysdeps/generic/sys/sysmacros.h: Delete file. * sysdeps/unix/sysv/linux/makedev.c: Delete file. * sysdeps/unix/sysv/linux/sys/sysmacros.h: Move file ... * bits/sysmacros.h: ... here; this encoding is now the generic encoding. Now defines only the following macros: __SYSMACROS_DECLARE_MAJOR, __SYSMACROS_DEFINE_MAJOR, __SYSMACROS_DECLARE_MINOR, __SYSMACROS_DEFINE_MINOR, __SYSMACROS_DECLARE_MAKEDEV, __SYSMACROS_DEFINE_MAKEDEV. * misc/sys/sysmacros.h, misc/makedev.c: New files that use bits/sysmacros.h and the above new macros to generate the public implementations of major, minor, and makedev. * misc/tst-makedev.c: New test. * include/sys/sysmacros.h: New wrapper. * misc/Makefile (headers): Add sys/sysmacros.h, bits/sysmacros.h. (routines): Add makedev. (tests): Add tst-makedev. * misc/Versions [GLIBC_2.25]: Add gnu_dev_major, gnu_dev_minor, gnu_dev_makedev. * posix/Makefile (headers): Remove sys/sysmacros.h. * sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Remove makedev. * sysdeps/arm/nacl/libc.abilist: Add GLIBC_2.25, gnu_dev_major, gnu_dev_makedev, gnu_dev_minor. * sysdeps/unix/sysv/linux/aarch64/libc.abilist * sysdeps/unix/sysv/linux/alpha/libc.abilist * sysdeps/unix/sysv/linux/arm/libc.abilist * sysdeps/unix/sysv/linux/hppa/libc.abilist * sysdeps/unix/sysv/linux/i386/libc.abilist * sysdeps/unix/sysv/linux/ia64/libc.abilist * sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist * sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist * sysdeps/unix/sysv/linux/microblaze/libc.abilist * sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist * sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist * sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist * sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist * sysdeps/unix/sysv/linux/nios2/libc.abilist * sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc-le.abilist * sysdeps/unix/sysv/linux/powerpc/powerpc64/libc.abilist * sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist * sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist * sysdeps/unix/sysv/linux/sh/libc.abilist * sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist * sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist * sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libc.abilist * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libc.abilist * sysdeps/unix/sysv/linux/tile/tilepro/libc.abilist * sysdeps/unix/sysv/linux/x86_64/64/libc.abilist * sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist: Add GLIBC_2.25.
105 lines
2.9 KiB
C
105 lines
2.9 KiB
C
/* Tests of functions to access `dev_t' values.
|
|
Copyright (C) 2016 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
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.
|
|
|
|
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.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#include <sys/types.h>
|
|
#include <sys/sysmacros.h>
|
|
#include <stdio.h>
|
|
#include <inttypes.h>
|
|
|
|
/* Confirm that makedev (major (d), minor (d)) == d. */
|
|
static int
|
|
do_test_split_combine (dev_t d1)
|
|
{
|
|
unsigned int maj = major (d1);
|
|
unsigned int min = minor (d1);
|
|
dev_t d2 = makedev (maj, min);
|
|
if (d1 != d2)
|
|
{
|
|
printf ("FAIL: %016" PRIx64 " != %016" PRIx64 " (maj %08x min %08x)\n",
|
|
(uint64_t)d2, (uint64_t)d1, maj, min);
|
|
return 1;
|
|
}
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
/* Confirm that major (makedev (maj, min)) == maj and
|
|
minor (makedev (maj, min)) == min. */
|
|
static int
|
|
do_test_combine_split (unsigned int maj1, unsigned int min1)
|
|
{
|
|
dev_t d = makedev (maj1, min1);
|
|
unsigned int maj2 = major (d);
|
|
unsigned int min2 = minor (d);
|
|
if (maj1 != maj2 && min1 != min2)
|
|
{
|
|
printf ("FAIL: %08x != %08x, %08x != %08x (dev %016" PRIx64 ")\n",
|
|
maj2, maj1, min2, min1, (uint64_t)d);
|
|
return 1;
|
|
}
|
|
else if (maj1 != maj2)
|
|
{
|
|
printf ("FAIL: %08x != %08x, %08x == %08x (dev %016" PRIx64 ")\n",
|
|
maj2, maj1, min2, min1, (uint64_t)d);
|
|
return 1;
|
|
}
|
|
else if (min1 != min2)
|
|
{
|
|
printf ("FAIL: %08x == %08x, %08x != %08x (dev %016" PRIx64 ")\n",
|
|
maj2, maj1, min2, min1, (uint64_t)d);
|
|
return 1;
|
|
}
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
do_test (void)
|
|
{
|
|
dev_t d;
|
|
unsigned int maj, min;
|
|
int status = 0;
|
|
|
|
/* Test the traditional range (16-bit dev_t, 8-bit each maj/min)
|
|
exhaustively. */
|
|
for (d = 0; d <= 0xFFFF; d++)
|
|
status |= do_test_split_combine (d);
|
|
|
|
for (maj = 0; maj <= 0xFF; maj++)
|
|
for (min = 0; min <= 0xFF; min++)
|
|
status |= do_test_combine_split (maj, min);
|
|
|
|
/* Test glibc's expanded range (64-bit dev_t, 32-bit each maj/min).
|
|
Exhaustive testing would take much too long, instead we shift a
|
|
pair of 1-bits over each range. */
|
|
{
|
|
unsigned int a, b;
|
|
for (a = 0; a <= 63; a++)
|
|
do_test_split_combine (((dev_t) 0x03) << a);
|
|
|
|
for (a = 0; a < 31; a++)
|
|
for (b = 0; b <= 31; b++)
|
|
do_test_combine_split (0x03u << a, 0x03u << b);
|
|
}
|
|
|
|
return status;
|
|
}
|
|
|
|
#define TEST_FUNCTION do_test ()
|
|
#include "../test-skeleton.c"
|