#
# 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 n
	help
		Say yes to build a 64-bit kernel, amd64 / x86_64, riscv64, etc.

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

menu "Memory Management"

config DEMAND_PAGING
	bool "Demand paging"
	default n
	help
		When turned on, mmap() calls do not immediately populate their pages.
		This does not turn on any sort of real paging.  Saying 'n' will act
		like all mmap()s have MAP_POPULATE.

config PAGE_COLORING
	bool "Page coloring"
	default n
	help
		Turns on internal support for page coloring.  When turned off, the page
		allocator acts like there is only one color.  Hasn't been used in a few
		years.

config BOXBORO
	depends on PAGE_COLORING
	bool "Boxboro-specific page coloring"
	default n
	help
		Say 'n'.

endmenu

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 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 RESET_STACKS
	bool "Reset Stacks"
	default y
	help
		When idling, the kernel will reset the stack of its kernel thread to
		the top of the stack, abandoning its context.  This is useful so we do
		not run off the end of our stacks, but makes backtracing difficult.

config KTHREAD_POISON
	bool "Kthread Poison Canary"
	default n
	help
		Kthreads will use a bit of storage at the bottom of the stack to track
		the state of the kthread.  This is useful to catch various bugs with
		kthreading, such as launching the same kthread twice concurrently.

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.

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
