Merge e74acdf55d ("Merge tag 'modules-6.0-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux") into android-mainline
Steps on the way to 6.0-rc1 Resolves merge conflicts with: init/Kconfig kernel/module/Kconfig Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I92b7f12c0ba853ee8bfc81d072fb6eced54dbfa9
This commit is contained in:
@@ -1158,8 +1158,12 @@
|
||||
nopku [X86] Disable Memory Protection Keys CPU feature found
|
||||
in some Intel CPUs.
|
||||
|
||||
<module>.async_probe [KNL]
|
||||
Enable asynchronous probe on this module.
|
||||
<module>.async_probe[=<bool>] [KNL]
|
||||
If no <bool> value is specified or if the value
|
||||
specified is not a valid <bool>, enable asynchronous
|
||||
probe on this module. Otherwise, enable/disable
|
||||
asynchronous probe on this module as indicated by the
|
||||
<bool> value. See also: module.async_probe
|
||||
|
||||
early_ioremap_debug [KNL]
|
||||
Enable debug messages in early_ioremap support. This
|
||||
@@ -3285,6 +3289,15 @@
|
||||
For details see:
|
||||
Documentation/admin-guide/hw-vuln/processor_mmio_stale_data.rst
|
||||
|
||||
module.async_probe=<bool>
|
||||
[KNL] When set to true, modules will use async probing
|
||||
by default. To enable/disable async probing for a
|
||||
specific module, use the module specific control that
|
||||
is documented under <module>.async_probe. When both
|
||||
module.async_probe and <module>.async_probe are
|
||||
specified, <module>.async_probe takes precedence for
|
||||
the specific module.
|
||||
|
||||
module.sig_enforce
|
||||
[KNL] When CONFIG_MODULE_SIG is set, this means that
|
||||
modules without (valid) signatures will fail to load.
|
||||
|
||||
@@ -13752,6 +13752,7 @@ S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git modules-next
|
||||
F: include/linux/module.h
|
||||
F: kernel/module/
|
||||
F: scripts/module*
|
||||
|
||||
MONOLITHIC POWER SYSTEM PMIC DRIVER
|
||||
M: Saravanan Sekar <sravanhome@gmail.com>
|
||||
|
||||
+1
-305
@@ -1933,311 +1933,7 @@ config MODULE_SIG_FORMAT
|
||||
def_bool n
|
||||
select SYSTEM_DATA_VERIFICATION
|
||||
|
||||
menuconfig MODULES
|
||||
bool "Enable loadable module support"
|
||||
modules
|
||||
help
|
||||
Kernel modules are small pieces of compiled code which can
|
||||
be inserted in the running kernel, rather than being
|
||||
permanently built into the kernel. You use the "modprobe"
|
||||
tool to add (and sometimes remove) them. If you say Y here,
|
||||
many parts of the kernel can be built as modules (by
|
||||
answering M instead of Y where indicated): this is most
|
||||
useful for infrequently used options which are not required
|
||||
for booting. For more information, see the man pages for
|
||||
modprobe, lsmod, modinfo, insmod and rmmod.
|
||||
|
||||
If you say Y here, you will need to run "make
|
||||
modules_install" to put the modules under /lib/modules/
|
||||
where modprobe can find them (you may need to be root to do
|
||||
this).
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
if MODULES
|
||||
|
||||
config MODULE_FORCE_LOAD
|
||||
bool "Forced module loading"
|
||||
default n
|
||||
help
|
||||
Allow loading of modules without version information (ie. modprobe
|
||||
--force). Forced module loading sets the 'F' (forced) taint flag and
|
||||
is usually a really bad idea.
|
||||
|
||||
config MODULE_UNLOAD
|
||||
bool "Module unloading"
|
||||
help
|
||||
Without this option you will not be able to unload any
|
||||
modules (note that some modules may not be unloadable
|
||||
anyway), which makes your kernel smaller, faster
|
||||
and simpler. If unsure, say Y.
|
||||
|
||||
config MODULE_FORCE_UNLOAD
|
||||
bool "Forced module unloading"
|
||||
depends on MODULE_UNLOAD
|
||||
help
|
||||
This option allows you to force a module to unload, even if the
|
||||
kernel believes it is unsafe: the kernel will remove the module
|
||||
without waiting for anyone to stop using it (using the -f option to
|
||||
rmmod). This is mainly for kernel developers and desperate users.
|
||||
If unsure, say N.
|
||||
|
||||
config MODULE_UNLOAD_TAINT_TRACKING
|
||||
bool "Tainted module unload tracking"
|
||||
depends on MODULE_UNLOAD
|
||||
default n
|
||||
help
|
||||
This option allows you to maintain a record of each unloaded
|
||||
module that tainted the kernel. In addition to displaying a
|
||||
list of linked (or loaded) modules e.g. on detection of a bad
|
||||
page (see bad_page()), the aforementioned details are also
|
||||
shown. If unsure, say N.
|
||||
|
||||
config MODVERSIONS
|
||||
bool "Module versioning support"
|
||||
help
|
||||
Usually, you have to use modules compiled with your kernel.
|
||||
Saying Y here makes it sometimes possible to use modules
|
||||
compiled for different kernels, by adding enough information
|
||||
to the modules to (hopefully) spot any changes which would
|
||||
make them incompatible with the kernel you are running. If
|
||||
unsure, say N.
|
||||
|
||||
config ASM_MODVERSIONS
|
||||
bool
|
||||
default HAVE_ASM_MODVERSIONS && MODVERSIONS
|
||||
help
|
||||
This enables module versioning for exported symbols also from
|
||||
assembly. This can be enabled only when the target architecture
|
||||
supports it.
|
||||
|
||||
config MODULE_SRCVERSION_ALL
|
||||
bool "Source checksum for all modules"
|
||||
help
|
||||
Modules which contain a MODULE_VERSION get an extra "srcversion"
|
||||
field inserted into their modinfo section, which contains a
|
||||
sum of the source files which made it. This helps maintainers
|
||||
see exactly which source was used to build a module (since
|
||||
others sometimes change the module source without updating
|
||||
the version). With this option, such a "srcversion" field
|
||||
will be created for all modules. If unsure, say N.
|
||||
|
||||
config MODULE_SIG
|
||||
bool "Module signature verification"
|
||||
select MODULE_SIG_FORMAT
|
||||
help
|
||||
Check modules for valid signatures upon load: the signature
|
||||
is simply appended to the module. For more information see
|
||||
<file:Documentation/admin-guide/module-signing.rst>.
|
||||
|
||||
Note that this option adds the OpenSSL development packages as a
|
||||
kernel build dependency so that the signing tool can use its crypto
|
||||
library.
|
||||
|
||||
You should enable this option if you wish to use either
|
||||
CONFIG_SECURITY_LOCKDOWN_LSM or lockdown functionality imposed via
|
||||
another LSM - otherwise unsigned modules will be loadable regardless
|
||||
of the lockdown policy.
|
||||
|
||||
!!!WARNING!!! If you enable this option, you MUST make sure that the
|
||||
module DOES NOT get stripped after being signed. This includes the
|
||||
debuginfo strip done by some packagers (such as rpmbuild) and
|
||||
inclusion into an initramfs that wants the module size reduced.
|
||||
|
||||
config MODULE_SIG_FORCE
|
||||
bool "Require modules to be validly signed"
|
||||
depends on MODULE_SIG
|
||||
help
|
||||
Reject unsigned modules or signed modules for which we don't have a
|
||||
key. Without this, such modules will simply taint the kernel.
|
||||
|
||||
config MODULE_SIG_PROTECT
|
||||
bool "Android GKI module protection"
|
||||
depends on MODULE_SIG && !MODULE_SIG_FORCE
|
||||
help
|
||||
Enables Android GKI symbol and export protection support.
|
||||
|
||||
This modifies the behavior of the MODULE_SIG_FORCE as follows:
|
||||
- Allows Android GKI Modules signed using MODULE_SIG_ALL during build.
|
||||
- Allows other modules to load if they don't violate the access to
|
||||
Android GKI protected symbols and do not export the symbols already
|
||||
exported by the Android GKI modules. Loading will fail and return
|
||||
-EACCES (Permission denied) if symbol access contidions are not met.
|
||||
|
||||
config MODULE_SIG_ALL
|
||||
bool "Automatically sign all modules"
|
||||
default y
|
||||
depends on MODULE_SIG || IMA_APPRAISE_MODSIG
|
||||
help
|
||||
Sign all modules during make modules_install. Without this option,
|
||||
modules must be signed manually, using the scripts/sign-file tool.
|
||||
|
||||
comment "Do not forget to sign required modules with scripts/sign-file"
|
||||
depends on MODULE_SIG_FORCE && !MODULE_SIG_ALL
|
||||
|
||||
choice
|
||||
prompt "Which hash algorithm should modules be signed with?"
|
||||
depends on MODULE_SIG || IMA_APPRAISE_MODSIG
|
||||
help
|
||||
This determines which sort of hashing algorithm will be used during
|
||||
signature generation. This algorithm _must_ be built into the kernel
|
||||
directly so that signature verification can take place. It is not
|
||||
possible to load a signed module containing the algorithm to check
|
||||
the signature on that module.
|
||||
|
||||
config MODULE_SIG_SHA1
|
||||
bool "Sign modules with SHA-1"
|
||||
select CRYPTO_SHA1
|
||||
|
||||
config MODULE_SIG_SHA224
|
||||
bool "Sign modules with SHA-224"
|
||||
select CRYPTO_SHA256
|
||||
|
||||
config MODULE_SIG_SHA256
|
||||
bool "Sign modules with SHA-256"
|
||||
select CRYPTO_SHA256
|
||||
|
||||
config MODULE_SIG_SHA384
|
||||
bool "Sign modules with SHA-384"
|
||||
select CRYPTO_SHA512
|
||||
|
||||
config MODULE_SIG_SHA512
|
||||
bool "Sign modules with SHA-512"
|
||||
select CRYPTO_SHA512
|
||||
|
||||
endchoice
|
||||
|
||||
config MODULE_SIG_HASH
|
||||
string
|
||||
depends on MODULE_SIG || IMA_APPRAISE_MODSIG
|
||||
default "sha1" if MODULE_SIG_SHA1
|
||||
default "sha224" if MODULE_SIG_SHA224
|
||||
default "sha256" if MODULE_SIG_SHA256
|
||||
default "sha384" if MODULE_SIG_SHA384
|
||||
default "sha512" if MODULE_SIG_SHA512
|
||||
|
||||
choice
|
||||
prompt "Module compression mode"
|
||||
help
|
||||
This option allows you to choose the algorithm which will be used to
|
||||
compress modules when 'make modules_install' is run. (or, you can
|
||||
choose to not compress modules at all.)
|
||||
|
||||
External modules will also be compressed in the same way during the
|
||||
installation.
|
||||
|
||||
For modules inside an initrd or initramfs, it's more efficient to
|
||||
compress the whole initrd or initramfs instead.
|
||||
|
||||
This is fully compatible with signed modules.
|
||||
|
||||
Please note that the tool used to load modules needs to support the
|
||||
corresponding algorithm. module-init-tools MAY support gzip, and kmod
|
||||
MAY support gzip, xz and zstd.
|
||||
|
||||
Your build system needs to provide the appropriate compression tool
|
||||
to compress the modules.
|
||||
|
||||
If in doubt, select 'None'.
|
||||
|
||||
config MODULE_COMPRESS_NONE
|
||||
bool "None"
|
||||
help
|
||||
Do not compress modules. The installed modules are suffixed
|
||||
with .ko.
|
||||
|
||||
config MODULE_COMPRESS_GZIP
|
||||
bool "GZIP"
|
||||
help
|
||||
Compress modules with GZIP. The installed modules are suffixed
|
||||
with .ko.gz.
|
||||
|
||||
config MODULE_COMPRESS_XZ
|
||||
bool "XZ"
|
||||
help
|
||||
Compress modules with XZ. The installed modules are suffixed
|
||||
with .ko.xz.
|
||||
|
||||
config MODULE_COMPRESS_ZSTD
|
||||
bool "ZSTD"
|
||||
help
|
||||
Compress modules with ZSTD. The installed modules are suffixed
|
||||
with .ko.zst.
|
||||
|
||||
endchoice
|
||||
|
||||
config MODULE_DECOMPRESS
|
||||
bool "Support in-kernel module decompression"
|
||||
depends on MODULE_COMPRESS_GZIP || MODULE_COMPRESS_XZ
|
||||
select ZLIB_INFLATE if MODULE_COMPRESS_GZIP
|
||||
select XZ_DEC if MODULE_COMPRESS_XZ
|
||||
help
|
||||
|
||||
Support for decompressing kernel modules by the kernel itself
|
||||
instead of relying on userspace to perform this task. Useful when
|
||||
load pinning security policy is enabled.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS
|
||||
bool "Allow loading of modules with missing namespace imports"
|
||||
help
|
||||
Symbols exported with EXPORT_SYMBOL_NS*() are considered exported in
|
||||
a namespace. A module that makes use of a symbol exported with such a
|
||||
namespace is required to import the namespace via MODULE_IMPORT_NS().
|
||||
There is no technical reason to enforce correct namespace imports,
|
||||
but it creates consistency between symbols defining namespaces and
|
||||
users importing namespaces they make use of. This option relaxes this
|
||||
requirement and lifts the enforcement when loading a module.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config MODPROBE_PATH
|
||||
string "Path to modprobe binary"
|
||||
default "/sbin/modprobe"
|
||||
help
|
||||
When kernel code requests a module, it does so by calling
|
||||
the "modprobe" userspace utility. This option allows you to
|
||||
set the path where that binary is found. This can be changed
|
||||
at runtime via the sysctl file
|
||||
/proc/sys/kernel/modprobe. Setting this to the empty string
|
||||
removes the kernel's ability to request modules (but
|
||||
userspace can still load modules explicitly).
|
||||
|
||||
config TRIM_UNUSED_KSYMS
|
||||
bool "Trim unused exported kernel symbols" if EXPERT
|
||||
depends on !COMPILE_TEST
|
||||
help
|
||||
The kernel and some modules make many symbols available for
|
||||
other modules to use via EXPORT_SYMBOL() and variants. Depending
|
||||
on the set of modules being selected in your kernel configuration,
|
||||
many of those exported symbols might never be used.
|
||||
|
||||
This option allows for unused exported symbols to be dropped from
|
||||
the build. In turn, this provides the compiler more opportunities
|
||||
(especially when using LTO) for optimizing the code and reducing
|
||||
binary size. This might have some security advantages as well.
|
||||
|
||||
If unsure, or if you need to build out-of-tree modules, say N.
|
||||
|
||||
config UNUSED_KSYMS_WHITELIST
|
||||
string "Whitelist of symbols to keep in ksymtab"
|
||||
depends on TRIM_UNUSED_KSYMS
|
||||
help
|
||||
By default, all unused exported symbols will be un-exported from the
|
||||
build when TRIM_UNUSED_KSYMS is selected.
|
||||
|
||||
UNUSED_KSYMS_WHITELIST allows to whitelist symbols that must be kept
|
||||
exported at all times, even in absence of in-tree users. The value to
|
||||
set here is the path to a text file containing the list of symbols,
|
||||
one per line. The path can be absolute, or relative to the kernel
|
||||
source tree.
|
||||
|
||||
endif # MODULES
|
||||
|
||||
config MODULES_TREE_LOOKUP
|
||||
def_bool y
|
||||
depends on PERF_EVENTS || TRACING || CFI_CLANG
|
||||
source "kernel/module/Kconfig"
|
||||
|
||||
config INIT_ALL_POSSIBLE
|
||||
bool
|
||||
|
||||
@@ -0,0 +1,306 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
menuconfig MODULES
|
||||
bool "Enable loadable module support"
|
||||
modules
|
||||
help
|
||||
Kernel modules are small pieces of compiled code which can
|
||||
be inserted in the running kernel, rather than being
|
||||
permanently built into the kernel. You use the "modprobe"
|
||||
tool to add (and sometimes remove) them. If you say Y here,
|
||||
many parts of the kernel can be built as modules (by
|
||||
answering M instead of Y where indicated): this is most
|
||||
useful for infrequently used options which are not required
|
||||
for booting. For more information, see the man pages for
|
||||
modprobe, lsmod, modinfo, insmod and rmmod.
|
||||
|
||||
If you say Y here, you will need to run "make
|
||||
modules_install" to put the modules under /lib/modules/
|
||||
where modprobe can find them (you may need to be root to do
|
||||
this).
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
if MODULES
|
||||
|
||||
config MODULE_FORCE_LOAD
|
||||
bool "Forced module loading"
|
||||
default n
|
||||
help
|
||||
Allow loading of modules without version information (ie. modprobe
|
||||
--force). Forced module loading sets the 'F' (forced) taint flag and
|
||||
is usually a really bad idea.
|
||||
|
||||
config MODULE_UNLOAD
|
||||
bool "Module unloading"
|
||||
help
|
||||
Without this option you will not be able to unload any
|
||||
modules (note that some modules may not be unloadable
|
||||
anyway), which makes your kernel smaller, faster
|
||||
and simpler. If unsure, say Y.
|
||||
|
||||
config MODULE_FORCE_UNLOAD
|
||||
bool "Forced module unloading"
|
||||
depends on MODULE_UNLOAD
|
||||
help
|
||||
This option allows you to force a module to unload, even if the
|
||||
kernel believes it is unsafe: the kernel will remove the module
|
||||
without waiting for anyone to stop using it (using the -f option to
|
||||
rmmod). This is mainly for kernel developers and desperate users.
|
||||
If unsure, say N.
|
||||
|
||||
config MODULE_UNLOAD_TAINT_TRACKING
|
||||
bool "Tainted module unload tracking"
|
||||
depends on MODULE_UNLOAD
|
||||
default n
|
||||
help
|
||||
This option allows you to maintain a record of each unloaded
|
||||
module that tainted the kernel. In addition to displaying a
|
||||
list of linked (or loaded) modules e.g. on detection of a bad
|
||||
page (see bad_page()), the aforementioned details are also
|
||||
shown. If unsure, say N.
|
||||
|
||||
config MODVERSIONS
|
||||
bool "Module versioning support"
|
||||
help
|
||||
Usually, you have to use modules compiled with your kernel.
|
||||
Saying Y here makes it sometimes possible to use modules
|
||||
compiled for different kernels, by adding enough information
|
||||
to the modules to (hopefully) spot any changes which would
|
||||
make them incompatible with the kernel you are running. If
|
||||
unsure, say N.
|
||||
|
||||
config ASM_MODVERSIONS
|
||||
bool
|
||||
default HAVE_ASM_MODVERSIONS && MODVERSIONS
|
||||
help
|
||||
This enables module versioning for exported symbols also from
|
||||
assembly. This can be enabled only when the target architecture
|
||||
supports it.
|
||||
|
||||
config MODULE_SRCVERSION_ALL
|
||||
bool "Source checksum for all modules"
|
||||
help
|
||||
Modules which contain a MODULE_VERSION get an extra "srcversion"
|
||||
field inserted into their modinfo section, which contains a
|
||||
sum of the source files which made it. This helps maintainers
|
||||
see exactly which source was used to build a module (since
|
||||
others sometimes change the module source without updating
|
||||
the version). With this option, such a "srcversion" field
|
||||
will be created for all modules. If unsure, say N.
|
||||
|
||||
config MODULE_SIG
|
||||
bool "Module signature verification"
|
||||
select MODULE_SIG_FORMAT
|
||||
help
|
||||
Check modules for valid signatures upon load: the signature
|
||||
is simply appended to the module. For more information see
|
||||
<file:Documentation/admin-guide/module-signing.rst>.
|
||||
|
||||
Note that this option adds the OpenSSL development packages as a
|
||||
kernel build dependency so that the signing tool can use its crypto
|
||||
library.
|
||||
|
||||
You should enable this option if you wish to use either
|
||||
CONFIG_SECURITY_LOCKDOWN_LSM or lockdown functionality imposed via
|
||||
another LSM - otherwise unsigned modules will be loadable regardless
|
||||
of the lockdown policy.
|
||||
|
||||
!!!WARNING!!! If you enable this option, you MUST make sure that the
|
||||
module DOES NOT get stripped after being signed. This includes the
|
||||
debuginfo strip done by some packagers (such as rpmbuild) and
|
||||
inclusion into an initramfs that wants the module size reduced.
|
||||
|
||||
config MODULE_SIG_FORCE
|
||||
bool "Require modules to be validly signed"
|
||||
depends on MODULE_SIG
|
||||
help
|
||||
Reject unsigned modules or signed modules for which we don't have a
|
||||
key. Without this, such modules will simply taint the kernel.
|
||||
|
||||
config MODULE_SIG_PROTECT
|
||||
bool "Android GKI module protection"
|
||||
depends on MODULE_SIG && !MODULE_SIG_FORCE
|
||||
help
|
||||
Enables Android GKI symbol and export protection support.
|
||||
|
||||
This modifies the behavior of the MODULE_SIG_FORCE as follows:
|
||||
- Allows Android GKI Modules signed using MODULE_SIG_ALL during build.
|
||||
- Allows other modules to load if they don't violate the access to
|
||||
Android GKI protected symbols and do not export the symbols already
|
||||
exported by the Android GKI modules. Loading will fail and return
|
||||
-EACCES (Permission denied) if symbol access conditions are not met.
|
||||
|
||||
config MODULE_SIG_ALL
|
||||
bool "Automatically sign all modules"
|
||||
default y
|
||||
depends on MODULE_SIG || IMA_APPRAISE_MODSIG
|
||||
help
|
||||
Sign all modules during make modules_install. Without this option,
|
||||
modules must be signed manually, using the scripts/sign-file tool.
|
||||
|
||||
comment "Do not forget to sign required modules with scripts/sign-file"
|
||||
depends on MODULE_SIG_FORCE && !MODULE_SIG_ALL
|
||||
|
||||
choice
|
||||
prompt "Which hash algorithm should modules be signed with?"
|
||||
depends on MODULE_SIG || IMA_APPRAISE_MODSIG
|
||||
help
|
||||
This determines which sort of hashing algorithm will be used during
|
||||
signature generation. This algorithm _must_ be built into the kernel
|
||||
directly so that signature verification can take place. It is not
|
||||
possible to load a signed module containing the algorithm to check
|
||||
the signature on that module.
|
||||
|
||||
config MODULE_SIG_SHA1
|
||||
bool "Sign modules with SHA-1"
|
||||
select CRYPTO_SHA1
|
||||
|
||||
config MODULE_SIG_SHA224
|
||||
bool "Sign modules with SHA-224"
|
||||
select CRYPTO_SHA256
|
||||
|
||||
config MODULE_SIG_SHA256
|
||||
bool "Sign modules with SHA-256"
|
||||
select CRYPTO_SHA256
|
||||
|
||||
config MODULE_SIG_SHA384
|
||||
bool "Sign modules with SHA-384"
|
||||
select CRYPTO_SHA512
|
||||
|
||||
config MODULE_SIG_SHA512
|
||||
bool "Sign modules with SHA-512"
|
||||
select CRYPTO_SHA512
|
||||
|
||||
endchoice
|
||||
|
||||
config MODULE_SIG_HASH
|
||||
string
|
||||
depends on MODULE_SIG || IMA_APPRAISE_MODSIG
|
||||
default "sha1" if MODULE_SIG_SHA1
|
||||
default "sha224" if MODULE_SIG_SHA224
|
||||
default "sha256" if MODULE_SIG_SHA256
|
||||
default "sha384" if MODULE_SIG_SHA384
|
||||
default "sha512" if MODULE_SIG_SHA512
|
||||
|
||||
choice
|
||||
prompt "Module compression mode"
|
||||
help
|
||||
This option allows you to choose the algorithm which will be used to
|
||||
compress modules when 'make modules_install' is run. (or, you can
|
||||
choose to not compress modules at all.)
|
||||
|
||||
External modules will also be compressed in the same way during the
|
||||
installation.
|
||||
|
||||
For modules inside an initrd or initramfs, it's more efficient to
|
||||
compress the whole initrd or initramfs instead.
|
||||
|
||||
This is fully compatible with signed modules.
|
||||
|
||||
Please note that the tool used to load modules needs to support the
|
||||
corresponding algorithm. module-init-tools MAY support gzip, and kmod
|
||||
MAY support gzip, xz and zstd.
|
||||
|
||||
Your build system needs to provide the appropriate compression tool
|
||||
to compress the modules.
|
||||
|
||||
If in doubt, select 'None'.
|
||||
|
||||
config MODULE_COMPRESS_NONE
|
||||
bool "None"
|
||||
help
|
||||
Do not compress modules. The installed modules are suffixed
|
||||
with .ko.
|
||||
|
||||
config MODULE_COMPRESS_GZIP
|
||||
bool "GZIP"
|
||||
help
|
||||
Compress modules with GZIP. The installed modules are suffixed
|
||||
with .ko.gz.
|
||||
|
||||
config MODULE_COMPRESS_XZ
|
||||
bool "XZ"
|
||||
help
|
||||
Compress modules with XZ. The installed modules are suffixed
|
||||
with .ko.xz.
|
||||
|
||||
config MODULE_COMPRESS_ZSTD
|
||||
bool "ZSTD"
|
||||
help
|
||||
Compress modules with ZSTD. The installed modules are suffixed
|
||||
with .ko.zst.
|
||||
|
||||
endchoice
|
||||
|
||||
config MODULE_DECOMPRESS
|
||||
bool "Support in-kernel module decompression"
|
||||
depends on MODULE_COMPRESS_GZIP || MODULE_COMPRESS_XZ
|
||||
select ZLIB_INFLATE if MODULE_COMPRESS_GZIP
|
||||
select XZ_DEC if MODULE_COMPRESS_XZ
|
||||
help
|
||||
|
||||
Support for decompressing kernel modules by the kernel itself
|
||||
instead of relying on userspace to perform this task. Useful when
|
||||
load pinning security policy is enabled.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS
|
||||
bool "Allow loading of modules with missing namespace imports"
|
||||
help
|
||||
Symbols exported with EXPORT_SYMBOL_NS*() are considered exported in
|
||||
a namespace. A module that makes use of a symbol exported with such a
|
||||
namespace is required to import the namespace via MODULE_IMPORT_NS().
|
||||
There is no technical reason to enforce correct namespace imports,
|
||||
but it creates consistency between symbols defining namespaces and
|
||||
users importing namespaces they make use of. This option relaxes this
|
||||
requirement and lifts the enforcement when loading a module.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config MODPROBE_PATH
|
||||
string "Path to modprobe binary"
|
||||
default "/sbin/modprobe"
|
||||
help
|
||||
When kernel code requests a module, it does so by calling
|
||||
the "modprobe" userspace utility. This option allows you to
|
||||
set the path where that binary is found. This can be changed
|
||||
at runtime via the sysctl file
|
||||
/proc/sys/kernel/modprobe. Setting this to the empty string
|
||||
removes the kernel's ability to request modules (but
|
||||
userspace can still load modules explicitly).
|
||||
|
||||
config TRIM_UNUSED_KSYMS
|
||||
bool "Trim unused exported kernel symbols" if EXPERT
|
||||
depends on !COMPILE_TEST
|
||||
help
|
||||
The kernel and some modules make many symbols available for
|
||||
other modules to use via EXPORT_SYMBOL() and variants. Depending
|
||||
on the set of modules being selected in your kernel configuration,
|
||||
many of those exported symbols might never be used.
|
||||
|
||||
This option allows for unused exported symbols to be dropped from
|
||||
the build. In turn, this provides the compiler more opportunities
|
||||
(especially when using LTO) for optimizing the code and reducing
|
||||
binary size. This might have some security advantages as well.
|
||||
|
||||
If unsure, or if you need to build out-of-tree modules, say N.
|
||||
|
||||
config UNUSED_KSYMS_WHITELIST
|
||||
string "Whitelist of symbols to keep in ksymtab"
|
||||
depends on TRIM_UNUSED_KSYMS
|
||||
help
|
||||
By default, all unused exported symbols will be un-exported from the
|
||||
build when TRIM_UNUSED_KSYMS is selected.
|
||||
|
||||
UNUSED_KSYMS_WHITELIST allows to whitelist symbols that must be kept
|
||||
exported at all times, even in absence of in-tree users. The value to
|
||||
set here is the path to a text file containing the list of symbols,
|
||||
one per line. The path can be absolute, or relative to the kernel
|
||||
source tree.
|
||||
|
||||
config MODULES_TREE_LOOKUP
|
||||
def_bool y
|
||||
depends on PERF_EVENTS || TRACING || CFI_CLANG
|
||||
|
||||
endif # MODULES
|
||||
@@ -119,10 +119,10 @@ static ssize_t module_gzip_decompress(struct load_info *info,
|
||||
goto out_inflate_end;
|
||||
}
|
||||
|
||||
s.next_out = kmap(page);
|
||||
s.next_out = kmap_local_page(page);
|
||||
s.avail_out = PAGE_SIZE;
|
||||
rc = zlib_inflate(&s, 0);
|
||||
kunmap(page);
|
||||
kunmap_local(s.next_out);
|
||||
|
||||
new_size += PAGE_SIZE - s.avail_out;
|
||||
} while (rc == Z_OK);
|
||||
@@ -178,11 +178,11 @@ static ssize_t module_xz_decompress(struct load_info *info,
|
||||
goto out;
|
||||
}
|
||||
|
||||
xz_buf.out = kmap(page);
|
||||
xz_buf.out = kmap_local_page(page);
|
||||
xz_buf.out_pos = 0;
|
||||
xz_buf.out_size = PAGE_SIZE;
|
||||
xz_ret = xz_dec_run(xz_dec, &xz_buf);
|
||||
kunmap(page);
|
||||
kunmap_local(xz_buf.out);
|
||||
|
||||
new_size += xz_buf.out_pos;
|
||||
} while (xz_buf.out_pos == PAGE_SIZE && xz_ret == XZ_OK);
|
||||
|
||||
@@ -103,7 +103,7 @@ struct module *find_module_all(const char *name, size_t len, bool even_unformed)
|
||||
int cmp_name(const void *name, const void *sym);
|
||||
long module_get_offset(struct module *mod, unsigned int *size, Elf_Shdr *sechdr,
|
||||
unsigned int section);
|
||||
char *module_flags(struct module *mod, char *buf);
|
||||
char *module_flags(struct module *mod, char *buf, bool show_state);
|
||||
size_t module_flags_taint(unsigned long taints, char *buf);
|
||||
|
||||
static inline void module_assert_mutex_or_preempt(void)
|
||||
|
||||
+27
-14
@@ -457,26 +457,39 @@ unsigned long find_kallsyms_symbol_value(struct module *mod, const char *name)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Look for this name: can be of form module:name. */
|
||||
unsigned long module_kallsyms_lookup_name(const char *name)
|
||||
static unsigned long __module_kallsyms_lookup_name(const char *name)
|
||||
{
|
||||
struct module *mod;
|
||||
char *colon;
|
||||
unsigned long ret = 0;
|
||||
|
||||
colon = strnchr(name, MODULE_NAME_LEN, ':');
|
||||
if (colon) {
|
||||
mod = find_module_all(name, colon - name, false);
|
||||
if (mod)
|
||||
return find_kallsyms_symbol_value(mod, colon + 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
list_for_each_entry_rcu(mod, &modules, list) {
|
||||
unsigned long ret;
|
||||
|
||||
if (mod->state == MODULE_STATE_UNFORMED)
|
||||
continue;
|
||||
ret = find_kallsyms_symbol_value(mod, name);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Look for this name: can be of form module:name. */
|
||||
unsigned long module_kallsyms_lookup_name(const char *name)
|
||||
{
|
||||
unsigned long ret;
|
||||
|
||||
/* Don't lock: we're in enough trouble already. */
|
||||
preempt_disable();
|
||||
if ((colon = strnchr(name, MODULE_NAME_LEN, ':')) != NULL) {
|
||||
if ((mod = find_module_all(name, colon - name, false)) != NULL)
|
||||
ret = find_kallsyms_symbol_value(mod, colon + 1);
|
||||
} else {
|
||||
list_for_each_entry_rcu(mod, &modules, list) {
|
||||
if (mod->state == MODULE_STATE_UNFORMED)
|
||||
continue;
|
||||
if ((ret = find_kallsyms_symbol_value(mod, name)) != 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
ret = __module_kallsyms_lookup_name(name);
|
||||
preempt_enable();
|
||||
return ret;
|
||||
}
|
||||
|
||||
+30
-13
@@ -119,7 +119,7 @@ static void mod_update_bounds(struct module *mod)
|
||||
}
|
||||
|
||||
/* Block module loading/unloading? */
|
||||
int modules_disabled = 0;
|
||||
int modules_disabled;
|
||||
core_param(nomodule, modules_disabled, bint, 0);
|
||||
|
||||
/* Waiting for a module to finish initializing? */
|
||||
@@ -524,7 +524,10 @@ static struct module_attribute modinfo_##field = { \
|
||||
MODINFO_ATTR(version);
|
||||
MODINFO_ATTR(srcversion);
|
||||
|
||||
static char last_unloaded_module[MODULE_NAME_LEN+1];
|
||||
static struct {
|
||||
char name[MODULE_NAME_LEN + 1];
|
||||
char taints[MODULE_FLAGS_BUF_SIZE];
|
||||
} last_unloaded_module;
|
||||
|
||||
#ifdef CONFIG_MODULE_UNLOAD
|
||||
|
||||
@@ -694,6 +697,7 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
|
||||
{
|
||||
struct module *mod;
|
||||
char name[MODULE_NAME_LEN];
|
||||
char buf[MODULE_FLAGS_BUF_SIZE];
|
||||
int ret, forced = 0;
|
||||
|
||||
if (!capable(CAP_SYS_MODULE) || modules_disabled)
|
||||
@@ -753,8 +757,9 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
|
||||
|
||||
async_synchronize_full();
|
||||
|
||||
/* Store the name of the last unloaded module for diagnostic purposes */
|
||||
strlcpy(last_unloaded_module, mod->name, sizeof(last_unloaded_module));
|
||||
/* Store the name and taints of the last unloaded module for diagnostic purposes */
|
||||
strscpy(last_unloaded_module.name, mod->name, sizeof(last_unloaded_module.name));
|
||||
strscpy(last_unloaded_module.taints, module_flags(mod, buf, false), sizeof(last_unloaded_module.taints));
|
||||
|
||||
free_module(mod);
|
||||
/* someone could wait for the module in add_unformed_module() */
|
||||
@@ -2166,7 +2171,7 @@ static int move_module(struct module *mod, struct load_info *info)
|
||||
|
||||
#ifdef CONFIG_ARCH_WANTS_MODULES_DATA_IN_VMALLOC
|
||||
/* Do the allocs. */
|
||||
ptr = vmalloc(mod->data_layout.size);
|
||||
ptr = vzalloc(mod->data_layout.size);
|
||||
/*
|
||||
* The pointer to this block is stored in the module structure
|
||||
* which is inside the block. Just mark it as not being a
|
||||
@@ -2179,7 +2184,6 @@ static int move_module(struct module *mod, struct load_info *info)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memset(ptr, 0, mod->data_layout.size);
|
||||
mod->data_layout.base = ptr;
|
||||
#endif
|
||||
/* Transfer each section which specifies SHF_ALLOC */
|
||||
@@ -2438,6 +2442,12 @@ static void do_free_init(struct work_struct *w)
|
||||
}
|
||||
}
|
||||
|
||||
#undef MODULE_PARAM_PREFIX
|
||||
#define MODULE_PARAM_PREFIX "module."
|
||||
/* Default value for module->async_probe_requested */
|
||||
static bool async_probe;
|
||||
module_param(async_probe, bool, 0644);
|
||||
|
||||
/*
|
||||
* This is where the real work happens.
|
||||
*
|
||||
@@ -2658,7 +2668,8 @@ static int unknown_module_param_cb(char *param, char *val, const char *modname,
|
||||
int ret;
|
||||
|
||||
if (strcmp(param, "async_probe") == 0) {
|
||||
mod->async_probe_requested = true;
|
||||
if (strtobool(val, &mod->async_probe_requested))
|
||||
mod->async_probe_requested = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2827,6 +2838,8 @@ static int load_module(struct load_info *info, const char __user *uargs,
|
||||
if (err)
|
||||
goto bug_cleanup;
|
||||
|
||||
mod->async_probe_requested = async_probe;
|
||||
|
||||
/* Module is ready to execute: parsing args may do that. */
|
||||
after_dashes = parse_args(mod->name, mod->args, mod->kp, mod->num_kp,
|
||||
-32768, 32767, mod,
|
||||
@@ -3001,24 +3014,27 @@ static void cfi_cleanup(struct module *mod)
|
||||
}
|
||||
|
||||
/* Keep in sync with MODULE_FLAGS_BUF_SIZE !!! */
|
||||
char *module_flags(struct module *mod, char *buf)
|
||||
char *module_flags(struct module *mod, char *buf, bool show_state)
|
||||
{
|
||||
int bx = 0;
|
||||
|
||||
BUG_ON(mod->state == MODULE_STATE_UNFORMED);
|
||||
if (!mod->taints && !show_state)
|
||||
goto out;
|
||||
if (mod->taints ||
|
||||
mod->state == MODULE_STATE_GOING ||
|
||||
mod->state == MODULE_STATE_COMING) {
|
||||
buf[bx++] = '(';
|
||||
bx += module_flags_taint(mod->taints, buf + bx);
|
||||
/* Show a - for module-is-being-unloaded */
|
||||
if (mod->state == MODULE_STATE_GOING)
|
||||
if (mod->state == MODULE_STATE_GOING && show_state)
|
||||
buf[bx++] = '-';
|
||||
/* Show a + for module-is-being-loaded */
|
||||
if (mod->state == MODULE_STATE_COMING)
|
||||
if (mod->state == MODULE_STATE_COMING && show_state)
|
||||
buf[bx++] = '+';
|
||||
buf[bx++] = ')';
|
||||
}
|
||||
out:
|
||||
buf[bx] = '\0';
|
||||
|
||||
return buf;
|
||||
@@ -3151,12 +3167,13 @@ void print_modules(void)
|
||||
list_for_each_entry_rcu(mod, &modules, list) {
|
||||
if (mod->state == MODULE_STATE_UNFORMED)
|
||||
continue;
|
||||
pr_cont(" %s%s", mod->name, module_flags(mod, buf));
|
||||
pr_cont(" %s%s", mod->name, module_flags(mod, buf, true));
|
||||
}
|
||||
|
||||
print_unloaded_tainted_modules();
|
||||
preempt_enable();
|
||||
if (last_unloaded_module[0])
|
||||
pr_cont(" [last unloaded: %s]", last_unloaded_module);
|
||||
if (last_unloaded_module.name[0])
|
||||
pr_cont(" [last unloaded: %s%s]", last_unloaded_module.name,
|
||||
last_unloaded_module.taints);
|
||||
pr_cont("\n");
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ static int m_show(struct seq_file *m, void *p)
|
||||
|
||||
/* Taints info */
|
||||
if (mod->taints)
|
||||
seq_printf(m, " %s", module_flags(mod, buf));
|
||||
seq_printf(m, " %s", module_flags(mod, buf, true));
|
||||
|
||||
seq_puts(m, "\n");
|
||||
return 0;
|
||||
|
||||
@@ -27,6 +27,8 @@ SECTIONS {
|
||||
.ctors 0 : ALIGN(8) { *(SORT(.ctors.*)) *(.ctors) }
|
||||
.init_array 0 : ALIGN(8) { *(SORT(.init_array.*)) *(.init_array) }
|
||||
|
||||
.altinstructions 0 : ALIGN(8) { KEEP(*(.altinstructions)) }
|
||||
__bug_table 0 : ALIGN(8) { KEEP(*(__bug_table)) }
|
||||
__jump_table 0 : ALIGN(8) { KEEP(*(__jump_table)) }
|
||||
|
||||
__patchable_function_entries : { *(__patchable_function_entries) }
|
||||
|
||||
Reference in New Issue
Block a user