#include <sys/param.h>
#include <sys/types.h>
#include <sys/sysmacros.h>
#include <sys/systm.h>
#include <sys/tuneable.h>
#include <sys/errno.h>
#include <sys/var.h>
#include <sys/signal.h>
#include <sys/time.h>
#include <sys/sysconfig.h>
#include <sys/resource.h>
#include <sys/ulimit.h>
#include <sys/unistd.h>
#include <sys/debug.h>
#include <sys/cpuvar.h>
#include <sys/mman.h>
#include <sys/timer.h>
#include <sys/zone.h>
#include <sys/vm_usage.h>
#include <vm/as.h>
extern rctl_hndl_t rc_process_sigqueue;
long
sysconfig(int which)
{
switch (which) {
default:
return (mach_sysconfig(which));
case _CONFIG_CLK_TCK:
return ((long)hz);
case _CONFIG_PROF_TCK:
return ((long)hz);
case _CONFIG_NGROUPS:
return (ngroups_max);
case _CONFIG_OPEN_FILES:
{
rlim64_t fd_ctl;
mutex_enter(&curproc->p_lock);
fd_ctl = rctl_enforced_value(
rctlproc_legacy[RLIMIT_NOFILE], curproc->p_rctls,
curproc);
mutex_exit(&curproc->p_lock);
return ((ulong_t)fd_ctl);
}
case _CONFIG_CHILD_MAX:
return (v.v_maxup);
case _CONFIG_POSIX_VER:
return (_POSIX_VERSION);
case _CONFIG_PAGESIZE:
return (PAGESIZE);
case _CONFIG_XOPEN_VER:
return (_XOPEN_VERSION);
case _CONFIG_NPROC_CONF:
return (zone_ncpus_get(curproc->p_zone));
case _CONFIG_NPROC_ONLN:
return (zone_ncpus_online_get(curproc->p_zone));
case _CONFIG_NPROC_MAX:
return (max_ncpus);
case _CONFIG_NPROC_NCPU:
return (NCPU);
case _CONFIG_STACK_PROT:
return (curproc->p_stkprot & ~PROT_USER);
case _CONFIG_AIO_LISTIO_MAX:
return (_AIO_LISTIO_MAX);
case _CONFIG_AIO_MAX:
return (_AIO_MAX);
case _CONFIG_AIO_PRIO_DELTA_MAX:
return (0);
case _CONFIG_DELAYTIMER_MAX:
return (INT_MAX);
case _CONFIG_MQ_OPEN_MAX:
return (_MQ_OPEN_MAX);
case _CONFIG_MQ_PRIO_MAX:
return (_MQ_PRIO_MAX);
case _CONFIG_RTSIG_MAX:
return (_SIGRTMAX - _SIGRTMIN + 1);
case _CONFIG_SEM_NSEMS_MAX:
return (_SEM_NSEMS_MAX);
case _CONFIG_SEM_VALUE_MAX:
return (_SEM_VALUE_MAX);
case _CONFIG_SIGQUEUE_MAX:
{
rlim64_t sigqsz_max;
mutex_enter(&curproc->p_lock);
sigqsz_max = rctl_enforced_value(rc_process_sigqueue,
curproc->p_rctls, curproc);
mutex_exit(&curproc->p_lock);
return ((uint_t)sigqsz_max);
}
case _CONFIG_SIGRT_MIN:
return (_SIGRTMIN);
case _CONFIG_SIGRT_MAX:
return (_SIGRTMAX);
case _CONFIG_TIMER_MAX:
return (timer_max);
case _CONFIG_PHYS_PAGES:
if (!INGLOBALZONE(curproc) &&
curproc->p_zone->zone_phys_mcap != 0)
return (MIN(btop(curproc->p_zone->zone_phys_mcap),
physinstalled));
return (physinstalled);
case _CONFIG_AVPHYS_PAGES:
if (!INGLOBALZONE(curproc) &&
curproc->p_zone->zone_phys_mcap != 0) {
pgcnt_t cap, rss, free;
vmusage_t in_use;
size_t cnt = 1;
cap = btop(curproc->p_zone->zone_phys_mcap);
if (cap > physinstalled)
return (freemem);
if (vm_getusage(VMUSAGE_ZONE, 1, &in_use, &cnt,
FKIOCTL) != 0)
in_use.vmu_rss_all = 0;
rss = btop(in_use.vmu_rss_all);
if (cap > rss)
free = cap - rss;
else
free = 0;
return (MIN(free, freemem));
}
return (freemem);
case _CONFIG_MAXPID:
return (maxpid);
case _CONFIG_CPUID_MAX:
return (max_cpuid);
case _CONFIG_EPHID_MAX:
return (MAXEPHUID);
case _CONFIG_UADDR_MAX:
return ((long)(uintptr_t)curproc->p_as->a_userlimit);
case _CONFIG_SYMLOOP_MAX:
return (MAXSYMLINKS);
}
}