config STATIC_LINK
	bool "Force a static link"
	default n
	help
	  This option gives you the ability to force a static link of UML.
	  Normally, UML is linked as a shared binary.  This is inconvenient for
	  use in a chroot jail.  So, if you intend to run UML inside a chroot,
	  you probably want to say Y here.
	  Additionally, this option enables using higher memory spaces (up to
	  2.75G) for UML.

source "mm/Kconfig"
source "kernel/time/Kconfig"

config LD_SCRIPT_STATIC
	bool
	default y
	depends on STATIC_LINK

config LD_SCRIPT_DYN
	bool
	default y
	depends on !LD_SCRIPT_STATIC

source "fs/Kconfig.binfmt"

config HOSTFS
	tristate "Host filesystem"
	help
          While the User-Mode Linux port uses its own root file system for
          booting and normal file access, this module lets the UML user
          access files stored on the host.  It does not require any
          network connection between the Host and UML.  An example use of
          this might be:

          mount none /tmp/fromhost -t hostfs -o /tmp/umlshare

          where /tmp/fromhost is an empty directory inside UML and
          /tmp/umlshare is a directory on the host with files the UML user
          wishes to access.

          For more information, see
          <http://user-mode-linux.sourceforge.net/hostfs.html>.

          If you'd like to be able to work with files stored on the host,
          say Y or M here; otherwise say N.

config HPPFS
	tristate "HoneyPot ProcFS (EXPERIMENTAL)"
	depends on EXPERIMENTAL && PROC_FS
	help
	  hppfs (HoneyPot ProcFS) is a filesystem which allows UML /proc
	  entries to be overridden, removed, or fabricated from the host.
	  Its purpose is to allow a UML to appear to be a physical machine
	  by removing or changing anything in /proc which gives away the
	  identity of a UML.

	  See <http://user-mode-linux.sf.net/old/hppfs.html> for more information.

	  You only need this if you are setting up a UML honeypot.  Otherwise,
	  it is safe to say 'N' here.

config MCONSOLE
	bool "Management console"
	default y
	help
          The user mode linux management console is a low-level interface to
          the kernel, somewhat like the i386 SysRq interface.  Since there is
          a full-blown operating system running under every user mode linux
          instance, there is much greater flexibility possible than with the
          SysRq mechanism.

          If you answer 'Y' to this option, to use this feature, you need the
          mconsole client (called uml_mconsole) which is present in CVS in
          2.4.5-9um and later (path /tools/mconsole), and is also in the
          distribution RPM package in 2.4.6 and later.

          It is safe to say 'Y' here.

config MAGIC_SYSRQ
	bool "Magic SysRq key"
	depends on MCONSOLE
	help
	  If you say Y here, you will have some control over the system even
	  if the system crashes for example during kernel debugging (e.g., you
	  will be able to flush the buffer cache to disk, reboot the system
	  immediately or dump some status information). A key for each of the
	  possible requests is provided.

	  This is the feature normally accomplished by pressing a key
	  while holding SysRq (Alt+PrintScreen).

	  On UML, this is accomplished by sending a "sysrq" command with
	  mconsole, followed by the letter for the requested command.

	  The keys are documented in <file:Documentation/sysrq.txt>. Don't say Y
	  unless you really know what this hack does.

config SMP
	bool "Symmetric multi-processing support (EXPERIMENTAL)"
	default n
	depends on BROKEN
	help
	  This option enables UML SMP support.
	  It is NOT related to having a real SMP box. Not directly, at least.

	  UML implements virtual SMP by allowing as many processes to run
	  simultaneously on the host as there are virtual processors configured.

	  Obviously, if the host is a uniprocessor, those processes will
	  timeshare, but, inside UML, will appear to be running simultaneously.
	  If the host is a multiprocessor, then UML processes may run
	  simultaneously, depending on the host scheduler.

	  This, however, is supported only in TT mode. So, if you use the SKAS
	  patch on your host, switching to TT mode and enabling SMP usually
	  gives	you worse performances.
	  Also, since the support for SMP has been under-developed, there could
	  be some bugs being exposed by enabling SMP.

	  If you don't know what to do, say N.

config NR_CPUS
	int "Maximum number of CPUs (2-32)"
	range 2 32
	depends on SMP
	default "32"

config HIGHMEM
	bool "Highmem support (EXPERIMENTAL)"
	depends on !64BIT && BROKEN
	default n
	help
	  This was used to allow UML to run with big amounts of memory.
	  Currently it is unstable, so if unsure say N.

	  To use big amounts of memory, it is recommended enable static
	  linking (i.e. CONFIG_STATIC_LINK) - this should allow the
	  guest to use up to 2.75G of memory.

config KERNEL_STACK_ORDER
	int "Kernel stack size order"
	default 1 if 64BIT
	range 1 10 if 64BIT
	default 0 if !64BIT
	help
	  This option determines the size of UML kernel stacks.  They will
	  be 1 << order pages.  The default is OK unless you're running Valgrind
	  on UML, in which case, set this to 3.

config NO_DMA
	def_bool y
