#
# For a description of the syntax of this configuration file,
# see Linux's Documentation/kbuild/kconfig-language.txt.
#
mainmenu "Akaros/$SRCARCH Kernel Configuration"

# This is info, not a setable option.  Must make ARCH=arch to change.
config SRCARCH
	string
	option env="ARCH"

config 64BIT
	bool "64-bit kernel"
	default y
	help
		Say yes to build a 64-bit kernel.  Must be 'y' for x86.

menuconfig RUN_INIT_SCRIPT
	bool "Run init script after boot"
	default n
	help
		Run an init script after boot instead of dropping into the monitor

config INIT_SCRIPT_PATH_AND_ARGS
    depends on RUN_INIT_SCRIPT
    string "Path to init script, followed by its arguments."
    default /bin/init.sh
    help
		Path to the init script run at boot time, followed by a space separated
		list of arguments

source "kern/arch/$SRCARCH/Kconfig"

source "kern/src/net/Kconfig"

source "kern/drivers/Kconfig"

menu "Filesystems"

config KFS
	bool "KFS filesystem"
	default y
	help
		KFS is an initramfs bundled into the kernel, and contains your root
		filesystem.

config KFS_PATHS
	depends on KFS
	string "KFS/Initramfs paths"
	default kern/kfs
	help
		Space separated list of paths to directories to bundle into KFS.  This
		will be your root filesystem.

config KFS_CPIO_BIN
	depends on KFS
	string "KFS CPIO helper"
	default ""
	help
		This binary (relative to the root directory) will be run before
		bundling the KFS Paths into the CPIO.

endmenu

choice COREALLOC_POLICY
	prompt "Core Allocation Policy"
	help
		Select a policy for allocating cores to a process upon request.  All
		strategies first allocate cores from the set of provisioned cores for a
		process, but differ in how they select cores beyond this.

config COREALLOC_FCFS
	bool "Simple FCFS"
	help
		Allocate cores to processes on a first-come-first-served basis. All
		cores are treated equally, and no topology information is used to try
		and optimize which cores are given to which processes upon request.

config COREALLOC_PACKED
	bool "Packed Topology"
	help
		Allocate cores to a process based on a topology-aware algorithm that
		tries to pack allocated cores as close together as possible.  It first
		tries to pair new cores with their hyper-threaded pair, then keep them
		on the same socket, then the same numa domain.

endchoice

menu "Kernel Debugging"

menu "Per-cpu Tracers"

config TRACE_KMSGS
	bool "KMSG Tracing"
	default n
	help
		Turns on KMSG tracing, using the per-cpu ring buffer (holds about 256
		events).  You can access this from the monitor via "trace pcpui".  Turn
		this off for a slight performance improvement on every KMSG (and every
		MCP proc_yield).

config TRACE_LOCKS
	bool "Lock Tracing"
	depends on SPINLOCK_DEBUG
	default n
	help
		Turns on lock tracing, using the per-cpu ring buffer.  This records the
		a timestamp and lock address, in an over-write tracing style (meaning
		it'll clobber older events).  If you have locking issues, this may give
		you clues as to which locks were grabbed recently.

endmenu

config DEVELOPMENT_ASSERTIONS
	bool "dasserts"
	default n
	help
		Turn on dassert() in code, dassert will compile to assert().

config SPINLOCK_DEBUG
	bool "Spinlock debugging"
	default n
	help
		Turns on debugging, which tracks the last time a lock was acquired and
		detects improper lock acquisition based on IRQ levels (e.g. using
		spin_lock() in IRQ context).  This will slow down all lock
		acquisitions.

config SEQLOCK_DEBUG
	bool "Seqlock debugging"
	default n
	help
		Provides asserts to detect seqlock errors.  This will allow a malicious
		userspace to trigger a panic in the kernel.

config SEMAPHORE_DEBUG
	bool "Semaphore debugging"
	default n
	help
		Turns on debugging, which tracks the last time and location that a
		semaphore was downed, and provides a linked list of all semaphores that
		have waiters.  This will slow down all semaphore ups and downs.

config SEM_SPINWAIT
	bool "Semaphore spinwaiting"
	default n
	help
		Turns on semaphore spinwaiting.  In lieu of intelligent Adaptive
		Mutexes, busy semaphores will just spin for a while before fully
		sleeping.

config SEM_SPINWAIT_NR_LOOPS
	int "Number of polls before sleeping"
	depends on SEM_SPINWAIT
	default 100
	help
		How many times to poll a busy semaphore before going to sleep.

config DISABLE_SMT
	bool "Disables symmetric multithreading"
	default n
	help
		Disables hyperthreading by telling the kernel to never give out even
		numbered cores to MCPs.  This does not check to see if the threads are
		in fact siblings, or if the target machine is hyperthreaded.

config PRINTK_NO_BACKSPACE
	bool "Printk with no backspace"
	default n
	help
		One of the serial devices I was using a while back had issues printing
		backspaces.  This was an old hack to deal with that.

config SYSCALL_STRING_SAVING
	bool "Syscall string saving"
	default n
	help
		Kmallocs a small buffer for each syscall and attaches it to the
		kthread, which can be viewed when debugging semaphores.  Individual
		syscalls can save info in this buffer.

config BLOCK_EXTRAS
	bool "Block Extra Data"
	default y
	help
		Extends blocks to have a list of other memory blocks.  Useful for
		networking performance.  This is only an option while we debug the
		implementation.  Say y.  If you have networking bugs, try turning this
		off, and if that helps, tell someone.

config BETTER_BACKTRACE
	bool "Better backtraces, less optimizations"
	default n
	help
		The kernel uses the frame pointer and call stacks for backtraces.
		Tail-call optimizations remove some of this information.  Say 'Y' here
		to have better backtraces, at the expense of performance.

endmenu

menu "Misc/Old Options"

config ARSC_SERVER
	bool "Asynchronous remote syscalls"
	default n
	help
		Code to run a syscall-server on a core.  A process can submit syscalls
		and get the results asynchronously.  Hasn't been used in years.  Say
		'n' unless you want to play around.

# SPARC auto-selects this
config APPSERVER
	bool "Appserver"
	default n
	help
		Old school I/O was through a remote machine.  Not sure if anyone uses
		this anymore.

config SERIAL_IO
	bool "Serial IO"
	default n
	help
		Like the appserver, serial I/O was an old attempt to process I/O on a
		remote machine across the serial port.

config SINGLE_CORE
	bool "Single core"
	default n
	help
		Have the kernel boot only a single core.  Can be useful for debugging,
		but hasn't been used in years.

config BSD_ON_CORE0
	bool "BSD on core 0"
	default n
	help
		This was an old joke.  Say 'n', since we can't simply #include <bsd>.

endmenu

source "kern/lib/Kconfig"

source "kern/src/ktest/Kconfig"
