/*
 * klibc/sysconfig.h
 *
 * Allows for definitions of some things which may be system-dependent
 * NOTE: this file must not result in any output from the preprocessor.
 */

#ifndef _KLIBC_SYSCONFIG_H
#define _KLIBC_SYSCONFIG_H

#include <klibc/archconfig.h>
#include <asm/unistd.h>

/*
 * These are the variables that can be defined in <klibc/archconfig.h>.
 * For boolean options, #define to 0 to disable, #define to 1 to enable.
 *
 * If undefined, they will be given defaults here.
 */


/*
 * _KLIBC_NO_MMU:
 *
 *	Indicates this architecture doesn't have an MMU, and therefore
 *	does not have the sys_fork and sys_brk system calls.
 */
/* Default to having an MMU if we can find the fork system call */
#ifndef _KLIBC_NO_MMU
# if defined(__NR_fork)
#  define _KLIBC_NO_MMU 0
# else
#  define _KLIBC_NO_MMU 1
# endif
#endif


/*
 * _KLIBC_REAL_VFORK:
 *
 *	Indicates that this architecture has a real vfork() system call.
 *	This is the default if sys_vfork exists; if there is an
 *	architecture-dependent implementation of vfork(), define this
 *	symbol.
 */
#ifndef _KLIBC_REAL_VFORK
# if defined(__NR_vfork)
#  define _KLIBC_REAL_VFORK 1
# else
#  define _KLIBC_REAL_VFORK 0
# endif
#endif


/*
 * _KLIBC_USE_MMAP2:
 *
 *	Indicates that this architecture should use sys_mmap2 instead
 *	of sys_mmap.  This is the default on 32-bit architectures, assuming
 *	sys_mmap2 exists.
 */
#ifndef _KLIBC_USE_MMAP2
# if (_BITSIZE == 32 && defined(__NR_mmap2)) || \
     (_BITSIZE == 64 && !defined(__NR_mmap))
#  define _KLIBC_USE_MMAP2 1
# else
#  define _KLIBC_USE_MMAP2 0
# endif
#endif


/*
 * _KLIBC_MMAP2_SHIFT:
 *
 *	Indicate the shift of the offset parameter in sys_mmap2.
 *	On most architectures, this is always 12, but on some
 *	architectures it can be a different number, or the current
 *	page size.  If this is dependent on the page size, define
 *	this to an expression which includes __getpageshift().
 */
#ifndef _KLIBC_MMAP2_SHIFT
# define _KLIBC_MMAP2_SHIFT 12
#endif


/*
 * _KLIBC_MALLOC_USES_SBRK:
 *
 *	Indicates that malloc() should use sbrk() to obtain raw memory
 *	from the system, rather than mmap().
 */
/* Default to get memory using mmap() */
#ifndef _KLIBC_MALLOC_USES_SBRK
# define _KLIBC_MALLOC_USES_SBRK 0
#endif


/*
 * _KLIBC_MALLOC_CHUNK_SIZE:
 *	This is the minimum chunk size we will ask the kernel for using
 *	malloc(); this should be a multiple of the page size and must
 *	be a power of 2.
 */
#ifndef _KLIBC_MALLOC_CHUNK_SIZE
# define _KLIBC_MALLOC_CHUNK_SIZE	65536
#endif


/*
 * _KLIBC_BUFSIZ:
 *	This is the size of an stdio buffer.  By default this is
 *	_KLIBC_MALLOC_CHUNK_SIZE/4, which allows the three standard
 *	streams to fit inside a malloc chunk.
 */
#ifndef _KLIBC_BUFSIZ
# define _KLIBC_BUFSIZ (_KLIBC_MALLOC_CHUNK_SIZE >> 2)
#endif


/*
 * _KLIBC_SBRK_ALIGNMENT:
 *
 *	This is the minimum alignment for the memory returned by
 *	sbrk().  It must be a power of 2.  If _KLIBC_MALLOC_USES_SBRK
 *	is set it should be no smaller than the size of struct
 *	arena_header in malloc.h (== 4 pointers.)
 */
#ifndef _KLIBC_SBRK_ALIGNMENT
# define _KLIBC_SBRK_ALIGNMENT		32
#endif


/*
 * _KLIBC_USE_RT_SIG:
 *
 *      Indicates that this architecture should use the rt_sig*()
 *      family of system calls, even if the older system calls are
 *      provided.  This requires that <asm/signal.h> is correct for
 *      using with the rt_sig*() system calls.  This is the default if
 *      the older system calls are undefined in <asm/unistd.h>.
 *
 */
#ifndef _KLIBC_USE_RT_SIG
# ifdef __NR_sigaction
#  define _KLIBC_USE_RT_SIG 0
# else
#  define _KLIBC_USE_RT_SIG 1
# endif
#endif


/*
 * _KLIBC_NEEDS_SA_RESTORER:
 *
 *	Some architectures, like x86-64 and some i386 Fedora kernels,
 *	do not provide a default sigreturn, and therefore must have
 *	SA_RESTORER set.
 */
#ifndef _KLIBC_NEEDS_SA_RESTORER
# define _KLIBC_NEEDS_SA_RESTORER 0
#endif


/*
 * _KLIBC_STATFS_F_TYPE_64:
 *
 *	This indicates that the f_type, f_bsize, f_namelen,
 *	f_frsize, and f_spare fields of struct statfs are
 *	64 bits long.  This is normally the case for 64-bit
 *	platforms, and so is the default for those.  See
 *	usr/include/sys/vfs.h for the exact details.
 */
#ifndef _KLIBC_STATFS_F_TYPE_64
# define _KLIBC_STATFS_F_TYPE_64 (_BITSIZE == 64)
#endif


/*
 * _KLIBC_STATFS_F_TYPE_32B:
 *
 * 	mips has it's own definition of statfs, which is
 * 	different from any other 32 bit arch.
 */
#ifndef _KLIBC_STATFS_F_TYPE_32B
# define _KLIBC_STATFS_F_TYPE_32B 0
#endif


/*
 * _KLIBC_HAS_ARCHSOCKET_H
 *
 *       This architecture has <klibc/archsocket.h>
 */
#ifndef _KLIBC_HAS_ARCHSOCKET_H
# define _KLIBC_HAS_ARCHSOCKET_H 0
#endif


/*
 * _KLIBC_SYS_SOCKETCALL
 *
 *	This architecture (e.g. SPARC) advertises socket-related
 *	system calls, which are not actually implemented.  Use
 *	socketcalls unconditionally instead.
 */
#ifndef _KLIBC_SYS_SOCKETCALL
# define _KLIBC_SYS_SOCKETCALL 0
#endif

/*
 * _KLIBC_ARM_USE_BX
 *
 *	This arm architecture supports bx instruction.
 */
#ifndef _KLIBC_ARM_USE_BX
# define _KLIBC_ARM_USE_BX 0
#endif

#endif /* _KLIBC_SYSCONFIG_H */
