Implement additional sysconf values
authorDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Thu, 21 Aug 2008 01:03:13 +0000 (01:03 +0000)
committerDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Thu, 21 Aug 2008 01:03:53 +0000 (01:03 +0000)
NOTES.opensolaris
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/bits/confname.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/get_child_max.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/getclktck.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/getdtsz.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/getpagesize.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sysconf.c [new file with mode: 0644]

index f42c3b0..64e4196 100644 (file)
@@ -95,3 +95,51 @@ reader-writer lock:
   process) of a reader-writer lock.
 
 [0] http://docs.sun.com/app/docs/doc/819-2243/rwlock-init-3c?a=view
+
+sysconf:
+
+  Many of the _SC_ sysconf values are obtained via the systemconf syscall. The
+  following is a table of mappings from _SC_ to _CONFIG_ values. The third
+  column lists the value returned by sysdeps/posix/sysconf.c.
+
+    _SC_CHILD_MAX           _CONFIG_CHILD_MAX           _get_child_max
+    _SC_CLK_TCK             _CONFIG_CLK_TCK             _getclktck
+    _SC_NGROUPS_MAX         _CONFIG_NGROUPS             NGROUPS_MAX
+    _SC_OPEN_MAX            _CONFIG_OPEN_FILES          __getdtablesize
+    _SC_PAGESIZE            _CONFIG_PAGESIZE            __getpagesize
+    _SC_XOPEN_VERSION       _CONFIG_XOPEN_VER           _XOPEN_VERSION
+    _SC_STREAM_MAX          _CONFIG_OPEN_FILES          STREAM_MAX
+    _SC_NPROCESSORS_CONF    _CONFIG_NPROC_CONF          __get_nprocs_conf
+    _SC_NPROCESSORS_ONLN    _CONFIG_NPROC_ONLN          __get_nprocs
+    _SC_NPROCESSORS_MAX     _CONFIG_NPROC_MAX
+    _SC_STACK_PROT          _CONFIG_STACK_PROT
+    _SC_AIO_LISTIO_MAX      _CONFIG_AIO_LISTIO_MAX      AIO_LISTIO_MAX
+    _SC_AIO_MAX             _CONFIG_AIO_MAX             AIO_MAX
+    _SC_AIO_PRIO_DELTA_MAX  _CONFIG_AIO_PRIO_DELTA_MAX  AIO_PRIO_DELTA_MAX
+    _SC_DELAYTIMER_MAX      _CONFIG_DELAYTIMER_MAX      DELAYTIMER_MAX
+    _SC_MQ_OPEN_MAX         _CONFIG_MQ_OPEN_MAX         MQ_OPEN_MAX
+    _SC_MQ_PRIO_MAX         _CONFIG_MQ_PRIO_MAX         MQ_PRIO_MAX
+    _SC_RTSIG_MAX           _CONFIG_RTSIG_MAX           RTSIG_MAX
+    _SC_SEM_NSEMS_MAX       _CONFIG_SEM_NSEMS_MAX       SEM_NSEMS_MAX
+    _SC_SEM_VALUE_MAX       _CONFIG_SEM_VALUE_MAX       SEM_VALUE_MAX
+    _SC_SIGQUEUE_MAX        _CONFIG_SIGQUEUE_MAX        SIGQUEUE_MAX
+    _SC_SIGRT_MAX           _CONFIG_SIGRT_MAX
+    _SC_SIGRT_MIN           _CONFIG_SIGRT_MIN
+    _SC_TIMER_MAX           _CONFIG_TIMER_MAX           TIMER_MAX
+    _SC_PHYS_PAGES          _CONFIG_PHYS_PAGES          __get_phys_pages
+    _SC_AVPHYS_PAGES        _CONFIG_AVPHYS_PAGES        __get_avphys_pages
+    _SC_COHER_BLKSZ         _CONFIG_COHERENCY
+    _SC_SPLIT_CACHE         _CONFIG_SPLIT_CACHE
+    _SC_ICACHE_SZ           _CONFIG_ICACHESZ
+    _SC_DCACHE_SZ           _CONFIG_DCACHESZ
+    _SC_ICACHE_LINESZ       _CONFIG_ICACHELINESZ
+    _SC_DCACHE_LINESZ       _CONFIG_DCACHELINESZ
+    _SC_ICACHE_BLKSZ        _CONFIG_ICACHEBLKSZ
+    _SC_DCACHE_BLKSZ        _CONFIG_DCACHEBLKSZ
+    _SC_DCACHE_TBLKSZ       _CONFIG_DCACHETBLKSZ
+    _SC_ICACHE_ASSOC        _CONFIG_ICACHE_ASSOC
+    _SC_DCACHE_ASSOC        _CONFIG_DCACHE_ASSOC
+    _SC_MAXPID              _CONFIG_MAXPID
+    _SC_CPUID_MAX           _CONFIG_CPUID_MAX
+    _SC_EPHID_MAX           _CONFIG_EPHID_MAX
+    _SC_SYMLOOP_MAX         _CONFIG_SYMLOOP_MAX         SYMLOOP_MAX
index f3b58a6..2dcc93e 100644 (file)
@@ -232,7 +232,39 @@ enum
     _SC_AVPHYS_PAGES = 501,
 #define _SC_AVPHYS_PAGES               _SC_AVPHYS_PAGES
 
