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

config EXT2FS
	bool "Ext2 filesystem"
	default n
	help
		Build in support for ext2.  Extremely experimental, and only works with
		a block device image, which will be mounted at /mnt.  If you select
		this, you must specify a block device.

config EXT2_BDEV
	depends on EXT2FS
	string "Ext2 image file"
	default mnt/ext2fs.img
	help
		This file needs to be an ext2 image (file that looks like a block
		device).  You should be able to mount this file in your host OS.  It
		will be bundled into the kernel and mounted at /mnt.

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 LARGE_KSTACKS
	bool "Large (two-page) Kernel Stacks"
	default y
	help
		Ideally, we'd like to use single-page stacks, which are easier on the
		memory allocator.  Some of the Plan 9 code hogs stack space, and we may
		run off the end of a single-page stack.

		Say 'y' to play it safe and use the larger, slower stacks.  Say 'n' for
		higher performance, and mention this setting if you have any weird
		crashes or panics.

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"
