#
# For a description of the syntax of this configuration file,
# see scripts/kbuild/config-language.txt.
#

menu "Linux Module Utilities"

config CONFIG_INSMOD
	bool "insmod"
	default n
	help
	  insmod is used to load specified modules in the running kernel.

config CONFIG_FEATURE_INSMOD_VERSION_CHECKING
	bool "Module version checking"
	default n
	depends on CONFIG_INSMOD && CONFIG_FEATURE_2_4_MODULES
	help
	  Support checking of versions for modules.  This is used to
	  ensure that the kernel and module are made for each other.

config CONFIG_FEATURE_INSMOD_KSYMOOPS_SYMBOLS
	bool "Add module symbols to kernel symbol table"
	default n
	depends on CONFIG_INSMOD && CONFIG_FEATURE_2_4_MODULES
	help
	  By adding module symbols to the kernel symbol table, Oops messages
	  occuring within kernel modules can be properly debugged.  By enabling
	  this feature, module symbols will always be added to the kernel symbol
	  table for properly debugging support.  If you are not interested in
	  Oops messages from kernel modules, say N.

config CONFIG_FEATURE_INSMOD_LOADINKMEM
	bool "In kernel memory optimization (uClinux only)"
	default n
	depends on CONFIG_INSMOD && CONFIG_FEATURE_2_4_MODULES
	help
	  This is a special uClinux only memory optimization that lets insmod
	  load the specified kernel module directly into kernel space, reducing
	  memory usage by preventing the need for two copies of the module
	  being loaded into memory.

config CONFIG_FEATURE_INSMOD_LOAD_MAP
	bool "Enable load map (-m) option"
	default n
	depends on CONFIG_INSMOD && CONFIG_FEATURE_2_4_MODULES
	help
	  Enabling this, one would be able to get a load map
	  output on stdout. This makes kernel module debugging
	  easier.
	  If you don't plan to debug kernel modules, you
	  don't need this option.

config CONFIG_FEATURE_INSMOD_LOAD_MAP_FULL
	bool "Symbols in load map"
	default y
	depends on CONFIG_FEATURE_INSMOD_LOAD_MAP
	help
	  Without this option, -m will only output section
	  load map.  With this option, -m will also output
	  symbols load map.

config CONFIG_RMMOD
	bool "rmmod"
	default n
	help
	  rmmod is used to unload specified modules from the kernel.

config CONFIG_LSMOD
	bool "lsmod"
	default n
	help
	  lsmod is used to display a list of loaded modules.

config CONFIG_FEATURE_LSMOD_PRETTY_2_6_OUTPUT
	bool "lsmod pretty output for 2.6.x Linux kernels "
	default n
	depends on CONFIG_LSMOD
	help
	  This option makes output format of lsmod adjusted to
	  the format of module-init-tools for Linux kernel 2.6.

config CONFIG_MODPROBE
	bool "modprobe"
	default n
	help
	  Handle the loading of modules, and their dependencies on a high
	  level.

	  Note that in the state, modprobe does not understand multiple
	  module options from the configuration file. See option below.

config CONFIG_FEATURE_MODPROBE_MULTIPLE_OPTIONS
	bool
	prompt "Multiple options parsing" if CONFIG_NITPICK
	default y
	depends on CONFIG_MODPROBE
	help
	  Allow modprobe to understand more than one option to pass to
	  modules.

	  This is a WIP, while waiting for a common argument parsing
	  common amongst all BB applets (shell, modprobe, etc...) and
	  adds around 600 bytes on x86, 700 bytes on ARM. The code is
	  biggish and uggly, but just works.

	  Saying Y here is not a bad idea if you're not that short
	  on storage capacity.

config CONFIG_FEATURE_MODPROBE_FANCY_ALIAS
	bool
	prompt "Fancy alias parsing" if CONFIG_NITPICK
	default y
	depends on CONFIG_MODPROBE && CONFIG_FEATURE_2_6_MODULES
	help
	  Say 'y' here to enable parsing of aliases with underscore/dash
	  mismatch between module name and file name, along with bus-specific
	  aliases (such as pci:... or usb:... aliases).

comment "Options common to multiple modutils"
	depends on CONFIG_INSMOD || CONFIG_RMMOD || CONFIG_MODPROBE || CONFIG_LSMOD

config CONFIG_FEATURE_CHECK_TAINTED_MODULE
	# Simulate indentation
	bool "Support tainted module checking with new kernels"
	default y
	depends on CONFIG_INSMOD || CONFIG_LSMOD
	help
	  Support checking for tainted modules.  These are usually binary
	  only modules that will make the linux-kernel list ignore your
	  support request.
	  This option is required to support GPLONLY modules.

config CONFIG_FEATURE_2_4_MODULES
	# Simulate indentation
	bool "Support version 2.2.x to 2.4.x Linux kernels"
	default y
	depends on CONFIG_INSMOD || CONFIG_RMMOD
	help
	  Support module loading for 2.2.x and 2.4.x Linux kernels.

config CONFIG_FEATURE_2_6_MODULES
	# Simulate indentation
	bool "Support version 2.6.x Linux kernels"
	default y
	depends on CONFIG_INSMOD || CONFIG_RMMOD || CONFIG_MODPROBE
	help
	  Support module loading for newer 2.6.x Linux kernels.


config CONFIG_FEATURE_QUERY_MODULE_INTERFACE
	bool
	default y
	depends on CONFIG_FEATURE_2_4_MODULES && !CONFIG_FEATURE_2_6_MODULES


endmenu

