#
# 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"
