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