-/* _SC_COHER_BLKSZ to _SC_EPHID_MAX */ /* OpenSolaris */
+/* These are found in OpenSolaris but not GNU libc.  */
+    _SC_COHER_BLKSZ = 503,
+#define _SC_COHER_BLKSZ                        _SC_COHER_BLKSZ
+    _SC_SPLIT_CACHE = 504,
+#define _SC_SPLIT_CACHE                        _SC_SPLIT_CACHE
+    _SC_ICACHE_SZ = 505,
+#define _SC_ICACHE_SZ                  _SC_ICACHE_SZ
+    _SC_DCACHE_SZ = 506,
+#define _SC_DCACHE_SZ                  _SC_DCACHE_SZ
+    _SC_ICACHE_LINESZ = 507,
+#define _SC_ICACHE_LINESZ              _SC_ICACHE_LINESZ
+    _SC_DCACHE_LINESZ = 508,
+#define _SC_DCACHE_LINESZ              _SC_DCACHE_LINESZ
+    _SC_ICACHE_BLKSZ = 509,
+#define _SC_ICACHE_BLKSZ               _SC_ICACHE_BLKSZ
+    _SC_DCACHE_BLKSZ = 510,
+#define _SC_DCACHE_BLKSZ               _SC_DCACHE_BLKSZ
+    _SC_DCACHE_TBLKSZ = 511,
+#define _SC_DCACHE_TBLKSZ              _SC_DCACHE_TBLKSZ
+    _SC_ICACHE_ASSOC = 512,
+#define _SC_ICACHE_ASSOC               _SC_ICACHE_ASSOC
+    _SC_DCACHE_ASSOC = 513,
+#define _SC_DCACHE_ASSOC               _SC_DCACHE_ASSOC
+    _SC_MAXPID = 514,
+#define _SC_MAXPID                     _SC_MAXPID
+    _SC_STACK_PROT = 515,
+#define _SC_STACK_PROT                 _SC_STACK_PROT
+    _SC_NPROCESSORS_MAX = 516,
+#define _SC_NPROCESSORS_MAX            _SC_NPROCESSORS_MAX
+    _SC_CPUID_MAX = 517,
+#define _SC_CPUID_MAX                  _SC_CPUID_MAX
+    _SC_EPHID_MAX = 518,
+#define _SC_EPHID_MAX                  _SC_EPHID_MAX
 
     _SC_THREAD_DESTRUCTOR_ITERATIONS = 568,
 #define        _SC_THREAD_DESTRUCTOR_ITERATIONS _SC_THREAD_DESTRUCTOR_ITERATIONS
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/get_child_max.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/get_child_max.c
new file mode 100644 (file)
index 0000000..ff06835
--- /dev/null
@@ -0,0 +1,29 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   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, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <inline-syscall.h>
+#include <sys/sysconfig.h>
+
+DECLARE_INLINE_SYSCALL (long, sysconfig, int which);
+
+long int
+__get_child_max (void)
+{
+  return INLINE_SYSCALL (sysconfig, 1, _CONFIG_CHILD_MAX);
+}
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/getclktck.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/getclktck.c
new file mode 100644 (file)
index 0000000..c2ef7c1
--- /dev/null
@@ -0,0 +1,39 @@
+/* Copyright (C) 2000, 2002, 2004, 2008 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, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <time.h>
+
+#include <ldsodefs.h>
+
+#include <inline-syscall.h>
+#include <sys/sysconfig.h>
+
+DECLARE_INLINE_SYSCALL (long, sysconfig, int which);
+
+/* Return frequency of times().  */
+int
+__getclktck ()
+{
+#ifdef HAVE_AUX_VECTOR
+  /* Did the kernel pass the clktck in the elf header? */
+  if (GLRO(dl_clktck) != 0)
+    return GLRO(dl_pagesize);
+#endif
+
+  return (int)INLINE_SYSCALL (sysconfig, 1, _CONFIG_CLK_TCK);
+}
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/getdtsz.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/getdtsz.c
new file mode 100644 (file)
index 0000000..5c309a5
--- /dev/null
@@ -0,0 +1,30 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   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, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <inline-syscall.h>
+#include <sys/sysconfig.h>
+
+DECLARE_INLINE_SYSCALL (long, sysconfig, int which);
+
+int
+__getdtablesize (void)
+{
+  return (int)INLINE_SYSCALL (sysconfig, 1, _CONFIG_OPEN_FILES);
+}
+weak_alias (__getdtablesize, getdtablesize)
index 2d670e5..7b25339 100644 (file)
@@ -28,11 +28,13 @@ DECLARE_INLINE_SYSCALL (long, sysconfig, int which);
 int
 __getpagesize ()
 {
+#ifdef HAVE_AUX_VECTOR
   /* Did the kernel pass the pagesize in the elf header? */
   if (GLRO(dl_pagesize) != 0)
     return GLRO(dl_pagesize);
+#endif
 
-  return INLINE_SYSCALL (sysconfig, 1, _CONFIG_PAGESIZE);
+  return (int)INLINE_SYSCALL (sysconfig, 1, _CONFIG_PAGESIZE);
 }
 libc_hidden_def (__getpagesize)
 weak_alias (__getpagesize, getpagesize)
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sysconf.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sysconf.c
new file mode 100644 (file)
index 0000000..6022fd8
--- /dev/null
@@ -0,0 +1,105 @@
+/* Get file-specific information about a file.  OpenSolaris version.
+   Copyright (C) 2003, 2004, 2006, 2008 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, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <inline-syscall.h>
+#include <unistd.h>
+#include <sys/sysconfig.h>
+
+DECLARE_INLINE_SYSCALL (long, sysconfig, int which);
+
+static long int posix_sysconf (int name);
+
+
+/* Get the value of the system variable NAME.  */
+long int
+__sysconf (int name)
+{
+  switch (name)
+    {
+    case _SC_NGROUPS_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_NGROUPS);
+    case _SC_STREAM_MAX:
+      return __getdtablesize ();
+    case _SC_NPROCESSORS_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_NPROC_MAX);
+    case _SC_STACK_PROT:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_STACK_PROT);
+    case _SC_AIO_LISTIO_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_AIO_LISTIO_MAX);
+    case _SC_AIO_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_AIO_MAX);
+    case _SC_AIO_PRIO_DELTA_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_AIO_PRIO_DELTA_MAX);
+    case _SC_DELAYTIMER_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_DELAYTIMER_MAX);
+    case _SC_MQ_OPEN_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_MQ_OPEN_MAX);
+    case _SC_MQ_PRIO_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_MQ_PRIO_MAX);
+    case _SC_RTSIG_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_RTSIG_MAX);
+    case _SC_SEM_NSEMS_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_SEM_NSEMS_MAX);
+    case _SC_SEM_VALUE_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_SEM_VALUE_MAX);
+    case _SC_SIGQUEUE_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_SIGQUEUE_MAX);
+    case _SC_SIGRT_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_SIGRT_MAX);
+    case _SC_SIGRT_MIN:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_SIGRT_MIN);
+    case _SC_TIMER_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_TIMER_MAX);
+    case _SC_COHER_BLKSZ:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_COHERENCY);
+    case _SC_SPLIT_CACHE:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_SPLIT_CACHE);
+    case _SC_ICACHE_SZ:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_ICACHESZ);
+    case _SC_DCACHE_SZ:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_DCACHESZ);
+    case _SC_ICACHE_LINESZ:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_ICACHELINESZ);
+    case _SC_DCACHE_LINESZ:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_DCACHELINESZ);
+    case _SC_ICACHE_BLKSZ:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_ICACHEBLKSZ);
+    case _SC_DCACHE_BLKSZ:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_DCACHEBLKSZ);
+    case _SC_ICACHE_ASSOC:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_ICACHE_ASSOC);
+    case _SC_DCACHE_ASSOC:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_DCACHE_ASSOC);
+    case _SC_MAXPID:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_MAXPID);
+    case _SC_CPUID_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_CPUID_MAX);
+    case _SC_EPHID_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_EPHID_MAX);
+    case _SC_SYMLOOP_MAX:
+      return INLINE_SYSCALL (sysconfig, 1, _CONFIG_SYMLOOP_MAX);
+    default:
+      return posix_sysconf (name);
+  }
+}
+
+/* Now the POSIX version.  */
+#undef __sysconf
+#define __sysconf static posix_sysconf
+#include <sysdeps/posix/sysconf.c>